ETH Price: $2,525.11 (+0.25%)

Token

TheHippoPool (THP)
 

Overview

Max Total Supply

721 THP

Holders

287

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 THP
0x2edfbd1bd4bcab2a1fd24efd4724d1344c82bb36
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Hippo

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
istanbul EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-20
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


pragma solidity ^0.8.0;

/**
 * @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;
        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");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}



pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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;
}


pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}




pragma solidity ^0.8.0;



pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


pragma solidity ^0.8.0;


/**
 * @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())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public 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 {
                    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` and `to` are never both zero.
     *
     * 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 {}
}

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 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);
}

pragma solidity ^0.8.0;

/**
 * @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();
    }
}


pragma solidity ^0.8.0;

contract Hippo is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    uint256 public maxHippos;
    uint constant public MAX_PURCHASE = 16;
    uint constant public MAX_PRESALE = 444;
    bool public saleIsActive = false;
    bool public preSaleIsActive = false;
    uint256 public constant PRICE = 60000000000000000; // 0.06
    string public provenance;
    string private baseURI;
    uint256 public startingIndex;
    uint256 public startingIndexBlock;
    uint256 public REVEAL_TIMESTAMP;

    constructor(
        string memory name,
        string memory symbol,
        uint256 maxSupply,
        uint256 saleStart
    ) ERC721(name, symbol) {
        maxHippos = maxSupply;
        REVEAL_TIMESTAMP = saleStart + 86400; // 24H after sale
    }

    function setRevealTimestamp(uint256 revealTimeStamp) public onlyOwner {
        REVEAL_TIMESTAMP = revealTimeStamp;
    }
    function setProvenanceHash(string memory provenanceHash) public onlyOwner{
        provenance = provenanceHash;
    }

    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }
    function flipPreSaleState() public onlyOwner {
        preSaleIsActive = !preSaleIsActive;
    }

    function reserveHippos(uint numberOfHippos) public onlyOwner {
        uint supply = totalSupply();
        uint i;
        for (i = 0; i < numberOfHippos; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function trySetStartingIndexBlock() private {
        if ( startingIndexBlock == 0 && (totalSupply() == maxHippos || block.timestamp >= REVEAL_TIMESTAMP)) {
            startingIndexBlock = block.number;
        }
    }

    function presaleMint(uint numberOfHippos) public payable{
        require(preSaleIsActive, "presale must be active");
        require(numberOfHippos < MAX_PURCHASE, "Can only mint up to 20 per tx");
        require(totalSupply().add(numberOfHippos) <= MAX_PRESALE, "Number of hippos would exceed max supply");
        require(numberOfHippos.mul(PRICE) == msg.value, "Sent ether value is incorrect");

        for (uint i = 0; i < numberOfHippos; i++) {
            _safeMint(msg.sender, totalSupply());
        }
    }

    function mintHippo(uint numberOfHippos) public payable{
        require(saleIsActive, "Sale must be active");
        require(numberOfHippos < MAX_PURCHASE, "Can only mint up to 20 per tx");
        require(totalSupply().add(numberOfHippos) <= maxHippos, "Number of hippos would exceed max supply");
        require(numberOfHippos.mul(PRICE) == msg.value, "Sent ether value is incorrect");

        for (uint i = 0; i < numberOfHippos; i++) {
            _safeMint(msg.sender, totalSupply());
        }

        trySetStartingIndexBlock();
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function setStartingIndex() public {
        require(startingIndex == 0, "Starting index is already set");
        require(startingIndexBlock != 0, "Starting index block must be set");

        startingIndex = uint(blockhash(startingIndexBlock)) % maxHippos;
        // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)
        if (block.number.sub(startingIndexBlock) > 255) {
            startingIndex = uint(blockhash(block.number - 1)) % maxHippos;
        }
        // Prevent default sequence
        if (startingIndex == 0) {
            startingIndex = startingIndex.add(1);
        }
    }

    function emergencySetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");
        startingIndexBlock = block.number;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"saleStart","type":"uint256"}],"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxHippos","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfHippos","type":"uint256"}],"name":"mintHippo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfHippos","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfHippos","type":"uint256"}],"name":"reserveHippos","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"revealTimeStamp","type":"uint256"}],"name":"setRevealTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff0219169083151502179055503480156200004757600080fd5b5060405162004c2738038062004c2783398181016040528101906200006d9190620002f2565b8383816000908051906020019062000087929190620001b9565b508060019080519060200190620000a0929190620001b9565b505050620000c3620000b7620000eb60201b60201c565b620000f360201b60201c565b81600b819055506201518081620000db9190620003f7565b6011819055505050505062000571565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001c79062000494565b90600052602060002090601f016020900481019282620001eb576000855562000237565b82601f106200020657805160ff191683800117855562000237565b8280016001018555821562000237579182015b828111156200023657825182559160200191906001019062000219565b5b5090506200024691906200024a565b5090565b5b80821115620002655760008160009055506001016200024b565b5090565b6000620002806200027a84620003c4565b62000390565b9050828152602081018484840111156200029957600080fd5b620002a68482856200045e565b509392505050565b600082601f830112620002c057600080fd5b8151620002d284826020860162000269565b91505092915050565b600081519050620002ec8162000557565b92915050565b600080600080608085870312156200030957600080fd5b600085015167ffffffffffffffff8111156200032457600080fd5b6200033287828801620002ae565b945050602085015167ffffffffffffffff8111156200035057600080fd5b6200035e87828801620002ae565b93505060406200037187828801620002db565b92505060606200038487828801620002db565b91505092959194509250565b6000604051905081810181811067ffffffffffffffff82111715620003ba57620003b962000528565b5b8060405250919050565b600067ffffffffffffffff821115620003e257620003e162000528565b5b601f19601f8301169050602081019050919050565b6000620004048262000454565b9150620004118362000454565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620004495762000448620004ca565b5b828201905092915050565b6000819050919050565b60005b838110156200047e57808201518184015260208101905062000461565b838111156200048e576000848401525b50505050565b60006002820490506001821680620004ad57607f821691505b60208210811415620004c457620004c3620004f9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005628162000454565b81146200056e57600080fd5b50565b6146a680620005816000396000f3fe60806040526004361061023b5760003560e01c806370a082311161012e578063c87b56dd116100ab578063e98665501161006f578063e986655014610840578063eb8d244414610857578063f032554914610882578063f2fde38b14610899578063fd4da8db146108c25761023b565b8063c87b56dd14610754578063c9b298f114610791578063cb774d47146107ad578063e36d6498146107d8578063e985e9c5146108035761023b565b80638d859f3e116100f25780638d859f3e146106815780638da5cb5b146106ac57806395d89b41146106d7578063a22cb46514610702578063b88d4fde1461072b5761023b565b806370a08231146105c25780637146bd08146105ff578063715018a61461062a5780637811ffb1146106415780637d17fcbe1461066a5761023b565b806323b872dd116101bc5780634d4c4e99116101805780634d4c4e99146104c95780634f6ccce7146104f457806355f804b3146105315780636352211e1461055a5780636946e7f2146105975761023b565b806323b872dd1461040c5780632f745c591461043557806334918dfd146104725780633ccfd60b1461048957806342842e0e146104a05761023b565b80630f7309e8116102035780630f7309e814610337578063109695231461036257806318160ddd1461038b57806318e20a38146103b65780631f0234d8146103e15761023b565b8063018a2c371461024057806301ffc9a71461026957806306fdde03146102a6578063081812fc146102d1578063095ea7b31461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613486565b6108de565b005b34801561027557600080fd5b50610290600480360381019061028b91906133f3565b610964565b60405161029d9190613e84565b60405180910390f35b3480156102b257600080fd5b506102bb6109de565b6040516102c89190613e9f565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f39190613486565b610a70565b6040516103059190613e1d565b60405180910390f35b34801561031a57600080fd5b50610335600480360381019061033091906133b7565b610af5565b005b34801561034357600080fd5b5061034c610c0d565b6040516103599190613e9f565b60405180910390f35b34801561036e57600080fd5b5061038960048036038101906103849190613445565b610c9b565b005b34801561039757600080fd5b506103a0610d31565b6040516103ad91906141e1565b60405180910390f35b3480156103c257600080fd5b506103cb610d3e565b6040516103d891906141e1565b60405180910390f35b3480156103ed57600080fd5b506103f6610d44565b6040516104039190613e84565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e91906132b1565b610d57565b005b34801561044157600080fd5b5061045c600480360381019061045791906133b7565b610db7565b60405161046991906141e1565b60405180910390f35b34801561047e57600080fd5b50610487610e5c565b005b34801561049557600080fd5b5061049e610f04565b005b3480156104ac57600080fd5b506104c760048036038101906104c291906132b1565b610fcf565b005b3480156104d557600080fd5b506104de610fef565b6040516104eb91906141e1565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190613486565b610ff5565b60405161052891906141e1565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613445565b61108c565b005b34801561056657600080fd5b50610581600480360381019061057c9190613486565b611122565b60405161058e9190613e1d565b60405180910390f35b3480156105a357600080fd5b506105ac6111d4565b6040516105b991906141e1565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e4919061324c565b6111da565b6040516105f691906141e1565b60405180910390f35b34801561060b57600080fd5b50610614611292565b60405161062191906141e1565b60405180910390f35b34801561063657600080fd5b5061063f611297565b005b34801561064d57600080fd5b5061066860048036038101906106639190613486565b61131f565b005b34801561067657600080fd5b5061067f6113df565b005b34801561068d57600080fd5b506106966114a9565b6040516106a391906141e1565b60405180910390f35b3480156106b857600080fd5b506106c16114b4565b6040516106ce9190613e1d565b60405180910390f35b3480156106e357600080fd5b506106ec6114de565b6040516106f99190613e9f565b60405180910390f35b34801561070e57600080fd5b506107296004803603810190610724919061337b565b611570565b005b34801561073757600080fd5b50610752600480360381019061074d9190613300565b6116f1565b005b34801561076057600080fd5b5061077b60048036038101906107769190613486565b611753565b6040516107889190613e9f565b60405180910390f35b6107ab60048036038101906107a69190613486565b6117fa565b005b3480156107b957600080fd5b506107c2611978565b6040516107cf91906141e1565b60405180910390f35b3480156107e457600080fd5b506107ed61197e565b6040516107fa91906141e1565b60405180910390f35b34801561080f57600080fd5b5061082a60048036038101906108259190613275565b611984565b6040516108379190613e84565b60405180910390f35b34801561084c57600080fd5b50610855611a18565b005b34801561086357600080fd5b5061086c611b29565b6040516108799190613e84565b60405180910390f35b34801561088e57600080fd5b50610897611b3c565b005b3480156108a557600080fd5b506108c060048036038101906108bb919061324c565b611be4565b005b6108dc60048036038101906108d79190613486565b611cdc565b005b6108e6611e62565b73ffffffffffffffffffffffffffffffffffffffff166109046114b4565b73ffffffffffffffffffffffffffffffffffffffff161461095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190614101565b60405180910390fd5b8060118190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109d757506109d682611e6a565b5b9050919050565b6060600080546109ed9061449b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a199061449b565b8015610a665780601f10610a3b57610100808354040283529160200191610a66565b820191906000526020600020905b815481529060010190602001808311610a4957829003601f168201915b5050505050905090565b6000610a7b82611f4c565b610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab1906140e1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0082611122565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6890614161565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b90611e62565b73ffffffffffffffffffffffffffffffffffffffff161480610bbf5750610bbe81610bb9611e62565b611984565b5b610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590614041565b60405180910390fd5b610c088383611fb8565b505050565b600d8054610c1a9061449b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c469061449b565b8015610c935780601f10610c6857610100808354040283529160200191610c93565b820191906000526020600020905b815481529060010190602001808311610c7657829003601f168201915b505050505081565b610ca3611e62565b73ffffffffffffffffffffffffffffffffffffffff16610cc16114b4565b73ffffffffffffffffffffffffffffffffffffffff1614610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e90614101565b60405180910390fd5b80600d9080519060200190610d2d929190613070565b5050565b6000600880549050905090565b60115481565b600c60019054906101000a900460ff1681565b610d68610d62611e62565b82612071565b610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e906141a1565b60405180910390fd5b610db283838361214f565b505050565b6000610dc2836111da565b8210610e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfa90613ee1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e64611e62565b73ffffffffffffffffffffffffffffffffffffffff16610e826114b4565b73ffffffffffffffffffffffffffffffffffffffff1614610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf90614101565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610f0c611e62565b73ffffffffffffffffffffffffffffffffffffffff16610f2a6114b4565b73ffffffffffffffffffffffffffffffffffffffff1614610f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7790614101565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fcb573d6000803e3d6000fd5b5050565b610fea838383604051806020016040528060008152506116f1565b505050565b6101bc81565b6000610fff610d31565b8210611040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611037906141c1565b60405180910390fd5b6008828154811061107a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611094611e62565b73ffffffffffffffffffffffffffffffffffffffff166110b26114b4565b73ffffffffffffffffffffffffffffffffffffffff1614611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff90614101565b60405180910390fd5b80600e908051906020019061111e929190613070565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c290614081565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124290614061565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601081565b61129f611e62565b73ffffffffffffffffffffffffffffffffffffffff166112bd6114b4565b73ffffffffffffffffffffffffffffffffffffffff1614611313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a90614101565b60405180910390fd5b61131d60006123ab565b565b611327611e62565b73ffffffffffffffffffffffffffffffffffffffff166113456114b4565b73ffffffffffffffffffffffffffffffffffffffff161461139b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139290614101565b60405180910390fd5b60006113a5610d31565b905060005b828110156113da576113c73382846113c291906142d0565b612471565b80806113d2906144cd565b9150506113aa565b505050565b6113e7611e62565b73ffffffffffffffffffffffffffffffffffffffff166114056114b4565b73ffffffffffffffffffffffffffffffffffffffff161461145b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145290614101565b60405180910390fd5b6000600f54146114a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149790614021565b60405180910390fd5b43601081905550565b66d529ae9e86000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114ed9061449b565b80601f01602080910402602001604051908101604052809291908181526020018280546115199061449b565b80156115665780601f1061153b57610100808354040283529160200191611566565b820191906000526020600020905b81548152906001019060200180831161154957829003601f168201915b5050505050905090565b611578611e62565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd90613fc1565b60405180910390fd5b80600560006115f3611e62565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116a0611e62565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116e59190613e84565b60405180910390a35050565b6117026116fc611e62565b83612071565b611741576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611738906141a1565b60405180910390fd5b61174d8484848461248f565b50505050565b606061175e82611f4c565b61179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490614141565b60405180910390fd5b60006117a76124eb565b905060008151116117c757604051806020016040528060008152506117f2565b806117d18461257d565b6040516020016117e2929190613df9565b6040516020818303038152906040525b915050919050565b600c60019054906101000a900460ff16611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184090613f01565b60405180910390fd5b6010811061188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390613fe1565b60405180910390fd5b6101bc6118a98261189b610d31565b61272a90919063ffffffff16565b11156118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190613f81565b60405180910390fd5b3461190566d529ae9e8600008361274090919063ffffffff16565b14611945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193c906140a1565b60405180910390fd5b60005b81811015611974576119613361195c610d31565b612471565b808061196c906144cd565b915050611948565b5050565b600f5481565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600f5414611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490614021565b60405180910390fd5b60006010541415611aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9a90614181565b60405180910390fd5b600b546010544060001c611ab79190614516565b600f8190555060ff611ad46010544361275690919063ffffffff16565b1115611aff57600b54600143611aea91906143b1565b4060001c611af89190614516565b600f819055505b6000600f541415611b2757611b206001600f5461272a90919063ffffffff16565b600f819055505b565b600c60009054906101000a900460ff1681565b611b44611e62565b73ffffffffffffffffffffffffffffffffffffffff16611b626114b4565b73ffffffffffffffffffffffffffffffffffffffff1614611bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baf90614101565b60405180910390fd5b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b611bec611e62565b73ffffffffffffffffffffffffffffffffffffffff16611c0a6114b4565b73ffffffffffffffffffffffffffffffffffffffff1614611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5790614101565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790613f41565b60405180910390fd5b611cd9816123ab565b50565b600c60009054906101000a900460ff16611d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2290613ec1565b60405180910390fd5b60108110611d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6590613fe1565b60405180910390fd5b600b54611d8b82611d7d610d31565b61272a90919063ffffffff16565b1115611dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc390613f81565b60405180910390fd5b34611de766d529ae9e8600008361274090919063ffffffff16565b14611e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1e906140a1565b60405180910390fd5b60005b81811015611e5657611e4333611e3e610d31565b612471565b8080611e4e906144cd565b915050611e2a565b50611e5f61276c565b50565b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f3557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f455750611f44826127a2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661202b83611122565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061207c82611f4c565b6120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b290614001565b60405180910390fd5b60006120c683611122565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061213557508373ffffffffffffffffffffffffffffffffffffffff1661211d84610a70565b73ffffffffffffffffffffffffffffffffffffffff16145b8061214657506121458185611984565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661216f82611122565b73ffffffffffffffffffffffffffffffffffffffff16146121c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bc90614121565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c90613fa1565b60405180910390fd5b61224083838361280c565b61224b600082611fb8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461229b91906143b1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122f291906142d0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61248b828260405180602001604052806000815250612920565b5050565b61249a84848461214f565b6124a68484848461297b565b6124e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dc90613f21565b60405180910390fd5b50505050565b6060600e80546124fa9061449b565b80601f01602080910402602001604051908101604052809291908181526020018280546125269061449b565b80156125735780601f1061254857610100808354040283529160200191612573565b820191906000526020600020905b81548152906001019060200180831161255657829003601f168201915b5050505050905090565b606060008214156125c5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612725565b600082905060005b600082146125f75780806125e0906144cd565b915050600a826125f09190614326565b91506125cd565b60008167ffffffffffffffff811115612639577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561266b5781602001600182028036833780820191505090505b5090505b6000851461271e5760018261268491906143b1565b9150600a856126939190614516565b603061269f91906142d0565b60f81b8183815181106126db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127179190614326565b945061266f565b8093505050505b919050565b6000818361273891906142d0565b905092915050565b6000818361274e9190614357565b905092915050565b6000818361276491906143b1565b905092915050565b60006010541480156127935750600b54612784610d31565b148061279257506011544210155b5b156127a057436010819055505b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612817838383612b12565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561285a5761285581612b17565b612899565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612898576128978382612b60565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128dc576128d781612ccd565b61291b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461291a576129198282612e10565b5b5b505050565b61292a8383612e8f565b612937600084848461297b565b612976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296d90613f21565b60405180910390fd5b505050565b600061299c8473ffffffffffffffffffffffffffffffffffffffff1661305d565b15612b05578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129c5611e62565b8786866040518563ffffffff1660e01b81526004016129e79493929190613e38565b602060405180830381600087803b158015612a0157600080fd5b505af1925050508015612a3257506040513d601f19601f82011682018060405250810190612a2f919061341c565b60015b612ab5573d8060008114612a62576040519150601f19603f3d011682016040523d82523d6000602084013e612a67565b606091505b50600081511415612aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa490613f21565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b0a565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b6d846111da565b612b7791906143b1565b9050600060076000848152602001908152602001600020549050818114612c5c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ce191906143b1565b9050600060096000848152602001908152602001600020549050600060088381548110612d37577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612d7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612e1b836111da565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef6906140c1565b60405180910390fd5b612f0881611f4c565b15612f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3f90613f61565b60405180910390fd5b612f546000838361280c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa491906142d0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461307c9061449b565b90600052602060002090601f01602090048101928261309e57600085556130e5565b82601f106130b757805160ff19168380011785556130e5565b828001600101855582156130e5579182015b828111156130e45782518255916020019190600101906130c9565b5b5090506130f291906130f6565b5090565b5b8082111561310f5760008160009055506001016130f7565b5090565b60006131266131218461422d565b6141fc565b90508281526020810184848401111561313e57600080fd5b613149848285614459565b509392505050565b600061316461315f8461425d565b6141fc565b90508281526020810184848401111561317c57600080fd5b613187848285614459565b509392505050565b60008135905061319e81614614565b92915050565b6000813590506131b38161462b565b92915050565b6000813590506131c881614642565b92915050565b6000815190506131dd81614642565b92915050565b600082601f8301126131f457600080fd5b8135613204848260208601613113565b91505092915050565b600082601f83011261321e57600080fd5b813561322e848260208601613151565b91505092915050565b60008135905061324681614659565b92915050565b60006020828403121561325e57600080fd5b600061326c8482850161318f565b91505092915050565b6000806040838503121561328857600080fd5b60006132968582860161318f565b92505060206132a78582860161318f565b9150509250929050565b6000806000606084860312156132c657600080fd5b60006132d48682870161318f565b93505060206132e58682870161318f565b92505060406132f686828701613237565b9150509250925092565b6000806000806080858703121561331657600080fd5b60006133248782880161318f565b94505060206133358782880161318f565b935050604061334687828801613237565b925050606085013567ffffffffffffffff81111561336357600080fd5b61336f878288016131e3565b91505092959194509250565b6000806040838503121561338e57600080fd5b600061339c8582860161318f565b92505060206133ad858286016131a4565b9150509250929050565b600080604083850312156133ca57600080fd5b60006133d88582860161318f565b92505060206133e985828601613237565b9150509250929050565b60006020828403121561340557600080fd5b6000613413848285016131b9565b91505092915050565b60006020828403121561342e57600080fd5b600061343c848285016131ce565b91505092915050565b60006020828403121561345757600080fd5b600082013567ffffffffffffffff81111561347157600080fd5b61347d8482850161320d565b91505092915050565b60006020828403121561349857600080fd5b60006134a684828501613237565b91505092915050565b6134b8816143e5565b82525050565b6134c7816143f7565b82525050565b60006134d88261428d565b6134e281856142a3565b93506134f2818560208601614468565b6134fb81614603565b840191505092915050565b600061351182614298565b61351b81856142b4565b935061352b818560208601614468565b61353481614603565b840191505092915050565b600061354a82614298565b61355481856142c5565b9350613564818560208601614468565b80840191505092915050565b600061357d6013836142b4565b91507f53616c65206d75737420626520616374697665000000000000000000000000006000830152602082019050919050565b60006135bd602b836142b4565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006136236016836142b4565b91507f70726573616c65206d75737420626520616374697665000000000000000000006000830152602082019050919050565b60006136636032836142b4565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006136c96026836142b4565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061372f601c836142b4565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061376f6028836142b4565b91507f4e756d626572206f6620686970706f7320776f756c6420657863656564206d6160008301527f7820737570706c790000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137d56024836142b4565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061383b6019836142b4565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061387b601d836142b4565b91507f43616e206f6e6c79206d696e7420757020746f203230207065722074780000006000830152602082019050919050565b60006138bb602c836142b4565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613921601d836142b4565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b60006139616038836142b4565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006139c7602a836142b4565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a2d6029836142b4565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a93601d836142b4565b91507f53656e742065746865722076616c756520697320696e636f72726563740000006000830152602082019050919050565b6000613ad36020836142b4565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613b13602c836142b4565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613b796020836142b4565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613bb96029836142b4565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c1f602f836142b4565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613c856021836142b4565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ceb6020836142b4565b91507f5374617274696e6720696e64657820626c6f636b206d757374206265207365746000830152602082019050919050565b6000613d2b6031836142b4565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613d91602c836142b4565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b613df38161444f565b82525050565b6000613e05828561353f565b9150613e11828461353f565b91508190509392505050565b6000602082019050613e3260008301846134af565b92915050565b6000608082019050613e4d60008301876134af565b613e5a60208301866134af565b613e676040830185613dea565b8181036060830152613e7981846134cd565b905095945050505050565b6000602082019050613e9960008301846134be565b92915050565b60006020820190508181036000830152613eb98184613506565b905092915050565b60006020820190508181036000830152613eda81613570565b9050919050565b60006020820190508181036000830152613efa816135b0565b9050919050565b60006020820190508181036000830152613f1a81613616565b9050919050565b60006020820190508181036000830152613f3a81613656565b9050919050565b60006020820190508181036000830152613f5a816136bc565b9050919050565b60006020820190508181036000830152613f7a81613722565b9050919050565b60006020820190508181036000830152613f9a81613762565b9050919050565b60006020820190508181036000830152613fba816137c8565b9050919050565b60006020820190508181036000830152613fda8161382e565b9050919050565b60006020820190508181036000830152613ffa8161386e565b9050919050565b6000602082019050818103600083015261401a816138ae565b9050919050565b6000602082019050818103600083015261403a81613914565b9050919050565b6000602082019050818103600083015261405a81613954565b9050919050565b6000602082019050818103600083015261407a816139ba565b9050919050565b6000602082019050818103600083015261409a81613a20565b9050919050565b600060208201905081810360008301526140ba81613a86565b9050919050565b600060208201905081810360008301526140da81613ac6565b9050919050565b600060208201905081810360008301526140fa81613b06565b9050919050565b6000602082019050818103600083015261411a81613b6c565b9050919050565b6000602082019050818103600083015261413a81613bac565b9050919050565b6000602082019050818103600083015261415a81613c12565b9050919050565b6000602082019050818103600083015261417a81613c78565b9050919050565b6000602082019050818103600083015261419a81613cde565b9050919050565b600060208201905081810360008301526141ba81613d1e565b9050919050565b600060208201905081810360008301526141da81613d84565b9050919050565b60006020820190506141f66000830184613dea565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614223576142226145d4565b5b8060405250919050565b600067ffffffffffffffff821115614248576142476145d4565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614278576142776145d4565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142db8261444f565b91506142e68361444f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561431b5761431a614547565b5b828201905092915050565b60006143318261444f565b915061433c8361444f565b92508261434c5761434b614576565b5b828204905092915050565b60006143628261444f565b915061436d8361444f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143a6576143a5614547565b5b828202905092915050565b60006143bc8261444f565b91506143c78361444f565b9250828210156143da576143d9614547565b5b828203905092915050565b60006143f08261442f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561448657808201518184015260208101905061446b565b83811115614495576000848401525b50505050565b600060028204905060018216806144b357607f821691505b602082108114156144c7576144c66145a5565b5b50919050565b60006144d88261444f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561450b5761450a614547565b5b600182019050919050565b60006145218261444f565b915061452c8361444f565b92508261453c5761453b614576565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61461d816143e5565b811461462857600080fd5b50565b614634816143f7565b811461463f57600080fd5b50565b61464b81614403565b811461465657600080fd5b50565b6146628161444f565b811461466d57600080fd5b5056fea2646970667358221220c94b291de3006d7cf1226b7c3d34726995b4b9d3ae75749616ed7481300b888a64736f6c63430008000033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000115c000000000000000000000000000000000000000000000000000000006122acc0000000000000000000000000000000000000000000000000000000000000000c546865486970706f506f6f6c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035448500000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061023b5760003560e01c806370a082311161012e578063c87b56dd116100ab578063e98665501161006f578063e986655014610840578063eb8d244414610857578063f032554914610882578063f2fde38b14610899578063fd4da8db146108c25761023b565b8063c87b56dd14610754578063c9b298f114610791578063cb774d47146107ad578063e36d6498146107d8578063e985e9c5146108035761023b565b80638d859f3e116100f25780638d859f3e146106815780638da5cb5b146106ac57806395d89b41146106d7578063a22cb46514610702578063b88d4fde1461072b5761023b565b806370a08231146105c25780637146bd08146105ff578063715018a61461062a5780637811ffb1146106415780637d17fcbe1461066a5761023b565b806323b872dd116101bc5780634d4c4e99116101805780634d4c4e99146104c95780634f6ccce7146104f457806355f804b3146105315780636352211e1461055a5780636946e7f2146105975761023b565b806323b872dd1461040c5780632f745c591461043557806334918dfd146104725780633ccfd60b1461048957806342842e0e146104a05761023b565b80630f7309e8116102035780630f7309e814610337578063109695231461036257806318160ddd1461038b57806318e20a38146103b65780631f0234d8146103e15761023b565b8063018a2c371461024057806301ffc9a71461026957806306fdde03146102a6578063081812fc146102d1578063095ea7b31461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613486565b6108de565b005b34801561027557600080fd5b50610290600480360381019061028b91906133f3565b610964565b60405161029d9190613e84565b60405180910390f35b3480156102b257600080fd5b506102bb6109de565b6040516102c89190613e9f565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f39190613486565b610a70565b6040516103059190613e1d565b60405180910390f35b34801561031a57600080fd5b50610335600480360381019061033091906133b7565b610af5565b005b34801561034357600080fd5b5061034c610c0d565b6040516103599190613e9f565b60405180910390f35b34801561036e57600080fd5b5061038960048036038101906103849190613445565b610c9b565b005b34801561039757600080fd5b506103a0610d31565b6040516103ad91906141e1565b60405180910390f35b3480156103c257600080fd5b506103cb610d3e565b6040516103d891906141e1565b60405180910390f35b3480156103ed57600080fd5b506103f6610d44565b6040516104039190613e84565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e91906132b1565b610d57565b005b34801561044157600080fd5b5061045c600480360381019061045791906133b7565b610db7565b60405161046991906141e1565b60405180910390f35b34801561047e57600080fd5b50610487610e5c565b005b34801561049557600080fd5b5061049e610f04565b005b3480156104ac57600080fd5b506104c760048036038101906104c291906132b1565b610fcf565b005b3480156104d557600080fd5b506104de610fef565b6040516104eb91906141e1565b60405180910390f35b34801561050057600080fd5b5061051b60048036038101906105169190613486565b610ff5565b60405161052891906141e1565b60405180910390f35b34801561053d57600080fd5b5061055860048036038101906105539190613445565b61108c565b005b34801561056657600080fd5b50610581600480360381019061057c9190613486565b611122565b60405161058e9190613e1d565b60405180910390f35b3480156105a357600080fd5b506105ac6111d4565b6040516105b991906141e1565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e4919061324c565b6111da565b6040516105f691906141e1565b60405180910390f35b34801561060b57600080fd5b50610614611292565b60405161062191906141e1565b60405180910390f35b34801561063657600080fd5b5061063f611297565b005b34801561064d57600080fd5b5061066860048036038101906106639190613486565b61131f565b005b34801561067657600080fd5b5061067f6113df565b005b34801561068d57600080fd5b506106966114a9565b6040516106a391906141e1565b60405180910390f35b3480156106b857600080fd5b506106c16114b4565b6040516106ce9190613e1d565b60405180910390f35b3480156106e357600080fd5b506106ec6114de565b6040516106f99190613e9f565b60405180910390f35b34801561070e57600080fd5b506107296004803603810190610724919061337b565b611570565b005b34801561073757600080fd5b50610752600480360381019061074d9190613300565b6116f1565b005b34801561076057600080fd5b5061077b60048036038101906107769190613486565b611753565b6040516107889190613e9f565b60405180910390f35b6107ab60048036038101906107a69190613486565b6117fa565b005b3480156107b957600080fd5b506107c2611978565b6040516107cf91906141e1565b60405180910390f35b3480156107e457600080fd5b506107ed61197e565b6040516107fa91906141e1565b60405180910390f35b34801561080f57600080fd5b5061082a60048036038101906108259190613275565b611984565b6040516108379190613e84565b60405180910390f35b34801561084c57600080fd5b50610855611a18565b005b34801561086357600080fd5b5061086c611b29565b6040516108799190613e84565b60405180910390f35b34801561088e57600080fd5b50610897611b3c565b005b3480156108a557600080fd5b506108c060048036038101906108bb919061324c565b611be4565b005b6108dc60048036038101906108d79190613486565b611cdc565b005b6108e6611e62565b73ffffffffffffffffffffffffffffffffffffffff166109046114b4565b73ffffffffffffffffffffffffffffffffffffffff161461095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190614101565b60405180910390fd5b8060118190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109d757506109d682611e6a565b5b9050919050565b6060600080546109ed9061449b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a199061449b565b8015610a665780601f10610a3b57610100808354040283529160200191610a66565b820191906000526020600020905b815481529060010190602001808311610a4957829003601f168201915b5050505050905090565b6000610a7b82611f4c565b610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab1906140e1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0082611122565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6890614161565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b90611e62565b73ffffffffffffffffffffffffffffffffffffffff161480610bbf5750610bbe81610bb9611e62565b611984565b5b610bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf590614041565b60405180910390fd5b610c088383611fb8565b505050565b600d8054610c1a9061449b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c469061449b565b8015610c935780601f10610c6857610100808354040283529160200191610c93565b820191906000526020600020905b815481529060010190602001808311610c7657829003601f168201915b505050505081565b610ca3611e62565b73ffffffffffffffffffffffffffffffffffffffff16610cc16114b4565b73ffffffffffffffffffffffffffffffffffffffff1614610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e90614101565b60405180910390fd5b80600d9080519060200190610d2d929190613070565b5050565b6000600880549050905090565b60115481565b600c60019054906101000a900460ff1681565b610d68610d62611e62565b82612071565b610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e906141a1565b60405180910390fd5b610db283838361214f565b505050565b6000610dc2836111da565b8210610e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfa90613ee1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e64611e62565b73ffffffffffffffffffffffffffffffffffffffff16610e826114b4565b73ffffffffffffffffffffffffffffffffffffffff1614610ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecf90614101565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610f0c611e62565b73ffffffffffffffffffffffffffffffffffffffff16610f2a6114b4565b73ffffffffffffffffffffffffffffffffffffffff1614610f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7790614101565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fcb573d6000803e3d6000fd5b5050565b610fea838383604051806020016040528060008152506116f1565b505050565b6101bc81565b6000610fff610d31565b8210611040576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611037906141c1565b60405180910390fd5b6008828154811061107a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611094611e62565b73ffffffffffffffffffffffffffffffffffffffff166110b26114b4565b73ffffffffffffffffffffffffffffffffffffffff1614611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff90614101565b60405180910390fd5b80600e908051906020019061111e929190613070565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c290614081565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561124b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124290614061565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601081565b61129f611e62565b73ffffffffffffffffffffffffffffffffffffffff166112bd6114b4565b73ffffffffffffffffffffffffffffffffffffffff1614611313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a90614101565b60405180910390fd5b61131d60006123ab565b565b611327611e62565b73ffffffffffffffffffffffffffffffffffffffff166113456114b4565b73ffffffffffffffffffffffffffffffffffffffff161461139b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139290614101565b60405180910390fd5b60006113a5610d31565b905060005b828110156113da576113c73382846113c291906142d0565b612471565b80806113d2906144cd565b9150506113aa565b505050565b6113e7611e62565b73ffffffffffffffffffffffffffffffffffffffff166114056114b4565b73ffffffffffffffffffffffffffffffffffffffff161461145b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145290614101565b60405180910390fd5b6000600f54146114a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149790614021565b60405180910390fd5b43601081905550565b66d529ae9e86000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546114ed9061449b565b80601f01602080910402602001604051908101604052809291908181526020018280546115199061449b565b80156115665780601f1061153b57610100808354040283529160200191611566565b820191906000526020600020905b81548152906001019060200180831161154957829003601f168201915b5050505050905090565b611578611e62565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd90613fc1565b60405180910390fd5b80600560006115f3611e62565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116a0611e62565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116e59190613e84565b60405180910390a35050565b6117026116fc611e62565b83612071565b611741576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611738906141a1565b60405180910390fd5b61174d8484848461248f565b50505050565b606061175e82611f4c565b61179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179490614141565b60405180910390fd5b60006117a76124eb565b905060008151116117c757604051806020016040528060008152506117f2565b806117d18461257d565b6040516020016117e2929190613df9565b6040516020818303038152906040525b915050919050565b600c60019054906101000a900460ff16611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184090613f01565b60405180910390fd5b6010811061188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390613fe1565b60405180910390fd5b6101bc6118a98261189b610d31565b61272a90919063ffffffff16565b11156118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190613f81565b60405180910390fd5b3461190566d529ae9e8600008361274090919063ffffffff16565b14611945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193c906140a1565b60405180910390fd5b60005b81811015611974576119613361195c610d31565b612471565b808061196c906144cd565b915050611948565b5050565b600f5481565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600f5414611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5490614021565b60405180910390fd5b60006010541415611aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9a90614181565b60405180910390fd5b600b546010544060001c611ab79190614516565b600f8190555060ff611ad46010544361275690919063ffffffff16565b1115611aff57600b54600143611aea91906143b1565b4060001c611af89190614516565b600f819055505b6000600f541415611b2757611b206001600f5461272a90919063ffffffff16565b600f819055505b565b600c60009054906101000a900460ff1681565b611b44611e62565b73ffffffffffffffffffffffffffffffffffffffff16611b626114b4565b73ffffffffffffffffffffffffffffffffffffffff1614611bb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baf90614101565b60405180910390fd5b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b611bec611e62565b73ffffffffffffffffffffffffffffffffffffffff16611c0a6114b4565b73ffffffffffffffffffffffffffffffffffffffff1614611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5790614101565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790613f41565b60405180910390fd5b611cd9816123ab565b50565b600c60009054906101000a900460ff16611d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2290613ec1565b60405180910390fd5b60108110611d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6590613fe1565b60405180910390fd5b600b54611d8b82611d7d610d31565b61272a90919063ffffffff16565b1115611dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc390613f81565b60405180910390fd5b34611de766d529ae9e8600008361274090919063ffffffff16565b14611e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1e906140a1565b60405180910390fd5b60005b81811015611e5657611e4333611e3e610d31565b612471565b8080611e4e906144cd565b915050611e2a565b50611e5f61276c565b50565b600033905090565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f3557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f455750611f44826127a2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661202b83611122565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061207c82611f4c565b6120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b290614001565b60405180910390fd5b60006120c683611122565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061213557508373ffffffffffffffffffffffffffffffffffffffff1661211d84610a70565b73ffffffffffffffffffffffffffffffffffffffff16145b8061214657506121458185611984565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661216f82611122565b73ffffffffffffffffffffffffffffffffffffffff16146121c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bc90614121565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222c90613fa1565b60405180910390fd5b61224083838361280c565b61224b600082611fb8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461229b91906143b1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122f291906142d0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61248b828260405180602001604052806000815250612920565b5050565b61249a84848461214f565b6124a68484848461297b565b6124e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dc90613f21565b60405180910390fd5b50505050565b6060600e80546124fa9061449b565b80601f01602080910402602001604051908101604052809291908181526020018280546125269061449b565b80156125735780601f1061254857610100808354040283529160200191612573565b820191906000526020600020905b81548152906001019060200180831161255657829003601f168201915b5050505050905090565b606060008214156125c5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612725565b600082905060005b600082146125f75780806125e0906144cd565b915050600a826125f09190614326565b91506125cd565b60008167ffffffffffffffff811115612639577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561266b5781602001600182028036833780820191505090505b5090505b6000851461271e5760018261268491906143b1565b9150600a856126939190614516565b603061269f91906142d0565b60f81b8183815181106126db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127179190614326565b945061266f565b8093505050505b919050565b6000818361273891906142d0565b905092915050565b6000818361274e9190614357565b905092915050565b6000818361276491906143b1565b905092915050565b60006010541480156127935750600b54612784610d31565b148061279257506011544210155b5b156127a057436010819055505b565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612817838383612b12565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561285a5761285581612b17565b612899565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612898576128978382612b60565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128dc576128d781612ccd565b61291b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461291a576129198282612e10565b5b5b505050565b61292a8383612e8f565b612937600084848461297b565b612976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296d90613f21565b60405180910390fd5b505050565b600061299c8473ffffffffffffffffffffffffffffffffffffffff1661305d565b15612b05578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129c5611e62565b8786866040518563ffffffff1660e01b81526004016129e79493929190613e38565b602060405180830381600087803b158015612a0157600080fd5b505af1925050508015612a3257506040513d601f19601f82011682018060405250810190612a2f919061341c565b60015b612ab5573d8060008114612a62576040519150601f19603f3d011682016040523d82523d6000602084013e612a67565b606091505b50600081511415612aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa490613f21565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b0a565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b6d846111da565b612b7791906143b1565b9050600060076000848152602001908152602001600020549050818114612c5c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612ce191906143b1565b9050600060096000848152602001908152602001600020549050600060088381548110612d37577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612d7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612df4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612e1b836111da565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef6906140c1565b60405180910390fd5b612f0881611f4c565b15612f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3f90613f61565b60405180910390fd5b612f546000838361280c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa491906142d0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461307c9061449b565b90600052602060002090601f01602090048101928261309e57600085556130e5565b82601f106130b757805160ff19168380011785556130e5565b828001600101855582156130e5579182015b828111156130e45782518255916020019190600101906130c9565b5b5090506130f291906130f6565b5090565b5b8082111561310f5760008160009055506001016130f7565b5090565b60006131266131218461422d565b6141fc565b90508281526020810184848401111561313e57600080fd5b613149848285614459565b509392505050565b600061316461315f8461425d565b6141fc565b90508281526020810184848401111561317c57600080fd5b613187848285614459565b509392505050565b60008135905061319e81614614565b92915050565b6000813590506131b38161462b565b92915050565b6000813590506131c881614642565b92915050565b6000815190506131dd81614642565b92915050565b600082601f8301126131f457600080fd5b8135613204848260208601613113565b91505092915050565b600082601f83011261321e57600080fd5b813561322e848260208601613151565b91505092915050565b60008135905061324681614659565b92915050565b60006020828403121561325e57600080fd5b600061326c8482850161318f565b91505092915050565b6000806040838503121561328857600080fd5b60006132968582860161318f565b92505060206132a78582860161318f565b9150509250929050565b6000806000606084860312156132c657600080fd5b60006132d48682870161318f565b93505060206132e58682870161318f565b92505060406132f686828701613237565b9150509250925092565b6000806000806080858703121561331657600080fd5b60006133248782880161318f565b94505060206133358782880161318f565b935050604061334687828801613237565b925050606085013567ffffffffffffffff81111561336357600080fd5b61336f878288016131e3565b91505092959194509250565b6000806040838503121561338e57600080fd5b600061339c8582860161318f565b92505060206133ad858286016131a4565b9150509250929050565b600080604083850312156133ca57600080fd5b60006133d88582860161318f565b92505060206133e985828601613237565b9150509250929050565b60006020828403121561340557600080fd5b6000613413848285016131b9565b91505092915050565b60006020828403121561342e57600080fd5b600061343c848285016131ce565b91505092915050565b60006020828403121561345757600080fd5b600082013567ffffffffffffffff81111561347157600080fd5b61347d8482850161320d565b91505092915050565b60006020828403121561349857600080fd5b60006134a684828501613237565b91505092915050565b6134b8816143e5565b82525050565b6134c7816143f7565b82525050565b60006134d88261428d565b6134e281856142a3565b93506134f2818560208601614468565b6134fb81614603565b840191505092915050565b600061351182614298565b61351b81856142b4565b935061352b818560208601614468565b61353481614603565b840191505092915050565b600061354a82614298565b61355481856142c5565b9350613564818560208601614468565b80840191505092915050565b600061357d6013836142b4565b91507f53616c65206d75737420626520616374697665000000000000000000000000006000830152602082019050919050565b60006135bd602b836142b4565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006136236016836142b4565b91507f70726573616c65206d75737420626520616374697665000000000000000000006000830152602082019050919050565b60006136636032836142b4565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006136c96026836142b4565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061372f601c836142b4565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061376f6028836142b4565b91507f4e756d626572206f6620686970706f7320776f756c6420657863656564206d6160008301527f7820737570706c790000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137d56024836142b4565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061383b6019836142b4565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061387b601d836142b4565b91507f43616e206f6e6c79206d696e7420757020746f203230207065722074780000006000830152602082019050919050565b60006138bb602c836142b4565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613921601d836142b4565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b60006139616038836142b4565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006139c7602a836142b4565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a2d6029836142b4565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a93601d836142b4565b91507f53656e742065746865722076616c756520697320696e636f72726563740000006000830152602082019050919050565b6000613ad36020836142b4565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613b13602c836142b4565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613b796020836142b4565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613bb96029836142b4565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c1f602f836142b4565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613c856021836142b4565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ceb6020836142b4565b91507f5374617274696e6720696e64657820626c6f636b206d757374206265207365746000830152602082019050919050565b6000613d2b6031836142b4565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613d91602c836142b4565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b613df38161444f565b82525050565b6000613e05828561353f565b9150613e11828461353f565b91508190509392505050565b6000602082019050613e3260008301846134af565b92915050565b6000608082019050613e4d60008301876134af565b613e5a60208301866134af565b613e676040830185613dea565b8181036060830152613e7981846134cd565b905095945050505050565b6000602082019050613e9960008301846134be565b92915050565b60006020820190508181036000830152613eb98184613506565b905092915050565b60006020820190508181036000830152613eda81613570565b9050919050565b60006020820190508181036000830152613efa816135b0565b9050919050565b60006020820190508181036000830152613f1a81613616565b9050919050565b60006020820190508181036000830152613f3a81613656565b9050919050565b60006020820190508181036000830152613f5a816136bc565b9050919050565b60006020820190508181036000830152613f7a81613722565b9050919050565b60006020820190508181036000830152613f9a81613762565b9050919050565b60006020820190508181036000830152613fba816137c8565b9050919050565b60006020820190508181036000830152613fda8161382e565b9050919050565b60006020820190508181036000830152613ffa8161386e565b9050919050565b6000602082019050818103600083015261401a816138ae565b9050919050565b6000602082019050818103600083015261403a81613914565b9050919050565b6000602082019050818103600083015261405a81613954565b9050919050565b6000602082019050818103600083015261407a816139ba565b9050919050565b6000602082019050818103600083015261409a81613a20565b9050919050565b600060208201905081810360008301526140ba81613a86565b9050919050565b600060208201905081810360008301526140da81613ac6565b9050919050565b600060208201905081810360008301526140fa81613b06565b9050919050565b6000602082019050818103600083015261411a81613b6c565b9050919050565b6000602082019050818103600083015261413a81613bac565b9050919050565b6000602082019050818103600083015261415a81613c12565b9050919050565b6000602082019050818103600083015261417a81613c78565b9050919050565b6000602082019050818103600083015261419a81613cde565b9050919050565b600060208201905081810360008301526141ba81613d1e565b9050919050565b600060208201905081810360008301526141da81613d84565b9050919050565b60006020820190506141f66000830184613dea565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614223576142226145d4565b5b8060405250919050565b600067ffffffffffffffff821115614248576142476145d4565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614278576142776145d4565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006142db8261444f565b91506142e68361444f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561431b5761431a614547565b5b828201905092915050565b60006143318261444f565b915061433c8361444f565b92508261434c5761434b614576565b5b828204905092915050565b60006143628261444f565b915061436d8361444f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143a6576143a5614547565b5b828202905092915050565b60006143bc8261444f565b91506143c78361444f565b9250828210156143da576143d9614547565b5b828203905092915050565b60006143f08261442f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561448657808201518184015260208101905061446b565b83811115614495576000848401525b50505050565b600060028204905060018216806144b357607f821691505b602082108114156144c7576144c66145a5565b5b50919050565b60006144d88261444f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561450b5761450a614547565b5b600182019050919050565b60006145218261444f565b915061452c8361444f565b92508261453c5761453b614576565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61461d816143e5565b811461462857600080fd5b50565b614634816143f7565b811461463f57600080fd5b50565b61464b81614403565b811461465657600080fd5b50565b6146628161444f565b811461466d57600080fd5b5056fea2646970667358221220c94b291de3006d7cf1226b7c3d34726995b4b9d3ae75749616ed7481300b888a64736f6c63430008000033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000115c000000000000000000000000000000000000000000000000000000006122acc0000000000000000000000000000000000000000000000000000000000000000c546865486970706f506f6f6c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035448500000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): TheHippoPool
Arg [1] : symbol (string): THP
Arg [2] : maxSupply (uint256): 4444
Arg [3] : saleStart (uint256): 1629662400

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000000000000000000000000000000000000000115c
Arg [3] : 000000000000000000000000000000000000000000000000000000006122acc0
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 546865486970706f506f6f6c0000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 5448500000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

49060:4035:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49854:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42883:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29955:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31514:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31037:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49410:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49983:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43523:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49545:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49304:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32404:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43191:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50314:89;;;;;;;;;;;;;:::i;:::-;;52084:140;;;;;;;;;;;;;:::i;:::-;;32814:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49220:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43713:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50218:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29649:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49144:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29379:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49175:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20029:94;;;;;;;;;;;;;:::i;:::-;;50515:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52910:182;;;;;;;;;;;;;:::i;:::-;;49346:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19378:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30124:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31807:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33070:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30299:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50985:527;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49470:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49505:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32173:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52232:670;;;;;;;;;;;;;:::i;:::-;;49265:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50409:98;;;;;;;;;;;;;:::i;:::-;;20278:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51520:556;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49854:123;19609:12;:10;:12::i;:::-;19598:23;;:7;:5;:7::i;:::-;:23;;;19590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49954:15:::1;49935:16;:34;;;;49854:123:::0;:::o;42883:224::-;42985:4;43024:35;43009:50;;;:11;:50;;;;:90;;;;43063:36;43087:11;43063:23;:36::i;:::-;43009:90;43002:97;;42883:224;;;:::o;29955:100::-;30009:13;30042:5;30035:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29955:100;:::o;31514:221::-;31590:7;31618:16;31626:7;31618;:16::i;:::-;31610:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31703:15;:24;31719:7;31703:24;;;;;;;;;;;;;;;;;;;;;31696:31;;31514:221;;;:::o;31037:411::-;31118:13;31134:23;31149:7;31134:14;:23::i;:::-;31118:39;;31182:5;31176:11;;:2;:11;;;;31168:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31276:5;31260:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31285:37;31302:5;31309:12;:10;:12::i;:::-;31285:16;:37::i;:::-;31260:62;31238:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31419:21;31428:2;31432:7;31419:8;:21::i;:::-;31037:411;;;:::o;49410:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49983:119::-;19609:12;:10;:12::i;:::-;19598:23;;:7;:5;:7::i;:::-;:23;;;19590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50080:14:::1;50067:10;:27;;;;;;;;;;;;:::i;:::-;;49983:119:::0;:::o;43523:113::-;43584:7;43611:10;:17;;;;43604:24;;43523:113;:::o;49545:31::-;;;;:::o;49304:35::-;;;;;;;;;;;;;:::o;32404:339::-;32599:41;32618:12;:10;:12::i;:::-;32632:7;32599:18;:41::i;:::-;32591:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32707:28;32717:4;32723:2;32727:7;32707:9;:28::i;:::-;32404:339;;;:::o;43191:256::-;43288:7;43324:23;43341:5;43324:16;:23::i;:::-;43316:5;:31;43308:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43413:12;:19;43426:5;43413:19;;;;;;;;;;;;;;;:26;43433:5;43413:26;;;;;;;;;;;;43406:33;;43191:256;;;;:::o;50314:89::-;19609:12;:10;:12::i;:::-;19598:23;;:7;:5;:7::i;:::-;:23;;;19590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50383:12:::1;;;;;;;;;;;50382:13;50367:12;;:28;;;;;;;;;;;;;;;;;;50314:89::o:0;52084:140::-;19609:12;:10;:12::i;:::-;19598:23;;:7;:5;:7::i;:::-;:23;;;19590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52132:12:::1;52147:21;52132:36;;52187:10;52179:28;;:37;52208:7;52179:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;19669:1;52084:140::o:0;32814:185::-;32952:39;32969:4;32975:2;32979:7;32952:39;;;;;;;;;;;;:16;:39::i;:::-;32814:185;;;:::o;49220:38::-;49255:3;49220:38;:::o;43713:233::-;43788:7;43824:30;:28;:30::i;:::-;43816:5;:38;43808:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43921:10;43932:5;43921:17;;;;;;;;;;;;;;;;;;;;;;;;43914:24;;43713:233;;;:::o;50218:88::-;19609:12;:10;:12::i;:::-;19598:23;;:7;:5;:7::i;:::-;:23;;;19590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50295:3:::1;50285:7;:13;;;;;;;;;;;;:::i;:::-;;50218:88:::0;:::o;29649:239::-;29721:7;29741:13;29757:7;:16;29765:7;29757:16;;;;;;;;;;;;;;;;;;;;;29741:32;;29809:1;29792:19;;:5;:19;;;;29784:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29875:5;29868:12;;;29649:239;;;:::o;49144:24::-;;;;:::o;29379:208::-;29451:7;29496:1;29479:19;;:5;:19;;;;29471:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29563:9;:16;29573:5;29563:16;;;;;;;;;;;;;;;;29556:23;;29379:208;;;:::o;49175:38::-;49211:2;49175:38;:::o;20029:94::-;19609:12;:10;:12::i;:::-;19598:23;;:7;:5;:7::i;:::-;:23;;;19590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20094:21:::1;20112:1;20094:9;:21::i;:::-;20029:94::o:0;50515:231::-;19609:12;:10;:12::i;:::-;19598:23;;:7;:5;:7::i;:::-;:23;;;19590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50587:11:::1;50601:13;:11;:13::i;:::-;50587:27;;50625:6;50642:97;50658:14;50654:1;:18;50642:97;;;50694:33;50704:10;50725:1;50716:6;:10;;;;:::i;:::-;50694:9;:33::i;:::-;50674:3;;;;;:::i;:::-;;;;50642:97;;;19669:1;;50515:231:::0;:::o;52910:182::-;19609:12;:10;:12::i;:::-;19598:23;;:7;:5;:7::i;:::-;:23;;;19590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53005:1:::1;52988:13;;:18;52980:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;53072:12;53051:18;:33;;;;52910:182::o:0;49346:49::-;49378:17;49346:49;:::o;19378:87::-;19424:7;19451:6;;;;;;;;;;;19444:13;;19378:87;:::o;30124:104::-;30180:13;30213:7;30206:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30124:104;:::o;31807:295::-;31922:12;:10;:12::i;:::-;31910:24;;:8;:24;;;;31902:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32022:8;31977:18;:32;31996:12;:10;:12::i;:::-;31977:32;;;;;;;;;;;;;;;:42;32010:8;31977:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32075:8;32046:48;;32061:12;:10;:12::i;:::-;32046:48;;;32085:8;32046:48;;;;;;:::i;:::-;;;;;;;;31807:295;;:::o;33070:328::-;33245:41;33264:12;:10;:12::i;:::-;33278:7;33245:18;:41::i;:::-;33237:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33351:39;33365:4;33371:2;33375:7;33384:5;33351:13;:39::i;:::-;33070:328;;;;:::o;30299:334::-;30372:13;30406:16;30414:7;30406;:16::i;:::-;30398:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30487:21;30511:10;:8;:10::i;:::-;30487:34;;30563:1;30545:7;30539:21;:25;:86;;;;;;;;;;;;;;;;;30591:7;30600:18;:7;:16;:18::i;:::-;30574:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30539:86;30532:93;;;30299:334;;;:::o;50985:527::-;51060:15;;;;;;;;;;;51052:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;49211:2;51121:14;:29;51113:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;49255:3;51203:33;51221:14;51203:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:48;;51195:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;51344:9;51315:25;49378:17;51315:14;:18;;:25;;;;:::i;:::-;:38;51307:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;51405:6;51400:105;51421:14;51417:1;:18;51400:105;;;51457:36;51467:10;51479:13;:11;:13::i;:::-;51457:9;:36::i;:::-;51437:3;;;;;:::i;:::-;;;;51400:105;;;;50985:527;:::o;49470:28::-;;;;:::o;49505:33::-;;;;:::o;32173:164::-;32270:4;32294:18;:25;32313:5;32294:25;;;;;;;;;;;;;;;:35;32320:8;32294:35;;;;;;;;;;;;;;;;;;;;;;;;;32287:42;;32173:164;;;;:::o;52232:670::-;52303:1;52286:13;;:18;52278:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;52379:1;52357:18;;:23;;52349:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52484:9;;52461:18;;52451:29;52446:35;;:47;;;;:::i;:::-;52430:13;:63;;;;52668:3;52629:36;52646:18;;52629:12;:16;;:36;;;;:::i;:::-;:42;52625:136;;;52740:9;;52734:1;52719:12;:16;;;;:::i;:::-;52709:27;52704:33;;:45;;;;:::i;:::-;52688:13;:61;;;;52625:136;52829:1;52812:13;;:18;52808:87;;;52863:20;52881:1;52863:13;;:17;;:20;;;;:::i;:::-;52847:13;:36;;;;52808:87;52232:670::o;49265:32::-;;;;;;;;;;;;;:::o;50409:98::-;19609:12;:10;:12::i;:::-;19598:23;;:7;:5;:7::i;:::-;:23;;;19590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50484:15:::1;;;;;;;;;;;50483:16;50465:15;;:34;;;;;;;;;;;;;;;;;;50409:98::o:0;20278:192::-;19609:12;:10;:12::i;:::-;19598:23;;:7;:5;:7::i;:::-;:23;;;19590:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20387:1:::1;20367:22;;:8;:22;;;;20359:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20443:19;20453:8;20443:9;:19::i;:::-;20278:192:::0;:::o;51520:556::-;51593:12;;;;;;;;;;;51585:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;49211:2;51648:14;:29;51640:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;51767:9;;51730:33;51748:14;51730:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:46;;51722:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;51869:9;51840:25;49378:17;51840:14;:18;;:25;;;;:::i;:::-;:38;51832:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;51930:6;51925:105;51946:14;51942:1;:18;51925:105;;;51982:36;51992:10;52004:13;:11;:13::i;:::-;51982:9;:36::i;:::-;51962:3;;;;;:::i;:::-;;;;51925:105;;;;52042:26;:24;:26::i;:::-;51520:556;:::o;1490:98::-;1543:7;1570:10;1563:17;;1490:98;:::o;29010:305::-;29112:4;29164:25;29149:40;;;:11;:40;;;;:105;;;;29221:33;29206:48;;;:11;:48;;;;29149:105;:158;;;;29271:36;29295:11;29271:23;:36::i;:::-;29149:158;29129:178;;29010:305;;;:::o;34908:127::-;34973:4;35025:1;34997:30;;:7;:16;35005:7;34997:16;;;;;;;;;;;;;;;;;;;;;:30;;;;34990:37;;34908:127;;;:::o;38890:174::-;38992:2;38965:15;:24;38981:7;38965:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39048:7;39044:2;39010:46;;39019:23;39034:7;39019:14;:23::i;:::-;39010:46;;;;;;;;;;;;38890:174;;:::o;35202:348::-;35295:4;35320:16;35328:7;35320;:16::i;:::-;35312:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35396:13;35412:23;35427:7;35412:14;:23::i;:::-;35396:39;;35465:5;35454:16;;:7;:16;;;:51;;;;35498:7;35474:31;;:20;35486:7;35474:11;:20::i;:::-;:31;;;35454:51;:87;;;;35509:32;35526:5;35533:7;35509:16;:32::i;:::-;35454:87;35446:96;;;35202:348;;;;:::o;38194:578::-;38353:4;38326:31;;:23;38341:7;38326:14;:23::i;:::-;:31;;;38318:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38436:1;38422:16;;:2;:16;;;;38414:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38492:39;38513:4;38519:2;38523:7;38492:20;:39::i;:::-;38596:29;38613:1;38617:7;38596:8;:29::i;:::-;38657:1;38638:9;:15;38648:4;38638:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38686:1;38669:9;:13;38679:2;38669:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38717:2;38698:7;:16;38706:7;38698:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38756:7;38752:2;38737:27;;38746:4;38737:27;;;;;;;;;;;;38194:578;;;:::o;20478:173::-;20534:16;20553:6;;;;;;;;;;;20534:25;;20579:8;20570:6;;:17;;;;;;;;;;;;;;;;;;20634:8;20603:40;;20624:8;20603:40;;;;;;;;;;;;20478:173;;:::o;35892:110::-;35968:26;35978:2;35982:7;35968:26;;;;;;;;;;;;:9;:26::i;:::-;35892:110;;:::o;34280:315::-;34437:28;34447:4;34453:2;34457:7;34437:9;:28::i;:::-;34484:48;34507:4;34513:2;34517:7;34526:5;34484:22;:48::i;:::-;34476:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34280:315;;;;:::o;50110:100::-;50162:13;50195:7;50188:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50110:100;:::o;1957:723::-;2013:13;2243:1;2234:5;:10;2230:53;;;2261:10;;;;;;;;;;;;;;;;;;;;;2230:53;2293:12;2308:5;2293:20;;2324:14;2349:78;2364:1;2356:4;:9;2349:78;;2382:8;;;;;:::i;:::-;;;;2413:2;2405:10;;;;;:::i;:::-;;;2349:78;;;2437:19;2469:6;2459:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2437:39;;2487:154;2503:1;2494:5;:10;2487:154;;2531:1;2521:11;;;;;:::i;:::-;;;2598:2;2590:5;:10;;;;:::i;:::-;2577:2;:24;;;;:::i;:::-;2564:39;;2547:6;2554;2547:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2627:2;2618:11;;;;;:::i;:::-;;;2487:154;;;2665:6;2651:21;;;;;1957:723;;;;:::o;14270:98::-;14328:7;14359:1;14355;:5;;;;:::i;:::-;14348:12;;14270:98;;;;:::o;15008:::-;15066:7;15097:1;15093;:5;;;;:::i;:::-;15086:12;;15008:98;;;;:::o;14651:::-;14709:7;14740:1;14736;:5;;;;:::i;:::-;14729:12;;14651:98;;;;:::o;50754:223::-;50836:1;50814:18;;:23;:94;;;;;50859:9;;50842:13;:11;:13::i;:::-;:26;:65;;;;50891:16;;50872:15;:35;;50842:65;50814:94;50809:161;;;50946:12;50925:18;:33;;;;50809:161;50754:223::o;27588:157::-;27673:4;27712:25;27697:40;;;:11;:40;;;;27690:47;;27588:157;;;:::o;44559:589::-;44703:45;44730:4;44736:2;44740:7;44703:26;:45::i;:::-;44781:1;44765:18;;:4;:18;;;44761:187;;;44800:40;44832:7;44800:31;:40::i;:::-;44761:187;;;44870:2;44862:10;;:4;:10;;;44858:90;;44889:47;44922:4;44928:7;44889:32;:47::i;:::-;44858:90;44761:187;44976:1;44962:16;;:2;:16;;;44958:183;;;44995:45;45032:7;44995:36;:45::i;:::-;44958:183;;;45068:4;45062:10;;:2;:10;;;45058:83;;45089:40;45117:2;45121:7;45089:27;:40::i;:::-;45058:83;44958:183;44559:589;;;:::o;36229:321::-;36359:18;36365:2;36369:7;36359:5;:18::i;:::-;36410:54;36441:1;36445:2;36449:7;36458:5;36410:22;:54::i;:::-;36388:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36229:321;;;:::o;39629:803::-;39784:4;39805:15;:2;:13;;;:15::i;:::-;39801:624;;;39857:2;39841:36;;;39878:12;:10;:12::i;:::-;39892:4;39898:7;39907:5;39841:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39837:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40104:1;40087:6;:13;:18;40083:272;;;40130:60;;;;;;;;;;:::i;:::-;;;;;;;;40083:272;40305:6;40299:13;40290:6;40286:2;40282:15;40275:38;39837:533;39974:45;;;39964:55;;;:6;:55;;;;39957:62;;;;;39801:624;40409:4;40402:11;;39629:803;;;;;;;:::o;41004:126::-;;;;:::o;45871:164::-;45975:10;:17;;;;45948:15;:24;45964:7;45948:24;;;;;;;;;;;:44;;;;46003:10;46019:7;46003:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45871:164;:::o;46662:988::-;46928:22;46978:1;46953:22;46970:4;46953:16;:22::i;:::-;:26;;;;:::i;:::-;46928:51;;46990:18;47011:17;:26;47029:7;47011:26;;;;;;;;;;;;46990:47;;47158:14;47144:10;:28;47140:328;;47189:19;47211:12;:18;47224:4;47211:18;;;;;;;;;;;;;;;:34;47230:14;47211:34;;;;;;;;;;;;47189:56;;47295:11;47262:12;:18;47275:4;47262:18;;;;;;;;;;;;;;;:30;47281:10;47262:30;;;;;;;;;;;:44;;;;47412:10;47379:17;:30;47397:11;47379:30;;;;;;;;;;;:43;;;;47140:328;;47564:17;:26;47582:7;47564:26;;;;;;;;;;;47557:33;;;47608:12;:18;47621:4;47608:18;;;;;;;;;;;;;;;:34;47627:14;47608:34;;;;;;;;;;;47601:41;;;46662:988;;;;:::o;47945:1079::-;48198:22;48243:1;48223:10;:17;;;;:21;;;;:::i;:::-;48198:46;;48255:18;48276:15;:24;48292:7;48276:24;;;;;;;;;;;;48255:45;;48627:19;48649:10;48660:14;48649:26;;;;;;;;;;;;;;;;;;;;;;;;48627:48;;48713:11;48688:10;48699;48688:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;48824:10;48793:15;:28;48809:11;48793:28;;;;;;;;;;;:41;;;;48965:15;:24;48981:7;48965:24;;;;;;;;;;;48958:31;;;49000:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47945:1079;;;;:::o;45449:221::-;45534:14;45551:20;45568:2;45551:16;:20::i;:::-;45534:37;;45609:7;45582:12;:16;45595:2;45582:16;;;;;;;;;;;;;;;:24;45599:6;45582:24;;;;;;;;;;;:34;;;;45656:6;45627:17;:26;45645:7;45627:26;;;;;;;;;;;:35;;;;45449:221;;;:::o;36886:382::-;36980:1;36966:16;;:2;:16;;;;36958:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37039:16;37047:7;37039;:16::i;:::-;37038:17;37030:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37101:45;37130:1;37134:2;37138:7;37101:20;:45::i;:::-;37176:1;37159:9;:13;37169:2;37159:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37207:2;37188:7;:16;37196:7;37188:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37252:7;37248:2;37227:33;;37244:1;37227:33;;;;;;;;;;;;36886:382;;:::o;4426:387::-;4486:4;4694:12;4761:7;4749:20;4741:28;;4804:1;4797:4;:8;4790:15;;;4426:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7442:317::-;;7605:67;7669:2;7664:3;7605:67;:::i;:::-;7598:74;;7702:21;7698:1;7693:3;7689:11;7682:42;7750:2;7745:3;7741:12;7734:19;;7588:171;;;:::o;7765:375::-;;7928:67;7992:2;7987:3;7928:67;:::i;:::-;7921:74;;8025:34;8021:1;8016:3;8012:11;8005:55;8091:13;8086:2;8081:3;8077:12;8070:35;8131:2;8126:3;8122:12;8115:19;;7911:229;;;:::o;8146:320::-;;8309:67;8373:2;8368:3;8309:67;:::i;:::-;8302:74;;8406:24;8402:1;8397:3;8393:11;8386:45;8457:2;8452:3;8448:12;8441:19;;8292:174;;;:::o;8472:382::-;;8635:67;8699:2;8694:3;8635:67;:::i;:::-;8628:74;;8732:34;8728:1;8723:3;8719:11;8712:55;8798:20;8793:2;8788:3;8784:12;8777:42;8845:2;8840:3;8836:12;8829:19;;8618:236;;;:::o;8860:370::-;;9023:67;9087:2;9082:3;9023:67;:::i;:::-;9016:74;;9120:34;9116:1;9111:3;9107:11;9100:55;9186:8;9181:2;9176:3;9172:12;9165:30;9221:2;9216:3;9212:12;9205:19;;9006:224;;;:::o;9236:326::-;;9399:67;9463:2;9458:3;9399:67;:::i;:::-;9392:74;;9496:30;9492:1;9487:3;9483:11;9476:51;9553:2;9548:3;9544:12;9537:19;;9382:180;;;:::o;9568:372::-;;9731:67;9795:2;9790:3;9731:67;:::i;:::-;9724:74;;9828:34;9824:1;9819:3;9815:11;9808:55;9894:10;9889:2;9884:3;9880:12;9873:32;9931:2;9926:3;9922:12;9915:19;;9714:226;;;:::o;9946:368::-;;10109:67;10173:2;10168:3;10109:67;:::i;:::-;10102:74;;10206:34;10202:1;10197:3;10193:11;10186:55;10272:6;10267:2;10262:3;10258:12;10251:28;10305:2;10300:3;10296:12;10289:19;;10092:222;;;:::o;10320:323::-;;10483:67;10547:2;10542:3;10483:67;:::i;:::-;10476:74;;10580:27;10576:1;10571:3;10567:11;10560:48;10634:2;10629:3;10625:12;10618:19;;10466:177;;;:::o;10649:327::-;;10812:67;10876:2;10871:3;10812:67;:::i;:::-;10805:74;;10909:31;10905:1;10900:3;10896:11;10889:52;10967:2;10962:3;10958:12;10951:19;;10795:181;;;:::o;10982:376::-;;11145:67;11209:2;11204:3;11145:67;:::i;:::-;11138:74;;11242:34;11238:1;11233:3;11229:11;11222:55;11308:14;11303:2;11298:3;11294:12;11287:36;11349:2;11344:3;11340:12;11333:19;;11128:230;;;:::o;11364:327::-;;11527:67;11591:2;11586:3;11527:67;:::i;:::-;11520:74;;11624:31;11620:1;11615:3;11611:11;11604:52;11682:2;11677:3;11673:12;11666:19;;11510:181;;;:::o;11697:388::-;;11860:67;11924:2;11919:3;11860:67;:::i;:::-;11853:74;;11957:34;11953:1;11948:3;11944:11;11937:55;12023:26;12018:2;12013:3;12009:12;12002:48;12076:2;12071:3;12067:12;12060:19;;11843:242;;;:::o;12091:374::-;;12254:67;12318:2;12313:3;12254:67;:::i;:::-;12247:74;;12351:34;12347:1;12342:3;12338:11;12331:55;12417:12;12412:2;12407:3;12403:12;12396:34;12456:2;12451:3;12447:12;12440:19;;12237:228;;;:::o;12471:373::-;;12634:67;12698:2;12693:3;12634:67;:::i;:::-;12627:74;;12731:34;12727:1;12722:3;12718:11;12711:55;12797:11;12792:2;12787:3;12783:12;12776:33;12835:2;12830:3;12826:12;12819:19;;12617:227;;;:::o;12850:327::-;;13013:67;13077:2;13072:3;13013:67;:::i;:::-;13006:74;;13110:31;13106:1;13101:3;13097:11;13090:52;13168:2;13163:3;13159:12;13152:19;;12996:181;;;:::o;13183:330::-;;13346:67;13410:2;13405:3;13346:67;:::i;:::-;13339:74;;13443:34;13439:1;13434:3;13430:11;13423:55;13504:2;13499:3;13495:12;13488:19;;13329:184;;;:::o;13519:376::-;;13682:67;13746:2;13741:3;13682:67;:::i;:::-;13675:74;;13779:34;13775:1;13770:3;13766:11;13759:55;13845:14;13840:2;13835:3;13831:12;13824:36;13886:2;13881:3;13877:12;13870:19;;13665:230;;;:::o;13901:330::-;;14064:67;14128:2;14123:3;14064:67;:::i;:::-;14057:74;;14161:34;14157:1;14152:3;14148:11;14141:55;14222:2;14217:3;14213:12;14206:19;;14047:184;;;:::o;14237:373::-;;14400:67;14464:2;14459:3;14400:67;:::i;:::-;14393:74;;14497:34;14493:1;14488:3;14484:11;14477:55;14563:11;14558:2;14553:3;14549:12;14542:33;14601:2;14596:3;14592:12;14585:19;;14383:227;;;:::o;14616:379::-;;14779:67;14843:2;14838:3;14779:67;:::i;:::-;14772:74;;14876:34;14872:1;14867:3;14863:11;14856:55;14942:17;14937:2;14932:3;14928:12;14921:39;14986:2;14981:3;14977:12;14970:19;;14762:233;;;:::o;15001:365::-;;15164:67;15228:2;15223:3;15164:67;:::i;:::-;15157:74;;15261:34;15257:1;15252:3;15248:11;15241:55;15327:3;15322:2;15317:3;15313:12;15306:25;15357:2;15352:3;15348:12;15341:19;;15147:219;;;:::o;15372:330::-;;15535:67;15599:2;15594:3;15535:67;:::i;:::-;15528:74;;15632:34;15628:1;15623:3;15619:11;15612:55;15693:2;15688:3;15684:12;15677:19;;15518:184;;;:::o;15708:381::-;;15871:67;15935:2;15930:3;15871:67;:::i;:::-;15864:74;;15968:34;15964:1;15959:3;15955:11;15948:55;16034:19;16029:2;16024:3;16020:12;16013:41;16080:2;16075:3;16071:12;16064:19;;15854:235;;;:::o;16095:376::-;;16258:67;16322:2;16317:3;16258:67;:::i;:::-;16251:74;;16355:34;16351:1;16346:3;16342:11;16335:55;16421:14;16416:2;16411:3;16407:12;16400:36;16462:2;16457:3;16453:12;16446:19;;16241:230;;;:::o;16477:118::-;16564:24;16582:5;16564:24;:::i;:::-;16559:3;16552:37;16542:53;;:::o;16601:435::-;;16803:95;16894:3;16885:6;16803:95;:::i;:::-;16796:102;;16915:95;17006:3;16997:6;16915:95;:::i;:::-;16908:102;;17027:3;17020:10;;16785:251;;;;;:::o;17042:222::-;;17173:2;17162:9;17158:18;17150:26;;17186:71;17254:1;17243:9;17239:17;17230:6;17186:71;:::i;:::-;17140:124;;;;:::o;17270:640::-;;17503:3;17492:9;17488:19;17480:27;;17517:71;17585:1;17574:9;17570:17;17561:6;17517:71;:::i;:::-;17598:72;17666:2;17655:9;17651:18;17642:6;17598:72;:::i;:::-;17680;17748:2;17737:9;17733:18;17724:6;17680:72;:::i;:::-;17799:9;17793:4;17789:20;17784:2;17773:9;17769:18;17762:48;17827:76;17898:4;17889:6;17827:76;:::i;:::-;17819:84;;17470:440;;;;;;;:::o;17916:210::-;;18041:2;18030:9;18026:18;18018:26;;18054:65;18116:1;18105:9;18101:17;18092:6;18054:65;:::i;:::-;18008:118;;;;:::o;18132:313::-;;18283:2;18272:9;18268:18;18260:26;;18332:9;18326:4;18322:20;18318:1;18307:9;18303:17;18296:47;18360:78;18433:4;18424:6;18360:78;:::i;:::-;18352:86;;18250:195;;;;:::o;18451:419::-;;18655:2;18644:9;18640:18;18632:26;;18704:9;18698:4;18694:20;18690:1;18679:9;18675:17;18668:47;18732:131;18858:4;18732:131;:::i;:::-;18724:139;;18622:248;;;:::o;18876:419::-;;19080:2;19069:9;19065:18;19057:26;;19129:9;19123:4;19119:20;19115:1;19104:9;19100:17;19093:47;19157:131;19283:4;19157:131;:::i;:::-;19149:139;;19047:248;;;:::o;19301:419::-;;19505:2;19494:9;19490:18;19482:26;;19554:9;19548:4;19544:20;19540:1;19529:9;19525:17;19518:47;19582:131;19708:4;19582:131;:::i;:::-;19574:139;;19472:248;;;:::o;19726:419::-;;19930:2;19919:9;19915:18;19907:26;;19979:9;19973:4;19969:20;19965:1;19954:9;19950:17;19943:47;20007:131;20133:4;20007:131;:::i;:::-;19999:139;;19897:248;;;:::o;20151:419::-;;20355:2;20344:9;20340:18;20332:26;;20404:9;20398:4;20394:20;20390:1;20379:9;20375:17;20368:47;20432:131;20558:4;20432:131;:::i;:::-;20424:139;;20322:248;;;:::o;20576:419::-;;20780:2;20769:9;20765:18;20757:26;;20829:9;20823:4;20819:20;20815:1;20804:9;20800:17;20793:47;20857:131;20983:4;20857:131;:::i;:::-;20849:139;;20747:248;;;:::o;21001:419::-;;21205:2;21194:9;21190:18;21182:26;;21254:9;21248:4;21244:20;21240:1;21229:9;21225:17;21218:47;21282:131;21408:4;21282:131;:::i;:::-;21274:139;;21172:248;;;:::o;21426:419::-;;21630:2;21619:9;21615:18;21607:26;;21679:9;21673:4;21669:20;21665:1;21654:9;21650:17;21643:47;21707:131;21833:4;21707:131;:::i;:::-;21699:139;;21597:248;;;:::o;21851:419::-;;22055:2;22044:9;22040:18;22032:26;;22104:9;22098:4;22094:20;22090:1;22079:9;22075:17;22068:47;22132:131;22258:4;22132:131;:::i;:::-;22124:139;;22022:248;;;:::o;22276:419::-;;22480:2;22469:9;22465:18;22457:26;;22529:9;22523:4;22519:20;22515:1;22504:9;22500:17;22493:47;22557:131;22683:4;22557:131;:::i;:::-;22549:139;;22447:248;;;:::o;22701:419::-;;22905:2;22894:9;22890:18;22882:26;;22954:9;22948:4;22944:20;22940:1;22929:9;22925:17;22918:47;22982:131;23108:4;22982:131;:::i;:::-;22974:139;;22872:248;;;:::o;23126:419::-;;23330:2;23319:9;23315:18;23307:26;;23379:9;23373:4;23369:20;23365:1;23354:9;23350:17;23343:47;23407:131;23533:4;23407:131;:::i;:::-;23399:139;;23297:248;;;:::o;23551:419::-;;23755:2;23744:9;23740:18;23732:26;;23804:9;23798:4;23794:20;23790:1;23779:9;23775:17;23768:47;23832:131;23958:4;23832:131;:::i;:::-;23824:139;;23722:248;;;:::o;23976:419::-;;24180:2;24169:9;24165:18;24157:26;;24229:9;24223:4;24219:20;24215:1;24204:9;24200:17;24193:47;24257:131;24383:4;24257:131;:::i;:::-;24249:139;;24147:248;;;:::o;24401:419::-;;24605:2;24594:9;24590:18;24582:26;;24654:9;24648:4;24644:20;24640:1;24629:9;24625:17;24618:47;24682:131;24808:4;24682:131;:::i;:::-;24674:139;;24572:248;;;:::o;24826:419::-;;25030:2;25019:9;25015:18;25007:26;;25079:9;25073:4;25069:20;25065:1;25054:9;25050:17;25043:47;25107:131;25233:4;25107:131;:::i;:::-;25099:139;;24997:248;;;:::o;25251:419::-;;25455:2;25444:9;25440:18;25432:26;;25504:9;25498:4;25494:20;25490:1;25479:9;25475:17;25468:47;25532:131;25658:4;25532:131;:::i;:::-;25524:139;;25422:248;;;:::o;25676:419::-;;25880:2;25869:9;25865:18;25857:26;;25929:9;25923:4;25919:20;25915:1;25904:9;25900:17;25893:47;25957:131;26083:4;25957:131;:::i;:::-;25949:139;;25847:248;;;:::o;26101:419::-;;26305:2;26294:9;26290:18;26282:26;;26354:9;26348:4;26344:20;26340:1;26329:9;26325:17;26318:47;26382:131;26508:4;26382:131;:::i;:::-;26374:139;;26272:248;;;:::o;26526:419::-;;26730:2;26719:9;26715:18;26707:26;;26779:9;26773:4;26769:20;26765:1;26754:9;26750:17;26743:47;26807:131;26933:4;26807:131;:::i;:::-;26799:139;;26697:248;;;:::o;26951:419::-;;27155:2;27144:9;27140:18;27132:26;;27204:9;27198:4;27194:20;27190:1;27179:9;27175:17;27168:47;27232:131;27358:4;27232:131;:::i;:::-;27224:139;;27122:248;;;:::o;27376:419::-;;27580:2;27569:9;27565:18;27557:26;;27629:9;27623:4;27619:20;27615:1;27604:9;27600:17;27593:47;27657:131;27783:4;27657:131;:::i;:::-;27649:139;;27547:248;;;:::o;27801:419::-;;28005:2;27994:9;27990:18;27982:26;;28054:9;28048:4;28044:20;28040:1;28029:9;28025:17;28018:47;28082:131;28208:4;28082:131;:::i;:::-;28074:139;;27972:248;;;:::o;28226:419::-;;28430:2;28419:9;28415:18;28407:26;;28479:9;28473:4;28469:20;28465:1;28454:9;28450:17;28443:47;28507:131;28633:4;28507:131;:::i;:::-;28499:139;;28397:248;;;:::o;28651:419::-;;28855:2;28844:9;28840:18;28832:26;;28904:9;28898:4;28894:20;28890:1;28879:9;28875:17;28868:47;28932:131;29058:4;28932:131;:::i;:::-;28924:139;;28822:248;;;:::o;29076:222::-;;29207:2;29196:9;29192:18;29184:26;;29220:71;29288:1;29277:9;29273:17;29264:6;29220:71;:::i;:::-;29174:124;;;;:::o;29304:283::-;;29370:2;29364:9;29354:19;;29412:4;29404:6;29400:17;29519:6;29507:10;29504:22;29483:18;29471:10;29468:34;29465:62;29462:2;;;29530:18;;:::i;:::-;29462:2;29570:10;29566:2;29559:22;29344:243;;;;:::o;29593:331::-;;29744:18;29736:6;29733:30;29730:2;;;29766:18;;:::i;:::-;29730:2;29851:4;29847:9;29840:4;29832:6;29828:17;29824:33;29816:41;;29912:4;29906;29902:15;29894:23;;29659:265;;;:::o;29930:332::-;;30082:18;30074:6;30071:30;30068:2;;;30104:18;;:::i;:::-;30068:2;30189:4;30185:9;30178:4;30170:6;30166:17;30162:33;30154:41;;30250:4;30244;30240:15;30232:23;;29997:265;;;:::o;30268:98::-;;30353:5;30347:12;30337:22;;30326:40;;;:::o;30372:99::-;;30458:5;30452:12;30442:22;;30431:40;;;:::o;30477:168::-;;30594:6;30589:3;30582:19;30634:4;30629:3;30625:14;30610:29;;30572:73;;;;:::o;30651:169::-;;30769:6;30764:3;30757:19;30809:4;30804:3;30800:14;30785:29;;30747:73;;;;:::o;30826:148::-;;30965:3;30950:18;;30940:34;;;;:::o;30980:305::-;;31039:20;31057:1;31039:20;:::i;:::-;31034:25;;31073:20;31091:1;31073:20;:::i;:::-;31068:25;;31227:1;31159:66;31155:74;31152:1;31149:81;31146:2;;;31233:18;;:::i;:::-;31146:2;31277:1;31274;31270:9;31263:16;;31024:261;;;;:::o;31291:185::-;;31348:20;31366:1;31348:20;:::i;:::-;31343:25;;31382:20;31400:1;31382:20;:::i;:::-;31377:25;;31421:1;31411:2;;31426:18;;:::i;:::-;31411:2;31468:1;31465;31461:9;31456:14;;31333:143;;;;:::o;31482:348::-;;31545:20;31563:1;31545:20;:::i;:::-;31540:25;;31579:20;31597:1;31579:20;:::i;:::-;31574:25;;31767:1;31699:66;31695:74;31692:1;31689:81;31684:1;31677:9;31670:17;31666:105;31663:2;;;31774:18;;:::i;:::-;31663:2;31822:1;31819;31815:9;31804:20;;31530:300;;;;:::o;31836:191::-;;31896:20;31914:1;31896:20;:::i;:::-;31891:25;;31930:20;31948:1;31930:20;:::i;:::-;31925:25;;31969:1;31966;31963:8;31960:2;;;31974:18;;:::i;:::-;31960:2;32019:1;32016;32012:9;32004:17;;31881:146;;;;:::o;32033:96::-;;32099:24;32117:5;32099:24;:::i;:::-;32088:35;;32078:51;;;:::o;32135:90::-;;32212:5;32205:13;32198:21;32187:32;;32177:48;;;:::o;32231:149::-;;32307:66;32300:5;32296:78;32285:89;;32275:105;;;:::o;32386:126::-;;32463:42;32456:5;32452:54;32441:65;;32431:81;;;:::o;32518:77::-;;32584:5;32573:16;;32563:32;;;:::o;32601:154::-;32685:6;32680:3;32675;32662:30;32747:1;32738:6;32733:3;32729:16;32722:27;32652:103;;;:::o;32761:307::-;32829:1;32839:113;32853:6;32850:1;32847:13;32839:113;;;32938:1;32933:3;32929:11;32923:18;32919:1;32914:3;32910:11;32903:39;32875:2;32872:1;32868:10;32863:15;;32839:113;;;32970:6;32967:1;32964:13;32961:2;;;33050:1;33041:6;33036:3;33032:16;33025:27;32961:2;32810:258;;;;:::o;33074:320::-;;33155:1;33149:4;33145:12;33135:22;;33202:1;33196:4;33192:12;33223:18;33213:2;;33279:4;33271:6;33267:17;33257:27;;33213:2;33341;33333:6;33330:14;33310:18;33307:38;33304:2;;;33360:18;;:::i;:::-;33304:2;33125:269;;;;:::o;33400:233::-;;33462:24;33480:5;33462:24;:::i;:::-;33453:33;;33508:66;33501:5;33498:77;33495:2;;;33578:18;;:::i;:::-;33495:2;33625:1;33618:5;33614:13;33607:20;;33443:190;;;:::o;33639:176::-;;33688:20;33706:1;33688:20;:::i;:::-;33683:25;;33722:20;33740:1;33722:20;:::i;:::-;33717:25;;33761:1;33751:2;;33766:18;;:::i;:::-;33751:2;33807:1;33804;33800:9;33795:14;;33673:142;;;;:::o;33821:180::-;33869:77;33866:1;33859:88;33966:4;33963:1;33956:15;33990:4;33987:1;33980:15;34007:180;34055:77;34052:1;34045:88;34152:4;34149:1;34142:15;34176:4;34173:1;34166:15;34193:180;34241:77;34238:1;34231:88;34338:4;34335:1;34328:15;34362:4;34359:1;34352:15;34379:180;34427:77;34424:1;34417:88;34524:4;34521:1;34514:15;34548:4;34545:1;34538:15;34565:102;;34657:2;34653:7;34648:2;34641:5;34637:14;34633:28;34623:38;;34613:54;;;:::o;34673:122::-;34746:24;34764:5;34746:24;:::i;:::-;34739:5;34736:35;34726:2;;34785:1;34782;34775:12;34726:2;34716:79;:::o;34801:116::-;34871:21;34886:5;34871:21;:::i;:::-;34864:5;34861:32;34851:2;;34907:1;34904;34897:12;34851:2;34841:76;:::o;34923:120::-;34995:23;35012:5;34995:23;:::i;:::-;34988:5;34985:34;34975:2;;35033:1;35030;35023:12;34975:2;34965:78;:::o;35049:122::-;35122:24;35140:5;35122:24;:::i;:::-;35115:5;35112:35;35102:2;;35161:1;35158;35151:12;35102:2;35092:79;:::o

Swarm Source

ipfs://c94b291de3006d7cf1226b7c3d34726995b4b9d3ae75749616ed7481300b888a
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.