ETH Price: $3,467.14 (+2.34%)
Gas: 10 Gwei

Token

NonFungibleForks (FORKHUNGER)
 

Overview

Max Total Supply

2,527 FORKHUNGER

Holders

1,924

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
chickenlegs.eth
Balance
4 FORKHUNGER
0x3245d7659409e1dfa25878c02273b5e86e74f2c3
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Ryan (dad/dev) + Anna (daughter/artiste) are generating 5,555 forks as NFTs to celebrate the London Fork. Pay what you want to mint one and we'll give it away. Anyone who makes a copy of this collection is a forkhead. If you notice prices that are not in ETH (i.e. if they're ...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NonFungibleForks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 5555 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-28
*/

// File @openzeppelin/contracts/utils/math/[email protected]

// SPDX-License-Identifier: MIT

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;
        }
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]

// MIT License

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

// MIT License

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;
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// MIT License

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);
}


// File @openzeppelin/contracts/utils/[email protected]

// MIT License

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/access/[email protected]

// MIT License

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);
    }
}


// File @openzeppelin/contracts/token/ERC721/[email protected]

// MIT License

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);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// MIT License

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

// MIT License

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);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


// File @openzeppelin/contracts/utils/[email protected]

// MIT License

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);
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]

// MIT License

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

// MIT License

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.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 {}
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

// MIT License

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


// File @openzeppelin/contracts/security/[email protected]

// MIT License

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File contracts/NonFungibleForks.sol

// contracts/NonFungibleForks.sol
// MIT License
pragma solidity ^0.8.0;





// Welcome to the Non-Fungible Forks Smart Contract!
// Let's be honest: this is the first time Ryan (dev/dad) has done this.
// Although I've made stuff in lots of other languages, the immutability
// of smart contracts is a tad scary, if we're being honest.
// If you find something that seems like a vulnerability, please let
// me know at [email protected] instead of being a forking arsehole
// and exploiting a charity project, please!

// A great deal of this Smart Contract was adapted from that of the AMAZING
// HashScapes NFT project (hashscapes.com) - particularly the base
// functions for magic and power (called balances and dividends in HS)
// Please go support these amazing co-forkers as their NFT has considerably
// more utility than our little charity project! [hashscapes.com]

// Paul Price of Top Dog Beach Club has also been an invaluable resource
// to me and to the project in general. Abby also made a 1/1 for the 
// collection! [topdogbeachclub.com]

// Please check out our website for a list of all co-forkers who helped make
// this project possible. https://forkhunger.art

// According the the USDA, at least 10.5% of all households in the United States
// are food insecure. Their definition for food insecurity is "uncertain of having, 
// or unable to acquire, enough food to meet the needs of all their members because 
// they had insufficient money or other resources for food. 
// [https://www.ers.usda.gov/topics/food-nutrition-assistance/food-security-in-the-us/key-statistics-graphics.aspx]

// Other "developed" countries have similar challenges making sure everyone has
// enough to eat. An estimated 7.2% of the population in high income countries 
// used food banks in 2013. [https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6572174/]

// We can do better than this! While we wait and work for social structures to 
// improve, however, it's super important to support the existing systems of
// food banks and other charitable organizations focused on feeding people.
// That's what we aim to do with this project.

// F**K HUNGER!

contract NonFungibleForks is ERC721Enumerable, Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    struct ForkMagic {
        uint256 magic;
        uint256 power;
        uint256 lastTimestamp;
    }

    uint public constant MAX_FORKS = 5555;
    uint public constant NUMBER_RESERVED = 55;
    uint public constant PRICE = 30000000000000000; // 0.03 ETH each (after first one)
    string public METADATA_PROVENANCE_HASH = "";

    string public baseURI = "https://api.forkhunger.art/";
    uint private curIndex = NUMBER_RESERVED.add(1);
    bool public hasSaleStarted = false;
    mapping(uint => ForkMagic) private forkMagicLevels; // mapping of NonFungibleForks IDs to their "Fork Magic"

    constructor() ERC721("NonFungibleForks","FORKHUNGER")  {
    }
    
    /** FORKS MAGIC */
    
    /** Each Fork is initialized with a magic of 100
     * and power rate of 10. This means the Fork's
     * magic increases at a base rate of 10/day. */
    function initializeForkMagic(uint id) private {
        forkMagicLevels[id] = ForkMagic(100, 10, block.timestamp);
    }
    
    function getForkMagic(uint id) public view returns (uint256) {
        /* Note on `forkMagicLevels[id].power >= 10`: The
        * `power` is initialized at 10, and it can never
        * be decreased. Therefore, `power < 10` means
        * the Fork has not been minted yet. */
        require(forkMagicLevels[id].power >= 10, "That Fork has not been minted yet.");
        ForkMagic storage forkMagic = forkMagicLevels[id];
        /* `lastTimestamp` is a variable that serves to cache
        * the Fork's value. This is to save on gas--this
        * function will return to correct magic without
        * having to update the `magic` until necessary. */
        return forkMagic.magic.add(forkMagic.power.mul(block.timestamp.sub(forkMagic.lastTimestamp)).div(86400)); // 86400 seconds is 1 day.
    }
    
    /** Each Fork's power is initialized at 10/day.
     * However, one can spend 0.005 ETH to upgrade it.
     * This way, certain NonFungibleForks can accumulate magic
     * quicker. 
     *
     * Did you know you can donate to a local food pantry and 
     * receive a free Semi-fungible fork? */
    function upgradeForkPower(uint id, uint256 amount) public payable {
        require(forkMagicLevels[id].power >= 10, "That Fork has not been minted yet.");
        require(msg.value >= amount.mul(5000000000000000)); // 0.005 ETH
        ForkMagic storage forkMagic = forkMagicLevels[id];
        /* `getForkMagic` must be used to retrieve the
        * live magic. Then, this must be updated to
        * ensure it will work the next time it is called.
        * As mentioned earlier, `lastTimestamp` serves
        * as a cached value to minimize gas usage. Thus,
        * it must also be updated. */
        forkMagic.magic = getForkMagic(id);
        forkMagic.lastTimestamp = block.timestamp;
        forkMagic.power = forkMagic.power.add(amount);
    }
    
    /** This function takes in an array of Fork IDs
     * and an array of magics to spend from them. Thus,
     * there must be no duplicate IDs and the arrays should
     * be of equal length. It is important to note that
     * the owner's ability to select WHICH NonFungibleForks to
     * spend magic from is crucial to maintain their
     * value. btw go buy a HashScape immediately */
    function spendForkMagic(uint[] memory forkIds, uint256[] memory amountToSpend) public returns (uint256) {
        require(forkIds.length == amountToSpend.length, "You must provide a 1-to-1 relationship of magic amounts to spend from your NonFungibleForks.");
        require(!checkDuplicates(forkIds), "You may not buy from the same coin per transaction.");
        require(forkIds.length <= 10, "You can only spend from 10 NonFungibleForks at a time.");
        uint256 totalSpent = 0;
        // Loop through first to make sure the owner actually owns all their NonFungibleForks and has enough magic in them.
        for (uint i = 0; i < forkIds.length; i++) {
            uint id = forkIds[i];
            uint256 amount = amountToSpend[i];
            require(msg.sender == ownerOf(id), "You do not own the NonFungibleForks you specified.");
            require(getForkMagic(id) >= amount, "Insufficient NonFungibleForks magic.");
        }
        // See `upgradeForkPower` comments for explanation on why the NonFungibleForks' magics and `lastTimestamp` are updated.
        for (uint i = 0; i < forkIds.length; i++) {
            uint id = forkIds[i];
            uint amount = amountToSpend[i];
            ForkMagic storage forkMagic = forkMagicLevels[id];
            forkMagic.magic = getForkMagic(id).sub(amount);
            forkMagic.lastTimestamp = block.timestamp;
            totalSpent = totalSpent.add(amount);
        }
        // The total magic that was spent is returned, so it can be used with future apps and integrations.
        return totalSpent;
    }
    
    /** O(n^2) algorithm to check for duplicate integers
     * in an array. For small input (in this case, <= 10),
     * the algorithm is good. Thus, gas is not wasted. */
    function checkDuplicates(uint[] memory arr) private pure returns (bool) {
        for (uint i = 0; i < arr.length; i++) {
            for (uint j = i + 1; j < arr.length; j++) {
                if (arr[i] == arr[j]) {
                    return true;
                }
            }
        }
        return false;
    }
    
    /** NFT */
    
    function tokensOfOwner(address _owner) external view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    function buyFork(uint256 numNonFungibleForks) public payable nonReentrant() {
        require(hasSaleStarted, "Sale is not active.");
        require(totalSupply() < MAX_FORKS, "Sale has ended.");
        require(numNonFungibleForks > 0 && numNonFungibleForks <= 25, "You can buy a maximum of 25 Non-Fungible Forks at a time.");
        require(totalSupply().add(numNonFungibleForks) <= MAX_FORKS, "Not enough Non-Fungible Forks remain!");
        require((msg.value >= numNonFungibleForks.mul(PRICE)) || (balanceOf(msg.sender) < 1 && numNonFungibleForks == 1), "Minimum price of 0.03 after first fork.");
        for (uint i = 0; i < numNonFungibleForks; i++) {
            _safeMint(msg.sender, curIndex);
            initializeForkMagic(curIndex);
            adjustIndex();
        }
    }

    function adjustIndex() private {
        curIndex++;
    }

    function getCurrentIndex() public view returns (uint) {
        return curIndex;
    }

    function setProvenanceHash(string memory _hash) public onlyOwner {
        METADATA_PROVENANCE_HASH = _hash;
    }

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

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

    function flipSaleState() public onlyOwner {
        hasSaleStarted = !hasSaleStarted;
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }

    function reserve() public onlyOwner {
        // Reserve first `NUMBER_RESERVED` NonFungibleForks 
        for (uint i = 1; i <= NUMBER_RESERVED; i++) {
            initializeForkMagic(i);
            _safeMint(owner(), i);
        }
    }

    function giveAwayMany(address[] memory recipients) public nonReentrant() onlyOwner {
        require(totalSupply().add(recipients.length) < MAX_FORKS, "Not enough forks remain.");
        for (uint i = 0; i < recipients.length; i++) {
            address giveawayTo = recipients[i];
            _safeMint(giveawayTo, curIndex);
            initializeForkMagic(curIndex);
            adjustIndex();
        }
    }

    function giveAway(address recipient) public nonReentrant() onlyOwner {
        require(totalSupply() < MAX_FORKS, "Sale has already ended");
        _safeMint(recipient, curIndex);
        initializeForkMagic(curIndex);
        adjustIndex();
    }

    function reserveCur() public onlyOwner {
        require(totalSupply() < MAX_FORKS, "Sale has already ended");
        initializeForkMagic(curIndex);
        _safeMint(owner(), curIndex);
        adjustIndex();
    }

    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(baseURI, "contract_metadata.json"));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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_FORKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADATA_PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUMBER_RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numNonFungibleForks","type":"uint256"}],"name":"buyFork","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getForkMagic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"giveAway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"giveAwayMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveCur","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"forkIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amountToSpend","type":"uint256[]"}],"name":"spendForkMagic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"upgradeForkPower","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60a06040819052600060808190526200001b91600c916200019d565b5060408051808201909152601b8082527f68747470733a2f2f6170692e666f726b68756e6765722e6172742f000000000060209092019182526200006291600d916200019d565b506200007f600160376200013260201b620021e21790919060201c565b600e55600f805460ff191690553480156200009957600080fd5b50604080518082018252601081526f4e6f6e46756e6769626c65466f726b7360801b60208083019182528351808501909452600a8452692327a925a42aa723a2a960b11b908401528151919291620000f4916000916200019d565b5080516200010a9060019060208401906200019d565b50505062000127620001216200014760201b60201c565b6200014b565b6001600b55620002a7565b600062000140828462000243565b9392505050565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001ab906200026a565b90600052602060002090601f016020900481019282620001cf57600085556200021a565b82601f10620001ea57805160ff19168380011785556200021a565b828001600101855582156200021a579182015b828111156200021a578251825591602001919060010190620001fd565b50620002289291506200022c565b5090565b5b808211156200022857600081556001016200022d565b600082198211156200026557634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200027f57607f821691505b60208210811415620002a157634e487b7160e01b600052602260045260246000fd5b50919050565b61380480620002b76000396000f3fe6080604052600436106102c65760003560e01c80637dc2b43a11610179578063a22cb465116100d6578063e3bc6ce51161008a578063f0c9dc6011610064578063f0c9dc6014610747578063f2fde38b1461075c578063f88d2f251461077c57600080fd5b8063e3bc6ce5146106d3578063e8a3d485146106e9578063e985e9c5146106fe57600080fd5b8063b88d4fde116100bb578063b88d4fde1461067e578063c87b56dd1461069e578063cd3293de146106be57600080fd5b8063a22cb4651461063e578063a3f2ae481461065e57600080fd5b80638da5cb5b1161012d57806399c22d4f1161011257806399c22d4f146105e95780639e24078514610609578063a200b8441461062957600080fd5b80638da5cb5b146105b657806395d89b41146105d457600080fd5b80638462151c1161015e5780638462151c14610566578063853828b6146105935780638d859f3e1461059b57600080fd5b80637dc2b43a1461053e5780638255b7421461055357600080fd5b80632f745c59116102275780636352211e116101db57806370a08231116101c057806370a08231146104f4578063714c539814610514578063715018a61461052957600080fd5b80636352211e146104bf5780636c0360eb146104df57600080fd5b806342842e0e1161020c57806342842e0e1461045f5780634f6ccce71461047f57806355f804b31461049f57600080fd5b80632f745c591461042a57806334918dfd1461044a57600080fd5b80630d9005ae1161027e57806318160ddd1161026357806318160ddd146103db5780631c8b232d146103f057806323b872dd1461040a57600080fd5b80630d9005ae1461039c57806310969523146103bb57600080fd5b806306fdde03116102af57806306fdde0314610322578063081812fc14610344578063095ea7b31461037c57600080fd5b806301ffc9a7146102cb57806306c40cd614610300575b600080fd5b3480156102d757600080fd5b506102eb6102e6366004613342565b61078f565b60405190151581526020015b60405180910390f35b34801561030c57600080fd5b5061032061031b36600461323f565b6107eb565b005b34801561032e57600080fd5b506103376109a7565b6040516102f7919061359c565b34801561035057600080fd5b5061036461035f3660046133c5565b610a39565b6040516001600160a01b0390911681526020016102f7565b34801561038857600080fd5b50610320610397366004613215565b610adf565b3480156103a857600080fd5b50600e545b6040519081526020016102f7565b3480156103c757600080fd5b506103206103d636600461337c565b610c11565b3480156103e757600080fd5b506008546103ad565b3480156103fc57600080fd5b50600f546102eb9060ff1681565b34801561041657600080fd5b50610320610425366004613121565b610c82565b34801561043657600080fd5b506103ad610445366004613215565b610d09565b34801561045657600080fd5b50610320610db1565b34801561046b57600080fd5b5061032061047a366004613121565b610e1f565b34801561048b57600080fd5b506103ad61049a3660046133c5565b610e3a565b3480156104ab57600080fd5b506103206104ba36600461337c565b610ede565b3480156104cb57600080fd5b506103646104da3660046133c5565b610f4b565b3480156104eb57600080fd5b50610337610fd6565b34801561050057600080fd5b506103ad61050f3660046130d3565b611064565b34801561052057600080fd5b506103376110fe565b34801561053557600080fd5b5061032061110d565b34801561054a57600080fd5b506103ad603781565b6103206105613660046133de565b611173565b34801561057257600080fd5b506105866105813660046130d3565b611250565b6040516102f79190613558565b61032061130f565b3480156105a757600080fd5b506103ad666a94d74f43000081565b3480156105c257600080fd5b50600a546001600160a01b0316610364565b3480156105e057600080fd5b5061033761138d565b3480156105f557600080fd5b506103ad6106043660046132de565b61139c565b34801561061557600080fd5b506103206106243660046130d3565b611736565b34801561063557600080fd5b506103206118a4565b34801561064a57600080fd5b506103206106593660046131d9565b6119c3565b34801561066a57600080fd5b506103ad6106793660046133c5565b611a88565b34801561068a57600080fd5b5061032061069936600461315d565b611b5f565b3480156106aa57600080fd5b506103376106b93660046133c5565b611bed565b3480156106ca57600080fd5b50610320611cd5565b3480156106df57600080fd5b506103ad6115b381565b3480156106f557600080fd5b50610337611da8565b34801561070a57600080fd5b506102eb6107193660046130ee565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561075357600080fd5b50610337611dd0565b34801561076857600080fd5b506103206107773660046130d3565b611ddd565b61032061078a3660046133c5565b611ebc565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806107e557506107e5826121ee565b92915050565b6002600b5414156108435760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600b55600a546001600160a01b031633146108a25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b6115b36108b982516108b360085490565b906121e2565b106109065760405162461bcd60e51b815260206004820152601860248201527f4e6f7420656e6f75676820666f726b732072656d61696e2e0000000000000000604482015260640161083a565b60005b815181101561099e57600082828151811061092657610926613774565b6020026020010151905061093c81600e546122d1565b610983600e546040805160608101825260648152600a6020808301918252428385019081526000958652601090915292909320905181559151600183015551600290910155565b61098b6122eb565b5080610996816136e5565b915050610909565b50506001600b55565b6060600080546109b6906136b0565b80601f01602080910402602001604051908101604052809291908181526020018280546109e2906136b0565b8015610a2f5780601f10610a0457610100808354040283529160200191610a2f565b820191906000526020600020905b815481529060010190602001808311610a1257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610ac35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161083a565b506000908152600460205260409020546001600160a01b031690565b6000610aea82610f4b565b9050806001600160a01b0316836001600160a01b03161415610b745760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161083a565b336001600160a01b0382161480610b905750610b908133610719565b610c025760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161083a565b610c0c8383612302565b505050565b600a546001600160a01b03163314610c6b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b8051610c7e90600c906020840190612f54565b5050565b610c8c3382612388565b610cfe5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161083a565b610c0c838383612490565b6000610d1483611064565b8210610d885760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161083a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610e0b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b600f805460ff19811660ff90911615179055565b610c0c83838360405180602001604052806000815250611b5f565b6000610e4560085490565b8210610eb95760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161083a565b60088281548110610ecc57610ecc613774565b90600052602060002001549050919050565b600a546001600160a01b03163314610f385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b8051610c7e90600d906020840190612f54565b6000818152600260205260408120546001600160a01b0316806107e55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161083a565b600d8054610fe3906136b0565b80601f016020809104026020016040519081016040528092919081815260200182805461100f906136b0565b801561105c5780601f106110315761010080835404028352916020019161105c565b820191906000526020600020905b81548152906001019060200180831161103f57829003601f168201915b505050505081565b60006001600160a01b0382166110e25760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161083a565b506001600160a01b031660009081526003602052604090205490565b6060600d80546109b6906136b0565b600a546001600160a01b031633146111675760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b6111716000612680565b565b600082815260106020526040902060010154600a11156111fb5760405162461bcd60e51b815260206004820152602260248201527f5468617420466f726b20686173206e6f74206265656e206d696e74656420796560448201527f742e000000000000000000000000000000000000000000000000000000000000606482015260840161083a565b61120c816611c37937e080006126ea565b34101561121857600080fd5b600082815260106020526040902061122f83611a88565b8155426002820155600181015461124690836121e2565b6001909101555050565b6060600061125d83611064565b90508061127e5760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156112995761129961378a565b6040519080825280602002602001820160405280156112c2578160200160208202803683370190505b50905060005b82811015611276576112da8582610d09565b8282815181106112ec576112ec613774565b602090810291909101015280611301816136e5565b9150506112c8565b50919050565b600a546001600160a01b031633146113695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b60405133904780156108fc02916000818181858888f1935050505061117157600080fd5b6060600180546109b6906136b0565b6000815183511461143b5760405162461bcd60e51b815260206004820152605c60248201527f596f75206d7573742070726f76696465206120312d746f2d312072656c61746960448201527f6f6e73686970206f66206d6167696320616d6f756e747320746f207370656e6460648201527f2066726f6d20796f7572204e6f6e46756e6769626c65466f726b732e00000000608482015260a40161083a565b611444836126f6565b156114b75760405162461bcd60e51b815260206004820152603360248201527f596f75206d6179206e6f74206275792066726f6d207468652073616d6520636f60448201527f696e20706572207472616e73616374696f6e2e00000000000000000000000000606482015260840161083a565b600a8351111561152f5760405162461bcd60e51b815260206004820152603660248201527f596f752063616e206f6e6c79207370656e642066726f6d203130204e6f6e467560448201527f6e6769626c65466f726b7320617420612074696d652e00000000000000000000606482015260840161083a565b6000805b845181101561169957600085828151811061155057611550613774565b60200260200101519050600085838151811061156e5761156e613774565b6020026020010151905061158182610f4b565b6001600160a01b0316336001600160a01b0316146116075760405162461bcd60e51b815260206004820152603260248201527f596f7520646f206e6f74206f776e20746865204e6f6e46756e6769626c65466f60448201527f726b7320796f75207370656369666965642e0000000000000000000000000000606482015260840161083a565b8061161183611a88565b10156116845760405162461bcd60e51b8152602060048201526024808201527f496e73756666696369656e74204e6f6e46756e6769626c65466f726b73206d6160448201527f6769632e00000000000000000000000000000000000000000000000000000000606482015260840161083a565b50508080611691906136e5565b915050611533565b5060005b84518110156112765760008582815181106116ba576116ba613774565b6020026020010151905060008583815181106116d8576116d8613774565b60200260200101519050600060106000848152602001908152602001600020905061170c8261170685611a88565b9061278e565b815542600282015561171e85836121e2565b9450505050808061172e906136e5565b91505061169d565b6002600b5414156117895760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161083a565b6002600b55600a546001600160a01b031633146117e85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b6115b36117f460085490565b106118415760405162461bcd60e51b815260206004820152601660248201527f53616c652068617320616c726561647920656e64656400000000000000000000604482015260640161083a565b61184d81600e546122d1565b611894600e546040805160608101825260648152600a6020808301918252428385019081526000958652601090915292909320905181559151600183015551600290910155565b61189c6122eb565b506001600b55565b600a546001600160a01b031633146118fe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b6115b361190a60085490565b106119575760405162461bcd60e51b815260206004820152601660248201527f53616c652068617320616c726561647920656e64656400000000000000000000604482015260640161083a565b61199e600e546040805160608101825260648152600a6020808301918252428385019081526000958652601090915292909320905181559151600183015551600290910155565b6119bb6119b3600a546001600160a01b031690565b600e546122d1565b6111716122eb565b6001600160a01b038216331415611a1c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161083a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600081815260106020526040812060010154600a1115611b105760405162461bcd60e51b815260206004820152602260248201527f5468617420466f726b20686173206e6f74206265656e206d696e74656420796560448201527f742e000000000000000000000000000000000000000000000000000000000000606482015260840161083a565b60008281526010602052604090206002810154611b5890611b50906201518090611b4a90611b3f90429061278e565b6001860154906126ea565b9061279a565b8254906121e2565b9392505050565b611b693383612388565b611bdb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161083a565b611be7848484846127a6565b50505050565b6000818152600260205260409020546060906001600160a01b0316611c7a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161083a565b6000611c8461282f565b90506000815111611ca45760405180602001604052806000815250611b58565b80611cae8461283e565b604051602001611cbf92919061342c565b6040516020818303038152906040529392505050565b600a546001600160a01b03163314611d2f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b60015b60378111611da5576040805160608101825260648152600a60208083019182524283850190815260008681526010909252939020915182555160018201559051600290910155611d93611d8d600a546001600160a01b031690565b826122d1565b80611d9d816136e5565b915050611d32565b50565b6060600d604051602001611dbc919061345b565b604051602081830303815290604052905090565b600c8054610fe3906136b0565b600a546001600160a01b03163314611e375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b6001600160a01b038116611eb35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161083a565b611da581612680565b6002600b541415611f0f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161083a565b6002600b55600f5460ff16611f665760405162461bcd60e51b815260206004820152601360248201527f53616c65206973206e6f74206163746976652e00000000000000000000000000604482015260640161083a565b6115b3611f7260085490565b10611fbf5760405162461bcd60e51b815260206004820152600f60248201527f53616c652068617320656e6465642e0000000000000000000000000000000000604482015260640161083a565b600081118015611fd0575060198111155b6120425760405162461bcd60e51b815260206004820152603960248201527f596f752063616e206275792061206d6178696d756d206f66203235204e6f6e2d60448201527f46756e6769626c6520466f726b7320617420612074696d652e00000000000000606482015260840161083a565b6115b3612052826108b360085490565b11156120c65760405162461bcd60e51b815260206004820152602560248201527f4e6f7420656e6f756768204e6f6e2d46756e6769626c6520466f726b7320726560448201527f6d61696e21000000000000000000000000000000000000000000000000000000606482015260840161083a565b6120d781666a94d74f4300006126ea565b341015806120f8575060016120eb33611064565b1080156120f85750806001145b61216a5760405162461bcd60e51b815260206004820152602760248201527f4d696e696d756d207072696365206f6620302e3033206166746572206669727360448201527f7420666f726b2e00000000000000000000000000000000000000000000000000606482015260840161083a565b60005b8181101561099e5761218133600e546122d1565b6121c8600e546040805160608101825260648152600a6020808301918252428385019081526000958652601090915292909320905181559151600183015551600290910155565b6121d06122eb565b806121da816136e5565b91505061216d565b6000611b588284613604565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061228157507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107e557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107e5565b610c7e828260405180602001604052806000815250612970565b600e80549060006122fb836136e5565b9190505550565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061234f82610f4b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166124125760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161083a565b600061241d83610f4b565b9050806001600160a01b0316846001600160a01b031614806124585750836001600160a01b031661244d84610a39565b6001600160a01b0316145b8061248857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166124a382610f4b565b6001600160a01b03161461251f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161083a565b6001600160a01b03821661259a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161083a565b6125a58383836129f9565b6125b0600082612302565b6001600160a01b03831660009081526003602052604081208054600192906125d990849061366d565b90915550506001600160a01b0382166000908152600360205260408120805460019290612607908490613604565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611b588284613630565b6000805b8251811015612785576000612710826001613604565b90505b83518110156127725783818151811061272e5761272e613774565b602002602001015184838151811061274857612748613774565b60200260200101511415612760575060019392505050565b8061276a816136e5565b915050612713565b508061277d816136e5565b9150506126fa565b50600092915050565b6000611b58828461366d565b6000611b58828461361c565b6127b1848484612490565b6127bd84848484612ab1565b611be75760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161083a565b60606128396110fe565b905090565b60608161287e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156128a85780612892816136e5565b91506128a19050600a8361361c565b9150612882565b60008167ffffffffffffffff8111156128c3576128c361378a565b6040519080825280601f01601f1916602001820160405280156128ed576020820181803683370190505b5090505b84156124885761290260018361366d565b915061290f600a8661371e565b61291a906030613604565b60f81b81838151811061292f5761292f613774565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612969600a8661361c565b94506128f1565b61297a8383612c5e565b6129876000848484612ab1565b610c0c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161083a565b6001600160a01b038316612a5457612a4f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612a77565b816001600160a01b0316836001600160a01b031614612a7757612a778382612dc4565b6001600160a01b038216612a8e57610c0c81612e61565b826001600160a01b0316826001600160a01b031614610c0c57610c0c8282612f10565b60006001600160a01b0384163b15612c53576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612b0e90339089908890889060040161351c565b602060405180830381600087803b158015612b2857600080fd5b505af1925050508015612b58575060408051601f3d908101601f19168201909252612b559181019061335f565b60015b612c08573d808015612b86576040519150601f19603f3d011682016040523d82523d6000602084013e612b8b565b606091505b508051612c005760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161083a565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612488565b506001949350505050565b6001600160a01b038216612cb45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161083a565b6000818152600260205260409020546001600160a01b031615612d195760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161083a565b612d25600083836129f9565b6001600160a01b0382166000908152600360205260408120805460019290612d4e908490613604565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612dd184611064565b612ddb919061366d565b600083815260076020526040902054909150808214612e2e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612e739060019061366d565b60008381526009602052604081205460088054939450909284908110612e9b57612e9b613774565b906000526020600020015490508060088381548110612ebc57612ebc613774565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612ef457612ef461375e565b6001900381819060005260206000200160009055905550505050565b6000612f1b83611064565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612f60906136b0565b90600052602060002090601f016020900481019282612f825760008555612fc8565b82601f10612f9b57805160ff1916838001178555612fc8565b82800160010185558215612fc8579182015b82811115612fc8578251825591602001919060010190612fad565b50612fd4929150612fd8565b5090565b5b80821115612fd45760008155600101612fd9565b600067ffffffffffffffff8311156130075761300761378a565b61301a6020601f19601f860116016135af565b905082815283838301111561302e57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461305c57600080fd5b919050565b600082601f83011261307257600080fd5b81356020613087613082836135e0565b6135af565b80838252828201915082860187848660051b89010111156130a757600080fd5b60005b858110156130c6578135845292840192908401906001016130aa565b5090979650505050505050565b6000602082840312156130e557600080fd5b611b5882613045565b6000806040838503121561310157600080fd5b61310a83613045565b915061311860208401613045565b90509250929050565b60008060006060848603121561313657600080fd5b61313f84613045565b925061314d60208501613045565b9150604084013590509250925092565b6000806000806080858703121561317357600080fd5b61317c85613045565b935061318a60208601613045565b925060408501359150606085013567ffffffffffffffff8111156131ad57600080fd5b8501601f810187136131be57600080fd5b6131cd87823560208401612fed565b91505092959194509250565b600080604083850312156131ec57600080fd5b6131f583613045565b91506020830135801515811461320a57600080fd5b809150509250929050565b6000806040838503121561322857600080fd5b61323183613045565b946020939093013593505050565b6000602080838503121561325257600080fd5b823567ffffffffffffffff81111561326957600080fd5b8301601f8101851361327a57600080fd5b8035613288613082826135e0565b80828252848201915084840188868560051b87010111156132a857600080fd5b600094505b838510156132d2576132be81613045565b8352600194909401939185019185016132ad565b50979650505050505050565b600080604083850312156132f157600080fd5b823567ffffffffffffffff8082111561330957600080fd5b61331586838701613061565b9350602085013591508082111561332b57600080fd5b5061333885828601613061565b9150509250929050565b60006020828403121561335457600080fd5b8135611b58816137a0565b60006020828403121561337157600080fd5b8151611b58816137a0565b60006020828403121561338e57600080fd5b813567ffffffffffffffff8111156133a557600080fd5b8201601f810184136133b657600080fd5b61248884823560208401612fed565b6000602082840312156133d757600080fd5b5035919050565b600080604083850312156133f157600080fd5b50508035926020909101359150565b60008151808452613418816020860160208601613684565b601f01601f19169290920160200192915050565b6000835161343e818460208801613684565b835190830190613452818360208801613684565b01949350505050565b600080835481600182811c91508083168061347757607f831692505b602080841082141561349757634e487b7160e01b86526022600452602486fd5b8180156134ab57600181146134bc576134e9565b60ff198616895284890196506134e9565b60008a81526020902060005b868110156134e15781548b8201529085019083016134c8565b505084890196505b505050505050612488817f636f6e74726163745f6d657461646174612e6a736f6e00000000000000000000815260160190565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261354e6080830184613400565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561359057835183529284019291840191600101613574565b50909695505050505050565b602081526000611b586020830184613400565b604051601f8201601f1916810167ffffffffffffffff811182821017156135d8576135d861378a565b604052919050565b600067ffffffffffffffff8211156135fa576135fa61378a565b5060051b60200190565b6000821982111561361757613617613732565b500190565b60008261362b5761362b613748565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561366857613668613732565b500290565b60008282101561367f5761367f613732565b500390565b60005b8381101561369f578181015183820152602001613687565b83811115611be75750506000910152565b600181811c908216806136c457607f821691505b6020821081141561130957634e487b7160e01b600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561371757613717613732565b5060010190565b60008261372d5761372d613748565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611da557600080fdfea2646970667358221220c4769989194d1c1a15634b93cf2269f4167eefb31ab34203ca06028b24fb1cd064736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102c65760003560e01c80637dc2b43a11610179578063a22cb465116100d6578063e3bc6ce51161008a578063f0c9dc6011610064578063f0c9dc6014610747578063f2fde38b1461075c578063f88d2f251461077c57600080fd5b8063e3bc6ce5146106d3578063e8a3d485146106e9578063e985e9c5146106fe57600080fd5b8063b88d4fde116100bb578063b88d4fde1461067e578063c87b56dd1461069e578063cd3293de146106be57600080fd5b8063a22cb4651461063e578063a3f2ae481461065e57600080fd5b80638da5cb5b1161012d57806399c22d4f1161011257806399c22d4f146105e95780639e24078514610609578063a200b8441461062957600080fd5b80638da5cb5b146105b657806395d89b41146105d457600080fd5b80638462151c1161015e5780638462151c14610566578063853828b6146105935780638d859f3e1461059b57600080fd5b80637dc2b43a1461053e5780638255b7421461055357600080fd5b80632f745c59116102275780636352211e116101db57806370a08231116101c057806370a08231146104f4578063714c539814610514578063715018a61461052957600080fd5b80636352211e146104bf5780636c0360eb146104df57600080fd5b806342842e0e1161020c57806342842e0e1461045f5780634f6ccce71461047f57806355f804b31461049f57600080fd5b80632f745c591461042a57806334918dfd1461044a57600080fd5b80630d9005ae1161027e57806318160ddd1161026357806318160ddd146103db5780631c8b232d146103f057806323b872dd1461040a57600080fd5b80630d9005ae1461039c57806310969523146103bb57600080fd5b806306fdde03116102af57806306fdde0314610322578063081812fc14610344578063095ea7b31461037c57600080fd5b806301ffc9a7146102cb57806306c40cd614610300575b600080fd5b3480156102d757600080fd5b506102eb6102e6366004613342565b61078f565b60405190151581526020015b60405180910390f35b34801561030c57600080fd5b5061032061031b36600461323f565b6107eb565b005b34801561032e57600080fd5b506103376109a7565b6040516102f7919061359c565b34801561035057600080fd5b5061036461035f3660046133c5565b610a39565b6040516001600160a01b0390911681526020016102f7565b34801561038857600080fd5b50610320610397366004613215565b610adf565b3480156103a857600080fd5b50600e545b6040519081526020016102f7565b3480156103c757600080fd5b506103206103d636600461337c565b610c11565b3480156103e757600080fd5b506008546103ad565b3480156103fc57600080fd5b50600f546102eb9060ff1681565b34801561041657600080fd5b50610320610425366004613121565b610c82565b34801561043657600080fd5b506103ad610445366004613215565b610d09565b34801561045657600080fd5b50610320610db1565b34801561046b57600080fd5b5061032061047a366004613121565b610e1f565b34801561048b57600080fd5b506103ad61049a3660046133c5565b610e3a565b3480156104ab57600080fd5b506103206104ba36600461337c565b610ede565b3480156104cb57600080fd5b506103646104da3660046133c5565b610f4b565b3480156104eb57600080fd5b50610337610fd6565b34801561050057600080fd5b506103ad61050f3660046130d3565b611064565b34801561052057600080fd5b506103376110fe565b34801561053557600080fd5b5061032061110d565b34801561054a57600080fd5b506103ad603781565b6103206105613660046133de565b611173565b34801561057257600080fd5b506105866105813660046130d3565b611250565b6040516102f79190613558565b61032061130f565b3480156105a757600080fd5b506103ad666a94d74f43000081565b3480156105c257600080fd5b50600a546001600160a01b0316610364565b3480156105e057600080fd5b5061033761138d565b3480156105f557600080fd5b506103ad6106043660046132de565b61139c565b34801561061557600080fd5b506103206106243660046130d3565b611736565b34801561063557600080fd5b506103206118a4565b34801561064a57600080fd5b506103206106593660046131d9565b6119c3565b34801561066a57600080fd5b506103ad6106793660046133c5565b611a88565b34801561068a57600080fd5b5061032061069936600461315d565b611b5f565b3480156106aa57600080fd5b506103376106b93660046133c5565b611bed565b3480156106ca57600080fd5b50610320611cd5565b3480156106df57600080fd5b506103ad6115b381565b3480156106f557600080fd5b50610337611da8565b34801561070a57600080fd5b506102eb6107193660046130ee565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561075357600080fd5b50610337611dd0565b34801561076857600080fd5b506103206107773660046130d3565b611ddd565b61032061078a3660046133c5565b611ebc565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806107e557506107e5826121ee565b92915050565b6002600b5414156108435760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600b55600a546001600160a01b031633146108a25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b6115b36108b982516108b360085490565b906121e2565b106109065760405162461bcd60e51b815260206004820152601860248201527f4e6f7420656e6f75676820666f726b732072656d61696e2e0000000000000000604482015260640161083a565b60005b815181101561099e57600082828151811061092657610926613774565b6020026020010151905061093c81600e546122d1565b610983600e546040805160608101825260648152600a6020808301918252428385019081526000958652601090915292909320905181559151600183015551600290910155565b61098b6122eb565b5080610996816136e5565b915050610909565b50506001600b55565b6060600080546109b6906136b0565b80601f01602080910402602001604051908101604052809291908181526020018280546109e2906136b0565b8015610a2f5780601f10610a0457610100808354040283529160200191610a2f565b820191906000526020600020905b815481529060010190602001808311610a1257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610ac35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161083a565b506000908152600460205260409020546001600160a01b031690565b6000610aea82610f4b565b9050806001600160a01b0316836001600160a01b03161415610b745760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161083a565b336001600160a01b0382161480610b905750610b908133610719565b610c025760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161083a565b610c0c8383612302565b505050565b600a546001600160a01b03163314610c6b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b8051610c7e90600c906020840190612f54565b5050565b610c8c3382612388565b610cfe5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161083a565b610c0c838383612490565b6000610d1483611064565b8210610d885760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e6473000000000000000000000000000000000000000000606482015260840161083a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610e0b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b600f805460ff19811660ff90911615179055565b610c0c83838360405180602001604052806000815250611b5f565b6000610e4560085490565b8210610eb95760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e64730000000000000000000000000000000000000000606482015260840161083a565b60088281548110610ecc57610ecc613774565b90600052602060002001549050919050565b600a546001600160a01b03163314610f385760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b8051610c7e90600d906020840190612f54565b6000818152600260205260408120546001600160a01b0316806107e55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161083a565b600d8054610fe3906136b0565b80601f016020809104026020016040519081016040528092919081815260200182805461100f906136b0565b801561105c5780601f106110315761010080835404028352916020019161105c565b820191906000526020600020905b81548152906001019060200180831161103f57829003601f168201915b505050505081565b60006001600160a01b0382166110e25760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161083a565b506001600160a01b031660009081526003602052604090205490565b6060600d80546109b6906136b0565b600a546001600160a01b031633146111675760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b6111716000612680565b565b600082815260106020526040902060010154600a11156111fb5760405162461bcd60e51b815260206004820152602260248201527f5468617420466f726b20686173206e6f74206265656e206d696e74656420796560448201527f742e000000000000000000000000000000000000000000000000000000000000606482015260840161083a565b61120c816611c37937e080006126ea565b34101561121857600080fd5b600082815260106020526040902061122f83611a88565b8155426002820155600181015461124690836121e2565b6001909101555050565b6060600061125d83611064565b90508061127e5760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156112995761129961378a565b6040519080825280602002602001820160405280156112c2578160200160208202803683370190505b50905060005b82811015611276576112da8582610d09565b8282815181106112ec576112ec613774565b602090810291909101015280611301816136e5565b9150506112c8565b50919050565b600a546001600160a01b031633146113695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b60405133904780156108fc02916000818181858888f1935050505061117157600080fd5b6060600180546109b6906136b0565b6000815183511461143b5760405162461bcd60e51b815260206004820152605c60248201527f596f75206d7573742070726f76696465206120312d746f2d312072656c61746960448201527f6f6e73686970206f66206d6167696320616d6f756e747320746f207370656e6460648201527f2066726f6d20796f7572204e6f6e46756e6769626c65466f726b732e00000000608482015260a40161083a565b611444836126f6565b156114b75760405162461bcd60e51b815260206004820152603360248201527f596f75206d6179206e6f74206275792066726f6d207468652073616d6520636f60448201527f696e20706572207472616e73616374696f6e2e00000000000000000000000000606482015260840161083a565b600a8351111561152f5760405162461bcd60e51b815260206004820152603660248201527f596f752063616e206f6e6c79207370656e642066726f6d203130204e6f6e467560448201527f6e6769626c65466f726b7320617420612074696d652e00000000000000000000606482015260840161083a565b6000805b845181101561169957600085828151811061155057611550613774565b60200260200101519050600085838151811061156e5761156e613774565b6020026020010151905061158182610f4b565b6001600160a01b0316336001600160a01b0316146116075760405162461bcd60e51b815260206004820152603260248201527f596f7520646f206e6f74206f776e20746865204e6f6e46756e6769626c65466f60448201527f726b7320796f75207370656369666965642e0000000000000000000000000000606482015260840161083a565b8061161183611a88565b10156116845760405162461bcd60e51b8152602060048201526024808201527f496e73756666696369656e74204e6f6e46756e6769626c65466f726b73206d6160448201527f6769632e00000000000000000000000000000000000000000000000000000000606482015260840161083a565b50508080611691906136e5565b915050611533565b5060005b84518110156112765760008582815181106116ba576116ba613774565b6020026020010151905060008583815181106116d8576116d8613774565b60200260200101519050600060106000848152602001908152602001600020905061170c8261170685611a88565b9061278e565b815542600282015561171e85836121e2565b9450505050808061172e906136e5565b91505061169d565b6002600b5414156117895760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161083a565b6002600b55600a546001600160a01b031633146117e85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b6115b36117f460085490565b106118415760405162461bcd60e51b815260206004820152601660248201527f53616c652068617320616c726561647920656e64656400000000000000000000604482015260640161083a565b61184d81600e546122d1565b611894600e546040805160608101825260648152600a6020808301918252428385019081526000958652601090915292909320905181559151600183015551600290910155565b61189c6122eb565b506001600b55565b600a546001600160a01b031633146118fe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b6115b361190a60085490565b106119575760405162461bcd60e51b815260206004820152601660248201527f53616c652068617320616c726561647920656e64656400000000000000000000604482015260640161083a565b61199e600e546040805160608101825260648152600a6020808301918252428385019081526000958652601090915292909320905181559151600183015551600290910155565b6119bb6119b3600a546001600160a01b031690565b600e546122d1565b6111716122eb565b6001600160a01b038216331415611a1c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161083a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600081815260106020526040812060010154600a1115611b105760405162461bcd60e51b815260206004820152602260248201527f5468617420466f726b20686173206e6f74206265656e206d696e74656420796560448201527f742e000000000000000000000000000000000000000000000000000000000000606482015260840161083a565b60008281526010602052604090206002810154611b5890611b50906201518090611b4a90611b3f90429061278e565b6001860154906126ea565b9061279a565b8254906121e2565b9392505050565b611b693383612388565b611bdb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161083a565b611be7848484846127a6565b50505050565b6000818152600260205260409020546060906001600160a01b0316611c7a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161083a565b6000611c8461282f565b90506000815111611ca45760405180602001604052806000815250611b58565b80611cae8461283e565b604051602001611cbf92919061342c565b6040516020818303038152906040529392505050565b600a546001600160a01b03163314611d2f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b60015b60378111611da5576040805160608101825260648152600a60208083019182524283850190815260008681526010909252939020915182555160018201559051600290910155611d93611d8d600a546001600160a01b031690565b826122d1565b80611d9d816136e5565b915050611d32565b50565b6060600d604051602001611dbc919061345b565b604051602081830303815290604052905090565b600c8054610fe3906136b0565b600a546001600160a01b03163314611e375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161083a565b6001600160a01b038116611eb35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161083a565b611da581612680565b6002600b541415611f0f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161083a565b6002600b55600f5460ff16611f665760405162461bcd60e51b815260206004820152601360248201527f53616c65206973206e6f74206163746976652e00000000000000000000000000604482015260640161083a565b6115b3611f7260085490565b10611fbf5760405162461bcd60e51b815260206004820152600f60248201527f53616c652068617320656e6465642e0000000000000000000000000000000000604482015260640161083a565b600081118015611fd0575060198111155b6120425760405162461bcd60e51b815260206004820152603960248201527f596f752063616e206275792061206d6178696d756d206f66203235204e6f6e2d60448201527f46756e6769626c6520466f726b7320617420612074696d652e00000000000000606482015260840161083a565b6115b3612052826108b360085490565b11156120c65760405162461bcd60e51b815260206004820152602560248201527f4e6f7420656e6f756768204e6f6e2d46756e6769626c6520466f726b7320726560448201527f6d61696e21000000000000000000000000000000000000000000000000000000606482015260840161083a565b6120d781666a94d74f4300006126ea565b341015806120f8575060016120eb33611064565b1080156120f85750806001145b61216a5760405162461bcd60e51b815260206004820152602760248201527f4d696e696d756d207072696365206f6620302e3033206166746572206669727360448201527f7420666f726b2e00000000000000000000000000000000000000000000000000606482015260840161083a565b60005b8181101561099e5761218133600e546122d1565b6121c8600e546040805160608101825260648152600a6020808301918252428385019081526000958652601090915292909320905181559151600183015551600290910155565b6121d06122eb565b806121da816136e5565b91505061216d565b6000611b588284613604565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061228157507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107e557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107e5565b610c7e828260405180602001604052806000815250612970565b600e80549060006122fb836136e5565b9190505550565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061234f82610f4b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166124125760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161083a565b600061241d83610f4b565b9050806001600160a01b0316846001600160a01b031614806124585750836001600160a01b031661244d84610a39565b6001600160a01b0316145b8061248857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166124a382610f4b565b6001600160a01b03161461251f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606482015260840161083a565b6001600160a01b03821661259a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161083a565b6125a58383836129f9565b6125b0600082612302565b6001600160a01b03831660009081526003602052604081208054600192906125d990849061366d565b90915550506001600160a01b0382166000908152600360205260408120805460019290612607908490613604565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611b588284613630565b6000805b8251811015612785576000612710826001613604565b90505b83518110156127725783818151811061272e5761272e613774565b602002602001015184838151811061274857612748613774565b60200260200101511415612760575060019392505050565b8061276a816136e5565b915050612713565b508061277d816136e5565b9150506126fa565b50600092915050565b6000611b58828461366d565b6000611b58828461361c565b6127b1848484612490565b6127bd84848484612ab1565b611be75760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161083a565b60606128396110fe565b905090565b60608161287e57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156128a85780612892816136e5565b91506128a19050600a8361361c565b9150612882565b60008167ffffffffffffffff8111156128c3576128c361378a565b6040519080825280601f01601f1916602001820160405280156128ed576020820181803683370190505b5090505b84156124885761290260018361366d565b915061290f600a8661371e565b61291a906030613604565b60f81b81838151811061292f5761292f613774565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612969600a8661361c565b94506128f1565b61297a8383612c5e565b6129876000848484612ab1565b610c0c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161083a565b6001600160a01b038316612a5457612a4f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612a77565b816001600160a01b0316836001600160a01b031614612a7757612a778382612dc4565b6001600160a01b038216612a8e57610c0c81612e61565b826001600160a01b0316826001600160a01b031614610c0c57610c0c8282612f10565b60006001600160a01b0384163b15612c53576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612b0e90339089908890889060040161351c565b602060405180830381600087803b158015612b2857600080fd5b505af1925050508015612b58575060408051601f3d908101601f19168201909252612b559181019061335f565b60015b612c08573d808015612b86576040519150601f19603f3d011682016040523d82523d6000602084013e612b8b565b606091505b508051612c005760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161083a565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612488565b506001949350505050565b6001600160a01b038216612cb45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161083a565b6000818152600260205260409020546001600160a01b031615612d195760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161083a565b612d25600083836129f9565b6001600160a01b0382166000908152600360205260408120805460019290612d4e908490613604565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612dd184611064565b612ddb919061366d565b600083815260076020526040902054909150808214612e2e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612e739060019061366d565b60008381526009602052604081205460088054939450909284908110612e9b57612e9b613774565b906000526020600020015490508060088381548110612ebc57612ebc613774565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612ef457612ef461375e565b6001900381819060005260206000200160009055905550505050565b6000612f1b83611064565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612f60906136b0565b90600052602060002090601f016020900481019282612f825760008555612fc8565b82601f10612f9b57805160ff1916838001178555612fc8565b82800160010185558215612fc8579182015b82811115612fc8578251825591602001919060010190612fad565b50612fd4929150612fd8565b5090565b5b80821115612fd45760008155600101612fd9565b600067ffffffffffffffff8311156130075761300761378a565b61301a6020601f19601f860116016135af565b905082815283838301111561302e57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461305c57600080fd5b919050565b600082601f83011261307257600080fd5b81356020613087613082836135e0565b6135af565b80838252828201915082860187848660051b89010111156130a757600080fd5b60005b858110156130c6578135845292840192908401906001016130aa565b5090979650505050505050565b6000602082840312156130e557600080fd5b611b5882613045565b6000806040838503121561310157600080fd5b61310a83613045565b915061311860208401613045565b90509250929050565b60008060006060848603121561313657600080fd5b61313f84613045565b925061314d60208501613045565b9150604084013590509250925092565b6000806000806080858703121561317357600080fd5b61317c85613045565b935061318a60208601613045565b925060408501359150606085013567ffffffffffffffff8111156131ad57600080fd5b8501601f810187136131be57600080fd5b6131cd87823560208401612fed565b91505092959194509250565b600080604083850312156131ec57600080fd5b6131f583613045565b91506020830135801515811461320a57600080fd5b809150509250929050565b6000806040838503121561322857600080fd5b61323183613045565b946020939093013593505050565b6000602080838503121561325257600080fd5b823567ffffffffffffffff81111561326957600080fd5b8301601f8101851361327a57600080fd5b8035613288613082826135e0565b80828252848201915084840188868560051b87010111156132a857600080fd5b600094505b838510156132d2576132be81613045565b8352600194909401939185019185016132ad565b50979650505050505050565b600080604083850312156132f157600080fd5b823567ffffffffffffffff8082111561330957600080fd5b61331586838701613061565b9350602085013591508082111561332b57600080fd5b5061333885828601613061565b9150509250929050565b60006020828403121561335457600080fd5b8135611b58816137a0565b60006020828403121561337157600080fd5b8151611b58816137a0565b60006020828403121561338e57600080fd5b813567ffffffffffffffff8111156133a557600080fd5b8201601f810184136133b657600080fd5b61248884823560208401612fed565b6000602082840312156133d757600080fd5b5035919050565b600080604083850312156133f157600080fd5b50508035926020909101359150565b60008151808452613418816020860160208601613684565b601f01601f19169290920160200192915050565b6000835161343e818460208801613684565b835190830190613452818360208801613684565b01949350505050565b600080835481600182811c91508083168061347757607f831692505b602080841082141561349757634e487b7160e01b86526022600452602486fd5b8180156134ab57600181146134bc576134e9565b60ff198616895284890196506134e9565b60008a81526020902060005b868110156134e15781548b8201529085019083016134c8565b505084890196505b505050505050612488817f636f6e74726163745f6d657461646174612e6a736f6e00000000000000000000815260160190565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261354e6080830184613400565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561359057835183529284019291840191600101613574565b50909695505050505050565b602081526000611b586020830184613400565b604051601f8201601f1916810167ffffffffffffffff811182821017156135d8576135d861378a565b604052919050565b600067ffffffffffffffff8211156135fa576135fa61378a565b5060051b60200190565b6000821982111561361757613617613732565b500190565b60008261362b5761362b613748565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561366857613668613732565b500290565b60008282101561367f5761367f613732565b500390565b60005b8381101561369f578181015183820152602001613687565b83811115611be75750506000910152565b600181811c908216806136c457607f821691505b6020821081141561130957634e487b7160e01b600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561371757613717613732565b5060010190565b60008261372d5761372d613748565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114611da557600080fdfea2646970667358221220c4769989194d1c1a15634b93cf2269f4167eefb31ab34203ca06028b24fb1cd064736f6c63430008070033

Deployed Bytecode Sourcemap

55323:9096:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44211:224;;;;;;;;;;-1:-1:-1;44211:224:0;;;;;:::i;:::-;;:::i;:::-;;;10181:14:1;;10174:22;10156:41;;10144:2;10129:18;44211:224:0;;;;;;;;63353:421;;;;;;;;;;-1:-1:-1;63353:421:0;;;;;:::i;:::-;;:::i;:::-;;32083:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33642:221::-;;;;;;;;;;-1:-1:-1;33642:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8796:55:1;;;8778:74;;8766:2;8751:18;33642:221:0;8632:226:1;33165:411:0;;;;;;;;;;-1:-1:-1;33165:411:0;;;;;:::i;:::-;;:::i;62314:88::-;;;;;;;;;;-1:-1:-1;62386:8:0;;62314:88;;;23352:25:1;;;23340:2;23325:18;62314:88:0;23206:177:1;62410:116:0;;;;;;;;;;-1:-1:-1;62410:116:0;;;;;:::i;:::-;;:::i;44851:113::-;;;;;;;;;;-1:-1:-1;44939:10:0;:17;44851:113;;55893:34;;;;;;;;;;-1:-1:-1;55893:34:0;;;;;;;;34532:339;;;;;;;;;;-1:-1:-1;34532:339:0;;;;;:::i;:::-;;:::i;44519:256::-;;;;;;;;;;-1:-1:-1;44519:256:0;;;;;:::i;:::-;;:::i;62868:93::-;;;;;;;;;;;;;:::i;34942:185::-;;;;;;;;;;-1:-1:-1;34942:185:0;;;;;:::i;:::-;;:::i;45041:233::-;;;;;;;;;;-1:-1:-1;45041:233:0;;;;;:::i;:::-;;:::i;62534:102::-;;;;;;;;;;-1:-1:-1;62534:102:0;;;;;:::i;:::-;;:::i;31777:239::-;;;;;;;;;;-1:-1:-1;31777:239:0;;;;;:::i;:::-;;:::i;55780:53::-;;;;;;;;;;;;;:::i;31507:208::-;;;;;;;;;;-1:-1:-1;31507:208:0;;;;;:::i;:::-;;:::i;62769:91::-;;;;;;;;;;;;;:::i;16227:94::-;;;;;;;;;;;;;:::i;55592:41::-;;;;;;;;;;;;55631:2;55592:41;;57587:771;;;;;;:::i;:::-;;:::i;60924:502::-;;;;;;;;;;-1:-1:-1;60924:502:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;62969:123::-;;;:::i;55640:46::-;;;;;;;;;;;;55669:17;55640:46;;15576:87;;;;;;;;;;-1:-1:-1;15649:6:0;;-1:-1:-1;;;;;15649:6:0;15576:87;;32252:104;;;;;;;;;;;;;:::i;58769:1603::-;;;;;;;;;;-1:-1:-1;58769:1603:0;;;;;:::i;:::-;;:::i;63782:253::-;;;;;;;;;;-1:-1:-1;63782:253:0;;;;;:::i;:::-;;:::i;64043:221::-;;;;;;;;;;;;;:::i;33935:295::-;;;;;;;;;;-1:-1:-1;33935:295:0;;;;;:::i;:::-;;:::i;56448:818::-;;;;;;;;;;-1:-1:-1;56448:818:0;;;;;:::i;:::-;;:::i;35198:328::-;;;;;;;;;;-1:-1:-1;35198:328:0;;;;;:::i;:::-;;:::i;32427:334::-;;;;;;;;;;-1:-1:-1;32427:334:0;;;;;:::i;:::-;;:::i;63100:245::-;;;;;;;;;;;;;:::i;55548:37::-;;;;;;;;;;;;55581:4;55548:37;;64272:144;;;;;;;;;;;;;:::i;34301:164::-;;;;;;;;;;-1:-1:-1;34301:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34422:25:0;;;34398:4;34422:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34301:164;55728:43;;;;;;;;;;;;;:::i;16476:192::-;;;;;;;;;;-1:-1:-1;16476:192:0;;;;;:::i;:::-;;:::i;61434:804::-;;;;;;:::i;:::-;;:::i;44211:224::-;44313:4;44337:50;;;44352:35;44337:50;;:90;;;44391:36;44415:11;44391:23;:36::i;:::-;44330:97;44211:224;-1:-1:-1;;44211:224:0:o;63353:421::-;52128:1;52724:7;;:19;;52716:63;;;;-1:-1:-1;;;52716:63:0;;22695:2:1;52716:63:0;;;22677:21:1;22734:2;22714:18;;;22707:30;22773:33;22753:18;;;22746:61;22824:18;;52716:63:0;;;;;;;;;52128:1;52857:7;:18;15649:6;;-1:-1:-1;;;;;15649:6:0;14424:10;15796:23:::1;15788:68;;;::::0;-1:-1:-1;;;15788:68:0;;17528:2:1;15788:68:0::1;::::0;::::1;17510:21:1::0;;;17547:18;;;17540:30;17606:34;17586:18;;;17579:62;17658:18;;15788:68:0::1;17326:356:1::0;15788:68:0::1;55581:4:::2;63455:36;63473:10;:17;63455:13;44939:10:::0;:17;;44851:113;63455:13:::2;:17:::0;::::2;:36::i;:::-;:48;63447:85;;;::::0;-1:-1:-1;;;63447:85:0;;23055:2:1;63447:85:0::2;::::0;::::2;23037:21:1::0;23094:2;23074:18;;;23067:30;23133:26;23113:18;;;23106:54;23177:18;;63447:85:0::2;22853:348:1::0;63447:85:0::2;63548:6;63543:224;63564:10;:17;63560:1;:21;63543:224;;;63603:18;63624:10;63635:1;63624:13;;;;;;;;:::i;:::-;;;;;;;63603:34;;63652:31;63662:10;63674:8;;63652:9;:31::i;:::-;63698:29;63718:8;;56393:35:::0;;;;;;;;56403:3;56393:35;;56408:2;56393:35;;;;;;;56412:15;56393:35;;;;;;-1:-1:-1;56371:19:0;;;:15;:19;;;;;;;:57;;;;;;;;;;;;;;;;56314:122;63698:29:::2;63742:13;:11;:13::i;:::-;-1:-1:-1::0;63583:3:0;::::2;::::0;::::2;:::i;:::-;;;;63543:224;;;-1:-1:-1::0;;52084:1:0;53036:7;:22;63353:421::o;32083:100::-;32137:13;32170:5;32163:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32083:100;:::o;33642:221::-;33718:7;37125:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37125:16:0;33738:73;;;;-1:-1:-1;;;33738:73:0;;17115:2:1;33738:73:0;;;17097:21:1;17154:2;17134:18;;;17127:30;17193:34;17173:18;;;17166:62;17264:14;17244:18;;;17237:42;17296:19;;33738:73:0;16913:408:1;33738:73:0;-1:-1:-1;33831:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33831:24:0;;33642:221::o;33165:411::-;33246:13;33262:23;33277:7;33262:14;:23::i;:::-;33246:39;;33310:5;-1:-1:-1;;;;;33304:11:0;:2;-1:-1:-1;;;;;33304:11:0;;;33296:57;;;;-1:-1:-1;;;33296:57:0;;19468:2:1;33296:57:0;;;19450:21:1;19507:2;19487:18;;;19480:30;19546:34;19526:18;;;19519:62;19617:3;19597:18;;;19590:31;19638:19;;33296:57:0;19266:397:1;33296:57:0;14424:10;-1:-1:-1;;;;;33388:21:0;;;;:62;;-1:-1:-1;33413:37:0;33430:5;14424:10;34301:164;:::i;33413:37::-;33366:168;;;;-1:-1:-1;;;33366:168:0;;15508:2:1;33366:168:0;;;15490:21:1;15547:2;15527:18;;;15520:30;15586:34;15566:18;;;15559:62;15657:26;15637:18;;;15630:54;15701:19;;33366:168:0;15306:420:1;33366:168:0;33547:21;33556:2;33560:7;33547:8;:21::i;:::-;33235:341;33165:411;;:::o;62410:116::-;15649:6;;-1:-1:-1;;;;;15649:6:0;14424:10;15796:23;15788:68;;;;-1:-1:-1;;;15788:68:0;;17528:2:1;15788:68:0;;;17510:21:1;;;17547:18;;;17540:30;17606:34;17586:18;;;17579:62;17658:18;;15788:68:0;17326:356:1;15788:68:0;62486:32;;::::1;::::0;:24:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;;62410:116:::0;:::o;34532:339::-;34727:41;14424:10;34760:7;34727:18;:41::i;:::-;34719:103;;;;-1:-1:-1;;;34719:103:0;;20629:2:1;34719:103:0;;;20611:21:1;20668:2;20648:18;;;20641:30;20707:34;20687:18;;;20680:62;20778:19;20758:18;;;20751:47;20815:19;;34719:103:0;20427:413:1;34719:103:0;34835:28;34845:4;34851:2;34855:7;34835:9;:28::i;44519:256::-;44616:7;44652:23;44669:5;44652:16;:23::i;:::-;44644:5;:31;44636:87;;;;-1:-1:-1;;;44636:87:0;;11135:2:1;44636:87:0;;;11117:21:1;11174:2;11154:18;;;11147:30;11213:34;11193:18;;;11186:62;11284:13;11264:18;;;11257:41;11315:19;;44636:87:0;10933:407:1;44636:87:0;-1:-1:-1;;;;;;44741:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;44519:256::o;62868:93::-;15649:6;;-1:-1:-1;;;;;15649:6:0;14424:10;15796:23;15788:68;;;;-1:-1:-1;;;15788:68:0;;17528:2:1;15788:68:0;;;17510:21:1;;;17547:18;;;17540:30;17606:34;17586:18;;;17579:62;17658:18;;15788:68:0;17326:356:1;15788:68:0;62939:14:::1;::::0;;-1:-1:-1;;62921:32:0;::::1;62939:14;::::0;;::::1;62938:15;62921:32;::::0;;62868:93::o;34942:185::-;35080:39;35097:4;35103:2;35107:7;35080:39;;;;;;;;;;;;:16;:39::i;45041:233::-;45116:7;45152:30;44939:10;:17;;44851:113;45152:30;45144:5;:38;45136:95;;;;-1:-1:-1;;;45136:95:0;;21453:2:1;45136:95:0;;;21435:21:1;21492:2;21472:18;;;21465:30;21531:34;21511:18;;;21504:62;21602:14;21582:18;;;21575:42;21634:19;;45136:95:0;21251:408:1;45136:95:0;45249:10;45260:5;45249:17;;;;;;;;:::i;:::-;;;;;;;;;45242:24;;45041:233;;;:::o;62534:102::-;15649:6;;-1:-1:-1;;;;;15649:6:0;14424:10;15796:23;15788:68;;;;-1:-1:-1;;;15788:68:0;;17528:2:1;15788:68:0;;;17510:21:1;;;17547:18;;;17540:30;17606:34;17586:18;;;17579:62;17658:18;;15788:68:0;17326:356:1;15788:68:0;62608:20;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;31777:239::-:0;31849:7;31885:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31885:16:0;31920:19;31912:73;;;;-1:-1:-1;;;31912:73:0;;16344:2:1;31912:73:0;;;16326:21:1;16383:2;16363:18;;;16356:30;16422:34;16402:18;;;16395:62;16493:11;16473:18;;;16466:39;16522:19;;31912:73:0;16142:405:1;55780:53:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31507:208::-;31579:7;-1:-1:-1;;;;;31607:19:0;;31599:74;;;;-1:-1:-1;;;31599:74:0;;15933:2:1;31599:74:0;;;15915:21:1;15972:2;15952:18;;;15945:30;16011:34;15991:18;;;15984:62;16082:12;16062:18;;;16055:40;16112:19;;31599:74:0;15731:406:1;31599:74:0;-1:-1:-1;;;;;;31691:16:0;;;;;:9;:16;;;;;;;31507:208::o;62769:91::-;62812:13;62845:7;62838:14;;;;;:::i;16227:94::-;15649:6;;-1:-1:-1;;;;;15649:6:0;14424:10;15796:23;15788:68;;;;-1:-1:-1;;;15788:68:0;;17528:2:1;15788:68:0;;;17510:21:1;;;17547:18;;;17540:30;17606:34;17586:18;;;17579:62;17658:18;;15788:68:0;17326:356:1;15788:68:0;16292:21:::1;16310:1;16292:9;:21::i;:::-;16227:94::o:0;57587:771::-;57672:19;;;;:15;:19;;;;;:25;;;57701:2;-1:-1:-1;57672:31:0;57664:78;;;;-1:-1:-1;;;57664:78:0;;22292:2:1;57664:78:0;;;22274:21:1;22331:2;22311:18;;;22304:30;22370:34;22350:18;;;22343:62;22441:4;22421:18;;;22414:32;22463:19;;57664:78:0;22090:398:1;57664:78:0;57774:28;:6;57785:16;57774:10;:28::i;:::-;57761:9;:41;;57753:50;;;;;;57827:27;57857:19;;;:15;:19;;;;;58226:16;57873:2;58226:12;:16::i;:::-;58208:34;;58279:15;58253:23;;;:41;58323:15;;;;:27;;58343:6;58323:19;:27::i;:::-;58305:15;;;;:45;-1:-1:-1;;57587:771:0:o;60924:502::-;60986:16;61015:18;61036:17;61046:6;61036:9;:17::i;:::-;61015:38;-1:-1:-1;61068:15:0;61064:355;;61107:16;;;61121:1;61107:16;;;;;;;;;;;-1:-1:-1;61100:23:0;60924:502;-1:-1:-1;;;60924:502:0:o;61064:355::-;61156:23;61196:10;61182:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61182:25:0;;61156:51;;61222:13;61250:130;61274:10;61266:5;:18;61250:130;;;61330:34;61350:6;61358:5;61330:19;:34::i;:::-;61314:6;61321:5;61314:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;61286:7;;;;:::i;:::-;;;;61250:130;;61064:355;61004:422;60924:502;;;:::o;62969:123::-;15649:6;;-1:-1:-1;;;;;15649:6:0;14424:10;15796:23;15788:68;;;;-1:-1:-1;;;15788:68:0;;17528:2:1;15788:68:0;;;17510:21:1;;;17547:18;;;17540:30;17606:34;17586:18;;;17579:62;17658:18;;15788:68:0;17326:356:1;15788:68:0;63036:47:::1;::::0;63044:10:::1;::::0;63061:21:::1;63036:47:::0;::::1;;;::::0;::::1;::::0;;;63061:21;63044:10;63036:47;::::1;;;;;;63028:56;;;::::0;::::1;32252:104:::0;32308:13;32341:7;32334:14;;;;;:::i;58769:1603::-;58864:7;58910:13;:20;58892:7;:14;:38;58884:143;;;;-1:-1:-1;;;58884:143:0;;10634:2:1;58884:143:0;;;10616:21:1;10673:2;10653:18;;;10646:30;10712:34;10692:18;;;10685:62;10783:34;10763:18;;;10756:62;10855:30;10834:19;;;10827:59;10903:19;;58884:143:0;10432:496:1;58884:143:0;59047:24;59063:7;59047:15;:24::i;:::-;59046:25;59038:89;;;;-1:-1:-1;;;59038:89:0;;15088:2:1;59038:89:0;;;15070:21:1;15127:2;15107:18;;;15100:30;15166:34;15146:18;;;15139:62;15237:21;15217:18;;;15210:49;15276:19;;59038:89:0;14886:415:1;59038:89:0;59164:2;59146:7;:14;:20;;59138:87;;;;-1:-1:-1;;;59138:87:0;;12730:2:1;59138:87:0;;;12712:21:1;12769:2;12749:18;;;12742:30;12808:34;12788:18;;;12781:62;12879:24;12859:18;;;12852:52;12921:19;;59138:87:0;12528:418:1;59138:87:0;59236:18;59399:6;59394:330;59415:7;:14;59411:1;:18;59394:330;;;59451:7;59461;59469:1;59461:10;;;;;;;;:::i;:::-;;;;;;;59451:20;;59486:14;59503:13;59517:1;59503:16;;;;;;;;:::i;:::-;;;;;;;59486:33;;59556:11;59564:2;59556:7;:11::i;:::-;-1:-1:-1;;;;;59542:25:0;:10;-1:-1:-1;;;;;59542:25:0;;59534:88;;;;-1:-1:-1;;;59534:88:0;;14669:2:1;59534:88:0;;;14651:21:1;14708:2;14688:18;;;14681:30;14747:34;14727:18;;;14720:62;14818:20;14798:18;;;14791:48;14856:19;;59534:88:0;14467:414:1;59534:88:0;59665:6;59645:16;59658:2;59645:12;:16::i;:::-;:26;;59637:75;;;;-1:-1:-1;;;59637:75:0;;18715:2:1;59637:75:0;;;18697:21:1;18754:2;18734:18;;;18727:30;18793:34;18773:18;;;18766:62;18864:6;18844:18;;;18837:34;18888:19;;59637:75:0;18513:400:1;59637:75:0;59436:288;;59431:3;;;;;:::i;:::-;;;;59394:330;;;;59868:6;59863:365;59884:7;:14;59880:1;:18;59863:365;;;59920:7;59930;59938:1;59930:10;;;;;;;;:::i;:::-;;;;;;;59920:20;;59955:11;59969:13;59983:1;59969:16;;;;;;;;:::i;:::-;;;;;;;59955:30;;60000:27;60030:15;:19;60046:2;60030:19;;;;;;;;;;;60000:49;;60082:28;60103:6;60082:16;60095:2;60082:12;:16::i;:::-;:20;;:28::i;:::-;60064:46;;60151:15;60125:23;;;:41;60194:22;:10;60209:6;60194:14;:22::i;:::-;60181:35;;59905:323;;;59900:3;;;;;:::i;:::-;;;;59863:365;;63782:253;52128:1;52724:7;;:19;;52716:63;;;;-1:-1:-1;;;52716:63:0;;22695:2:1;52716:63:0;;;22677:21:1;22734:2;22714:18;;;22707:30;22773:33;22753:18;;;22746:61;22824:18;;52716:63:0;22493:355:1;52716:63:0;52128:1;52857:7;:18;15649:6;;-1:-1:-1;;;;;15649:6:0;14424:10;15796:23:::1;15788:68;;;::::0;-1:-1:-1;;;15788:68:0;;17528:2:1;15788:68:0::1;::::0;::::1;17510:21:1::0;;;17547:18;;;17540:30;17606:34;17586:18;;;17579:62;17658:18;;15788:68:0::1;17326:356:1::0;15788:68:0::1;55581:4:::2;63870:13;44939:10:::0;:17;;44851:113;63870:13:::2;:25;63862:60;;;::::0;-1:-1:-1;;;63862:60:0;;19870:2:1;63862:60:0::2;::::0;::::2;19852:21:1::0;19909:2;19889:18;;;19882:30;19948:24;19928:18;;;19921:52;19990:18;;63862:60:0::2;19668:346:1::0;63862:60:0::2;63933:30;63943:9;63954:8;;63933:9;:30::i;:::-;63974:29;63994:8;;56393:35:::0;;;;;;;;56403:3;56393:35;;56408:2;56393:35;;;;;;;56412:15;56393:35;;;;;;-1:-1:-1;56371:19:0;;;:15;:19;;;;;;;:57;;;;;;;;;;;;;;;;56314:122;63974:29:::2;64014:13;:11;:13::i;:::-;-1:-1:-1::0;52084:1:0;53036:7;:22;63782:253::o;64043:221::-;15649:6;;-1:-1:-1;;;;;15649:6:0;14424:10;15796:23;15788:68;;;;-1:-1:-1;;;15788:68:0;;17528:2:1;15788:68:0;;;17510:21:1;;;17547:18;;;17540:30;17606:34;17586:18;;;17579:62;17658:18;;15788:68:0;17326:356:1;15788:68:0;55581:4:::1;64101:13;44939:10:::0;:17;;44851:113;64101:13:::1;:25;64093:60;;;::::0;-1:-1:-1;;;64093:60:0;;19870:2:1;64093:60:0::1;::::0;::::1;19852:21:1::0;19909:2;19889:18;;;19882:30;19948:24;19928:18;;;19921:52;19990:18;;64093:60:0::1;19668:346:1::0;64093:60:0::1;64164:29;64184:8;;56393:35:::0;;;;;;;;56403:3;56393:35;;56408:2;56393:35;;;;;;;56412:15;56393:35;;;;;;-1:-1:-1;56371:19:0;;;:15;:19;;;;;;;:57;;;;;;;;;;;;;;;;56314:122;64164:29:::1;64204:28;64214:7;15649:6:::0;;-1:-1:-1;;;;;15649:6:0;;15576:87;64214:7:::1;64223:8;;64204:9;:28::i;:::-;64243:13;:11;:13::i;33935:295::-:0;-1:-1:-1;;;;;34038:24:0;;14424:10;34038:24;;34030:62;;;;-1:-1:-1;;;34030:62:0;;13902:2:1;34030:62:0;;;13884:21:1;13941:2;13921:18;;;13914:30;13980:27;13960:18;;;13953:55;14025:18;;34030:62:0;13700:349:1;34030:62:0;14424:10;34105:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34105:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34105:53:0;;;;;;;;;;34174:48;;10156:41:1;;;34105:42:0;;14424:10;34174:48;;10129:18:1;34174:48:0;;;;;;;33935:295;;:::o;56448:818::-;56500:7;56748:19;;;:15;:19;;;;;:25;;;56777:2;-1:-1:-1;56748:31:0;56740:78;;;;-1:-1:-1;;;56740:78:0;;22292:2:1;56740:78:0;;;22274:21:1;22331:2;22311:18;;;22304:30;22370:34;22350:18;;;22343:62;22441:4;22421:18;;;22414:32;22463:19;;56740:78:0;22090:398:1;56740:78:0;56829:27;56859:19;;;:15;:19;;;;;57194:23;;;;57134:97;;57154:76;;57224:5;;57154:65;;57174:44;;:15;;:19;:44::i;:::-;57154:15;;;;;:19;:65::i;:::-;:69;;:76::i;:::-;57134:15;;;:19;:97::i;:::-;57127:104;56448:818;-1:-1:-1;;;56448:818:0:o;35198:328::-;35373:41;14424:10;35406:7;35373:18;:41::i;:::-;35365:103;;;;-1:-1:-1;;;35365:103:0;;20629:2:1;35365:103:0;;;20611:21:1;20668:2;20648:18;;;20641:30;20707:34;20687:18;;;20680:62;20778:19;20758:18;;;20751:47;20815:19;;35365:103:0;20427:413:1;35365:103:0;35479:39;35493:4;35499:2;35503:7;35512:5;35479:13;:39::i;:::-;35198:328;;;;:::o;32427:334::-;37101:4;37125:16;;;:7;:16;;;;;;32500:13;;-1:-1:-1;;;;;37125:16:0;32526:76;;;;-1:-1:-1;;;32526:76:0;;18299:2:1;32526:76:0;;;18281:21:1;18338:2;18318:18;;;18311:30;18377:34;18357:18;;;18350:62;18448:17;18428:18;;;18421:45;18483:19;;32526:76:0;18097:411:1;32526:76:0;32615:21;32639:10;:8;:10::i;:::-;32615:34;;32691:1;32673:7;32667:21;:25;:86;;;;;;;;;;;;;;;;;32719:7;32728:18;:7;:16;:18::i;:::-;32702:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32660:93;32427:334;-1:-1:-1;;;32427:334:0:o;63100:245::-;15649:6;;-1:-1:-1;;;;;15649:6:0;14424:10;15796:23;15788:68;;;;-1:-1:-1;;;15788:68:0;;17528:2:1;15788:68:0;;;17510:21:1;;;17547:18;;;17540:30;17606:34;17586:18;;;17579:62;17658:18;;15788:68:0;17326:356:1;15788:68:0;63223:1:::1;63209:129;55631:2;63226:1;:20;63209:129;;56393:35:::0;;;;;;;;56403:3;56393:35;;56408:2;56393:35;;;;;;;56412:15;56393:35;;;;;;-1:-1:-1;56371:19:0;;;:15;:19;;;;;;:57;;;;;;;;;;;;;;;;63305:21:::1;63315:7;15649:6:::0;;-1:-1:-1;;;;;15649:6:0;;15576:87;63315:7:::1;63324:1;63305:9;:21::i;:::-;63248:3:::0;::::1;::::0;::::1;:::i;:::-;;;;63209:129;;;;63100:245::o:0;64272:144::-;64316:13;64373:7;64356:51;;;;;;;;:::i;:::-;;;;;;;;;;;;;64342:66;;64272:144;:::o;55728:43::-;;;;;;;:::i;16476:192::-;15649:6;;-1:-1:-1;;;;;15649:6:0;14424:10;15796:23;15788:68;;;;-1:-1:-1;;;15788:68:0;;17528:2:1;15788:68:0;;;17510:21:1;;;17547:18;;;17540:30;17606:34;17586:18;;;17579:62;17658:18;;15788:68:0;17326:356:1;15788:68:0;-1:-1:-1;;;;;16565:22:0;::::1;16557:73;;;::::0;-1:-1:-1;;;16557:73:0;;11966:2:1;16557:73:0::1;::::0;::::1;11948:21:1::0;12005:2;11985:18;;;11978:30;12044:34;12024:18;;;12017:62;12115:8;12095:18;;;12088:36;12141:19;;16557:73:0::1;11764:402:1::0;16557:73:0::1;16641:19;16651:8;16641:9;:19::i;61434:804::-:0;52128:1;52724:7;;:19;;52716:63;;;;-1:-1:-1;;;52716:63:0;;22695:2:1;52716:63:0;;;22677:21:1;22734:2;22714:18;;;22707:30;22773:33;22753:18;;;22746:61;22824:18;;52716:63:0;22493:355:1;52716:63:0;52128:1;52857:7;:18;61529:14:::1;::::0;::::1;;61521:46;;;::::0;-1:-1:-1;;;61521:46:0;;19120:2:1;61521:46:0::1;::::0;::::1;19102:21:1::0;19159:2;19139:18;;;19132:30;19198:21;19178:18;;;19171:49;19237:18;;61521:46:0::1;18918:343:1::0;61521:46:0::1;55581:4;61586:13;44939:10:::0;:17;;44851:113;61586:13:::1;:25;61578:53;;;::::0;-1:-1:-1;;;61578:53:0;;13153:2:1;61578:53:0::1;::::0;::::1;13135:21:1::0;13192:2;13172:18;;;13165:30;13231:17;13211:18;;;13204:45;13266:18;;61578:53:0::1;12951:339:1::0;61578:53:0::1;61672:1;61650:19;:23;:52;;;;;61700:2;61677:19;:25;;61650:52;61642:122;;;::::0;-1:-1:-1;;;61642:122:0;;21866:2:1;61642:122:0::1;::::0;::::1;21848:21:1::0;21905:2;21885:18;;;21878:30;21944:34;21924:18;;;21917:62;22015:27;21995:18;;;21988:55;22060:19;;61642:122:0::1;21664:421:1::0;61642:122:0::1;55581:4;61783:38;61801:19;61783:13;44939:10:::0;:17;;44851:113;61783:38:::1;:51;;61775:101;;;::::0;-1:-1:-1;;;61775:101:0;;21047:2:1;61775:101:0::1;::::0;::::1;21029:21:1::0;21086:2;21066:18;;;21059:30;21125:34;21105:18;;;21098:62;21196:7;21176:18;;;21169:35;21221:19;;61775:101:0::1;20845:401:1::0;61775:101:0::1;61909:30;:19:::0;55669:17:::1;61909:23;:30::i;:::-;61896:9;:43;;61895:104;;;;61969:1;61945:21;61955:10;61945:9;:21::i;:::-;:25;:53;;;;;61974:19;61997:1;61974:24;61945:53;61887:156;;;::::0;-1:-1:-1;;;61887:156:0;;20221:2:1;61887:156:0::1;::::0;::::1;20203:21:1::0;20260:2;20240:18;;;20233:30;20299:34;20279:18;;;20272:62;20370:9;20350:18;;;20343:37;20397:19;;61887:156:0::1;20019:403:1::0;61887:156:0::1;62059:6;62054:177;62075:19;62071:1;:23;62054:177;;;62116:31;62126:10;62138:8;;62116:9;:31::i;:::-;62162:29;62182:8;;56393:35:::0;;;;;;;;56403:3;56393:35;;56408:2;56393:35;;;;;;;56412:15;56393:35;;;;;;-1:-1:-1;56371:19:0;;;:15;:19;;;;;;;:57;;;;;;;;;;;;;;;;56314:122;62162:29:::1;62206:13;:11;:13::i;:::-;62096:3:::0;::::1;::::0;::::1;:::i;:::-;;;;62054:177;;2829:98:::0;2887:7;2914:5;2918:1;2914;:5;:::i;31138:305::-;31240:4;31277:40;;;31292:25;31277:40;;:105;;-1:-1:-1;31334:48:0;;;31349:33;31334:48;31277:105;:158;;;-1:-1:-1;29746:25:0;29731:40;;;;31399:36;29622:157;38020:110;38096:26;38106:2;38110:7;38096:26;;;;;;;;;;;;:9;:26::i;62246:60::-;62288:8;:10;;;:8;:10;;;:::i;:::-;;;;;;62246:60::o;41018:174::-;41093:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;41093:29:0;;;;;;;;:24;;41147:23;41093:24;41147:14;:23::i;:::-;-1:-1:-1;;;;;41138:46:0;;;;;;;;;;;41018:174;;:::o;37330:348::-;37423:4;37125:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37125:16:0;37440:73;;;;-1:-1:-1;;;37440:73:0;;14256:2:1;37440:73:0;;;14238:21:1;14295:2;14275:18;;;14268:30;14334:34;14314:18;;;14307:62;14405:14;14385:18;;;14378:42;14437:19;;37440:73:0;14054:408:1;37440:73:0;37524:13;37540:23;37555:7;37540:14;:23::i;:::-;37524:39;;37593:5;-1:-1:-1;;;;;37582:16:0;:7;-1:-1:-1;;;;;37582:16:0;;:51;;;;37626:7;-1:-1:-1;;;;;37602:31:0;:20;37614:7;37602:11;:20::i;:::-;-1:-1:-1;;;;;37602:31:0;;37582:51;:87;;;-1:-1:-1;;;;;;34422:25:0;;;34398:4;34422:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37637:32;37574:96;37330:348;-1:-1:-1;;;;37330:348:0:o;40322:578::-;40481:4;-1:-1:-1;;;;;40454:31:0;:23;40469:7;40454:14;:23::i;:::-;-1:-1:-1;;;;;40454:31:0;;40446:85;;;;-1:-1:-1;;;40446:85:0;;17889:2:1;40446:85:0;;;17871:21:1;17928:2;17908:18;;;17901:30;17967:34;17947:18;;;17940:62;18038:11;18018:18;;;18011:39;18067:19;;40446:85:0;17687:405:1;40446:85:0;-1:-1:-1;;;;;40550:16:0;;40542:65;;;;-1:-1:-1;;;40542:65:0;;13497:2:1;40542:65:0;;;13479:21:1;13536:2;13516:18;;;13509:30;13575:34;13555:18;;;13548:62;13646:6;13626:18;;;13619:34;13670:19;;40542:65:0;13295:400:1;40542:65:0;40620:39;40641:4;40647:2;40651:7;40620:20;:39::i;:::-;40724:29;40741:1;40745:7;40724:8;:29::i;:::-;-1:-1:-1;;;;;40766:15:0;;;;;;:9;:15;;;;;:20;;40785:1;;40766:15;:20;;40785:1;;40766:20;:::i;:::-;;;;-1:-1:-1;;;;;;;40797:13:0;;;;;;:9;:13;;;;;:18;;40814:1;;40797:13;:18;;40814:1;;40797:18;:::i;:::-;;;;-1:-1:-1;;40826:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;40826:21:0;;;;;;;;;40865:27;;40826:16;;40865:27;;;;;;;40322:578;;;:::o;16676:173::-;16751:6;;;-1:-1:-1;;;;;16768:17:0;;;;;;;;;;;16801:40;;16751:6;;;16768:17;16751:6;;16801:40;;16732:16;;16801:40;16721:128;16676:173;:::o;3567:98::-;3625:7;3652:5;3656:1;3652;:5;:::i;60561:329::-;60627:4;;60644:216;60665:3;:10;60661:1;:14;60644:216;;;60702:6;60711:5;:1;60715;60711:5;:::i;:::-;60702:14;;60697:152;60722:3;:10;60718:1;:14;60697:152;;;60772:3;60776:1;60772:6;;;;;;;;:::i;:::-;;;;;;;60762:3;60766:1;60762:6;;;;;;;;:::i;:::-;;;;;;;:16;60758:76;;;-1:-1:-1;60810:4:0;;60561:329;-1:-1:-1;;;60561:329:0:o;60758:76::-;60734:3;;;;:::i;:::-;;;;60697:152;;;-1:-1:-1;60677:3:0;;;;:::i;:::-;;;;60644:216;;;-1:-1:-1;60877:5:0;;60561:329;-1:-1:-1;;60561:329:0:o;3210:98::-;3268:7;3295:5;3299:1;3295;:5;:::i;3966:98::-;4024:7;4051:5;4055:1;4051;:5;:::i;36408:315::-;36565:28;36575:4;36581:2;36585:7;36565:9;:28::i;:::-;36612:48;36635:4;36641:2;36645:7;36654:5;36612:22;:48::i;:::-;36604:111;;;;-1:-1:-1;;;36604:111:0;;11547:2:1;36604:111:0;;;11529:21:1;11586:2;11566:18;;;11559:30;11625:34;11605:18;;;11598:62;11696:20;11676:18;;;11669:48;11734:19;;36604:111:0;11345:414:1;62644:113:0;62704:13;62737:12;:10;:12::i;:::-;62730:19;;62644:113;:::o;27045:723::-;27101:13;27322:10;27318:53;;-1:-1:-1;;27349:10:0;;;;;;;;;;;;;;;;;;27045:723::o;27318:53::-;27396:5;27381:12;27437:78;27444:9;;27437:78;;27470:8;;;;:::i;:::-;;-1:-1:-1;27493:10:0;;-1:-1:-1;27501:2:0;27493:10;;:::i;:::-;;;27437:78;;;27525:19;27557:6;27547:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27547:17:0;;27525:39;;27575:154;27582:10;;27575:154;;27609:11;27619:1;27609:11;;:::i;:::-;;-1:-1:-1;27678:10:0;27686:2;27678:5;:10;:::i;:::-;27665:24;;:2;:24;:::i;:::-;27652:39;;27635:6;27642;27635:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;27706:11:0;27715:2;27706:11;;:::i;:::-;;;27575:154;;38357:321;38487:18;38493:2;38497:7;38487:5;:18::i;:::-;38538:54;38569:1;38573:2;38577:7;38586:5;38538:22;:54::i;:::-;38516:154;;;;-1:-1:-1;;;38516:154:0;;11547:2:1;38516:154:0;;;11529:21:1;11586:2;11566:18;;;11559:30;11625:34;11605:18;;;11598:62;11696:20;11676:18;;;11669:48;11734:19;;38516:154:0;11345:414:1;45887:589:0;-1:-1:-1;;;;;46093:18:0;;46089:187;;46128:40;46160:7;47303:10;:17;;47276:24;;;;:15;:24;;;;;:44;;;47331:24;;;;;;;;;;;;47199:164;46128:40;46089:187;;;46198:2;-1:-1:-1;;;;;46190:10:0;:4;-1:-1:-1;;;;;46190:10:0;;46186:90;;46217:47;46250:4;46256:7;46217:32;:47::i;:::-;-1:-1:-1;;;;;46290:16:0;;46286:183;;46323:45;46360:7;46323:36;:45::i;46286:183::-;46396:4;-1:-1:-1;;;;;46390:10:0;:2;-1:-1:-1;;;;;46390:10:0;;46386:83;;46417:40;46445:2;46449:7;46417:27;:40::i;41757:799::-;41912:4;-1:-1:-1;;;;;41933:13:0;;19704:20;19752:8;41929:620;;41969:72;;;;;-1:-1:-1;;;;;41969:36:0;;;;;:72;;14424:10;;42020:4;;42026:7;;42035:5;;41969:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41969:72:0;;;;;;;;-1:-1:-1;;41969:72:0;;;;;;;;;;;;:::i;:::-;;;41965:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42211:13:0;;42207:272;;42254:60;;-1:-1:-1;;;42254:60:0;;11547:2:1;42254:60:0;;;11529:21:1;11586:2;11566:18;;;11559:30;11625:34;11605:18;;;11598:62;11696:20;11676:18;;;11669:48;11734:19;;42254:60:0;11345:414:1;42207:272:0;42429:6;42423:13;42414:6;42410:2;42406:15;42399:38;41965:529;42092:51;;42102:41;42092:51;;-1:-1:-1;42085:58:0;;41929:620;-1:-1:-1;42533:4:0;41757:799;;;;;;:::o;39014:382::-;-1:-1:-1;;;;;39094:16:0;;39086:61;;;;-1:-1:-1;;;39086:61:0;;16754:2:1;39086:61:0;;;16736:21:1;;;16773:18;;;16766:30;16832:34;16812:18;;;16805:62;16884:18;;39086:61:0;16552:356:1;39086:61:0;37101:4;37125:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37125:16:0;:30;39158:58;;;;-1:-1:-1;;;39158:58:0;;12373:2:1;39158:58:0;;;12355:21:1;12412:2;12392:18;;;12385:30;12451;12431:18;;;12424:58;12499:18;;39158:58:0;12171:352:1;39158:58:0;39229:45;39258:1;39262:2;39266:7;39229:20;:45::i;:::-;-1:-1:-1;;;;;39287:13:0;;;;;;:9;:13;;;;;:18;;39304:1;;39287:13;:18;;39304:1;;39287:18;:::i;:::-;;;;-1:-1:-1;;39316:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;39316:21:0;;;;;;;;39355:33;;39316:16;;;39355:33;;39316:16;;39355:33;39014:382;;:::o;47990:988::-;48256:22;48306:1;48281:22;48298:4;48281:16;:22::i;:::-;:26;;;;:::i;:::-;48318:18;48339:26;;;:17;:26;;;;;;48256:51;;-1:-1:-1;48472:28:0;;;48468:328;;-1:-1:-1;;;;;48539:18:0;;48517:19;48539:18;;;:12;:18;;;;;;;;:34;;;;;;;;;48590:30;;;;;;:44;;;48707:30;;:17;:30;;;;;:43;;;48468:328;-1:-1:-1;48892:26:0;;;;:17;:26;;;;;;;;48885:33;;;-1:-1:-1;;;;;48936:18:0;;;;;:12;:18;;;;;:34;;;;;;;48929:41;47990:988::o;49273:1079::-;49551:10;:17;49526:22;;49551:21;;49571:1;;49551:21;:::i;:::-;49583:18;49604:24;;;:15;:24;;;;;;49977:10;:26;;49526:46;;-1:-1:-1;49604:24:0;;49526:46;;49977:26;;;;;;:::i;:::-;;;;;;;;;49955:48;;50041:11;50016:10;50027;50016:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;50121:28;;;:15;:28;;;;;;;:41;;;50293:24;;;;;50286:31;50328:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;49344:1008;;;49273:1079;:::o;46777:221::-;46862:14;46879:20;46896:2;46879:16;:20::i;:::-;-1:-1:-1;;;;;46910:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;46955:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;46777:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:465:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:116;282:4;-1:-1:-1;;208:2:1;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:45;;;368:1;365;358:12;327:45;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;14:465;;;;;:::o;484:196::-;552:20;;-1:-1:-1;;;;;601:54:1;;591:65;;581:93;;670:1;667;660:12;581:93;484:196;;;:::o;685:673::-;739:5;792:3;785:4;777:6;773:17;769:27;759:55;;810:1;807;800:12;759:55;846:6;833:20;872:4;896:60;912:43;952:2;912:43;:::i;:::-;896:60;:::i;:::-;978:3;1002:2;997:3;990:15;1030:2;1025:3;1021:12;1014:19;;1065:2;1057:6;1053:15;1117:3;1112:2;1106;1103:1;1099:10;1091:6;1087:23;1083:32;1080:41;1077:61;;;1134:1;1131;1124:12;1077:61;1156:1;1166:163;1180:2;1177:1;1174:9;1166:163;;;1237:17;;1225:30;;1275:12;;;;1307;;;;1198:1;1191:9;1166:163;;;-1:-1:-1;1347:5:1;;685:673;-1:-1:-1;;;;;;;685:673:1:o;1363:186::-;1422:6;1475:2;1463:9;1454:7;1450:23;1446:32;1443:52;;;1491:1;1488;1481:12;1443:52;1514:29;1533:9;1514:29;:::i;1554:260::-;1622:6;1630;1683:2;1671:9;1662:7;1658:23;1654:32;1651:52;;;1699:1;1696;1689:12;1651:52;1722:29;1741:9;1722:29;:::i;:::-;1712:39;;1770:38;1804:2;1793:9;1789:18;1770:38;:::i;:::-;1760:48;;1554:260;;;;;:::o;1819:328::-;1896:6;1904;1912;1965:2;1953:9;1944:7;1940:23;1936:32;1933:52;;;1981:1;1978;1971:12;1933:52;2004:29;2023:9;2004:29;:::i;:::-;1994:39;;2052:38;2086:2;2075:9;2071:18;2052:38;:::i;:::-;2042:48;;2137:2;2126:9;2122:18;2109:32;2099:42;;1819:328;;;;;:::o;2152:666::-;2247:6;2255;2263;2271;2324:3;2312:9;2303:7;2299:23;2295:33;2292:53;;;2341:1;2338;2331:12;2292:53;2364:29;2383:9;2364:29;:::i;:::-;2354:39;;2412:38;2446:2;2435:9;2431:18;2412:38;:::i;:::-;2402:48;;2497:2;2486:9;2482:18;2469:32;2459:42;;2552:2;2541:9;2537:18;2524:32;2579:18;2571:6;2568:30;2565:50;;;2611:1;2608;2601:12;2565:50;2634:22;;2687:4;2679:13;;2675:27;-1:-1:-1;2665:55:1;;2716:1;2713;2706:12;2665:55;2739:73;2804:7;2799:2;2786:16;2781:2;2777;2773:11;2739:73;:::i;:::-;2729:83;;;2152:666;;;;;;;:::o;2823:347::-;2888:6;2896;2949:2;2937:9;2928:7;2924:23;2920:32;2917:52;;;2965:1;2962;2955:12;2917:52;2988:29;3007:9;2988:29;:::i;:::-;2978:39;;3067:2;3056:9;3052:18;3039:32;3114:5;3107:13;3100:21;3093:5;3090:32;3080:60;;3136:1;3133;3126:12;3080:60;3159:5;3149:15;;;2823:347;;;;;:::o;3175:254::-;3243:6;3251;3304:2;3292:9;3283:7;3279:23;3275:32;3272:52;;;3320:1;3317;3310:12;3272:52;3343:29;3362:9;3343:29;:::i;:::-;3333:39;3419:2;3404:18;;;;3391:32;;-1:-1:-1;;;3175:254:1:o;3434:908::-;3518:6;3549:2;3592;3580:9;3571:7;3567:23;3563:32;3560:52;;;3608:1;3605;3598:12;3560:52;3648:9;3635:23;3681:18;3673:6;3670:30;3667:50;;;3713:1;3710;3703:12;3667:50;3736:22;;3789:4;3781:13;;3777:27;-1:-1:-1;3767:55:1;;3818:1;3815;3808:12;3767:55;3854:2;3841:16;3877:60;3893:43;3933:2;3893:43;:::i;3877:60::-;3959:3;3983:2;3978:3;3971:15;4011:2;4006:3;4002:12;3995:19;;4042:2;4038;4034:11;4090:7;4085:2;4079;4076:1;4072:10;4068:2;4064:19;4060:28;4057:41;4054:61;;;4111:1;4108;4101:12;4054:61;4133:1;4124:10;;4143:169;4157:2;4154:1;4151:9;4143:169;;;4214:23;4233:3;4214:23;:::i;:::-;4202:36;;4175:1;4168:9;;;;;4258:12;;;;4290;;4143:169;;;-1:-1:-1;4331:5:1;3434:908;-1:-1:-1;;;;;;;3434:908:1:o;4347:595::-;4465:6;4473;4526:2;4514:9;4505:7;4501:23;4497:32;4494:52;;;4542:1;4539;4532:12;4494:52;4582:9;4569:23;4611:18;4652:2;4644:6;4641:14;4638:34;;;4668:1;4665;4658:12;4638:34;4691:61;4744:7;4735:6;4724:9;4720:22;4691:61;:::i;:::-;4681:71;;4805:2;4794:9;4790:18;4777:32;4761:48;;4834:2;4824:8;4821:16;4818:36;;;4850:1;4847;4840:12;4818:36;;4873:63;4928:7;4917:8;4906:9;4902:24;4873:63;:::i;:::-;4863:73;;;4347:595;;;;;:::o;4947:245::-;5005:6;5058:2;5046:9;5037:7;5033:23;5029:32;5026:52;;;5074:1;5071;5064:12;5026:52;5113:9;5100:23;5132:30;5156:5;5132:30;:::i;5197:249::-;5266:6;5319:2;5307:9;5298:7;5294:23;5290:32;5287:52;;;5335:1;5332;5325:12;5287:52;5367:9;5361:16;5386:30;5410:5;5386:30;:::i;5451:450::-;5520:6;5573:2;5561:9;5552:7;5548:23;5544:32;5541:52;;;5589:1;5586;5579:12;5541:52;5629:9;5616:23;5662:18;5654:6;5651:30;5648:50;;;5694:1;5691;5684:12;5648:50;5717:22;;5770:4;5762:13;;5758:27;-1:-1:-1;5748:55:1;;5799:1;5796;5789:12;5748:55;5822:73;5887:7;5882:2;5869:16;5864:2;5860;5856:11;5822:73;:::i;5906:180::-;5965:6;6018:2;6006:9;5997:7;5993:23;5989:32;5986:52;;;6034:1;6031;6024:12;5986:52;-1:-1:-1;6057:23:1;;5906:180;-1:-1:-1;5906:180:1:o;6091:248::-;6159:6;6167;6220:2;6208:9;6199:7;6195:23;6191:32;6188:52;;;6236:1;6233;6226:12;6188:52;-1:-1:-1;;6259:23:1;;;6329:2;6314:18;;;6301:32;;-1:-1:-1;6091:248:1:o;6344:316::-;6385:3;6423:5;6417:12;6450:6;6445:3;6438:19;6466:63;6522:6;6515:4;6510:3;6506:14;6499:4;6492:5;6488:16;6466:63;:::i;:::-;6574:2;6562:15;-1:-1:-1;;6558:88:1;6549:98;;;;6649:4;6545:109;;6344:316;-1:-1:-1;;6344:316:1:o;6806:470::-;6985:3;7023:6;7017:13;7039:53;7085:6;7080:3;7073:4;7065:6;7061:17;7039:53;:::i;:::-;7155:13;;7114:16;;;;7177:57;7155:13;7114:16;7211:4;7199:17;;7177:57;:::i;:::-;7250:20;;6806:470;-1:-1:-1;;;;6806:470:1:o;7281:1346::-;7510:3;7539:1;7572:6;7566:13;7602:3;7624:1;7652:9;7648:2;7644:18;7634:28;;7712:2;7701:9;7697:18;7734;7724:61;;7778:4;7770:6;7766:17;7756:27;;7724:61;7804:2;7852;7844:6;7841:14;7821:18;7818:38;7815:222;;;-1:-1:-1;;;7886:3:1;7879:90;7992:4;7989:1;7982:15;8022:4;8017:3;8010:17;7815:222;8053:18;8080:162;;;;8256:1;8251:320;;;;8046:525;;8080:162;-1:-1:-1;;8117:9:1;8113:82;8108:3;8101:95;8225:6;8220:3;8216:16;8209:23;;8080:162;;8251:320;23988:1;23981:14;;;24025:4;24012:18;;8346:1;8360:165;8374:6;8371:1;8368:13;8360:165;;;8452:14;;8439:11;;;8432:35;8495:16;;;;8389:10;;8360:165;;;8364:3;;8554:6;8549:3;8545:16;8538:23;;8046:525;;;;;;;8587:34;8617:3;6742:24;6730:37;;6792:2;6783:12;;6665:136;8863:511;9057:4;-1:-1:-1;;;;;9167:2:1;9159:6;9155:15;9144:9;9137:34;9219:2;9211:6;9207:15;9202:2;9191:9;9187:18;9180:43;;9259:6;9254:2;9243:9;9239:18;9232:34;9302:3;9297:2;9286:9;9282:18;9275:31;9323:45;9363:3;9352:9;9348:19;9340:6;9323:45;:::i;:::-;9315:53;8863:511;-1:-1:-1;;;;;;8863:511:1:o;9379:632::-;9550:2;9602:21;;;9672:13;;9575:18;;;9694:22;;;9521:4;;9550:2;9773:15;;;;9747:2;9732:18;;;9521:4;9816:169;9830:6;9827:1;9824:13;9816:169;;;9891:13;;9879:26;;9960:15;;;;9925:12;;;;9852:1;9845:9;9816:169;;;-1:-1:-1;10002:3:1;;9379:632;-1:-1:-1;;;;;;9379:632:1:o;10208:219::-;10357:2;10346:9;10339:21;10320:4;10377:44;10417:2;10406:9;10402:18;10394:6;10377:44;:::i;23388:334::-;23459:2;23453:9;23515:2;23505:13;;-1:-1:-1;;23501:86:1;23489:99;;23618:18;23603:34;;23639:22;;;23600:62;23597:88;;;23665:18;;:::i;:::-;23701:2;23694:22;23388:334;;-1:-1:-1;23388:334:1:o;23727:183::-;23787:4;23820:18;23812:6;23809:30;23806:56;;;23842:18;;:::i;:::-;-1:-1:-1;23887:1:1;23883:14;23899:4;23879:25;;23727:183::o;24041:128::-;24081:3;24112:1;24108:6;24105:1;24102:13;24099:39;;;24118:18;;:::i;:::-;-1:-1:-1;24154:9:1;;24041:128::o;24174:120::-;24214:1;24240;24230:35;;24245:18;;:::i;:::-;-1:-1:-1;24279:9:1;;24174:120::o;24299:228::-;24339:7;24465:1;24397:66;24393:74;24390:1;24387:81;24382:1;24375:9;24368:17;24364:105;24361:131;;;24472:18;;:::i;:::-;-1:-1:-1;24512:9:1;;24299:228::o;24532:125::-;24572:4;24600:1;24597;24594:8;24591:34;;;24605:18;;:::i;:::-;-1:-1:-1;24642:9:1;;24532:125::o;24662:258::-;24734:1;24744:113;24758:6;24755:1;24752:13;24744:113;;;24834:11;;;24828:18;24815:11;;;24808:39;24780:2;24773:10;24744:113;;;24875:6;24872:1;24869:13;24866:48;;;-1:-1:-1;;24910:1:1;24892:16;;24885:27;24662:258::o;24925:437::-;25004:1;25000:12;;;;25047;;;25068:61;;25122:4;25114:6;25110:17;25100:27;;25068:61;25175:2;25167:6;25164:14;25144:18;25141:38;25138:218;;;-1:-1:-1;;;25209:1:1;25202:88;25313:4;25310:1;25303:15;25341:4;25338:1;25331:15;25367:195;25406:3;25437:66;25430:5;25427:77;25424:103;;;25507:18;;:::i;:::-;-1:-1:-1;25554:1:1;25543:13;;25367:195::o;25567:112::-;25599:1;25625;25615:35;;25630:18;;:::i;:::-;-1:-1:-1;25664:9:1;;25567:112::o;25684:184::-;-1:-1:-1;;;25733:1:1;25726:88;25833:4;25830:1;25823:15;25857:4;25854:1;25847:15;25873:184;-1:-1:-1;;;25922:1:1;25915:88;26022:4;26019:1;26012:15;26046:4;26043:1;26036:15;26062:184;-1:-1:-1;;;26111:1:1;26104:88;26211:4;26208:1;26201:15;26235:4;26232:1;26225:15;26251:184;-1:-1:-1;;;26300:1:1;26293:88;26400:4;26397:1;26390:15;26424:4;26421:1;26414:15;26440:184;-1:-1:-1;;;26489:1:1;26482:88;26589:4;26586:1;26579:15;26613:4;26610:1;26603:15;26629:177;26714:66;26707:5;26703:78;26696:5;26693:89;26683:117;;26796:1;26793;26786:12

Swarm Source

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