Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
25 SOUP
Holders
5
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
FrogSoupRemastered
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-11-15 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* ,---.,---. .---. ,--, .---. .---. .-. .-.,---. | .-'| .-.\ / .-. ) .' .' ( .-._)/ .-. ) | | | || .-.\ | `-.| `-'/ | | |(_)| | __ (_) \ | | |(_)| | | || |-' ) | .-'| ( | | | | \ \ ( _) _ \ \ | | | | | | | || |--' | | | |\ \ \ `-' / \ `-) ) ( `-' ) \ `-' / | `-')|| | )\| |_| \)\ )---' )\____/ `----' )---' `---(_)/( (__) (__)(_) (__) (_) (__) */ //IERC20 for Token usage interface IERC20 { function transfer(address _to, uint256 _amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); function balanceOf(address account) external view returns (uint256); } /** * @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); } /** * @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; } } /** * @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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved( uint256 tokenId ) external view returns (address operator); /** * @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 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); /** * @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; } /** * @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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @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); } /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 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" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /* * @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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString( uint256 value, uint256 length ) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @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 tokenId); /** * @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); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // 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; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @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 virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf( uint256 tokenId ) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @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) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),".json")) : ""; } /** * @dev Base URI for computing {tokenURI}. 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 virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved( uint256 tokenId ) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll( address operator, bool approved ) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _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 { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _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 { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner( address spender, uint256 tokenId ) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @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 { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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 ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { 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( "ERC721: transfer to non ERC721Receiver implementer" ); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface( bytes4 interfaceId ) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex( address owner, uint256 index ) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex( uint256 index ) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration( address from, uint256 tokenId ) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } interface IOldContract { function ownerOf(uint256 tokenId) external view returns (address); function balanceOf(address owner) external view returns (uint256); } interface IUniswapV2Router02 { function WETH() external pure returns (address); function swapExactETHForTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable returns (uint[] memory amounts); } contract FrogSoupRemastered is ERC721Enumerable { using Strings for uint256; string _baseTokenURI = "https://arweave.net/jA9S4P9xk_5RNoWwVyxRsryidcfpRS0a4WH217hR0JY/"; string _baseContractURI = "https://arweave.net/6uq6NonLkJA1pQR09IFX8Zz32AHypU5BDm1FHdm3w30/contract_metadata.json"; uint256 private _price1 = 0.03 ether; // Single Soup uint256 private _price3 = 0.08 ether; // Triple Bundle uint256 private _price5 = 0.12 ether; // Penta Bundle uint256 private _price10 = 0.20 ether; // Deca Bundle uint256 public immutable collectionSize = 5029; //Total Supply // Constants for Cooking Frogs IUniswapV2Router02 private uniswapRouter; address private UNISWAP_ROUTER_ADDRESS = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; address private constant TOAD_ADDRESS = 0x370a366f402e2e41CDBbE54EcEC12aaE0cce1955; address private constant SOUP_KITCHEN = 0x000000000000000000000000000000000000dEaD; // Dev address address private constant SARAH_ADDRESS = 0xe4017661491fA0fbeaE3734018E8d2b5CB218A9F; address private constant COMIC_ADDRESS = 0x2C4Ae75ef6AF3C67bBCF7897864B8d2dA237F0D7; // Address of the old contract IOldContract public oldContract; address private constant OLD_CONTRACT = 0x58172B314187e35892DeEc5DD0e2f847893e5405; // Highest token ID allowed for free mints uint256 public highestOldTokenId = 1850; // Separate supply counters for free and paid mints uint256 public freeMintSupply; uint256 public totalSupplyMinted; constructor() ERC721("Frog Soup Remastered", "SOUP") { oldContract = IOldContract(OLD_CONTRACT); uniswapRouter = IUniswapV2Router02(UNISWAP_ROUTER_ADDRESS); } // Free mint function (IDs 0-1850) function mintFree(uint256[] calldata tokenIds) public { uint256 length = tokenIds.length; address caller = msg.sender; for (uint256 i = 0; i < length; ) { require(tokenIds[i] <= highestOldTokenId, "Token ID must be between 0 and 1850"); require(oldContract.ownerOf(tokenIds[i]) == caller, "You do not own this token ID"); require(!_exists(tokenIds[i]), "Token already minted"); _safeMint(caller, tokenIds[i]); unchecked { i++; } } // Increment the free mint supply counter without affecting paid mints freeMintSupply += length; } // Paid mint functions (IDs 1851-5029) function mint1() public payable { require(msg.value >= _price1, "Ether sent is not correct"); require(freeMintSupply + totalSupplyMinted + 1 <= collectionSize, "Exceeds maximum supply"); uint256 newTokenId = highestOldTokenId + 1 + totalSupplyMinted; _safeMint(msg.sender, newTokenId); totalSupplyMinted++; uint256 amountToSend = msg.value / 3; (bool successSarah, ) = SARAH_ADDRESS.call{value: amountToSend}(""); require(successSarah, "Transfer to SARAH_ADDRESS failed"); (bool successComic, ) = COMIC_ADDRESS.call{value: amountToSend}(""); require(successComic, "Transfer to COMIC_ADDRESS failed"); } function mint3() public payable { require(msg.value >= _price3, "Ether sent is not correct"); require(freeMintSupply + totalSupplyMinted + 3 <= collectionSize, "Exceeds maximum supply"); for (uint256 i = 0; i < 3; i++) { _safeMint(msg.sender, highestOldTokenId + 1 + totalSupplyMinted + i); } totalSupplyMinted += 3; uint256 amountToSend = msg.value / 3; (bool successSarah, ) = SARAH_ADDRESS.call{value: amountToSend}(""); require(successSarah, "Transfer to SARAH_ADDRESS failed"); (bool successComic, ) = COMIC_ADDRESS.call{value: amountToSend}(""); require(successComic, "Transfer to COMIC_ADDRESS failed"); } function mint5() public payable { require(msg.value >= _price5, "Ether sent is not correct"); require(freeMintSupply + totalSupplyMinted + 5 <= collectionSize, "Exceeds maximum supply"); for (uint256 i = 0; i < 5; i++) { _safeMint(msg.sender, highestOldTokenId + 1 + totalSupplyMinted + i); } totalSupplyMinted += 5; uint256 amountToSend = msg.value / 3; (bool successSarah, ) = SARAH_ADDRESS.call{value: amountToSend}(""); require(successSarah, "Transfer to SARAH_ADDRESS failed"); (bool successComic, ) = COMIC_ADDRESS.call{value: amountToSend}(""); require(successComic, "Transfer to COMIC_ADDRESS failed"); } function mint10() public payable { require(msg.value >= _price10, "Ether sent is not correct"); require(freeMintSupply + totalSupplyMinted + 10 <= collectionSize, "Exceeds maximum supply"); for (uint256 i = 0; i < 10; i++) { _safeMint(msg.sender, highestOldTokenId + 1 + totalSupplyMinted + i); } totalSupplyMinted += 10; uint256 amountToSend = msg.value / 3; (bool successSarah, ) = SARAH_ADDRESS.call{value: amountToSend}(""); require(successSarah, "Transfer to SARAH_ADDRESS failed"); (bool successComic, ) = COMIC_ADDRESS.call{value: amountToSend}(""); require(successComic, "Transfer to COMIC_ADDRESS failed"); } function latestMintedTokenId() external view returns (uint256) { return highestOldTokenId + totalSupplyMinted; } //View Tokens owned by wallet address - used for potential soup gallery and apis function walletOfOwner( address _owner ) public view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); uint256[] memory tokensId = new uint256[](tokenCount); for (uint256 i; i < tokenCount; i++) { tokensId[i] = tokenOfOwnerByIndex(_owner, i); } return tokensId; } //Get URI for token function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } //Collection Metadata for Opensea function contractURI() public view returns (string memory) { return _baseContractURI; } function getToads() external { uint256 weiAmount = address(this).balance; // Get the entire Ether balance of the contract require(weiAmount > 0, "Contract has no Ether to swap"); // Define path with explicit memory keyword and address[] type address[] memory path = new address[](2); path[0] = uniswapRouter.WETH(); path[1] = TOAD_ADDRESS; // Set the deadline for the swap transaction uint256 deadline = block.timestamp + 180; // 3 minute deadline // Perform the Toad purchase uniswapRouter.swapExactETHForTokens{value: weiAmount}( 0, // Accept any amount of Toad for our ETH path, SOUP_KITCHEN, //Send directly to our kitchen for storage deadline ); } // Fallback function to handle Ether sent directly to the contract fallback() external payable { require(msg.value > 0, "No Ether sent"); uint256 amountToSend = msg.value / 3; (bool successSarah, ) = SARAH_ADDRESS.call{value: amountToSend}(""); require(successSarah, "Transfer to SARAH_ADDRESS failed"); (bool successComic, ) = COMIC_ADDRESS.call{value: amountToSend}(""); require(successComic, "Transfer to COMIC_ADDRESS failed"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintSupply","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":[],"name":"getToads","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"highestOldTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"latestMintedTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint1","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mint10","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mint3","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mint5","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mintFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldContract","outputs":[{"internalType":"contract IOldContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"totalSupplyMinted","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":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
610100604090815260a081815290612b3660c039600a906100209082610205565b50604051806080016040528060568152602001612ae060569139600b906100479082610205565b50666a94d74f430000600c5567011c37937e080000600d556701aa535d3d0c0000600e556702c68af0bb140000600f556113a5608052601180546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905561073a6013553480156100b4575f80fd5b506040518060400160405280601481526020017f46726f6720536f75702052656d61737465726564000000000000000000000000815250604051806040016040528060048152602001630534f55560e41b815250815f90816101169190610205565b5060016101238282610205565b5050601280546001600160a01b03199081167358172b314187e35892deec5dd0e2f847893e540517909155601154601080549092166001600160a01b0391909116179055506102bf565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061019557607f821691505b6020821081036101b357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561020057805f5260205f20601f840160051c810160208510156101de5750805b601f840160051c820191505b818110156101fd575f81556001016101ea565b50505b505050565b81516001600160401b0381111561021e5761021e61016d565b6102328161022c8454610181565b846101b9565b6020601f821160018114610264575f831561024d5750848201515b5f19600385901b1c1916600184901b1784556101fd565b5f84815260208120601f198516915b828110156102935787850151825560209485019460019092019101610273565b50848210156102b057868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6080516127ed6102f35f395f81816104d6015281816106d40152818161092401528181610d7f015261114401526127ed5ff3fe6080604052600436106101cc575f3560e01c806345c0f533116100f6578063a9decdda11610094578063e150007e11610063578063e150007e14610602578063e8a3d48514610617578063e985e9c51461062b578063ff81ff1c14610672576101cc565b8063a9decdda1461059d578063b88d4fde146105a5578063c87b56dd146105c4578063d8f4b089146105e3576101cc565b806370a08231116100d057806370a0823114610536578063933e95b21461055557806395d89b411461056a578063a22cb4651461057e576101cc565b806345c0f533146104c55780634f6ccce7146104f85780636352211e14610517576101cc565b80632009dbf21161016e57806330503c4e1161013d57806330503c4e146104535780633f85880d1461047257806342842e0e1461047a578063438b630014610499576101cc565b80632009dbf2146103ec57806323b872dd1461040057806323cf98821461041f5780632f745c5914610434576101cc565b80630788ce79116101aa5780630788ce7914610370578063081812fc14610378578063095ea7b3146103af57806318160ddd146103ce576101cc565b806301ffc9a714610313578063044b4b5d1461034757806306fdde031461034f575b5f34116102105760405162461bcd60e51b815260206004820152600d60248201526c139bc8115d1a195c881cd95b9d609a1b60448201526064015b60405180910390fd5b5f61021c600334612079565b6040519091505f9073e4017661491fa0fbeae3734018e8d2b5cb218a9f9083908381818185875af1925050503d805f8114610272576040519150601f19603f3d011682016040523d82523d5f602084013e610277565b606091505b50509050806102985760405162461bcd60e51b81526004016102079061208c565b6040515f90732c4ae75ef6af3c67bbcf7897864b8d2da237f0d79084908381818185875af1925050503d805f81146102eb576040519150601f19603f3d011682016040523d82523d5f602084013e6102f0565b606091505b50509050806103115760405162461bcd60e51b8152600401610207906120c1565b005b34801561031e575f80fd5b5061033261032d36600461210e565b610686565b60405190151581526020015b60405180910390f35b6103116106b0565b34801561035a575f80fd5b50610363610871565b60405161033e9190612157565b610311610900565b348015610383575f80fd5b50610397610392366004612169565b610ade565b6040516001600160a01b03909116815260200161033e565b3480156103ba575f80fd5b506103116103c9366004612194565b610b71565b3480156103d9575f80fd5b506008545b60405190815260200161033e565b3480156103f7575f80fd5b506103de610c80565b34801561040b575f80fd5b5061031161041a3660046121be565b610c96565b34801561042a575f80fd5b506103de60135481565b34801561043f575f80fd5b506103de61044e366004612194565b610cc7565b34801561045e575f80fd5b50601254610397906001600160a01b031681565b610311610d5b565b348015610485575f80fd5b506103116104943660046121be565b610e14565b3480156104a4575f80fd5b506104b86104b33660046121fc565b610e2e565b60405161033e9190612217565b3480156104d0575f80fd5b506103de7f000000000000000000000000000000000000000000000000000000000000000081565b348015610503575f80fd5b506103de610512366004612169565b610ec3565b348015610522575f80fd5b50610397610531366004612169565b610f53565b348015610541575f80fd5b506103de6105503660046121fc565b610fc9565b348015610560575f80fd5b506103de60155481565b348015610575575f80fd5b5061036361104e565b348015610589575f80fd5b50610311610598366004612259565b61105d565b610311611120565b3480156105b0575f80fd5b506103116105bf3660046122d9565b6111d9565b3480156105cf575f80fd5b506103636105de366004612169565b61120b565b3480156105ee575f80fd5b506103116105fd36600461239b565b6112e2565b34801561060d575f80fd5b506103de60145481565b348015610622575f80fd5b50610363611508565b348015610636575f80fd5b5061033261064536600461240c565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b34801561067d575f80fd5b50610311611517565b5f6001600160e01b0319821663780e9d6360e01b14806106aa57506106aa826116ec565b92915050565b600c543410156106d25760405162461bcd60e51b815260040161020790612438565b7f0000000000000000000000000000000000000000000000000000000000000000601554601454610703919061246f565b61070e90600161246f565b111561072c5760405162461bcd60e51b815260040161020790612482565b5f601554601354600161073f919061246f565b610749919061246f565b9050610755338261173b565b60158054905f610764836124b2565b909155505f9050610776600334612079565b6040519091505f9073e4017661491fa0fbeae3734018e8d2b5cb218a9f9083908381818185875af1925050503d805f81146107cc576040519150601f19603f3d011682016040523d82523d5f602084013e6107d1565b606091505b50509050806107f25760405162461bcd60e51b81526004016102079061208c565b6040515f90732c4ae75ef6af3c67bbcf7897864b8d2da237f0d79084908381818185875af1925050503d805f8114610845576040519150601f19603f3d011682016040523d82523d5f602084013e61084a565b606091505b505090508061086b5760405162461bcd60e51b8152600401610207906120c1565b50505050565b60605f805461087f906124ca565b80601f01602080910402602001604051908101604052809291908181526020018280546108ab906124ca565b80156108f65780601f106108cd576101008083540402835291602001916108f6565b820191905f5260205f20905b8154815290600101906020018083116108d957829003601f168201915b5050505050905090565b600d543410156109225760405162461bcd60e51b815260040161020790612438565b7f0000000000000000000000000000000000000000000000000000000000000000601554601454610953919061246f565b61095e90600361246f565b111561097c5760405162461bcd60e51b815260040161020790612482565b5f5b60038110156109bf576109b73382601554601354600161099e919061246f565b6109a8919061246f565b6109b2919061246f565b61173b565b60010161097e565b50600360155f8282546109d2919061246f565b909155505f90506109e4600334612079565b6040519091505f9073e4017661491fa0fbeae3734018e8d2b5cb218a9f9083908381818185875af1925050503d805f8114610a3a576040519150601f19603f3d011682016040523d82523d5f602084013e610a3f565b606091505b5050905080610a605760405162461bcd60e51b81526004016102079061208c565b6040515f90732c4ae75ef6af3c67bbcf7897864b8d2da237f0d79084908381818185875af1925050503d805f8114610ab3576040519150601f19603f3d011682016040523d82523d5f602084013e610ab8565b606091505b5050905080610ad95760405162461bcd60e51b8152600401610207906120c1565b505050565b5f818152600260205260408120546001600160a01b0316610b565760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610207565b505f908152600460205260409020546001600160a01b031690565b5f610b7b82610f53565b9050806001600160a01b0316836001600160a01b031603610be85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610207565b336001600160a01b0382161480610c045750610c048133610645565b610c765760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610207565b610ad98383611758565b5f601554601354610c91919061246f565b905090565b610ca033826117c5565b610cbc5760405162461bcd60e51b815260040161020790612502565b610ad98383836118b9565b5f610cd183610fc9565b8210610d335760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610207565b506001600160a01b03919091165f908152600660209081526040808320938352929052205490565b600f54341015610d7d5760405162461bcd60e51b815260040161020790612438565b7f0000000000000000000000000000000000000000000000000000000000000000601554601454610dae919061246f565b610db990600a61246f565b1115610dd75760405162461bcd60e51b815260040161020790612482565b5f5b600a811015610e0157610df93382601554601354600161099e919061246f565b600101610dd9565b50600a60155f8282546109d2919061246f565b610ad983838360405180602001604052805f8152506111d9565b60605f610e3a83610fc9565b90505f8167ffffffffffffffff811115610e5657610e56612294565b604051908082528060200260200182016040528015610e7f578160200160208202803683370190505b5090505f5b82811015610ebb57610e968582610cc7565b828281518110610ea857610ea8612553565b6020908102919091010152600101610e84565b509392505050565b5f610ecd60085490565b8210610f305760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610207565b60088281548110610f4357610f43612553565b905f5260205f2001549050919050565b5f818152600260205260408120546001600160a01b0316806106aa5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610207565b5f6001600160a01b0382166110335760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610207565b506001600160a01b03165f9081526003602052604090205490565b60606001805461087f906124ca565b336001600160a01b038316036110b55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610207565b335f8181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e543410156111425760405162461bcd60e51b815260040161020790612438565b7f0000000000000000000000000000000000000000000000000000000000000000601554601454611173919061246f565b61117e90600561246f565b111561119c5760405162461bcd60e51b815260040161020790612482565b5f5b60058110156111c6576111be3382601554601354600161099e919061246f565b60010161119e565b50600560155f8282546109d2919061246f565b6111e333836117c5565b6111ff5760405162461bcd60e51b815260040161020790612502565b61086b84848484611a60565b5f818152600260205260409020546060906001600160a01b03166112895760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610207565b5f611292611a93565b90505f8151116112b05760405180602001604052805f8152506112db565b806112ba84611aa2565b6040516020016112cb92919061257e565b6040516020818303038152906040525b9392505050565b80335f5b828110156114eb5760135485858381811061130357611303612553565b9050602002013511156113645760405162461bcd60e51b815260206004820152602360248201527f546f6b656e204944206d757374206265206265747765656e203020616e64203160448201526203835360ec1b6064820152608401610207565b6012546001600160a01b038084169116636352211e87878581811061138b5761138b612553565b905060200201356040518263ffffffff1660e01b81526004016113b091815260200190565b602060405180830381865afa1580156113cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ef91906125a8565b6001600160a01b0316146114455760405162461bcd60e51b815260206004820152601c60248201527f596f7520646f206e6f74206f776e207468697320746f6b656e204944000000006044820152606401610207565b61147d85858381811061145a5761145a612553565b905060200201355f908152600260205260409020546001600160a01b0316151590565b156114c15760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88185b1c9958591e481b5a5b9d195960621b6044820152606401610207565b6114e3828686848181106114d7576114d7612553565b9050602002013561173b565b6001016112e6565b508160145f8282546114fd919061246f565b909155505050505050565b6060600b805461087f906124ca565b47806115655760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206e6f20457468657220746f20737761700000006044820152606401610207565b6040805160028082526060820183525f926020830190803683375050601054604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156115cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f091906125a8565b815f8151811061160257611602612553565b60200260200101906001600160a01b031690816001600160a01b03168152505073370a366f402e2e41cdbbe54ecec12aae0cce19558160018151811061164a5761164a612553565b6001600160a01b03909216602092830291909101909101525f61166e4260b461246f565b601054604051637ff36ab560e01b81529192506001600160a01b031690637ff36ab59085906116a9905f90879061dead9088906004016125c3565b5f6040518083038185885af11580156116c4573d5f803e3d5ffd5b50505050506040513d5f823e601f3d908101601f1916820160405261086b919081019061262c565b5f6001600160e01b031982166380ac58cd60e01b148061171c57506001600160e01b03198216635b5e139f60e01b145b806106aa57506301ffc9a760e01b6001600160e01b03198316146106aa565b611754828260405180602001604052805f815250611b9f565b5050565b5f81815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061178c82610f53565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f818152600260205260408120546001600160a01b031661183d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610207565b5f61184783610f53565b9050806001600160a01b0316846001600160a01b031614806118825750836001600160a01b031661187784610ade565b6001600160a01b0316145b806118b157506001600160a01b038082165f9081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166118cc82610f53565b6001600160a01b0316146119345760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610207565b6001600160a01b0382166119965760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610207565b6119a1838383611bd1565b6119ab5f82611758565b6001600160a01b0383165f9081526003602052604081208054600192906119d39084906126d4565b90915550506001600160a01b0382165f908152600360205260408120805460019290611a0090849061246f565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611a6b8484846118b9565b611a7784848484611c88565b61086b5760405162461bcd60e51b8152600401610207906126e7565b6060600a805461087f906124ca565b6060815f03611ac85750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611af15780611adb816124b2565b9150611aea9050600a83612079565b9150611acb565b5f8167ffffffffffffffff811115611b0b57611b0b612294565b6040519080825280601f01601f191660200182016040528015611b35576020820181803683370190505b5090505b84156118b157611b4a6001836126d4565b9150611b57600a86612739565b611b6290603061246f565b60f81b818381518110611b7757611b77612553565b60200101906001600160f81b03191690815f1a905350611b98600a86612079565b9450611b39565b611ba98383611d85565b611bb55f848484611c88565b610ad95760405162461bcd60e51b8152600401610207906126e7565b6001600160a01b038316611c2b57611c2681600880545f838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611c4e565b816001600160a01b0316836001600160a01b031614611c4e57611c4e8382611ecf565b6001600160a01b038216611c6557610ad981611f68565b826001600160a01b0316826001600160a01b031614610ad957610ad9828261200f565b5f6001600160a01b0384163b15611d7a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ccb90339089908890889060040161274c565b6020604051808303815f875af1925050508015611d05575060408051601f3d908101601f19168201909252611d0291810190612788565b60015b611d60573d808015611d32576040519150601f19603f3d011682016040523d82523d5f602084013e611d37565b606091505b5080515f03611d585760405162461bcd60e51b8152600401610207906126e7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118b1565b506001949350505050565b6001600160a01b038216611ddb5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610207565b5f818152600260205260409020546001600160a01b031615611e3f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610207565b611e4a5f8383611bd1565b6001600160a01b0382165f908152600360205260408120805460019290611e7290849061246f565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f6001611edb84610fc9565b611ee591906126d4565b5f83815260076020526040902054909150808214611f36576001600160a01b0384165f9081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b505f9182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008545f90611f79906001906126d4565b5f8381526009602052604081205460088054939450909284908110611fa057611fa0612553565b905f5260205f20015490508060088381548110611fbf57611fbf612553565b5f918252602080832090910192909255828152600990915260408082208490558582528120556008805480611ff657611ff66127a3565b600190038181905f5260205f20015f9055905550505050565b5f61201983610fc9565b6001600160a01b039093165f908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261208757612087612051565b500490565b6020808252818101527f5472616e7366657220746f2053415241485f41444452455353206661696c6564604082015260600190565b6020808252818101527f5472616e7366657220746f20434f4d49435f41444452455353206661696c6564604082015260600190565b6001600160e01b03198116811461210b575f80fd5b50565b5f6020828403121561211e575f80fd5b81356112db816120f6565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112db6020830184612129565b5f60208284031215612179575f80fd5b5035919050565b6001600160a01b038116811461210b575f80fd5b5f80604083850312156121a5575f80fd5b82356121b081612180565b946020939093013593505050565b5f805f606084860312156121d0575f80fd5b83356121db81612180565b925060208401356121eb81612180565b929592945050506040919091013590565b5f6020828403121561220c575f80fd5b81356112db81612180565b602080825282518282018190525f918401906040840190835b8181101561224e578351835260209384019390920191600101612230565b509095945050505050565b5f806040838503121561226a575f80fd5b823561227581612180565b915060208301358015158114612289575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156122d1576122d1612294565b604052919050565b5f805f80608085870312156122ec575f80fd5b84356122f781612180565b9350602085013561230781612180565b925060408501359150606085013567ffffffffffffffff811115612329575f80fd5b8501601f81018713612339575f80fd5b803567ffffffffffffffff81111561235357612353612294565b612366601f8201601f19166020016122a8565b81815288602083850101111561237a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80602083850312156123ac575f80fd5b823567ffffffffffffffff8111156123c2575f80fd5b8301601f810185136123d2575f80fd5b803567ffffffffffffffff8111156123e8575f80fd5b8560208260051b84010111156123fc575f80fd5b6020919091019590945092505050565b5f806040838503121561241d575f80fd5b823561242881612180565b9150602083013561228981612180565b60208082526019908201527f45746865722073656e74206973206e6f7420636f727265637400000000000000604082015260600190565b808201808211156106aa576106aa612065565b60208082526016908201527545786365656473206d6178696d756d20737570706c7960501b604082015260600190565b5f600182016124c3576124c3612065565b5060010190565b600181811c908216806124de57607f821691505b6020821081036124fc57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f81518060208401855e5f93019283525090919050565b5f61259261258c8386612567565b84612567565b64173539b7b760d91b8152600501949350505050565b5f602082840312156125b8575f80fd5b81516112db81612180565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b8181101561260d5783516001600160a01b03168352602093840193909201916001016125e6565b50506001600160a01b0395909516604084015250506060015292915050565b5f6020828403121561263c575f80fd5b815167ffffffffffffffff811115612652575f80fd5b8201601f81018413612662575f80fd5b805167ffffffffffffffff81111561267c5761267c612294565b8060051b61268c602082016122a8565b918252602081840181019290810190878411156126a7575f80fd5b6020850194505b838510156126c95784518252602094850194909101906126ae565b979650505050505050565b818103818111156106aa576106aa612065565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b5f8261274757612747612051565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061277e90830184612129565b9695505050505050565b5f60208284031215612798575f80fd5b81516112db816120f6565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212208f4b74e7e24ad53e47d2f89c7cdbbc895011e752a2a8e2d2b755cfeb01e7a71264736f6c634300081a003368747470733a2f2f617277656176652e6e65742f367571364e6f6e4c6b4a41317051523039494658385a7a333241487970553542446d314648646d337733302f636f6e74726163745f6d657461646174612e6a736f6e68747470733a2f2f617277656176652e6e65742f6a413953345039786b5f35524e6f5777567978527372796964636670525330613457483231376852304a592f
Deployed Bytecode
0x6080604052600436106101cc575f3560e01c806345c0f533116100f6578063a9decdda11610094578063e150007e11610063578063e150007e14610602578063e8a3d48514610617578063e985e9c51461062b578063ff81ff1c14610672576101cc565b8063a9decdda1461059d578063b88d4fde146105a5578063c87b56dd146105c4578063d8f4b089146105e3576101cc565b806370a08231116100d057806370a0823114610536578063933e95b21461055557806395d89b411461056a578063a22cb4651461057e576101cc565b806345c0f533146104c55780634f6ccce7146104f85780636352211e14610517576101cc565b80632009dbf21161016e57806330503c4e1161013d57806330503c4e146104535780633f85880d1461047257806342842e0e1461047a578063438b630014610499576101cc565b80632009dbf2146103ec57806323b872dd1461040057806323cf98821461041f5780632f745c5914610434576101cc565b80630788ce79116101aa5780630788ce7914610370578063081812fc14610378578063095ea7b3146103af57806318160ddd146103ce576101cc565b806301ffc9a714610313578063044b4b5d1461034757806306fdde031461034f575b5f34116102105760405162461bcd60e51b815260206004820152600d60248201526c139bc8115d1a195c881cd95b9d609a1b60448201526064015b60405180910390fd5b5f61021c600334612079565b6040519091505f9073e4017661491fa0fbeae3734018e8d2b5cb218a9f9083908381818185875af1925050503d805f8114610272576040519150601f19603f3d011682016040523d82523d5f602084013e610277565b606091505b50509050806102985760405162461bcd60e51b81526004016102079061208c565b6040515f90732c4ae75ef6af3c67bbcf7897864b8d2da237f0d79084908381818185875af1925050503d805f81146102eb576040519150601f19603f3d011682016040523d82523d5f602084013e6102f0565b606091505b50509050806103115760405162461bcd60e51b8152600401610207906120c1565b005b34801561031e575f80fd5b5061033261032d36600461210e565b610686565b60405190151581526020015b60405180910390f35b6103116106b0565b34801561035a575f80fd5b50610363610871565b60405161033e9190612157565b610311610900565b348015610383575f80fd5b50610397610392366004612169565b610ade565b6040516001600160a01b03909116815260200161033e565b3480156103ba575f80fd5b506103116103c9366004612194565b610b71565b3480156103d9575f80fd5b506008545b60405190815260200161033e565b3480156103f7575f80fd5b506103de610c80565b34801561040b575f80fd5b5061031161041a3660046121be565b610c96565b34801561042a575f80fd5b506103de60135481565b34801561043f575f80fd5b506103de61044e366004612194565b610cc7565b34801561045e575f80fd5b50601254610397906001600160a01b031681565b610311610d5b565b348015610485575f80fd5b506103116104943660046121be565b610e14565b3480156104a4575f80fd5b506104b86104b33660046121fc565b610e2e565b60405161033e9190612217565b3480156104d0575f80fd5b506103de7f00000000000000000000000000000000000000000000000000000000000013a581565b348015610503575f80fd5b506103de610512366004612169565b610ec3565b348015610522575f80fd5b50610397610531366004612169565b610f53565b348015610541575f80fd5b506103de6105503660046121fc565b610fc9565b348015610560575f80fd5b506103de60155481565b348015610575575f80fd5b5061036361104e565b348015610589575f80fd5b50610311610598366004612259565b61105d565b610311611120565b3480156105b0575f80fd5b506103116105bf3660046122d9565b6111d9565b3480156105cf575f80fd5b506103636105de366004612169565b61120b565b3480156105ee575f80fd5b506103116105fd36600461239b565b6112e2565b34801561060d575f80fd5b506103de60145481565b348015610622575f80fd5b50610363611508565b348015610636575f80fd5b5061033261064536600461240c565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b34801561067d575f80fd5b50610311611517565b5f6001600160e01b0319821663780e9d6360e01b14806106aa57506106aa826116ec565b92915050565b600c543410156106d25760405162461bcd60e51b815260040161020790612438565b7f00000000000000000000000000000000000000000000000000000000000013a5601554601454610703919061246f565b61070e90600161246f565b111561072c5760405162461bcd60e51b815260040161020790612482565b5f601554601354600161073f919061246f565b610749919061246f565b9050610755338261173b565b60158054905f610764836124b2565b909155505f9050610776600334612079565b6040519091505f9073e4017661491fa0fbeae3734018e8d2b5cb218a9f9083908381818185875af1925050503d805f81146107cc576040519150601f19603f3d011682016040523d82523d5f602084013e6107d1565b606091505b50509050806107f25760405162461bcd60e51b81526004016102079061208c565b6040515f90732c4ae75ef6af3c67bbcf7897864b8d2da237f0d79084908381818185875af1925050503d805f8114610845576040519150601f19603f3d011682016040523d82523d5f602084013e61084a565b606091505b505090508061086b5760405162461bcd60e51b8152600401610207906120c1565b50505050565b60605f805461087f906124ca565b80601f01602080910402602001604051908101604052809291908181526020018280546108ab906124ca565b80156108f65780601f106108cd576101008083540402835291602001916108f6565b820191905f5260205f20905b8154815290600101906020018083116108d957829003601f168201915b5050505050905090565b600d543410156109225760405162461bcd60e51b815260040161020790612438565b7f00000000000000000000000000000000000000000000000000000000000013a5601554601454610953919061246f565b61095e90600361246f565b111561097c5760405162461bcd60e51b815260040161020790612482565b5f5b60038110156109bf576109b73382601554601354600161099e919061246f565b6109a8919061246f565b6109b2919061246f565b61173b565b60010161097e565b50600360155f8282546109d2919061246f565b909155505f90506109e4600334612079565b6040519091505f9073e4017661491fa0fbeae3734018e8d2b5cb218a9f9083908381818185875af1925050503d805f8114610a3a576040519150601f19603f3d011682016040523d82523d5f602084013e610a3f565b606091505b5050905080610a605760405162461bcd60e51b81526004016102079061208c565b6040515f90732c4ae75ef6af3c67bbcf7897864b8d2da237f0d79084908381818185875af1925050503d805f8114610ab3576040519150601f19603f3d011682016040523d82523d5f602084013e610ab8565b606091505b5050905080610ad95760405162461bcd60e51b8152600401610207906120c1565b505050565b5f818152600260205260408120546001600160a01b0316610b565760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610207565b505f908152600460205260409020546001600160a01b031690565b5f610b7b82610f53565b9050806001600160a01b0316836001600160a01b031603610be85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610207565b336001600160a01b0382161480610c045750610c048133610645565b610c765760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610207565b610ad98383611758565b5f601554601354610c91919061246f565b905090565b610ca033826117c5565b610cbc5760405162461bcd60e51b815260040161020790612502565b610ad98383836118b9565b5f610cd183610fc9565b8210610d335760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610207565b506001600160a01b03919091165f908152600660209081526040808320938352929052205490565b600f54341015610d7d5760405162461bcd60e51b815260040161020790612438565b7f00000000000000000000000000000000000000000000000000000000000013a5601554601454610dae919061246f565b610db990600a61246f565b1115610dd75760405162461bcd60e51b815260040161020790612482565b5f5b600a811015610e0157610df93382601554601354600161099e919061246f565b600101610dd9565b50600a60155f8282546109d2919061246f565b610ad983838360405180602001604052805f8152506111d9565b60605f610e3a83610fc9565b90505f8167ffffffffffffffff811115610e5657610e56612294565b604051908082528060200260200182016040528015610e7f578160200160208202803683370190505b5090505f5b82811015610ebb57610e968582610cc7565b828281518110610ea857610ea8612553565b6020908102919091010152600101610e84565b509392505050565b5f610ecd60085490565b8210610f305760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610207565b60088281548110610f4357610f43612553565b905f5260205f2001549050919050565b5f818152600260205260408120546001600160a01b0316806106aa5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610207565b5f6001600160a01b0382166110335760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610207565b506001600160a01b03165f9081526003602052604090205490565b60606001805461087f906124ca565b336001600160a01b038316036110b55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610207565b335f8181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e543410156111425760405162461bcd60e51b815260040161020790612438565b7f00000000000000000000000000000000000000000000000000000000000013a5601554601454611173919061246f565b61117e90600561246f565b111561119c5760405162461bcd60e51b815260040161020790612482565b5f5b60058110156111c6576111be3382601554601354600161099e919061246f565b60010161119e565b50600560155f8282546109d2919061246f565b6111e333836117c5565b6111ff5760405162461bcd60e51b815260040161020790612502565b61086b84848484611a60565b5f818152600260205260409020546060906001600160a01b03166112895760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610207565b5f611292611a93565b90505f8151116112b05760405180602001604052805f8152506112db565b806112ba84611aa2565b6040516020016112cb92919061257e565b6040516020818303038152906040525b9392505050565b80335f5b828110156114eb5760135485858381811061130357611303612553565b9050602002013511156113645760405162461bcd60e51b815260206004820152602360248201527f546f6b656e204944206d757374206265206265747765656e203020616e64203160448201526203835360ec1b6064820152608401610207565b6012546001600160a01b038084169116636352211e87878581811061138b5761138b612553565b905060200201356040518263ffffffff1660e01b81526004016113b091815260200190565b602060405180830381865afa1580156113cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ef91906125a8565b6001600160a01b0316146114455760405162461bcd60e51b815260206004820152601c60248201527f596f7520646f206e6f74206f776e207468697320746f6b656e204944000000006044820152606401610207565b61147d85858381811061145a5761145a612553565b905060200201355f908152600260205260409020546001600160a01b0316151590565b156114c15760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88185b1c9958591e481b5a5b9d195960621b6044820152606401610207565b6114e3828686848181106114d7576114d7612553565b9050602002013561173b565b6001016112e6565b508160145f8282546114fd919061246f565b909155505050505050565b6060600b805461087f906124ca565b47806115655760405162461bcd60e51b815260206004820152601d60248201527f436f6e747261637420686173206e6f20457468657220746f20737761700000006044820152606401610207565b6040805160028082526060820183525f926020830190803683375050601054604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156115cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f091906125a8565b815f8151811061160257611602612553565b60200260200101906001600160a01b031690816001600160a01b03168152505073370a366f402e2e41cdbbe54ecec12aae0cce19558160018151811061164a5761164a612553565b6001600160a01b03909216602092830291909101909101525f61166e4260b461246f565b601054604051637ff36ab560e01b81529192506001600160a01b031690637ff36ab59085906116a9905f90879061dead9088906004016125c3565b5f6040518083038185885af11580156116c4573d5f803e3d5ffd5b50505050506040513d5f823e601f3d908101601f1916820160405261086b919081019061262c565b5f6001600160e01b031982166380ac58cd60e01b148061171c57506001600160e01b03198216635b5e139f60e01b145b806106aa57506301ffc9a760e01b6001600160e01b03198316146106aa565b611754828260405180602001604052805f815250611b9f565b5050565b5f81815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061178c82610f53565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f818152600260205260408120546001600160a01b031661183d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610207565b5f61184783610f53565b9050806001600160a01b0316846001600160a01b031614806118825750836001600160a01b031661187784610ade565b6001600160a01b0316145b806118b157506001600160a01b038082165f9081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166118cc82610f53565b6001600160a01b0316146119345760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610207565b6001600160a01b0382166119965760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610207565b6119a1838383611bd1565b6119ab5f82611758565b6001600160a01b0383165f9081526003602052604081208054600192906119d39084906126d4565b90915550506001600160a01b0382165f908152600360205260408120805460019290611a0090849061246f565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611a6b8484846118b9565b611a7784848484611c88565b61086b5760405162461bcd60e51b8152600401610207906126e7565b6060600a805461087f906124ca565b6060815f03611ac85750506040805180820190915260018152600360fc1b602082015290565b815f5b8115611af15780611adb816124b2565b9150611aea9050600a83612079565b9150611acb565b5f8167ffffffffffffffff811115611b0b57611b0b612294565b6040519080825280601f01601f191660200182016040528015611b35576020820181803683370190505b5090505b84156118b157611b4a6001836126d4565b9150611b57600a86612739565b611b6290603061246f565b60f81b818381518110611b7757611b77612553565b60200101906001600160f81b03191690815f1a905350611b98600a86612079565b9450611b39565b611ba98383611d85565b611bb55f848484611c88565b610ad95760405162461bcd60e51b8152600401610207906126e7565b6001600160a01b038316611c2b57611c2681600880545f838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611c4e565b816001600160a01b0316836001600160a01b031614611c4e57611c4e8382611ecf565b6001600160a01b038216611c6557610ad981611f68565b826001600160a01b0316826001600160a01b031614610ad957610ad9828261200f565b5f6001600160a01b0384163b15611d7a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ccb90339089908890889060040161274c565b6020604051808303815f875af1925050508015611d05575060408051601f3d908101601f19168201909252611d0291810190612788565b60015b611d60573d808015611d32576040519150601f19603f3d011682016040523d82523d5f602084013e611d37565b606091505b5080515f03611d585760405162461bcd60e51b8152600401610207906126e7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118b1565b506001949350505050565b6001600160a01b038216611ddb5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610207565b5f818152600260205260409020546001600160a01b031615611e3f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610207565b611e4a5f8383611bd1565b6001600160a01b0382165f908152600360205260408120805460019290611e7290849061246f565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f6001611edb84610fc9565b611ee591906126d4565b5f83815260076020526040902054909150808214611f36576001600160a01b0384165f9081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b505f9182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008545f90611f79906001906126d4565b5f8381526009602052604081205460088054939450909284908110611fa057611fa0612553565b905f5260205f20015490508060088381548110611fbf57611fbf612553565b5f918252602080832090910192909255828152600990915260408082208490558582528120556008805480611ff657611ff66127a3565b600190038181905f5260205f20015f9055905550505050565b5f61201983610fc9565b6001600160a01b039093165f908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261208757612087612051565b500490565b6020808252818101527f5472616e7366657220746f2053415241485f41444452455353206661696c6564604082015260600190565b6020808252818101527f5472616e7366657220746f20434f4d49435f41444452455353206661696c6564604082015260600190565b6001600160e01b03198116811461210b575f80fd5b50565b5f6020828403121561211e575f80fd5b81356112db816120f6565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112db6020830184612129565b5f60208284031215612179575f80fd5b5035919050565b6001600160a01b038116811461210b575f80fd5b5f80604083850312156121a5575f80fd5b82356121b081612180565b946020939093013593505050565b5f805f606084860312156121d0575f80fd5b83356121db81612180565b925060208401356121eb81612180565b929592945050506040919091013590565b5f6020828403121561220c575f80fd5b81356112db81612180565b602080825282518282018190525f918401906040840190835b8181101561224e578351835260209384019390920191600101612230565b509095945050505050565b5f806040838503121561226a575f80fd5b823561227581612180565b915060208301358015158114612289575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156122d1576122d1612294565b604052919050565b5f805f80608085870312156122ec575f80fd5b84356122f781612180565b9350602085013561230781612180565b925060408501359150606085013567ffffffffffffffff811115612329575f80fd5b8501601f81018713612339575f80fd5b803567ffffffffffffffff81111561235357612353612294565b612366601f8201601f19166020016122a8565b81815288602083850101111561237a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80602083850312156123ac575f80fd5b823567ffffffffffffffff8111156123c2575f80fd5b8301601f810185136123d2575f80fd5b803567ffffffffffffffff8111156123e8575f80fd5b8560208260051b84010111156123fc575f80fd5b6020919091019590945092505050565b5f806040838503121561241d575f80fd5b823561242881612180565b9150602083013561228981612180565b60208082526019908201527f45746865722073656e74206973206e6f7420636f727265637400000000000000604082015260600190565b808201808211156106aa576106aa612065565b60208082526016908201527545786365656473206d6178696d756d20737570706c7960501b604082015260600190565b5f600182016124c3576124c3612065565b5060010190565b600181811c908216806124de57607f821691505b6020821081036124fc57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f81518060208401855e5f93019283525090919050565b5f61259261258c8386612567565b84612567565b64173539b7b760d91b8152600501949350505050565b5f602082840312156125b8575f80fd5b81516112db81612180565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b8181101561260d5783516001600160a01b03168352602093840193909201916001016125e6565b50506001600160a01b0395909516604084015250506060015292915050565b5f6020828403121561263c575f80fd5b815167ffffffffffffffff811115612652575f80fd5b8201601f81018413612662575f80fd5b805167ffffffffffffffff81111561267c5761267c612294565b8060051b61268c602082016122a8565b918252602081840181019290810190878411156126a7575f80fd5b6020850194505b838510156126c95784518252602094850194909101906126ae565b979650505050505050565b818103818111156106aa576106aa612065565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b5f8261274757612747612051565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061277e90830184612129565b9695505050505050565b5f60208284031215612798575f80fd5b81516112db816120f6565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212208f4b74e7e24ad53e47d2f89c7cdbbc895011e752a2a8e2d2b755cfeb01e7a71264736f6c634300081a0033
Deployed Bytecode Sourcemap
42938:7619:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50202:1;50190:9;:13;50182:39;;;;-1:-1:-1;;;50182:39:0;;216:2:1;50182:39:0;;;198:21:1;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:43;327:18;;50182:39:0;;;;;;;;;50230:20;50253:13;50265:1;50253:9;:13;:::i;:::-;50299:43;;50230:36;;-1:-1:-1;50276:17:0;;43968:42;;50230:36;;50276:17;50299:43;50276:17;50299:43;50230:36;43968:42;50299:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50275:67;;;50357:12;50349:57;;;;-1:-1:-1;;;50349:57:0;;;;;;;:::i;:::-;50439:43;;50416:17;;44058:42;;50465:12;;50416:17;50439:43;50416:17;50439:43;50465:12;44058:42;50439:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50415:67;;;50497:12;50489:57;;;;-1:-1:-1;;;50489:57:0;;;;;;;:::i;:::-;50175:379;36142:266;;;;;;;;;;-1:-1:-1;36142:266:0;;;;;:::i;:::-;;:::i;:::-;;;2228:14:1;;2221:22;2203:41;;2191:2;2176:18;36142:266:0;;;;;;;;45447:703;;;:::i;23519:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;46158:726::-;;;:::i;25075:274::-;;;;;;;;;;-1:-1:-1;25075:274:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3191:32:1;;;3173:51;;3161:2;3146:18;25075:274:0;3027:203:1;24598:411:0;;;;;;;;;;-1:-1:-1;24598:411:0;;;;;:::i;:::-;;:::i;36886:113::-;;;;;;;;;;-1:-1:-1;36974:10:0;:17;36886:113;;;3889:25:1;;;3877:2;3862:18;36886:113:0;3743:177:1;48365:126:0;;;;;;;;;;;;;:::i;26068:376::-;;;;;;;;;;-1:-1:-1;26068:376:0;;;;;:::i;:::-;;:::i;44322:39::-;;;;;;;;;;;;;;;;36492:318;;;;;;;;;;-1:-1:-1;36492:318:0;;;;;:::i;:::-;;:::i;44145:31::-;;;;;;;;;;-1:-1:-1;44145:31:0;;;;-1:-1:-1;;;;;44145:31:0;;;47626:731;;;:::i;26515:185::-;;;;;;;;;;-1:-1:-1;26515:185:0;;;;;:::i;:::-;;:::i;48585:361::-;;;;;;;;;;-1:-1:-1;48585:361:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43484:46::-;;;;;;;;;;;;;;;37076:286;;;;;;;;;;-1:-1:-1;37076:286:0;;;;;:::i;:::-;;:::i;23160:292::-;;;;;;;;;;-1:-1:-1;23160:292:0;;;;;:::i;:::-;;:::i;22837:261::-;;;;;;;;;;-1:-1:-1;22837:261:0;;;;;:::i;:::-;;:::i;44463:32::-;;;;;;;;;;;;;;;;23688:104;;;;;;;;;;;;;:::i;25421:320::-;;;;;;;;;;-1:-1:-1;25421:320:0;;;;;:::i;:::-;;:::i;46892:726::-;;;:::i;26771:365::-;;;;;;;;;;-1:-1:-1;26771:365:0;;;;;:::i;:::-;;:::i;23863:442::-;;;;;;;;;;-1:-1:-1;23863:442:0;;;;;:::i;:::-;;:::i;44734:661::-;;;;;;;;;;-1:-1:-1;44734:661:0;;;;;:::i;:::-;;:::i;44427:29::-;;;;;;;;;;;;;;;;49140:101;;;;;;;;;;;;;:::i;25812:189::-;;;;;;;;;;-1:-1:-1;25812:189:0;;;;;:::i;:::-;-1:-1:-1;;;;;25958:25:0;;;25934:4;25958:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25812:189;49249:814;;;;;;;;;;;;;:::i;36142:266::-;36260:4;-1:-1:-1;;;;;;36297:50:0;;-1:-1:-1;;;36297:50:0;;:103;;;36364:36;36388:11;36364:23;:36::i;:::-;36277:123;36142:266;-1:-1:-1;;36142:266:0:o;45447:703::-;45511:7;;45498:9;:20;;45490:58;;;;-1:-1:-1;;;45490:58:0;;;;;;;:::i;:::-;45609:14;45584:17;;45567:14;;:34;;;;:::i;:::-;:38;;45604:1;45567:38;:::i;:::-;:56;;45559:91;;;;-1:-1:-1;;;45559:91:0;;;;;;;:::i;:::-;45663:18;45708:17;;45684;;45704:1;45684:21;;;;:::i;:::-;:41;;;;:::i;:::-;45663:62;;45736:33;45746:10;45758;45736:9;:33::i;:::-;45780:17;:19;;;:17;:19;;;:::i;:::-;;;;-1:-1:-1;45812:20:0;;-1:-1:-1;45835:13:0;45847:1;45835:9;:13;:::i;:::-;45883:43;;45812:36;;-1:-1:-1;45860:17:0;;43968:42;;45812:36;;45860:17;45883:43;45860:17;45883:43;45812:36;43968:42;45883:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45859:67;;;45945:12;45937:57;;;;-1:-1:-1;;;45937:57:0;;;;;;;:::i;:::-;46031:43;;46008:17;;44058:42;;46057:12;;46008:17;46031:43;46008:17;46031:43;46057:12;44058:42;46031:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46007:67;;;46093:12;46085:57;;;;-1:-1:-1;;;46085:57:0;;;;;;;:::i;:::-;45479:671;;;;45447:703::o;23519:100::-;23573:13;23606:5;23599:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23519:100;:::o;46158:726::-;46222:7;;46209:9;:20;;46201:58;;;;-1:-1:-1;;;46201:58:0;;;;;;;:::i;:::-;46320:14;46295:17;;46278:14;;:34;;;;:::i;:::-;:38;;46315:1;46278:38;:::i;:::-;:56;;46270:91;;;;-1:-1:-1;;;46270:91:0;;;;;;;:::i;:::-;46379:9;46374:127;46398:1;46394;:5;46374:127;;;46421:68;46431:10;46487:1;46467:17;;46443;;46463:1;46443:21;;;;:::i;:::-;:41;;;;:::i;:::-;:45;;;;:::i;:::-;46421:9;:68::i;:::-;46401:3;;46374:127;;;;46532:1;46511:17;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;46546:20:0;;-1:-1:-1;46569:13:0;46581:1;46569:9;:13;:::i;:::-;46617:43;;46546:36;;-1:-1:-1;46594:17:0;;43968:42;;46546:36;;46594:17;46617:43;46594:17;46617:43;46546:36;43968:42;46617:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46593:67;;;46679:12;46671:57;;;;-1:-1:-1;;;46671:57:0;;;;;;;:::i;:::-;46765:43;;46742:17;;44058:42;;46791:12;;46742:17;46765:43;46742:17;46765:43;46791:12;44058:42;46765:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46741:67;;;46827:12;46819:57;;;;-1:-1:-1;;;46819:57:0;;;;;;;:::i;:::-;46190:694;;;46158:726::o;25075:274::-;25167:7;28772:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28772:16:0;25187:110;;;;-1:-1:-1;;;25187:110:0;;10105:2:1;25187:110:0;;;10087:21:1;10144:2;10124:18;;;10117:30;10183:34;10163:18;;;10156:62;-1:-1:-1;;;10234:18:1;;;10227:42;10286:19;;25187:110:0;9903:408:1;25187:110:0;-1:-1:-1;25317:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25317:24:0;;25075:274::o;24598:411::-;24679:13;24695:23;24710:7;24695:14;:23::i;:::-;24679:39;;24743:5;-1:-1:-1;;;;;24737:11:0;:2;-1:-1:-1;;;;;24737:11:0;;24729:57;;;;-1:-1:-1;;;24729:57:0;;10518:2:1;24729:57:0;;;10500:21:1;10557:2;10537:18;;;10530:30;10596:34;10576:18;;;10569:62;-1:-1:-1;;;10647:18:1;;;10640:31;10688:19;;24729:57:0;10316:397:1;24729:57:0;18054:10;-1:-1:-1;;;;;24821:21:0;;;;:62;;-1:-1:-1;24846:37:0;24863:5;18054:10;25812:189;:::i;24846:37::-;24799:168;;;;-1:-1:-1;;;24799:168:0;;10920:2:1;24799:168:0;;;10902:21:1;10959:2;10939:18;;;10932:30;10998:34;10978:18;;;10971:62;11069:26;11049:18;;;11042:54;11113:19;;24799:168:0;10718:420:1;24799:168:0;24980:21;24989:2;24993:7;24980:8;:21::i;48365:126::-;48419:7;48466:17;;48446;;:37;;;;:::i;:::-;48439:44;;48365:126;:::o;26068:376::-;26277:41;18054:10;26310:7;26277:18;:41::i;:::-;26255:140;;;;-1:-1:-1;;;26255:140:0;;;;;;;:::i;:::-;26408:28;26418:4;26424:2;26428:7;26408:9;:28::i;36492:318::-;36614:7;36664:23;36681:5;36664:16;:23::i;:::-;36656:5;:31;36634:124;;;;-1:-1:-1;;;36634:124:0;;11763:2:1;36634:124:0;;;11745:21:1;11802:2;11782:18;;;11775:30;11841:34;11821:18;;;11814:62;-1:-1:-1;;;11892:18:1;;;11885:41;11943:19;;36634:124:0;11561:407:1;36634:124:0;-1:-1:-1;;;;;;36776:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36492:318::o;47626:731::-;47691:8;;47678:9;:21;;47670:59;;;;-1:-1:-1;;;47670:59:0;;;;;;;:::i;:::-;47791:14;47765:17;;47748:14;;:34;;;;:::i;:::-;:39;;47785:2;47748:39;:::i;:::-;:57;;47740:92;;;;-1:-1:-1;;;47740:92:0;;;;;;;:::i;:::-;47850:9;47845:128;47869:2;47865:1;:6;47845:128;;;47893:68;47903:10;47959:1;47939:17;;47915;;47935:1;47915:21;;;;:::i;47893:68::-;47873:3;;47845:128;;;;48004:2;47983:17;;:23;;;;;;;:::i;26515:185::-;26653:39;26670:4;26676:2;26680:7;26653:39;;;;;;;;;;;;:16;:39::i;48585:361::-;48661:16;48690:18;48711:17;48721:6;48711:9;:17::i;:::-;48690:38;;48741:25;48783:10;48769:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48769:25:0;;48741:53;;48810:9;48805:108;48825:10;48821:1;:14;48805:108;;;48871:30;48891:6;48899:1;48871:19;:30::i;:::-;48857:8;48866:1;48857:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;48837:3;;48805:108;;;-1:-1:-1;48930:8:0;48585:361;-1:-1:-1;;;48585:361:0:o;37076:286::-;37167:7;37217:30;36974:10;:17;;36886:113;37217:30;37209:5;:38;37187:132;;;;-1:-1:-1;;;37187:132:0;;12307:2:1;37187:132:0;;;12289:21:1;12346:2;12326:18;;;12319:30;12385:34;12365:18;;;12358:62;-1:-1:-1;;;12436:18:1;;;12429:42;12488:19;;37187:132:0;12105:408:1;37187:132:0;37337:10;37348:5;37337:17;;;;;;;;:::i;:::-;;;;;;;;;37330:24;;37076:286;;;:::o;23160:292::-;23248:7;23284:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23284:16:0;;23311:110;;;;-1:-1:-1;;;23311:110:0;;12720:2:1;23311:110:0;;;12702:21:1;12759:2;12739:18;;;12732:30;12798:34;12778:18;;;12771:62;-1:-1:-1;;;12849:18:1;;;12842:39;12898:19;;23311:110:0;12518:405:1;22837:261:0;22925:7;-1:-1:-1;;;;;22967:19:0;;22945:111;;;;-1:-1:-1;;;22945:111:0;;13130:2:1;22945:111:0;;;13112:21:1;13169:2;13149:18;;;13142:30;13208:34;13188:18;;;13181:62;-1:-1:-1;;;13259:18:1;;;13252:40;13309:19;;22945:111:0;12928:406:1;22945:111:0;-1:-1:-1;;;;;;23074:16:0;;;;;:9;:16;;;;;;;22837:261::o;23688:104::-;23744:13;23777:7;23770:14;;;;;:::i;25421:320::-;18054:10;-1:-1:-1;;;;;25549:24:0;;;25541:62;;;;-1:-1:-1;;;25541:62:0;;13541:2:1;25541:62:0;;;13523:21:1;13580:2;13560:18;;;13553:30;13619:27;13599:18;;;13592:55;13664:18;;25541:62:0;13339:349:1;25541:62:0;18054:10;25616:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25616:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25616:53:0;;;;;;;;;;25685:48;;2203:41:1;;;25616:42:0;;18054:10;25685:48;;2176:18:1;25685:48:0;;;;;;;25421:320;;:::o;46892:726::-;46956:7;;46943:9;:20;;46935:58;;;;-1:-1:-1;;;46935:58:0;;;;;;;:::i;:::-;47054:14;47029:17;;47012:14;;:34;;;;:::i;:::-;:38;;47049:1;47012:38;:::i;:::-;:56;;47004:91;;;;-1:-1:-1;;;47004:91:0;;;;;;;:::i;:::-;47113:9;47108:127;47132:1;47128;:5;47108:127;;;47155:68;47165:10;47221:1;47201:17;;47177;;47197:1;47177:21;;;;:::i;47155:68::-;47135:3;;47108:127;;;;47266:1;47245:17;;:22;;;;;;;:::i;26771:365::-;26960:41;18054:10;26993:7;26960:18;:41::i;:::-;26938:140;;;;-1:-1:-1;;;26938:140:0;;;;;;;:::i;:::-;27089:39;27103:4;27109:2;27113:7;27122:5;27089:13;:39::i;23863:442::-;28748:4;28772:16;;;:7;:16;;;;;;23952:13;;-1:-1:-1;;;;;28772:16:0;23978:113;;;;-1:-1:-1;;;23978:113:0;;13895:2:1;23978:113:0;;;13877:21:1;13934:2;13914:18;;;13907:30;13973:34;13953:18;;;13946:62;-1:-1:-1;;;14024:18:1;;;14017:45;14079:19;;23978:113:0;13693:411:1;23978:113:0;24104:21;24128:10;:8;:10::i;:::-;24104:34;;24193:1;24175:7;24169:21;:25;:128;;;;;;;;;;;;;;;;;24238:7;24247:18;:7;:16;:18::i;:::-;24221:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24169:128;24149:148;23863:442;-1:-1:-1;;;23863:442:0:o;44734:661::-;44816:8;44859:10;44799:14;44882:389;44906:6;44902:1;:10;44882:389;;;44954:17;;44939:8;;44948:1;44939:11;;;;;;;:::i;:::-;;;;;;;:32;;44931:80;;;;-1:-1:-1;;;44931:80:0;;14958:2:1;44931:80:0;;;14940:21:1;14997:2;14977:18;;;14970:30;15036:34;15016:18;;;15009:62;-1:-1:-1;;;15087:18:1;;;15080:33;15130:19;;44931:80:0;14756:399:1;44931:80:0;45034:11;;-1:-1:-1;;;;;45034:42:0;;;;:11;:19;45054:8;;45063:1;45054:11;;;;;;;:::i;:::-;;;;;;;45034:32;;;;;;;;;;;;;3889:25:1;;3877:2;3862:18;;3743:177;45034:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45034:42:0;;45026:83;;;;-1:-1:-1;;;45026:83:0;;15618:2:1;45026:83:0;;;15600:21:1;15657:2;15637:18;;;15630:30;15696;15676:18;;;15669:58;15744:18;;45026:83:0;15416:352:1;45026:83:0;45133:20;45141:8;;45150:1;45141:11;;;;;;;:::i;:::-;;;;;;;28748:4;28772:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28772:16:0;:30;;;28683:127;45133:20;45132:21;45124:54;;;;-1:-1:-1;;;45124:54:0;;15975:2:1;45124:54:0;;;15957:21:1;16014:2;15994:18;;;15987:30;-1:-1:-1;;;16033:18:1;;;16026:50;16093:18;;45124:54:0;15773:344:1;45124:54:0;45195:30;45205:6;45213:8;;45222:1;45213:11;;;;;;;:::i;:::-;;;;;;;45195:9;:30::i;:::-;45254:3;;44882:389;;;;45381:6;45363:14;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;44734:661:0:o;49140:101::-;49184:13;49217:16;49210:23;;;;;:::i;49249:814::-;49309:21;49397:13;49389:55;;;;-1:-1:-1;;;49389:55:0;;16324:2:1;49389:55:0;;;16306:21:1;16363:2;16343:18;;;16336:30;16402:31;16382:18;;;16375:59;16451:18;;49389:55:0;16122:353:1;49389:55:0;49553:16;;;49567:1;49553:16;;;;;;;;49529:21;;49553:16;;;;;;;;-1:-1:-1;;49590:13:0;;:20;;;-1:-1:-1;;;49590:20:0;;;;49529:40;;-1:-1:-1;;;;;;49590:13:0;;;;:18;;-1:-1:-1;49590:20:0;;;;;;;;;;;;;;:13;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49580:4;49585:1;49580:7;;;;;;;;:::i;:::-;;;;;;:30;-1:-1:-1;;;;;49580:30:0;;;-1:-1:-1;;;;;49580:30:0;;;;;43767:42;49621:4;49626:1;49621:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49621:22:0;;;:7;;;;;;;;;;;:22;49710:16;49729:21;:15;49747:3;49729:21;:::i;:::-;49822:13;;:233;;-1:-1:-1;;;49822:233:0;;49710:40;;-1:-1:-1;;;;;;49822:13:0;;:35;;49865:9;;49822:233;;:13;;49947:4;;43856:42;;49710:40;;49822:233;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49822:233:0;;;;;;;;;;;;:::i;22452:321::-;22570:4;-1:-1:-1;;;;;;22607:40:0;;-1:-1:-1;;;22607:40:0;;:105;;-1:-1:-1;;;;;;;22664:48:0;;-1:-1:-1;;;22664:48:0;22607:105;:158;;;-1:-1:-1;;;;;;;;;;2444:40:0;;;22729:36;2319:173;29755:110;29831:26;29841:2;29845:7;29831:26;;;;;;;;;;;;:9;:26::i;:::-;29755:110;;:::o;32790:174::-;32865:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32865:29:0;-1:-1:-1;;;;;32865:29:0;;;;;;;;:24;;32919:23;32865:24;32919:14;:23::i;:::-;-1:-1:-1;;;;;32910:46:0;;;;;;;;;;;32790:174;;:::o;28977:436::-;29095:4;28772:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28772:16:0;29112:110;;;;-1:-1:-1;;;29112:110:0;;18505:2:1;29112:110:0;;;18487:21:1;18544:2;18524:18;;;18517:30;18583:34;18563:18;;;18556:62;-1:-1:-1;;;18634:18:1;;;18627:42;18686:19;;29112:110:0;18303:408:1;29112:110:0;29233:13;29249:23;29264:7;29249:14;:23::i;:::-;29233:39;;29302:5;-1:-1:-1;;;;;29291:16:0;:7;-1:-1:-1;;;;;29291:16:0;;:64;;;;29348:7;-1:-1:-1;;;;;29324:31:0;:20;29336:7;29324:11;:20::i;:::-;-1:-1:-1;;;;;29324:31:0;;29291:64;:113;;;-1:-1:-1;;;;;;25958:25:0;;;25934:4;25958:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29372:32;29283:122;28977:436;-1:-1:-1;;;;28977:436:0:o;32057:615::-;32230:4;-1:-1:-1;;;;;32203:31:0;:23;32218:7;32203:14;:23::i;:::-;-1:-1:-1;;;;;32203:31:0;;32181:122;;;;-1:-1:-1;;;32181:122:0;;18918:2:1;32181:122:0;;;18900:21:1;18957:2;18937:18;;;18930:30;18996:34;18976:18;;;18969:62;-1:-1:-1;;;19047:18:1;;;19040:39;19096:19;;32181:122:0;18716:405:1;32181:122:0;-1:-1:-1;;;;;32322:16:0;;32314:65;;;;-1:-1:-1;;;32314:65:0;;19328:2:1;32314:65:0;;;19310:21:1;19367:2;19347:18;;;19340:30;19406:34;19386:18;;;19379:62;-1:-1:-1;;;19457:18:1;;;19450:34;19501:19;;32314:65:0;19126:400:1;32314:65:0;32392:39;32413:4;32419:2;32423:7;32392:20;:39::i;:::-;32496:29;32513:1;32517:7;32496:8;:29::i;:::-;-1:-1:-1;;;;;32538:15:0;;;;;;:9;:15;;;;;:20;;32557:1;;32538:15;:20;;32557:1;;32538:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32569:13:0;;;;;;:9;:13;;;;;:18;;32586:1;;32569:13;:18;;32586:1;;32569:18;:::i;:::-;;;;-1:-1:-1;;32598:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32598:21:0;-1:-1:-1;;;;;32598:21:0;;;;;;;;;32637:27;;32598:16;;32637:27;;;;;;;32057:615;;;:::o;28018:352::-;28175:28;28185:4;28191:2;28195:7;28175:9;:28::i;:::-;28236:48;28259:4;28265:2;28269:7;28278:5;28236:22;:48::i;:::-;28214:148;;;;-1:-1:-1;;;28214:148:0;;;;;;;:::i;48979:114::-;49039:13;49072;49065:20;;;;;:::i;18544:723::-;18600:13;18821:5;18830:1;18821:10;18817:53;;-1:-1:-1;;18848:10:0;;;;;;;;;;;;-1:-1:-1;;;18848:10:0;;;;;18544:723::o;18817:53::-;18895:5;18880:12;18936:78;18943:9;;18936:78;;18969:8;;;;:::i;:::-;;-1:-1:-1;18992:10:0;;-1:-1:-1;19000:2:0;18992:10;;:::i;:::-;;;18936:78;;;19024:19;19056:6;19046:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19046:17:0;;19024:39;;19074:154;19081:10;;19074:154;;19108:11;19118:1;19108:11;;:::i;:::-;;-1:-1:-1;19177:10:0;19185:2;19177:5;:10;:::i;:::-;19164:24;;:2;:24;:::i;:::-;19151:39;;19134:6;19141;19134:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;19134:56:0;;;;;;;;-1:-1:-1;19205:11:0;19214:2;19205:11;;:::i;:::-;;;19074:154;;30092:321;30222:18;30228:2;30232:7;30222:5;:18::i;:::-;30273:54;30304:1;30308:2;30312:7;30321:5;30273:22;:54::i;:::-;30251:154;;;;-1:-1:-1;;;30251:154:0;;;;;;;:::i;37975:589::-;-1:-1:-1;;;;;38181:18:0;;38177:187;;38216:40;38248:7;39391:10;:17;;39364:24;;;;:15;:24;;;;;:44;;;39419:24;;;;;;;;;;;;39287:164;38216:40;38177:187;;;38286:2;-1:-1:-1;;;;;38278:10:0;:4;-1:-1:-1;;;;;38278:10:0;;38274:90;;38305:47;38338:4;38344:7;38305:32;:47::i;:::-;-1:-1:-1;;;;;38378:16:0;;38374:183;;38411:45;38448:7;38411:36;:45::i;38374:183::-;38484:4;-1:-1:-1;;;;;38478:10:0;:2;-1:-1:-1;;;;;38478:10:0;;38474:83;;38505:40;38533:2;38537:7;38505:27;:40::i;33529:1053::-;33684:4;-1:-1:-1;;;;;33705:13:0;;9858:20;9906:8;33701:874;;33758:175;;-1:-1:-1;;;33758:175:0;;-1:-1:-1;;;;;33758:36:0;;;;;:175;;18054:10;;33852:4;;33879:7;;33909:5;;33758:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33758:175:0;;;;;;;;-1:-1:-1;;33758:175:0;;;;;;;;;;;;:::i;:::-;;;33737:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34120:6;:13;34137:1;34120:18;34116:389;;34163:108;;-1:-1:-1;;;34163:108:0;;;;;;;:::i;34116:389::-;34455:6;34449:13;34440:6;34436:2;34432:15;34425:38;33737:783;-1:-1:-1;;;;;;33997:55:0;-1:-1:-1;;;33997:55:0;;-1:-1:-1;33990:62:0;;33701:874;-1:-1:-1;34559:4:0;33529:1053;;;;;;:::o;30749:382::-;-1:-1:-1;;;;;30829:16:0;;30821:61;;;;-1:-1:-1;;;30821:61:0;;21157:2:1;30821:61:0;;;21139:21:1;;;21176:18;;;21169:30;21235:34;21215:18;;;21208:62;21287:18;;30821:61:0;20955:356:1;30821:61:0;28748:4;28772:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28772:16:0;:30;30893:58;;;;-1:-1:-1;;;30893:58:0;;21518:2:1;30893:58:0;;;21500:21:1;21557:2;21537:18;;;21530:30;21596;21576:18;;;21569:58;21644:18;;30893:58:0;21316:352:1;30893:58:0;30964:45;30993:1;30997:2;31001:7;30964:20;:45::i;:::-;-1:-1:-1;;;;;31022:13:0;;;;;;:9;:13;;;;;:18;;31039:1;;31022:13;:18;;31039:1;;31022:18;:::i;:::-;;;;-1:-1:-1;;31051:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31051:21:0;-1:-1:-1;;;;;31051:21:0;;;;;;;;31090:33;;31051:16;;;31090:33;;31051:16;;31090:33;30749:382;;:::o;40078:1013::-;40369:22;40419:1;40394:22;40411:4;40394:16;:22::i;:::-;:26;;;;:::i;:::-;40431:18;40452:26;;;:17;:26;;;;;;40369:51;;-1:-1:-1;40585:28:0;;;40581:328;;-1:-1:-1;;;;;40652:18:0;;40630:19;40652:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40703:30;;;;;;:44;;;40820:30;;:17;:30;;;;;:43;;;40581:328;-1:-1:-1;41005:26:0;;;;:17;:26;;;;;;;;40998:33;;;-1:-1:-1;;;;;41049:18:0;;;;;:12;:18;;;;;:34;;;;;;;41042:41;40078:1013::o;41386:1079::-;41664:10;:17;41639:22;;41664:21;;41684:1;;41664:21;:::i;:::-;41696:18;41717:24;;;:15;:24;;;;;;42090:10;:26;;41639:46;;-1:-1:-1;41717:24:0;;41639:46;;42090:26;;;;;;:::i;:::-;;;;;;;;;42068:48;;42154:11;42129:10;42140;42129:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;42234:28;;;:15;:28;;;;;;;:41;;;42406:24;;;;;42399:31;42441:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41457:1008;;;41386:1079;:::o;38865:221::-;38950:14;38967:20;38984:2;38967:16;:20::i;:::-;-1:-1:-1;;;;;38998:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39043:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38865:221:0:o;356:127:1:-;417:10;412:3;408:20;405:1;398:31;448:4;445:1;438:15;472:4;469:1;462:15;488:127;549:10;544:3;540:20;537:1;530:31;580:4;577:1;570:15;604:4;601:1;594:15;620:120;660:1;686;676:35;;691:18;;:::i;:::-;-1:-1:-1;725:9:1;;620:120::o;955:356::-;1157:2;1139:21;;;1176:18;;;1169:30;1235:34;1230:2;1215:18;;1208:62;1302:2;1287:18;;955:356::o;1316:::-;1518:2;1500:21;;;1537:18;;;1530:30;1596:34;1591:2;1576:18;;1569:62;1663:2;1648:18;;1316:356::o;1677:131::-;-1:-1:-1;;;;;;1751:32:1;;1741:43;;1731:71;;1798:1;1795;1788:12;1731:71;1677:131;:::o;1813:245::-;1871:6;1924:2;1912:9;1903:7;1899:23;1895:32;1892:52;;;1940:1;1937;1930:12;1892:52;1979:9;1966:23;1998:30;2022:5;1998:30;:::i;2255:300::-;2308:3;2346:5;2340:12;2373:6;2368:3;2361:19;2429:6;2422:4;2415:5;2411:16;2404:4;2399:3;2395:14;2389:47;2481:1;2474:4;2465:6;2460:3;2456:16;2452:27;2445:38;2544:4;2537:2;2533:7;2528:2;2520:6;2516:15;2512:29;2507:3;2503:39;2499:50;2492:57;;;2255:300;;;;:::o;2560:231::-;2709:2;2698:9;2691:21;2672:4;2729:56;2781:2;2770:9;2766:18;2758:6;2729:56;:::i;2796:226::-;2855:6;2908:2;2896:9;2887:7;2883:23;2879:32;2876:52;;;2924:1;2921;2914:12;2876:52;-1:-1:-1;2969:23:1;;2796:226;-1:-1:-1;2796:226:1:o;3235:131::-;-1:-1:-1;;;;;3310:31:1;;3300:42;;3290:70;;3356:1;3353;3346:12;3371:367;3439:6;3447;3500:2;3488:9;3479:7;3475:23;3471:32;3468:52;;;3516:1;3513;3506:12;3468:52;3555:9;3542:23;3574:31;3599:5;3574:31;:::i;:::-;3624:5;3702:2;3687:18;;;;3674:32;;-1:-1:-1;;;3371:367:1:o;3925:508::-;4002:6;4010;4018;4071:2;4059:9;4050:7;4046:23;4042:32;4039:52;;;4087:1;4084;4077:12;4039:52;4126:9;4113:23;4145:31;4170:5;4145:31;:::i;:::-;4195:5;-1:-1:-1;4252:2:1;4237:18;;4224:32;4265:33;4224:32;4265:33;:::i;:::-;3925:508;;4317:7;;-1:-1:-1;;;4397:2:1;4382:18;;;;4369:32;;3925:508::o;4667:247::-;4726:6;4779:2;4767:9;4758:7;4754:23;4750:32;4747:52;;;4795:1;4792;4785:12;4747:52;4834:9;4821:23;4853:31;4878:5;4853:31;:::i;4919:611::-;5109:2;5121:21;;;5191:13;;5094:18;;;5213:22;;;5061:4;;5292:15;;;5266:2;5251:18;;;5061:4;5335:169;5349:6;5346:1;5343:13;5335:169;;;5410:13;;5398:26;;5453:2;5479:15;;;;5444:12;;;;5371:1;5364:9;5335:169;;;-1:-1:-1;5521:3:1;;4919:611;-1:-1:-1;;;;;4919:611:1:o;5535:416::-;5600:6;5608;5661:2;5649:9;5640:7;5636:23;5632:32;5629:52;;;5677:1;5674;5667:12;5629:52;5716:9;5703:23;5735:31;5760:5;5735:31;:::i;:::-;5785:5;-1:-1:-1;5842:2:1;5827:18;;5814:32;5884:15;;5877:23;5865:36;;5855:64;;5915:1;5912;5905:12;5855:64;5938:7;5928:17;;;5535:416;;;;;:::o;5956:127::-;6017:10;6012:3;6008:20;6005:1;5998:31;6048:4;6045:1;6038:15;6072:4;6069:1;6062:15;6088:275;6159:2;6153:9;6224:2;6205:13;;-1:-1:-1;;6201:27:1;6189:40;;6259:18;6244:34;;6280:22;;;6241:62;6238:88;;;6306:18;;:::i;:::-;6342:2;6335:22;6088:275;;-1:-1:-1;6088:275:1:o;6368:1162::-;6463:6;6471;6479;6487;6540:3;6528:9;6519:7;6515:23;6511:33;6508:53;;;6557:1;6554;6547:12;6508:53;6596:9;6583:23;6615:31;6640:5;6615:31;:::i;:::-;6665:5;-1:-1:-1;6722:2:1;6707:18;;6694:32;6735:33;6694:32;6735:33;:::i;:::-;6787:7;-1:-1:-1;6867:2:1;6852:18;;6839:32;;-1:-1:-1;6948:2:1;6933:18;;6920:32;6975:18;6964:30;;6961:50;;;7007:1;7004;6997:12;6961:50;7030:22;;7083:4;7075:13;;7071:27;-1:-1:-1;7061:55:1;;7112:1;7109;7102:12;7061:55;7152:2;7139:16;7178:18;7170:6;7167:30;7164:56;;;7200:18;;:::i;:::-;7242:57;7289:2;7266:17;;-1:-1:-1;;7262:31:1;7295:2;7258:40;7242:57;:::i;:::-;7322:6;7315:5;7308:21;7370:7;7365:2;7356:6;7352:2;7348:15;7344:24;7341:37;7338:57;;;7391:1;7388;7381:12;7338:57;7446:6;7441:2;7437;7433:11;7428:2;7421:5;7417:14;7404:49;7498:1;7493:2;7484:6;7477:5;7473:18;7469:27;7462:38;7519:5;7509:15;;;;;6368:1162;;;;;;;:::o;7535:610::-;7621:6;7629;7682:2;7670:9;7661:7;7657:23;7653:32;7650:52;;;7698:1;7695;7688:12;7650:52;7738:9;7725:23;7771:18;7763:6;7760:30;7757:50;;;7803:1;7800;7793:12;7757:50;7826:22;;7879:4;7871:13;;7867:27;-1:-1:-1;7857:55:1;;7908:1;7905;7898:12;7857:55;7948:2;7935:16;7974:18;7966:6;7963:30;7960:50;;;8006:1;8003;7996:12;7960:50;8059:7;8054:2;8044:6;8041:1;8037:14;8033:2;8029:23;8025:32;8022:45;8019:65;;;8080:1;8077;8070:12;8019:65;8111:2;8103:11;;;;;8133:6;;-1:-1:-1;7535:610:1;-1:-1:-1;;;7535:610:1:o;8150:388::-;8218:6;8226;8279:2;8267:9;8258:7;8254:23;8250:32;8247:52;;;8295:1;8292;8285:12;8247:52;8334:9;8321:23;8353:31;8378:5;8353:31;:::i;:::-;8403:5;-1:-1:-1;8460:2:1;8445:18;;8432:32;8473:33;8432:32;8473:33;:::i;8543:349::-;8745:2;8727:21;;;8784:2;8764:18;;;8757:30;8823:27;8818:2;8803:18;;8796:55;8883:2;8868:18;;8543:349::o;8897:125::-;8962:9;;;8983:10;;;8980:36;;;8996:18;;:::i;9027:346::-;9229:2;9211:21;;;9268:2;9248:18;;;9241:30;-1:-1:-1;;;9302:2:1;9287:18;;9280:52;9364:2;9349:18;;9027:346::o;9378:135::-;9417:3;9438:17;;;9435:43;;9458:18;;:::i;:::-;-1:-1:-1;9505:1:1;9494:13;;9378:135::o;9518:380::-;9597:1;9593:12;;;;9640;;;9661:61;;9715:4;9707:6;9703:17;9693:27;;9661:61;9768:2;9760:6;9757:14;9737:18;9734:38;9731:161;;9814:10;9809:3;9805:20;9802:1;9795:31;9849:4;9846:1;9839:15;9877:4;9874:1;9867:15;9731:161;;9518:380;;;:::o;11143:413::-;11345:2;11327:21;;;11384:2;11364:18;;;11357:30;11423:34;11418:2;11403:18;;11396:62;-1:-1:-1;;;11489:2:1;11474:18;;11467:47;11546:3;11531:19;;11143:413::o;11973:127::-;12034:10;12029:3;12025:20;12022:1;12015:31;12065:4;12062:1;12055:15;12089:4;12086:1;12079:15;14109:212;14151:3;14189:5;14183:12;14233:6;14226:4;14219:5;14215:16;14210:3;14204:36;14295:1;14259:16;;14284:13;;;-1:-1:-1;14259:16:1;;14109:212;-1:-1:-1;14109:212:1:o;14326:425::-;14606:3;14634:57;14660:30;14686:3;14678:6;14660:30;:::i;:::-;14652:6;14634:57;:::i;:::-;-1:-1:-1;;;14700:19:1;;14743:1;14735:10;;14326:425;-1:-1:-1;;;;14326:425:1:o;15160:251::-;15230:6;15283:2;15271:9;15262:7;15258:23;15254:32;15251:52;;;15299:1;15296;15289:12;15251:52;15331:9;15325:16;15350:31;15375:5;15350:31;:::i;16480:887::-;16714:4;16762:3;16751:9;16747:19;16793:6;16782:9;16775:25;16836:3;16831:2;16820:9;16816:18;16809:31;16860:6;16895;16889:13;16926:6;16918;16911:22;16964:3;16953:9;16949:19;16942:26;;17003:2;16995:6;16991:15;16977:29;;17024:1;17034:195;17048:6;17045:1;17042:13;17034:195;;;17113:13;;-1:-1:-1;;;;;17109:39:1;17097:52;;17178:2;17204:15;;;;17169:12;;;;17145:1;17063:9;17034:195;;;-1:-1:-1;;;;;;;17285:32:1;;;;17280:2;17265:18;;17258:60;-1:-1:-1;;17349:2:1;17334:18;17327:34;17246:3;16480:887;-1:-1:-1;;16480:887:1:o;17372:926::-;17467:6;17520:2;17508:9;17499:7;17495:23;17491:32;17488:52;;;17536:1;17533;17526:12;17488:52;17569:9;17563:16;17602:18;17594:6;17591:30;17588:50;;;17634:1;17631;17624:12;17588:50;17657:22;;17710:4;17702:13;;17698:27;-1:-1:-1;17688:55:1;;17739:1;17736;17729:12;17688:55;17772:2;17766:9;17798:18;17790:6;17787:30;17784:56;;;17820:18;;:::i;:::-;17866:6;17863:1;17859:14;17893:28;17917:2;17913;17909:11;17893:28;:::i;:::-;17955:19;;;17999:2;18029:11;;;18025:20;;;17990:12;;;;18057:19;;;18054:39;;;18089:1;18086;18079:12;18054:39;18121:2;18117;18113:11;18102:22;;18133:135;18149:6;18144:3;18141:15;18133:135;;;18215:10;;18203:23;;18255:2;18166:12;;;;18246;;;;18133:135;;;18287:5;17372:926;-1:-1:-1;;;;;;;17372:926:1:o;19531:128::-;19598:9;;;19619:11;;;19616:37;;;19633:18;;:::i;19664:414::-;19866:2;19848:21;;;19905:2;19885:18;;;19878:30;19944:34;19939:2;19924:18;;19917:62;-1:-1:-1;;;20010:2:1;19995:18;;19988:48;20068:3;20053:19;;19664:414::o;20083:112::-;20115:1;20141;20131:35;;20146:18;;:::i;:::-;-1:-1:-1;20180:9:1;;20083:112::o;20200:496::-;-1:-1:-1;;;;;20431:32:1;;;20413:51;;20500:32;;20495:2;20480:18;;20473:60;20564:2;20549:18;;20542:34;;;20612:3;20607:2;20592:18;;20585:31;;;-1:-1:-1;;20633:57:1;;20670:19;;20662:6;20633:57;:::i;:::-;20625:65;20200:496;-1:-1:-1;;;;;;20200:496:1:o;20701:249::-;20770:6;20823:2;20811:9;20802:7;20798:23;20794:32;20791:52;;;20839:1;20836;20829:12;20791:52;20871:9;20865:16;20890:30;20914:5;20890:30;:::i;21673:127::-;21734:10;21729:3;21725:20;21722:1;21715:31;21765:4;21762:1;21755:15;21789:4;21786:1;21779:15
Swarm Source
ipfs://8f4b74e7e24ad53e47d2f89c7cdbbc895011e752a2a8e2d2b755cfeb01e7a712
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.