ETH Price: $3,350.04 (-3.19%)
 

Overview

Max Total Supply

1,000,000,000 JUMP

Holders

100

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
465,693.396909264156198445 JUMP

Value
$0.00
0x51137ddAa24f1C2e555098c7150F7Fec79b301c3
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
JumpEVM

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// ERC20A, The new token standard with GameFi-driven taxes and fluctuating APR.
// Dynamic yield farming with ponzinomics

// Twitter: https://x.com/JumpEVM
// TG: https://t.me/JumpEVM
// Website: https://www.jumpevm.xyz/
// Docs: https://docs.jumpevm.xyz/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)

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 generally not needed starting with Solidity 0.8, since 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 subtraction 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/token/ERC20/extensions/IERC20Permit.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * ==== Security Considerations
 *
 * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
 * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
 * considered as an intention to spend the allowance in any specific way. The second is that because permits have
 * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
 * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
 * generally recommended is:
 *
 * ```solidity
 * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
 *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
 *     doThing(..., value);
 * }
 *
 * function doThing(..., uint256 value) public {
 *     token.safeTransferFrom(msg.sender, address(this), value);
 *     ...
 * }
 * ```
 *
 * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
 * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
 * {SafeERC20-safeTransferFrom}).
 *
 * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
 * contracts should have entry points that don't rely on permit.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     *
     * CAUTION: See Security Considerations above.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)

pragma solidity ^0.8.20;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

    /**
     * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert AddressInsufficientBalance(address(this));
        }

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

    /**
     * @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 or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {FailedInnerCall} error.
     *
     * 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.
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @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`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
     * unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {FailedInnerCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.20;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    /**
     * @dev An operation with an ERC20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data);
        if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
    }
}

// File: contracts/JumpEVMERC20A.sol



// ERC20A, The new token standard with GameFi-driven taxes and fluctuating APR.
// Dynamic yield farming with ponzinomics

// Twitter: https://x.com/JumpEVM
// TG: https://t.me/JumpEVM
// Website: https://www.jumpevm.xyz/
// Docs: https://docs.jumpevm.xyz/

pragma solidity ^0.8.0;





// External Staking Vault interface
interface StakingVault {
    function depositTokens(address user, uint256 id, uint256 amount) external;

    function withdrawTokens(address user, uint256 id, uint256 amount) external;
}

// NFT Pool Share interface
interface NFTPoolShare {
    function mint(address _to) external returns (uint256);

    function burn(uint256 tokenId) external;

    function walletOfOwner(
        address _owner
    ) external view returns (uint256[] memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);

    function setBaseURI(string memory _newBaseURI) external;

    function setBaseExtension(string memory _newBaseExtension) external;

    function balanceOf(address owner) external view returns (uint256);

    function ownerOf(uint256 tokenId) external view returns (address);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId) external view returns (address);

    function totalSupply() external view returns (uint256);
}

interface IUniswapV2Factory {
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);
}

contract JumpEVM is IERC20, Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    address payable private _taxWallet;

    mapping(uint256 => uint256) private _stakedBalances; // Tracks staking balances
    uint256 private _totalStaked; // Total amount staked in the system
    uint256 private _totalTaxPool; // Total tax pool for rewards

    uint256 private _minSellTax = 2; // Minimum sell tax (2%)
    uint256 private _maxSellTax = 20; // Maximum sell tax (20%)

    uint256 private _decimals = 18;
    uint256 private _tTotal = 1000000000 * 10 ** _decimals;

    string private _name = "JumpEVM";
    string private _symbol = "JUMP";

    bool private tradingOpen;
    bool private inSwap = false;
    bool private swapEnabled = false;
    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;
    modifier lockTheSwap() {
        inSwap = true;
        _;
        inSwap = false;
    }

    // Define the struct to represent a transaction
    struct Transaction {
        uint256 nftId; // The address of the wallet
        uint256 quantity; // The quantity of tokens involved in the transaction
        uint256 timestamp; // The time the transaction occurred
    }

    // Mapping to store transactions with a unique ID (for example, a uint)
    mapping(uint256 => Transaction) public stakeTransactions;

    // Define the struct to represent a staking vault
    StakingVault public stakingVault;
    address private stakingVaultAddress;

    // Define the struct to represent a NFT Pool Share
    NFTPoolShare public nftPoolShare;
    address private nftPoolShareAddress;

    constructor() Ownable(msg.sender) {
        _balances[_msgSender()] = _tTotal;
        _taxWallet = payable(_msgSender());
        stakingVault = StakingVault(address(0)); // Use the provided vault address // Initialize the vault with token address
        stakingVaultAddress = address(0);
        nftPoolShare = NFTPoolShare(address(0)); // Use the provided vault address // Initialize the vault with token address
        nftPoolShareAddress = address(0);
        // Initialize UniswapV2 router and pair for the token
        uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D // ETH
        ); // Uniswap V2 Router address
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this),
                uniswapV2Router.WETH()
            );

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function setStakingVault(address newVaultAddress) external onlyOwner {
        require(newVaultAddress != address(0), "Invalid vault address!");
        stakingVault = StakingVault(newVaultAddress);
        stakingVaultAddress = newVaultAddress;
    }

    function setNFTPoolShare(
        address newNFTPoolShareAddress
    ) external onlyOwner {
        require(newNFTPoolShareAddress != address(0), "Invalid vault address!");
        nftPoolShare = NFTPoolShare(newNFTPoolShareAddress);
        nftPoolShareAddress = newNFTPoolShareAddress;
    }

    // * MAIN FUNCTION: Calculate dynamic sell tax based on staking participation *
    function calculateDynamicSellTax() public view returns (uint256) {
        uint256 stakedAmount = _totalStaked;
        uint256 totalSupplyToken = _tTotal;

        if (stakedAmount == 0) {
            return _maxSellTax; // If no tokens are staked, apply maximum tax
        }

        // If the staked amount is 10% or more of total supply, apply the minimum tax
        uint256 threshold = totalSupplyToken.mul(10).div(100); // 30% of total supply
        if (stakedAmount >= threshold) {
            return _minSellTax;
        }

        // If stakedAmount is below 10%, dynamically calculate tax between minSellTax and maxSellTax
        // The tax should increase from minSellTax to maxSellTax as stakedAmount approaches 0
        uint256 scale = 1e18;
        uint256 dynamicRange = _maxSellTax.sub(_minSellTax); // Difference between max and min tax

        // Calculate the proportion of staked tokens relative to the 30% threshold
        // If stakedAmount is close to the threshold, tax should be close to minSellTax
        // If stakedAmount is close to 0, tax should be close to maxSellTax
        uint256 tax = _minSellTax.add(
            dynamicRange
                .mul(threshold.sub(stakedAmount))
                .mul(scale)
                .div(threshold)
                .div(scale)
        );

        return tax;
    }

    // * Staking Functions *
    function stakeTokens(uint256 amount) public {
        require(amount > 0, "Cannot stake zero tokens!");
        require(
            _balances[_msgSender()] >= amount,
            "Insufficient balance to stake!"
        );

        // Mint NFT
        uint256 currentNftId = nftPoolShare.mint(_msgSender());

        // Send tokens to the vault for staking
        stakingVault.depositTokens(_msgSender(), currentNftId, amount);

        _totalStaked = _totalStaked.add(amount);
        _stakedBalances[currentNftId] = _stakedBalances[currentNftId].add(
            amount
        );

        // Store the staking transaction details in a mapping
        stakeTransactions[currentNftId] = (
            Transaction({
                nftId: currentNftId,
                quantity: amount,
                timestamp: block.timestamp
            })
        );
    }

    // * Un-Staking Functions *
    function unstakeTokens(uint256 id) public {
        uint256 nftId = stakeTransactions[id].nftId;
        uint256 amount = stakeTransactions[id].quantity;
        require(amount > 0, "Cannot unstake zero tokens!");
        require(
            _stakedBalances[nftId] >= amount,
            "Insufficient staked balance to unstake!"
        );
        require(nftOwnerAddress(nftId) == _msgSender());

        // Burn NFT
        nftPoolShare.burn(nftId);

        // Check for min time of staking
        if (block.timestamp >= stakeTransactions[id].timestamp + 20 minutes) {
            // Calculate rewards based on the user's LP share
            uint256 lpShare = amount.mul(100).div(_totalStaked); // LP share percentage
            uint256 reward = _totalTaxPool.mul(lpShare).div(100); // Reward = pool balance * LP share

            _totalTaxPool = _totalTaxPool.sub(reward); // Deduct reward from the tax pool

            // Add reward from the tax pool
            _balances[_msgSender()] = _balances[_msgSender()].add(reward);
            _balances[address(this)] = _balances[address(this)].sub(reward);

            emit Transfer(address(this), _msgSender(), reward); // Log the reward transfer
        }

        _totalStaked = _totalStaked.sub(amount);
        _stakedBalances[nftId] = _stakedBalances[nftId].sub(amount);

        // Withdraw staked tokens from the vault
        stakingVault.withdrawTokens(_msgSender(), nftId, amount);

        // Delete the staking transaction details in the mapping
        delete stakeTransactions[id];
    }

    function nftOwnerAddress(uint256 id) public view returns (address) {
        return nftPoolShare.ownerOf(id);
    }

    // * Override transfer function to include dynamic tax *
    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        uint256 taxAmount = 0;

        // If it's a sell transaction (from Uniswap pair to user) and not swapping
        if (to == uniswapV2Pair && from != address(this)) {
            uint256 sellTax = calculateDynamicSellTax();
            taxAmount = amount.mul(sellTax).div(100); // Apply the dynamic sell tax
        }

        // If it's a stake/unstake transaction tax = 0
        if (to == stakingVaultAddress || from == stakingVaultAddress) {
            taxAmount = 0;
        }

        if (taxAmount > 0) {
            _balances[address(this)] = _balances[address(this)].add(taxAmount);
            uint256 amountToSell = taxAmount.mul(30).div(100);
            swapTokensForEth(amountToSell);
            payable(owner()).transfer(address(this).balance);

            // Update the tax pool with the remaining tax amount (after the amountToSell)
            _totalTaxPool = _totalTaxPool.add(taxAmount.sub(amountToSell));

            emit Transfer(from, address(this), taxAmount);
        }

        // Now perform the actual transfer of the tokens
        _balances[from] = _balances[from].sub(amount);
        _balances[to] = _balances[to].add(amount.sub(taxAmount));
        emit Transfer(from, to, amount.sub(taxAmount));
    }

    // * View Functions *
    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return uint8(_decimals);
    }

    function totalSupply() public view returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    function allowance(
        address owner,
        address spender
    ) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function stakingCAddress() public view returns (address) {
        return stakingVaultAddress;
    }

    function nftPoolCAddress() public view returns (address) {
        return nftPoolShareAddress;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount > allowance!"
            )
        );
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address!");
        require(spender != address(0), "ERC20: approve to the zero address!");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function sendETHToFee(uint256 amount) private {
        _taxWallet.transfer(amount);
    }

    // Open Trading function
    function openTrading() external onlyOwner {
        require(!tradingOpen, "Trading is open!");
        _approve(address(this), address(uniswapV2Router), _tTotal);
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
        swapEnabled = true;
        tradingOpen = true;
    }

    receive() external payable {}

    function manualContractUnclog() external {
        require(_msgSender() == _taxWallet);
        uint256 tokenBalance = balanceOf(address(this));
        if (tokenBalance > 0) {
            swapTokensForEth(tokenBalance);
        }
        uint256 ethBalance = address(this).balance;
        if (ethBalance > 0) {
            sendETHToFee(ethBalance);
        }
    }

    function manualSendEth() external {
        require(_msgSender() == _taxWallet);
        uint256 contractETHBalance = address(this).balance;
        sendETHToFee(contractETHBalance);
    }

    function withdrawPoolRewardTokens(address to, uint256 amount) external {
        require(_msgSender() == _taxWallet);
        amount = amount * 10 ** _decimals;
        require(
            amount <= _balances[address(this)],
            "Insufficient balance in Pool!"
        );
        _balances[address(this)] = _balances[address(this)].sub(amount);
        _balances[to] = _balances[to].add(amount);
        emit Transfer(address(this), to, amount);
    }

    // * Function to view total Staked tokens *
    function totalTaxPool() public view returns (uint256) {
        return _totalTaxPool;
    }

    // * Function to view total Staked tokens *
    function totalStakedTokens() public view returns (uint256) {
        return _totalStaked;
    }

    // * Function to view Staked tokens of NFT Id *
    function stakedTokensOfNFTId(uint256 nftId) public view returns (uint256) {
        return _stakedBalances[nftId];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateDynamicSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualContractUnclog","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSendEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"nftOwnerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPoolCAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPoolShare","outputs":[{"internalType":"contract NFTPoolShare","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newNFTPoolShareAddress","type":"address"}],"name":"setNFTPoolShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVaultAddress","type":"address"}],"name":"setStakingVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakeTransactions","outputs":[{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"stakedTokensOfNFTId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingCAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingVault","outputs":[{"internalType":"contract StakingVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTaxPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"}],"name":"unstakeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawPoolRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600260075560146008556012600955600954600a61002291906107ee565b633b9aca006100319190610838565b600a556040518060400160405280600781526020017f4a756d7045564d00000000000000000000000000000000000000000000000000815250600b90816100789190610aaa565b506040518060400160405280600481526020017f4a554d5000000000000000000000000000000000000000000000000000000000815250600c90816100bd9190610aaa565b505f600d60016101000a81548160ff0219169083151502179055505f600d60026101000a81548160ff0219169083151502179055503480156100fd575f80fd5b50335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361016f575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101669190610bb8565b60405180910390fd5b61017e816105c160201b60201c565b50600a5460015f61019361068260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506101de61068260201b60201c565b60035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600d60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104019190610bff565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610488573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ac9190610bff565b6040518363ffffffff1660e01b81526004016104c9929190610c2a565b6020604051808303815f875af11580156104e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105099190610bff565b600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061055661068260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600a546040516105b49190610c60565b60405180910390a3610c79565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111561070b578086048111156106e7576106e6610689565b5b60018516156106f65780820291505b8081029050610704856106b6565b94506106cb565b94509492505050565b5f8261072357600190506107de565b81610730575f90506107de565b816001811461074657600281146107505761077f565b60019150506107de565b60ff84111561076257610761610689565b5b8360020a91508482111561077957610778610689565b5b506107de565b5060208310610133831016604e8410600b84101617156107b45782820a9050838111156107af576107ae610689565b5b6107de565b6107c184848460016106c2565b925090508184048111156107d8576107d7610689565b5b81810290505b9392505050565b5f819050919050565b5f6107f8826107e5565b9150610803836107e5565b92506108307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610714565b905092915050565b5f610842826107e5565b915061084d836107e5565b925082820261085b816107e5565b9150828204841483151761087257610871610689565b5b5092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806108f457607f821691505b602082108103610907576109066108b0565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026109697fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261092e565b610973868361092e565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6109ae6109a96109a4846107e5565b61098b565b6107e5565b9050919050565b5f819050919050565b6109c783610994565b6109db6109d3826109b5565b84845461093a565b825550505050565b5f90565b6109ef6109e3565b6109fa8184846109be565b505050565b5b81811015610a1d57610a125f826109e7565b600181019050610a00565b5050565b601f821115610a6257610a338161090d565b610a3c8461091f565b81016020851015610a4b578190505b610a5f610a578561091f565b8301826109ff565b50505b505050565b5f82821c905092915050565b5f610a825f1984600802610a67565b1980831691505092915050565b5f610a9a8383610a73565b9150826002028217905092915050565b610ab382610879565b67ffffffffffffffff811115610acc57610acb610883565b5b610ad682546108dd565b610ae1828285610a21565b5f60209050601f831160018114610b12575f8415610b00578287015190505b610b0a8582610a8f565b865550610b71565b601f198416610b208661090d565b5f5b82811015610b4757848901518255600182019150602085019450602081019050610b22565b86831015610b645784890151610b60601f891682610a73565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610ba282610b79565b9050919050565b610bb281610b98565b82525050565b5f602082019050610bcb5f830184610ba9565b92915050565b5f80fd5b610bde81610b98565b8114610be8575f80fd5b50565b5f81519050610bf981610bd5565b92915050565b5f60208284031215610c1457610c13610bd1565b5b5f610c2184828501610beb565b91505092915050565b5f604082019050610c3d5f830185610ba9565b610c4a6020830184610ba9565b9392505050565b610c5a816107e5565b82525050565b5f602082019050610c735f830184610c51565b92915050565b61384780610c865f395ff3fe6080604052600436106101d0575f3560e01c806370a08231116100f657806395d89b4111610094578063ca053dc311610063578063ca053dc314610633578063dd62ed3e14610671578063f2fde38b146106ad578063fe560792146106d5576101d7565b806395d89b411461058d578063a9059cbb146105b7578063c1474e54146105f3578063c9567bf91461061d576101d7565b80637b07763c116100d05780637b07763c146104fd57806380f909c7146105255780638da5cb5b1461054d5780638f80a85214610577576101d7565b806370a0823114610483578063715018a6146104bf5780637547c7a3146104d5576101d7565b806323b872dd1161016e5780633ae732591161013d5780633ae73259146103dd578063511f4d2714610407578063608e4dd014610431578063671769fb14610459576101d7565b806323b872dd1461032357806324e7964a1461035f5780632d6e185714610389578063313ce567146103b3576101d7565b8063095ea7b3116101aa578063095ea7b31461026b57806318160ddd146102a75780631dbf20d5146102d15780631deff2161461030d576101d7565b806302d012c6146101db57806302d1db511461020557806306fdde0314610241576101d7565b366101d757005b5f80fd5b3480156101e6575f80fd5b506101ef6106fd565b6040516101fc9190612882565b60405180910390f35b348015610210575f80fd5b5061022b600480360381019061022691906128d2565b610725565b604051610238919061290c565b60405180910390f35b34801561024c575f80fd5b5061025561073f565b6040516102629190612995565b60405180910390f35b348015610276575f80fd5b50610291600480360381019061028c91906129df565b6107cf565b60405161029e9190612a37565b60405180910390f35b3480156102b2575f80fd5b506102bb6107ec565b6040516102c8919061290c565b60405180910390f35b3480156102dc575f80fd5b506102f760048036038101906102f291906128d2565b6107f5565b6040516103049190612882565b60405180910390f35b348015610318575f80fd5b50610321610896565b005b34801561032e575f80fd5b5061034960048036038101906103449190612a50565b610905565b6040516103569190612a37565b60405180910390f35b34801561036a575f80fd5b506103736109d9565b6040516103809190612afb565b60405180910390f35b348015610394575f80fd5b5061039d6109fe565b6040516103aa919061290c565b60405180910390f35b3480156103be575f80fd5b506103c7610b01565b6040516103d49190612b2f565b60405180910390f35b3480156103e8575f80fd5b506103f1610b0a565b6040516103fe919061290c565b60405180910390f35b348015610412575f80fd5b5061041b610b13565b6040516104289190612b68565b60405180910390f35b34801561043c575f80fd5b50610457600480360381019061045291906128d2565b610b38565b005b348015610464575f80fd5b5061046d611015565b60405161047a919061290c565b60405180910390f35b34801561048e575f80fd5b506104a960048036038101906104a49190612b81565b61101e565b6040516104b6919061290c565b60405180910390f35b3480156104ca575f80fd5b506104d3611064565b005b3480156104e0575f80fd5b506104fb60048036038101906104f691906128d2565b611077565b005b348015610508575f80fd5b50610523600480360381019061051e91906129df565b611319565b005b348015610530575f80fd5b5061054b60048036038101906105469190612b81565b61159f565b005b348015610558575f80fd5b50610561611698565b60405161056e9190612882565b60405180910390f35b348015610582575f80fd5b5061058b6116bf565b005b348015610598575f80fd5b506105a1611756565b6040516105ae9190612995565b60405180910390f35b3480156105c2575f80fd5b506105dd60048036038101906105d891906129df565b6117e6565b6040516105ea9190612a37565b60405180910390f35b3480156105fe575f80fd5b50610607611803565b6040516106149190612882565b60405180910390f35b348015610628575f80fd5b5061063161182b565b005b34801561063e575f80fd5b50610659600480360381019061065491906128d2565b6119a1565b60405161066893929190612bac565b60405180910390f35b34801561067c575f80fd5b5061069760048036038101906106929190612be1565b6119c7565b6040516106a4919061290c565b60405180910390f35b3480156106b8575f80fd5b506106d360048036038101906106ce9190612b81565b611a49565b005b3480156106e0575f80fd5b506106fb60048036038101906106f69190612b81565b611acd565b005b5f60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60045f8381526020019081526020015f20549050919050565b6060600b805461074e90612c4c565b80601f016020809104026020016040519081016040528092919081815260200182805461077a90612c4c565b80156107c55780601f1061079c576101008083540402835291602001916107c5565b820191905f5260205f20905b8154815290600101906020018083116107a857829003601f168201915b5050505050905090565b5f6107e26107db611bc6565b8484611bcd565b6001905092915050565b5f600a54905090565b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610850919061290c565b602060405180830381865afa15801561086b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088f9190612c90565b9050919050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108d6611bc6565b73ffffffffffffffffffffffffffffffffffffffff16146108f5575f80fd5b5f47905061090281611d90565b50565b5f610911848484611df8565b6109ce8461091d611bc6565b6109c9856040518060600160405280602381526020016137ef6023913960025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610980611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546123e59092919063ffffffff16565b611bcd565b600190509392505050565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8060055490505f600a5490505f8203610a1e5760085492505050610afe565b5f610a466064610a38600a8561243990919063ffffffff16565b61244e90919063ffffffff16565b9050808310610a5c576007549350505050610afe565b5f670de0b6b3a764000090505f610a8060075460085461246390919063ffffffff16565b90505f610af2610ae184610ad387610ac588610ab7610aa88e8d61246390919063ffffffff16565b8a61243990919063ffffffff16565b61243990919063ffffffff16565b61244e90919063ffffffff16565b61244e90919063ffffffff16565b60075461247890919063ffffffff16565b90508096505050505050505b90565b5f600954905090565b5f600554905090565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600f5f8381526020019081526020015f205f015490505f600f5f8481526020019081526020015f206001015490505f8111610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba090612d05565b60405180910390fd5b8060045f8481526020019081526020015f20541015610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490612d93565b60405180910390fd5b610c05611bc6565b73ffffffffffffffffffffffffffffffffffffffff16610c24836107f5565b73ffffffffffffffffffffffffffffffffffffffff1614610c43575f80fd5b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68836040518263ffffffff1660e01b8152600401610c9d919061290c565b5f604051808303815f87803b158015610cb4575f80fd5b505af1158015610cc6573d5f803e3d5ffd5b505050506104b0600f5f8581526020019081526020015f2060020154610cec9190612dde565b4210610f02575f610d1b600554610d0d60648561243990919063ffffffff16565b61244e90919063ffffffff16565b90505f610d466064610d388460065461243990919063ffffffff16565b61244e90919063ffffffff16565b9050610d5d8160065461246390919063ffffffff16565b600681905550610dba8160015f610d72611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f610dc5611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610e528160015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461246390919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610e9b611bc6565b73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ef7919061290c565b60405180910390a350505b610f178160055461246390919063ffffffff16565b600581905550610f418160045f8581526020019081526020015f205461246390919063ffffffff16565b60045f8481526020019081526020015f208190555060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634c1d1fde610f9b611bc6565b84846040518463ffffffff1660e01b8152600401610fbb93929190612e11565b5f604051808303815f87803b158015610fd2575f80fd5b505af1158015610fe4573d5f803e3d5ffd5b50505050600f5f8481526020019081526020015f205f8082015f9055600182015f9055600282015f90555050505050565b5f600654905090565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61106c61248d565b6110755f612514565b565b5f81116110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b090612e90565b60405180910390fd5b8060015f6110c5611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790612ef8565b60405180910390fd5b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842611186611bc6565b6040518263ffffffff1660e01b81526004016111a29190612882565b6020604051808303815f875af11580156111be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e29190612f2a565b905060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c5b9f8f611229611bc6565b83856040518463ffffffff1660e01b815260040161124993929190612e11565b5f604051808303815f87803b158015611260575f80fd5b505af1158015611272573d5f803e3d5ffd5b5050505061128b8260055461247890919063ffffffff16565b6005819055506112b58260045f8481526020019081526020015f205461247890919063ffffffff16565b60045f8381526020019081526020015f2081905550604051806060016040528082815260200183815260200142815250600f5f8381526020019081526020015f205f820151815f015560208201518160010155604082015181600201559050505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611359611bc6565b73ffffffffffffffffffffffffffffffffffffffff1614611378575f80fd5b600954600a6113879190613084565b8161139291906130ce565b905060015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054811115611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b90613159565b60405180910390fd5b6114648160015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461246390919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506114f58160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611593919061290c565b60405180910390a35050565b6115a761248d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c906131c1565b60405180910390fd5b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166116ff611bc6565b73ffffffffffffffffffffffffffffffffffffffff161461171e575f80fd5b5f6117283061101e565b90505f81111561173c5761173b816125d5565b5b5f4790505f8111156117525761175181611d90565b5b5050565b6060600c805461176590612c4c565b80601f016020809104026020016040519081016040528092919081815260200182805461179190612c4c565b80156117dc5780601f106117b3576101008083540402835291602001916117dc565b820191905f5260205f20905b8154815290600101906020018083116117bf57829003601f168201915b5050505050905090565b5f6117f96117f2611bc6565b8484611df8565b6001905092915050565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61183361248d565b600d5f9054906101000a900460ff1615611882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187990613229565b60405180910390fd5b6118b130600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a54611bcd565b600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71947306118fa3061101e565b5f80611904611698565b426040518863ffffffff1660e01b815260040161192696959493929190613280565b60606040518083038185885af1158015611942573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061196791906132df565b5050506001600d60026101000a81548160ff0219169083151502179055506001600d5f6101000a81548160ff021916908315150217905550565b600f602052805f5260405f205f91509050805f0154908060010154908060020154905083565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611a5161248d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ac1575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611ab89190612882565b60405180910390fd5b611aca81612514565b50565b611ad561248d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a906131c1565b60405180910390fd5b8060105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c329061339f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca09061342d565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d83919061290c565b60405180910390a3505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611df4573d5f803e3d5ffd5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5d906134bb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecb90613549565b60405180910390fd5b5f8111611f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0d906135d7565b60405180910390fd5b5f600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015611f9f57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611fd9575f611fad6109fe565b9050611fd56064611fc7838661243990919063ffffffff16565b61244e90919063ffffffff16565b9150505b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612080575060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612089575f90505b5f811115612234576120e18160015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f61214a606461213c601e8561243990919063ffffffff16565b61244e90919063ffffffff16565b9050612155816125d5565b61215d611698565b73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f1935050505015801561219f573d5f803e3d5ffd5b506121c76121b6828461246390919063ffffffff16565b60065461247890919063ffffffff16565b6006819055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161222a919061290c565b60405180910390a3505b6122848260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461246390919063ffffffff16565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506123276122db828461246390919063ffffffff16565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6123ca848661246390919063ffffffff16565b6040516123d7919061290c565b60405180910390a350505050565b5f83831115829061242c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124239190612995565b60405180910390fd5b5082840390509392505050565b5f818361244691906130ce565b905092915050565b5f818361245b9190613622565b905092915050565b5f81836124709190613652565b905092915050565b5f81836124859190612dde565b905092915050565b612495611bc6565b73ffffffffffffffffffffffffffffffffffffffff166124b3611698565b73ffffffffffffffffffffffffffffffffffffffff1614612512576124d6611bc6565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016125099190612882565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600d60016101000a81548160ff0219169083151502179055505f600267ffffffffffffffff81111561260c5761260b613685565b5b60405190808252806020026020018201604052801561263a5781602001602082028036833780820191505090505b50905030815f81518110612651576126506136b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061271a9190612c90565b8160018151811061272e5761272d6136b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061279530600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611bcd565b600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b81526004016127f8959493929190613796565b5f604051808303815f87803b15801561280f575f80fd5b505af1158015612821573d5f803e3d5ffd5b50505050505f600d60016101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61286c82612843565b9050919050565b61287c81612862565b82525050565b5f6020820190506128955f830184612873565b92915050565b5f80fd5b5f819050919050565b6128b18161289f565b81146128bb575f80fd5b50565b5f813590506128cc816128a8565b92915050565b5f602082840312156128e7576128e661289b565b5b5f6128f4848285016128be565b91505092915050565b6129068161289f565b82525050565b5f60208201905061291f5f8301846128fd565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61296782612925565b612971818561292f565b935061298181856020860161293f565b61298a8161294d565b840191505092915050565b5f6020820190508181035f8301526129ad818461295d565b905092915050565b6129be81612862565b81146129c8575f80fd5b50565b5f813590506129d9816129b5565b92915050565b5f80604083850312156129f5576129f461289b565b5b5f612a02858286016129cb565b9250506020612a13858286016128be565b9150509250929050565b5f8115159050919050565b612a3181612a1d565b82525050565b5f602082019050612a4a5f830184612a28565b92915050565b5f805f60608486031215612a6757612a6661289b565b5b5f612a74868287016129cb565b9350506020612a85868287016129cb565b9250506040612a96868287016128be565b9150509250925092565b5f819050919050565b5f612ac3612abe612ab984612843565b612aa0565b612843565b9050919050565b5f612ad482612aa9565b9050919050565b5f612ae582612aca565b9050919050565b612af581612adb565b82525050565b5f602082019050612b0e5f830184612aec565b92915050565b5f60ff82169050919050565b612b2981612b14565b82525050565b5f602082019050612b425f830184612b20565b92915050565b5f612b5282612aca565b9050919050565b612b6281612b48565b82525050565b5f602082019050612b7b5f830184612b59565b92915050565b5f60208284031215612b9657612b9561289b565b5b5f612ba3848285016129cb565b91505092915050565b5f606082019050612bbf5f8301866128fd565b612bcc60208301856128fd565b612bd960408301846128fd565b949350505050565b5f8060408385031215612bf757612bf661289b565b5b5f612c04858286016129cb565b9250506020612c15858286016129cb565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612c6357607f821691505b602082108103612c7657612c75612c1f565b5b50919050565b5f81519050612c8a816129b5565b92915050565b5f60208284031215612ca557612ca461289b565b5b5f612cb284828501612c7c565b91505092915050565b7f43616e6e6f7420756e7374616b65207a65726f20746f6b656e732100000000005f82015250565b5f612cef601b8361292f565b9150612cfa82612cbb565b602082019050919050565b5f6020820190508181035f830152612d1c81612ce3565b9050919050565b7f496e73756666696369656e74207374616b65642062616c616e636520746f20755f8201527f6e7374616b652100000000000000000000000000000000000000000000000000602082015250565b5f612d7d60278361292f565b9150612d8882612d23565b604082019050919050565b5f6020820190508181035f830152612daa81612d71565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612de88261289f565b9150612df38361289f565b9250828201905080821115612e0b57612e0a612db1565b5b92915050565b5f606082019050612e245f830186612873565b612e3160208301856128fd565b612e3e60408301846128fd565b949350505050565b7f43616e6e6f74207374616b65207a65726f20746f6b656e7321000000000000005f82015250565b5f612e7a60198361292f565b9150612e8582612e46565b602082019050919050565b5f6020820190508181035f830152612ea781612e6e565b9050919050565b7f496e73756666696369656e742062616c616e636520746f207374616b652100005f82015250565b5f612ee2601e8361292f565b9150612eed82612eae565b602082019050919050565b5f6020820190508181035f830152612f0f81612ed6565b9050919050565b5f81519050612f24816128a8565b92915050565b5f60208284031215612f3f57612f3e61289b565b5b5f612f4c84828501612f16565b91505092915050565b5f8160011c9050919050565b5f808291508390505b6001851115612faa57808604811115612f8657612f85612db1565b5b6001851615612f955780820291505b8081029050612fa385612f55565b9450612f6a565b94509492505050565b5f82612fc2576001905061307d565b81612fcf575f905061307d565b8160018114612fe55760028114612fef5761301e565b600191505061307d565b60ff84111561300157613000612db1565b5b8360020a91508482111561301857613017612db1565b5b5061307d565b5060208310610133831016604e8410600b84101617156130535782820a90508381111561304e5761304d612db1565b5b61307d565b6130608484846001612f61565b9250905081840481111561307757613076612db1565b5b81810290505b9392505050565b5f61308e8261289f565b91506130998361289f565b92506130c67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612fb3565b905092915050565b5f6130d88261289f565b91506130e38361289f565b92508282026130f18161289f565b9150828204841483151761310857613107612db1565b5b5092915050565b7f496e73756666696369656e742062616c616e636520696e20506f6f6c210000005f82015250565b5f613143601d8361292f565b915061314e8261310f565b602082019050919050565b5f6020820190508181035f83015261317081613137565b9050919050565b7f496e76616c6964207661756c74206164647265737321000000000000000000005f82015250565b5f6131ab60168361292f565b91506131b682613177565b602082019050919050565b5f6020820190508181035f8301526131d88161319f565b9050919050565b7f54726164696e67206973206f70656e21000000000000000000000000000000005f82015250565b5f61321360108361292f565b915061321e826131df565b602082019050919050565b5f6020820190508181035f83015261324081613207565b9050919050565b5f819050919050565b5f61326a61326561326084613247565b612aa0565b61289f565b9050919050565b61327a81613250565b82525050565b5f60c0820190506132935f830189612873565b6132a060208301886128fd565b6132ad6040830187613271565b6132ba6060830186613271565b6132c76080830185612873565b6132d460a08301846128fd565b979650505050505050565b5f805f606084860312156132f6576132f561289b565b5b5f61330386828701612f16565b935050602061331486828701612f16565b925050604061332586828701612f16565b9150509250925092565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737321000000000000000000000000000000000000000000000000000000602082015250565b5f61338960258361292f565b91506133948261332f565b604082019050919050565b5f6020820190508181035f8301526133b68161337d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373210000000000000000000000000000000000000000000000000000000000602082015250565b5f61341760238361292f565b9150613422826133bd565b604082019050919050565b5f6020820190508181035f8301526134448161340b565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6134a560258361292f565b91506134b08261344b565b604082019050919050565b5f6020820190508181035f8301526134d281613499565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f61353360238361292f565b915061353e826134d9565b604082019050919050565b5f6020820190508181035f83015261356081613527565b9050919050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f6135c160298361292f565b91506135cc82613567565b604082019050919050565b5f6020820190508181035f8301526135ee816135b5565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61362c8261289f565b91506136378361289f565b925082613647576136466135f5565b5b828204905092915050565b5f61365c8261289f565b91506136678361289f565b925082820390508181111561367f5761367e612db1565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61371181612862565b82525050565b5f6137228383613708565b60208301905092915050565b5f602082019050919050565b5f613744826136df565b61374e81856136e9565b9350613759836136f9565b805f5b838110156137895781516137708882613717565b975061377b8361372e565b92505060018101905061375c565b5085935050505092915050565b5f60a0820190506137a95f8301886128fd565b6137b66020830187613271565b81810360408301526137c8818661373a565b90506137d76060830185612873565b6137e460808301846128fd565b969550505050505056fe45524332303a207472616e7366657220616d6f756e74203e20616c6c6f77616e636521a264697066735822122084dcbaae9de78ff12b8d129940ab990594f955be56db1afd20a4b8ff7cc07c2c64736f6c63430008190033

Deployed Bytecode

0x6080604052600436106101d0575f3560e01c806370a08231116100f657806395d89b4111610094578063ca053dc311610063578063ca053dc314610633578063dd62ed3e14610671578063f2fde38b146106ad578063fe560792146106d5576101d7565b806395d89b411461058d578063a9059cbb146105b7578063c1474e54146105f3578063c9567bf91461061d576101d7565b80637b07763c116100d05780637b07763c146104fd57806380f909c7146105255780638da5cb5b1461054d5780638f80a85214610577576101d7565b806370a0823114610483578063715018a6146104bf5780637547c7a3146104d5576101d7565b806323b872dd1161016e5780633ae732591161013d5780633ae73259146103dd578063511f4d2714610407578063608e4dd014610431578063671769fb14610459576101d7565b806323b872dd1461032357806324e7964a1461035f5780632d6e185714610389578063313ce567146103b3576101d7565b8063095ea7b3116101aa578063095ea7b31461026b57806318160ddd146102a75780631dbf20d5146102d15780631deff2161461030d576101d7565b806302d012c6146101db57806302d1db511461020557806306fdde0314610241576101d7565b366101d757005b5f80fd5b3480156101e6575f80fd5b506101ef6106fd565b6040516101fc9190612882565b60405180910390f35b348015610210575f80fd5b5061022b600480360381019061022691906128d2565b610725565b604051610238919061290c565b60405180910390f35b34801561024c575f80fd5b5061025561073f565b6040516102629190612995565b60405180910390f35b348015610276575f80fd5b50610291600480360381019061028c91906129df565b6107cf565b60405161029e9190612a37565b60405180910390f35b3480156102b2575f80fd5b506102bb6107ec565b6040516102c8919061290c565b60405180910390f35b3480156102dc575f80fd5b506102f760048036038101906102f291906128d2565b6107f5565b6040516103049190612882565b60405180910390f35b348015610318575f80fd5b50610321610896565b005b34801561032e575f80fd5b5061034960048036038101906103449190612a50565b610905565b6040516103569190612a37565b60405180910390f35b34801561036a575f80fd5b506103736109d9565b6040516103809190612afb565b60405180910390f35b348015610394575f80fd5b5061039d6109fe565b6040516103aa919061290c565b60405180910390f35b3480156103be575f80fd5b506103c7610b01565b6040516103d49190612b2f565b60405180910390f35b3480156103e8575f80fd5b506103f1610b0a565b6040516103fe919061290c565b60405180910390f35b348015610412575f80fd5b5061041b610b13565b6040516104289190612b68565b60405180910390f35b34801561043c575f80fd5b50610457600480360381019061045291906128d2565b610b38565b005b348015610464575f80fd5b5061046d611015565b60405161047a919061290c565b60405180910390f35b34801561048e575f80fd5b506104a960048036038101906104a49190612b81565b61101e565b6040516104b6919061290c565b60405180910390f35b3480156104ca575f80fd5b506104d3611064565b005b3480156104e0575f80fd5b506104fb60048036038101906104f691906128d2565b611077565b005b348015610508575f80fd5b50610523600480360381019061051e91906129df565b611319565b005b348015610530575f80fd5b5061054b60048036038101906105469190612b81565b61159f565b005b348015610558575f80fd5b50610561611698565b60405161056e9190612882565b60405180910390f35b348015610582575f80fd5b5061058b6116bf565b005b348015610598575f80fd5b506105a1611756565b6040516105ae9190612995565b60405180910390f35b3480156105c2575f80fd5b506105dd60048036038101906105d891906129df565b6117e6565b6040516105ea9190612a37565b60405180910390f35b3480156105fe575f80fd5b50610607611803565b6040516106149190612882565b60405180910390f35b348015610628575f80fd5b5061063161182b565b005b34801561063e575f80fd5b50610659600480360381019061065491906128d2565b6119a1565b60405161066893929190612bac565b60405180910390f35b34801561067c575f80fd5b5061069760048036038101906106929190612be1565b6119c7565b6040516106a4919061290c565b60405180910390f35b3480156106b8575f80fd5b506106d360048036038101906106ce9190612b81565b611a49565b005b3480156106e0575f80fd5b506106fb60048036038101906106f69190612b81565b611acd565b005b5f60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60045f8381526020019081526020015f20549050919050565b6060600b805461074e90612c4c565b80601f016020809104026020016040519081016040528092919081815260200182805461077a90612c4c565b80156107c55780601f1061079c576101008083540402835291602001916107c5565b820191905f5260205f20905b8154815290600101906020018083116107a857829003601f168201915b5050505050905090565b5f6107e26107db611bc6565b8484611bcd565b6001905092915050565b5f600a54905090565b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610850919061290c565b602060405180830381865afa15801561086b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088f9190612c90565b9050919050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108d6611bc6565b73ffffffffffffffffffffffffffffffffffffffff16146108f5575f80fd5b5f47905061090281611d90565b50565b5f610911848484611df8565b6109ce8461091d611bc6565b6109c9856040518060600160405280602381526020016137ef6023913960025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610980611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546123e59092919063ffffffff16565b611bcd565b600190509392505050565b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8060055490505f600a5490505f8203610a1e5760085492505050610afe565b5f610a466064610a38600a8561243990919063ffffffff16565b61244e90919063ffffffff16565b9050808310610a5c576007549350505050610afe565b5f670de0b6b3a764000090505f610a8060075460085461246390919063ffffffff16565b90505f610af2610ae184610ad387610ac588610ab7610aa88e8d61246390919063ffffffff16565b8a61243990919063ffffffff16565b61243990919063ffffffff16565b61244e90919063ffffffff16565b61244e90919063ffffffff16565b60075461247890919063ffffffff16565b90508096505050505050505b90565b5f600954905090565b5f600554905090565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600f5f8381526020019081526020015f205f015490505f600f5f8481526020019081526020015f206001015490505f8111610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba090612d05565b60405180910390fd5b8060045f8481526020019081526020015f20541015610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490612d93565b60405180910390fd5b610c05611bc6565b73ffffffffffffffffffffffffffffffffffffffff16610c24836107f5565b73ffffffffffffffffffffffffffffffffffffffff1614610c43575f80fd5b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68836040518263ffffffff1660e01b8152600401610c9d919061290c565b5f604051808303815f87803b158015610cb4575f80fd5b505af1158015610cc6573d5f803e3d5ffd5b505050506104b0600f5f8581526020019081526020015f2060020154610cec9190612dde565b4210610f02575f610d1b600554610d0d60648561243990919063ffffffff16565b61244e90919063ffffffff16565b90505f610d466064610d388460065461243990919063ffffffff16565b61244e90919063ffffffff16565b9050610d5d8160065461246390919063ffffffff16565b600681905550610dba8160015f610d72611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f610dc5611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610e528160015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461246390919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610e9b611bc6565b73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ef7919061290c565b60405180910390a350505b610f178160055461246390919063ffffffff16565b600581905550610f418160045f8581526020019081526020015f205461246390919063ffffffff16565b60045f8481526020019081526020015f208190555060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634c1d1fde610f9b611bc6565b84846040518463ffffffff1660e01b8152600401610fbb93929190612e11565b5f604051808303815f87803b158015610fd2575f80fd5b505af1158015610fe4573d5f803e3d5ffd5b50505050600f5f8481526020019081526020015f205f8082015f9055600182015f9055600282015f90555050505050565b5f600654905090565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61106c61248d565b6110755f612514565b565b5f81116110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b090612e90565b60405180910390fd5b8060015f6110c5611bc6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790612ef8565b60405180910390fd5b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842611186611bc6565b6040518263ffffffff1660e01b81526004016111a29190612882565b6020604051808303815f875af11580156111be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e29190612f2a565b905060105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c5b9f8f611229611bc6565b83856040518463ffffffff1660e01b815260040161124993929190612e11565b5f604051808303815f87803b158015611260575f80fd5b505af1158015611272573d5f803e3d5ffd5b5050505061128b8260055461247890919063ffffffff16565b6005819055506112b58260045f8481526020019081526020015f205461247890919063ffffffff16565b60045f8381526020019081526020015f2081905550604051806060016040528082815260200183815260200142815250600f5f8381526020019081526020015f205f820151815f015560208201518160010155604082015181600201559050505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611359611bc6565b73ffffffffffffffffffffffffffffffffffffffff1614611378575f80fd5b600954600a6113879190613084565b8161139291906130ce565b905060015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054811115611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b90613159565b60405180910390fd5b6114648160015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461246390919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506114f58160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611593919061290c565b60405180910390a35050565b6115a761248d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c906131c1565b60405180910390fd5b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166116ff611bc6565b73ffffffffffffffffffffffffffffffffffffffff161461171e575f80fd5b5f6117283061101e565b90505f81111561173c5761173b816125d5565b5b5f4790505f8111156117525761175181611d90565b5b5050565b6060600c805461176590612c4c565b80601f016020809104026020016040519081016040528092919081815260200182805461179190612c4c565b80156117dc5780601f106117b3576101008083540402835291602001916117dc565b820191905f5260205f20905b8154815290600101906020018083116117bf57829003601f168201915b5050505050905090565b5f6117f96117f2611bc6565b8484611df8565b6001905092915050565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61183361248d565b600d5f9054906101000a900460ff1615611882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187990613229565b60405180910390fd5b6118b130600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a54611bcd565b600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71947306118fa3061101e565b5f80611904611698565b426040518863ffffffff1660e01b815260040161192696959493929190613280565b60606040518083038185885af1158015611942573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061196791906132df565b5050506001600d60026101000a81548160ff0219169083151502179055506001600d5f6101000a81548160ff021916908315150217905550565b600f602052805f5260405f205f91509050805f0154908060010154908060020154905083565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611a5161248d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ac1575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611ab89190612882565b60405180910390fd5b611aca81612514565b50565b611ad561248d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a906131c1565b60405180910390fd5b8060105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c329061339f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca09061342d565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d83919061290c565b60405180910390a3505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611df4573d5f803e3d5ffd5b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5d906134bb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecb90613549565b60405180910390fd5b5f8111611f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0d906135d7565b60405180910390fd5b5f600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015611f9f57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611fd9575f611fad6109fe565b9050611fd56064611fc7838661243990919063ffffffff16565b61244e90919063ffffffff16565b9150505b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612080575060115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15612089575f90505b5f811115612234576120e18160015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f61214a606461213c601e8561243990919063ffffffff16565b61244e90919063ffffffff16565b9050612155816125d5565b61215d611698565b73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f1935050505015801561219f573d5f803e3d5ffd5b506121c76121b6828461246390919063ffffffff16565b60065461247890919063ffffffff16565b6006819055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161222a919061290c565b60405180910390a3505b6122848260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461246390919063ffffffff16565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506123276122db828461246390919063ffffffff16565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461247890919063ffffffff16565b60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6123ca848661246390919063ffffffff16565b6040516123d7919061290c565b60405180910390a350505050565b5f83831115829061242c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124239190612995565b60405180910390fd5b5082840390509392505050565b5f818361244691906130ce565b905092915050565b5f818361245b9190613622565b905092915050565b5f81836124709190613652565b905092915050565b5f81836124859190612dde565b905092915050565b612495611bc6565b73ffffffffffffffffffffffffffffffffffffffff166124b3611698565b73ffffffffffffffffffffffffffffffffffffffff1614612512576124d6611bc6565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016125099190612882565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600d60016101000a81548160ff0219169083151502179055505f600267ffffffffffffffff81111561260c5761260b613685565b5b60405190808252806020026020018201604052801561263a5781602001602082028036833780820191505090505b50905030815f81518110612651576126506136b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061271a9190612c90565b8160018151811061272e5761272d6136b2565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061279530600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611bcd565b600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b81526004016127f8959493929190613796565b5f604051808303815f87803b15801561280f575f80fd5b505af1158015612821573d5f803e3d5ffd5b50505050505f600d60016101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61286c82612843565b9050919050565b61287c81612862565b82525050565b5f6020820190506128955f830184612873565b92915050565b5f80fd5b5f819050919050565b6128b18161289f565b81146128bb575f80fd5b50565b5f813590506128cc816128a8565b92915050565b5f602082840312156128e7576128e661289b565b5b5f6128f4848285016128be565b91505092915050565b6129068161289f565b82525050565b5f60208201905061291f5f8301846128fd565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61296782612925565b612971818561292f565b935061298181856020860161293f565b61298a8161294d565b840191505092915050565b5f6020820190508181035f8301526129ad818461295d565b905092915050565b6129be81612862565b81146129c8575f80fd5b50565b5f813590506129d9816129b5565b92915050565b5f80604083850312156129f5576129f461289b565b5b5f612a02858286016129cb565b9250506020612a13858286016128be565b9150509250929050565b5f8115159050919050565b612a3181612a1d565b82525050565b5f602082019050612a4a5f830184612a28565b92915050565b5f805f60608486031215612a6757612a6661289b565b5b5f612a74868287016129cb565b9350506020612a85868287016129cb565b9250506040612a96868287016128be565b9150509250925092565b5f819050919050565b5f612ac3612abe612ab984612843565b612aa0565b612843565b9050919050565b5f612ad482612aa9565b9050919050565b5f612ae582612aca565b9050919050565b612af581612adb565b82525050565b5f602082019050612b0e5f830184612aec565b92915050565b5f60ff82169050919050565b612b2981612b14565b82525050565b5f602082019050612b425f830184612b20565b92915050565b5f612b5282612aca565b9050919050565b612b6281612b48565b82525050565b5f602082019050612b7b5f830184612b59565b92915050565b5f60208284031215612b9657612b9561289b565b5b5f612ba3848285016129cb565b91505092915050565b5f606082019050612bbf5f8301866128fd565b612bcc60208301856128fd565b612bd960408301846128fd565b949350505050565b5f8060408385031215612bf757612bf661289b565b5b5f612c04858286016129cb565b9250506020612c15858286016129cb565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612c6357607f821691505b602082108103612c7657612c75612c1f565b5b50919050565b5f81519050612c8a816129b5565b92915050565b5f60208284031215612ca557612ca461289b565b5b5f612cb284828501612c7c565b91505092915050565b7f43616e6e6f7420756e7374616b65207a65726f20746f6b656e732100000000005f82015250565b5f612cef601b8361292f565b9150612cfa82612cbb565b602082019050919050565b5f6020820190508181035f830152612d1c81612ce3565b9050919050565b7f496e73756666696369656e74207374616b65642062616c616e636520746f20755f8201527f6e7374616b652100000000000000000000000000000000000000000000000000602082015250565b5f612d7d60278361292f565b9150612d8882612d23565b604082019050919050565b5f6020820190508181035f830152612daa81612d71565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612de88261289f565b9150612df38361289f565b9250828201905080821115612e0b57612e0a612db1565b5b92915050565b5f606082019050612e245f830186612873565b612e3160208301856128fd565b612e3e60408301846128fd565b949350505050565b7f43616e6e6f74207374616b65207a65726f20746f6b656e7321000000000000005f82015250565b5f612e7a60198361292f565b9150612e8582612e46565b602082019050919050565b5f6020820190508181035f830152612ea781612e6e565b9050919050565b7f496e73756666696369656e742062616c616e636520746f207374616b652100005f82015250565b5f612ee2601e8361292f565b9150612eed82612eae565b602082019050919050565b5f6020820190508181035f830152612f0f81612ed6565b9050919050565b5f81519050612f24816128a8565b92915050565b5f60208284031215612f3f57612f3e61289b565b5b5f612f4c84828501612f16565b91505092915050565b5f8160011c9050919050565b5f808291508390505b6001851115612faa57808604811115612f8657612f85612db1565b5b6001851615612f955780820291505b8081029050612fa385612f55565b9450612f6a565b94509492505050565b5f82612fc2576001905061307d565b81612fcf575f905061307d565b8160018114612fe55760028114612fef5761301e565b600191505061307d565b60ff84111561300157613000612db1565b5b8360020a91508482111561301857613017612db1565b5b5061307d565b5060208310610133831016604e8410600b84101617156130535782820a90508381111561304e5761304d612db1565b5b61307d565b6130608484846001612f61565b9250905081840481111561307757613076612db1565b5b81810290505b9392505050565b5f61308e8261289f565b91506130998361289f565b92506130c67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612fb3565b905092915050565b5f6130d88261289f565b91506130e38361289f565b92508282026130f18161289f565b9150828204841483151761310857613107612db1565b5b5092915050565b7f496e73756666696369656e742062616c616e636520696e20506f6f6c210000005f82015250565b5f613143601d8361292f565b915061314e8261310f565b602082019050919050565b5f6020820190508181035f83015261317081613137565b9050919050565b7f496e76616c6964207661756c74206164647265737321000000000000000000005f82015250565b5f6131ab60168361292f565b91506131b682613177565b602082019050919050565b5f6020820190508181035f8301526131d88161319f565b9050919050565b7f54726164696e67206973206f70656e21000000000000000000000000000000005f82015250565b5f61321360108361292f565b915061321e826131df565b602082019050919050565b5f6020820190508181035f83015261324081613207565b9050919050565b5f819050919050565b5f61326a61326561326084613247565b612aa0565b61289f565b9050919050565b61327a81613250565b82525050565b5f60c0820190506132935f830189612873565b6132a060208301886128fd565b6132ad6040830187613271565b6132ba6060830186613271565b6132c76080830185612873565b6132d460a08301846128fd565b979650505050505050565b5f805f606084860312156132f6576132f561289b565b5b5f61330386828701612f16565b935050602061331486828701612f16565b925050604061332586828701612f16565b9150509250925092565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737321000000000000000000000000000000000000000000000000000000602082015250565b5f61338960258361292f565b91506133948261332f565b604082019050919050565b5f6020820190508181035f8301526133b68161337d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373210000000000000000000000000000000000000000000000000000000000602082015250565b5f61341760238361292f565b9150613422826133bd565b604082019050919050565b5f6020820190508181035f8301526134448161340b565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6134a560258361292f565b91506134b08261344b565b604082019050919050565b5f6020820190508181035f8301526134d281613499565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f61353360238361292f565b915061353e826134d9565b604082019050919050565b5f6020820190508181035f83015261356081613527565b9050919050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f6135c160298361292f565b91506135cc82613567565b604082019050919050565b5f6020820190508181035f8301526135ee816135b5565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61362c8261289f565b91506136378361289f565b925082613647576136466135f5565b5b828204905092915050565b5f61365c8261289f565b91506136678361289f565b925082820390508181111561367f5761367e612db1565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61371181612862565b82525050565b5f6137228383613708565b60208301905092915050565b5f602082019050919050565b5f613744826136df565b61374e81856136e9565b9350613759836136f9565b805f5b838110156137895781516137708882613717565b975061377b8361372e565b92505060018101905061375c565b5085935050505092915050565b5f60a0820190506137a95f8301886128fd565b6137b66020830187613271565b81810360408301526137c8818661373a565b90506137d76060830185612873565b6137e460808301846128fd565b969550505050505056fe45524332303a207472616e7366657220616d6f756e74203e20616c6c6f77616e636521a264697066735822122084dcbaae9de78ff12b8d129940ab990594f955be56db1afd20a4b8ff7cc07c2c64736f6c63430008190033

Deployed Bytecode Sourcemap

32849:13808:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43087:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46532:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41988:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42651:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42272:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40187:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45497:192;;;;;;;;;;;;;:::i;:::-;;43197:432;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34436:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36237:1377;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42174:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46374:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34575:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38582:1597;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46224:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42366:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6550:103;;;;;;;;;;;;;:::i;:::-;;37652:889;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45697:470;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35845:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5875:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45113:376;;;;;;;;;;;;;:::i;:::-;;42079:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42811:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42977:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44605:463;;;;;;;;;;;;;:::i;:::-;;34316:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;42484:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6808:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35582:255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43087:102;43135:7;43162:19;;;;;;;;;;;43155:26;;43087:102;:::o;46532:122::-;46597:7;46624:15;:22;46640:5;46624:22;;;;;;;;;;;;46617:29;;46532:122;;;:::o;41988:83::-;42025:13;42058:5;42051:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41988:83;:::o;42651:152::-;42717:4;42734:39;42743:12;:10;:12::i;:::-;42757:7;42766:6;42734:8;:39::i;:::-;42791:4;42784:11;;42651:152;;;;:::o;42272:86::-;42316:7;42343;;42336:14;;42272:86;:::o;40187:117::-;40245:7;40272:12;;;;;;;;;;;:20;;;40293:2;40272:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40265:31;;40187:117;;;:::o;45497:192::-;45566:10;;;;;;;;;;;45550:26;;:12;:10;:12::i;:::-;:26;;;45542:35;;;;;;45588:26;45617:21;45588:50;;45649:32;45662:18;45649:12;:32::i;:::-;45531:158;45497:192::o;43197:432::-;43320:4;43337:36;43347:6;43355:9;43366:6;43337:9;:36::i;:::-;43384:215;43407:6;43428:12;:10;:12::i;:::-;43455:133;43511:6;43455:133;;;;;;;;;;;;;;;;;:11;:19;43467:6;43455:19;;;;;;;;;;;;;;;:33;43475:12;:10;:12::i;:::-;43455:33;;;;;;;;;;;;;;;;:37;;:133;;;;;:::i;:::-;43384:8;:215::i;:::-;43617:4;43610:11;;43197:432;;;;;:::o;34436:32::-;;;;;;;;;;;;;:::o;36237:1377::-;36293:7;36313:20;36336:12;;36313:35;;36359:24;36386:7;;36359:34;;36426:1;36410:12;:17;36406:114;;36451:11;;36444:18;;;;;;36406:114;36619:17;36639:33;36668:3;36639:24;36660:2;36639:16;:20;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;36619:53;;36726:9;36710:12;:25;36706:76;;36759:11;;36752:18;;;;;;;36706:76;36991:13;37007:4;36991:20;;37022;37045:28;37061:11;;37045;;:15;;:28;;;;:::i;:::-;37022:51;;37374:11;37388:195;37418:154;37566:5;37418:125;37533:9;37418:92;37504:5;37418:63;37453:27;37467:12;37453:9;:13;;:27;;;;:::i;:::-;37418:12;:34;;:63;;;;:::i;:::-;:85;;:92;;;;:::i;:::-;:114;;:125;;;;:::i;:::-;:147;;:154;;;;:::i;:::-;37388:11;;:15;;:195;;;;:::i;:::-;37374:209;;37603:3;37596:10;;;;;;;;36237:1377;;:::o;42174:90::-;42215:5;42246:9;;42233:23;;42174:90;:::o;46374:97::-;46424:7;46451:12;;46444:19;;46374:97;:::o;34575:32::-;;;;;;;;;;;;;:::o;38582:1597::-;38635:13;38651:17;:21;38669:2;38651:21;;;;;;;;;;;:27;;;38635:43;;38689:14;38706:17;:21;38724:2;38706:21;;;;;;;;;;;:30;;;38689:47;;38764:1;38755:6;:10;38747:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;38856:6;38830:15;:22;38846:5;38830:22;;;;;;;;;;;;:32;;38808:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;38974:12;:10;:12::i;:::-;38948:38;;:22;38964:5;38948:15;:22::i;:::-;:38;;;38940:47;;;;;;39021:12;;;;;;;;;;;:17;;;39039:5;39021:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39157:10;39123:17;:21;39141:2;39123:21;;;;;;;;;;;:31;;;:44;;;;:::i;:::-;39104:15;:63;39100:724;;39247:15;39265:33;39285:12;;39265:15;39276:3;39265:6;:10;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;39247:51;;39336:14;39353:35;39384:3;39353:26;39371:7;39353:13;;:17;;:26;;;;:::i;:::-;:30;;:35;;;;:::i;:::-;39336:52;;39457:25;39475:6;39457:13;;:17;;:25;;;;:::i;:::-;39441:13;:41;;;;39605:35;39633:6;39605:9;:23;39615:12;:10;:12::i;:::-;39605:23;;;;;;;;;;;;;;;;:27;;:35;;;;:::i;:::-;39579:9;:23;39589:12;:10;:12::i;:::-;39579:23;;;;;;;;;;;;;;;:61;;;;39682:36;39711:6;39682:9;:24;39700:4;39682:24;;;;;;;;;;;;;;;;:28;;:36;;;;:::i;:::-;39655:9;:24;39673:4;39655:24;;;;;;;;;;;;;;;:63;;;;39764:12;:10;:12::i;:::-;39740:45;;39757:4;39740:45;;;39778:6;39740:45;;;;;;:::i;:::-;;;;;;;;39169:655;;39100:724;39851:24;39868:6;39851:12;;:16;;:24;;;;:::i;:::-;39836:12;:39;;;;39911:34;39938:6;39911:15;:22;39927:5;39911:22;;;;;;;;;;;;:26;;:34;;;;:::i;:::-;39886:15;:22;39902:5;39886:22;;;;;;;;;;;:59;;;;40008:12;;;;;;;;;;;:27;;;40036:12;:10;:12::i;:::-;40050:5;40057:6;40008:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40150:17;:21;40168:2;40150:21;;;;;;;;;;;;40143:28;;;;;;;;;;;;;;;;;;;;38624:1555;;38582:1597;:::o;46224:93::-;46269:7;46296:13;;46289:20;;46224:93;:::o;42366:110::-;42423:7;42450:9;:18;42460:7;42450:18;;;;;;;;;;;;;;;;42443:25;;42366:110;;;:::o;6550:103::-;5761:13;:11;:13::i;:::-;6615:30:::1;6642:1;6615:18;:30::i;:::-;6550:103::o:0;37652:889::-;37724:1;37715:6;:10;37707:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;37815:6;37788:9;:23;37798:12;:10;:12::i;:::-;37788:23;;;;;;;;;;;;;;;;:33;;37766:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;37913:20;37936:12;;;;;;;;;;;:17;;;37954:12;:10;:12::i;:::-;37936:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37913:54;;38029:12;;;;;;;;;;;:26;;;38056:12;:10;:12::i;:::-;38070;38084:6;38029:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38119:24;38136:6;38119:12;;:16;;:24;;;;:::i;:::-;38104:12;:39;;;;38186:65;38234:6;38186:15;:29;38202:12;38186:29;;;;;;;;;;;;:33;;:65;;;;:::i;:::-;38154:15;:29;38170:12;38154:29;;;;;;;;;;;:97;;;;38376:146;;;;;;;;38414:12;38376:146;;;;38455:6;38376:146;;;;38491:15;38376:146;;;38327:17;:31;38345:12;38327:31;;;;;;;;;;;:206;;;;;;;;;;;;;;;;;;;;;;;;;;;37696:845;37652:889;:::o;45697:470::-;45803:10;;;;;;;;;;;45787:26;;:12;:10;:12::i;:::-;:26;;;45779:35;;;;;;45849:9;;45843:2;:15;;;;:::i;:::-;45834:6;:24;;;;:::i;:::-;45825:33;;45901:9;:24;45919:4;45901:24;;;;;;;;;;;;;;;;45891:6;:34;;45869:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;46020:36;46049:6;46020:9;:24;46038:4;46020:24;;;;;;;;;;;;;;;;:28;;:36;;;;:::i;:::-;45993:9;:24;46011:4;45993:24;;;;;;;;;;;;;;;:63;;;;46083:25;46101:6;46083:9;:13;46093:2;46083:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;46067:9;:13;46077:2;46067:13;;;;;;;;;;;;;;;:41;;;;46148:2;46124:35;;46141:4;46124:35;;;46152:6;46124:35;;;;;;:::i;:::-;;;;;;;;45697:470;;:::o;35845:299::-;5761:13;:11;:13::i;:::-;35990:1:::1;35956:36;;:22;:36;;::::0;35948:71:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36058:22;36030:12;;:51;;;;;;;;;;;;;;;;;;36114:22;36092:19;;:44;;;;;;;;;;;;;;;;;;35845:299:::0;:::o;5875:87::-;5921:7;5948:6;;;;;;;;;;;5941:13;;5875:87;:::o;45113:376::-;45189:10;;;;;;;;;;;45173:26;;:12;:10;:12::i;:::-;:26;;;45165:35;;;;;;45211:20;45234:24;45252:4;45234:9;:24::i;:::-;45211:47;;45288:1;45273:12;:16;45269:79;;;45306:30;45323:12;45306:16;:30::i;:::-;45269:79;45358:18;45379:21;45358:42;;45428:1;45415:10;:14;45411:71;;;45446:24;45459:10;45446:12;:24::i;:::-;45411:71;45154:335;;45113:376::o;42079:87::-;42118:13;42151:7;42144:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42079:87;:::o;42811:158::-;42880:4;42897:42;42907:12;:10;:12::i;:::-;42921:9;42932:6;42897:9;:42::i;:::-;42957:4;42950:11;;42811:158;;;;:::o;42977:102::-;43025:7;43052:19;;;;;;;;;;;43045:26;;42977:102;:::o;44605:463::-;5761:13;:11;:13::i;:::-;44667:11:::1;;;;;;;;;;;44666:12;44658:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;44710:58;44727:4;44742:15;;;;;;;;;;;44760:7;;44710:8;:58::i;:::-;44779:15;;;;;;;;;;;:31;;;44818:21;44863:4;44883:24;44901:4;44883:9;:24::i;:::-;44922:1;44938::::0;44954:7:::1;:5;:7::i;:::-;44976:15;44779:223;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;45027:4;45013:11;;:18;;;;;;;;;;;;;;;;;;45056:4;45042:11;;:18;;;;;;;;;;;;;;;;;;44605:463::o:0;34316:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42484:159::-;42581:7;42608:11;:18;42620:5;42608:18;;;;;;;;;;;;;;;:27;42627:7;42608:27;;;;;;;;;;;;;;;;42601:34;;42484:159;;;;:::o;6808:220::-;5761:13;:11;:13::i;:::-;6913:1:::1;6893:22;;:8;:22;;::::0;6889:93:::1;;6967:1;6939:31;;;;;;;;;;;:::i;:::-;;;;;;;;6889:93;6992:28;7011:8;6992:18;:28::i;:::-;6808:220:::0;:::o;35582:255::-;5761:13;:11;:13::i;:::-;35697:1:::1;35670:29;;:15;:29;;::::0;35662:64:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;35765:15;35737:12;;:44;;;;;;;;;;;;;;;;;;35814:15;35792:19;;:37;;;;;;;;;;;;;;;;;;35582:255:::0;:::o;3884:98::-;3937:7;3964:10;3957:17;;3884:98;:::o;43637:339::-;43747:1;43730:19;;:5;:19;;;43722:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43829:1;43810:21;;:7;:21;;;43802:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43914:6;43884:11;:18;43896:5;43884:18;;;;;;;;;;;;;;;:27;43903:7;43884:27;;;;;;;;;;;;;;;:36;;;;43952:7;43936:32;;43945:5;43936:32;;;43961:6;43936:32;;;;;;:::i;:::-;;;;;;;;43637:339;;;:::o;44475:92::-;44532:10;;;;;;;;;;;:19;;:27;44552:6;44532:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44475:92;:::o;40374:1579::-;40478:1;40462:18;;:4;:18;;;40454:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40555:1;40541:16;;:2;:16;;;40533:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;40625:1;40616:6;:10;40608:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;40685:17;40813:13;;;;;;;;;;;40807:19;;:2;:19;;;:44;;;;;40846:4;40830:21;;:4;:21;;;;40807:44;40803:205;;;40868:15;40886:25;:23;:25::i;:::-;40868:43;;40938:28;40962:3;40938:19;40949:7;40938:6;:10;;:19;;;;:::i;:::-;:23;;:28;;;;:::i;:::-;40926:40;;40853:155;40803:205;41086:19;;;;;;;;;;;41080:25;;:2;:25;;;:56;;;;41117:19;;;;;;;;;;;41109:27;;:4;:27;;;41080:56;41076:102;;;41165:1;41153:13;;41076:102;41206:1;41194:9;:13;41190:516;;;41251:39;41280:9;41251;:24;41269:4;41251:24;;;;;;;;;;;;;;;;:28;;:39;;;;:::i;:::-;41224:9;:24;41242:4;41224:24;;;;;;;;;;;;;;;:66;;;;41305:20;41328:26;41350:3;41328:17;41342:2;41328:9;:13;;:17;;;;:::i;:::-;:21;;:26;;;;:::i;:::-;41305:49;;41369:30;41386:12;41369:16;:30::i;:::-;41422:7;:5;:7::i;:::-;41414:25;;:48;41440:21;41414:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41586:46;41604:27;41618:12;41604:9;:13;;:27;;;;:::i;:::-;41586:13;;:17;;:46;;;;:::i;:::-;41570:13;:62;;;;41677:4;41654:40;;41663:4;41654:40;;;41684:9;41654:40;;;;;;:::i;:::-;;;;;;;;41209:497;41190:516;41794:27;41814:6;41794:9;:15;41804:4;41794:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;41776:9;:15;41786:4;41776:15;;;;;;;;;;;;;;;:45;;;;41848:40;41866:21;41877:9;41866:6;:10;;:21;;;;:::i;:::-;41848:9;:13;41858:2;41848:13;;;;;;;;;;;;;;;;:17;;:40;;;;:::i;:::-;41832:9;:13;41842:2;41832:13;;;;;;;;;;;;;;;:56;;;;41919:2;41904:41;;41913:4;41904:41;;;41923:21;41934:9;41923:6;:10;;:21;;;;:::i;:::-;41904:41;;;;;;:::i;:::-;;;;;;;;40443:1510;40374:1579;;;:::o;12541:206::-;12627:7;12685:1;12680;:6;;12688:12;12672:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12727:1;12723;:5;12716:12;;12541:206;;;;;:::o;11000:98::-;11058:7;11089:1;11085;:5;;;;:::i;:::-;11078:12;;11000:98;;;;:::o;11399:::-;11457:7;11488:1;11484;:5;;;;:::i;:::-;11477:12;;11399:98;;;;:::o;10643:::-;10701:7;10732:1;10728;:5;;;;:::i;:::-;10721:12;;10643:98;;;;:::o;10262:::-;10320:7;10351:1;10347;:5;;;;:::i;:::-;10340:12;;10262:98;;;;:::o;6040:166::-;6111:12;:10;:12::i;:::-;6100:23;;:7;:5;:7::i;:::-;:23;;;6096:103;;6174:12;:10;:12::i;:::-;6147:40;;;;;;;;;;;:::i;:::-;;;;;;;;6096:103;6040:166::o;7188:191::-;7262:16;7281:6;;;;;;;;;;;7262:25;;7307:8;7298:6;;:17;;;;;;;;;;;;;;;;;;7362:8;7331:40;;7352:8;7331:40;;;;;;;;;;;;7251:128;7188:191;:::o;43984:483::-;33895:4;33886:6;;:13;;;;;;;;;;;;;;;;;;44062:21:::1;44100:1;44086:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44062:40;;44131:4;44113;44118:1;44113:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;44157:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44147:4;44152:1;44147:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;44190:62;44207:4;44222:15;;;;;;;;;;;44240:11;44190:8;:62::i;:::-;44263:15;;;;;;;;;;;:66;;;44344:11;44370:1;44386:4;44413;44433:15;44263:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44051:416;33931:5:::0;33922:6;;:14;;;;;;;;;;;;;;;;;;43984:483;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;674:117::-;783:1;780;773:12;920:77;957:7;986:5;975:16;;920:77;;;:::o;1003:122::-;1076:24;1094:5;1076:24;:::i;:::-;1069:5;1066:35;1056:63;;1115:1;1112;1105:12;1056:63;1003:122;:::o;1131:139::-;1177:5;1215:6;1202:20;1193:29;;1231:33;1258:5;1231:33;:::i;:::-;1131:139;;;;:::o;1276:329::-;1335:6;1384:2;1372:9;1363:7;1359:23;1355:32;1352:119;;;1390:79;;:::i;:::-;1352:119;1510:1;1535:53;1580:7;1571:6;1560:9;1556:22;1535:53;:::i;:::-;1525:63;;1481:117;1276:329;;;;:::o;1611:118::-;1698:24;1716:5;1698:24;:::i;:::-;1693:3;1686:37;1611:118;;:::o;1735:222::-;1828:4;1866:2;1855:9;1851:18;1843:26;;1879:71;1947:1;1936:9;1932:17;1923:6;1879:71;:::i;:::-;1735:222;;;;:::o;1963:99::-;2015:6;2049:5;2043:12;2033:22;;1963:99;;;:::o;2068:169::-;2152:11;2186:6;2181:3;2174:19;2226:4;2221:3;2217:14;2202:29;;2068:169;;;;:::o;2243:139::-;2332:6;2327:3;2322;2316:23;2373:1;2364:6;2359:3;2355:16;2348:27;2243:139;;;:::o;2388:102::-;2429:6;2480:2;2476:7;2471:2;2464:5;2460:14;2456:28;2446:38;;2388:102;;;:::o;2496:377::-;2584:3;2612:39;2645:5;2612:39;:::i;:::-;2667:71;2731:6;2726:3;2667:71;:::i;:::-;2660:78;;2747:65;2805:6;2800:3;2793:4;2786:5;2782:16;2747:65;:::i;:::-;2837:29;2859:6;2837:29;:::i;:::-;2832:3;2828:39;2821:46;;2588:285;2496:377;;;;:::o;2879:313::-;2992:4;3030:2;3019:9;3015:18;3007:26;;3079:9;3073:4;3069:20;3065:1;3054:9;3050:17;3043:47;3107:78;3180:4;3171:6;3107:78;:::i;:::-;3099:86;;2879:313;;;;:::o;3198:122::-;3271:24;3289:5;3271:24;:::i;:::-;3264:5;3261:35;3251:63;;3310:1;3307;3300:12;3251:63;3198:122;:::o;3326:139::-;3372:5;3410:6;3397:20;3388:29;;3426:33;3453:5;3426:33;:::i;:::-;3326:139;;;;:::o;3471:474::-;3539:6;3547;3596:2;3584:9;3575:7;3571:23;3567:32;3564:119;;;3602:79;;:::i;:::-;3564:119;3722:1;3747:53;3792:7;3783:6;3772:9;3768:22;3747:53;:::i;:::-;3737:63;;3693:117;3849:2;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3820:118;3471:474;;;;;:::o;3951:90::-;3985:7;4028:5;4021:13;4014:21;4003:32;;3951:90;;;:::o;4047:109::-;4128:21;4143:5;4128:21;:::i;:::-;4123:3;4116:34;4047:109;;:::o;4162:210::-;4249:4;4287:2;4276:9;4272:18;4264:26;;4300:65;4362:1;4351:9;4347:17;4338:6;4300:65;:::i;:::-;4162:210;;;;:::o;4378:619::-;4455:6;4463;4471;4520:2;4508:9;4499:7;4495:23;4491:32;4488:119;;;4526:79;;:::i;:::-;4488:119;4646:1;4671:53;4716:7;4707:6;4696:9;4692:22;4671:53;:::i;:::-;4661:63;;4617:117;4773:2;4799:53;4844:7;4835:6;4824:9;4820:22;4799:53;:::i;:::-;4789:63;;4744:118;4901:2;4927:53;4972:7;4963:6;4952:9;4948:22;4927:53;:::i;:::-;4917:63;;4872:118;4378:619;;;;;:::o;5003:60::-;5031:3;5052:5;5045:12;;5003:60;;;:::o;5069:142::-;5119:9;5152:53;5170:34;5179:24;5197:5;5179:24;:::i;:::-;5170:34;:::i;:::-;5152:53;:::i;:::-;5139:66;;5069:142;;;:::o;5217:126::-;5267:9;5300:37;5331:5;5300:37;:::i;:::-;5287:50;;5217:126;;;:::o;5349:147::-;5420:9;5453:37;5484:5;5453:37;:::i;:::-;5440:50;;5349:147;;;:::o;5502:173::-;5610:58;5662:5;5610:58;:::i;:::-;5605:3;5598:71;5502:173;;:::o;5681:264::-;5795:4;5833:2;5822:9;5818:18;5810:26;;5846:92;5935:1;5924:9;5920:17;5911:6;5846:92;:::i;:::-;5681:264;;;;:::o;5951:86::-;5986:7;6026:4;6019:5;6015:16;6004:27;;5951:86;;;:::o;6043:112::-;6126:22;6142:5;6126:22;:::i;:::-;6121:3;6114:35;6043:112;;:::o;6161:214::-;6250:4;6288:2;6277:9;6273:18;6265:26;;6301:67;6365:1;6354:9;6350:17;6341:6;6301:67;:::i;:::-;6161:214;;;;:::o;6381:147::-;6452:9;6485:37;6516:5;6485:37;:::i;:::-;6472:50;;6381:147;;;:::o;6534:173::-;6642:58;6694:5;6642:58;:::i;:::-;6637:3;6630:71;6534:173;;:::o;6713:264::-;6827:4;6865:2;6854:9;6850:18;6842:26;;6878:92;6967:1;6956:9;6952:17;6943:6;6878:92;:::i;:::-;6713:264;;;;:::o;6983:329::-;7042:6;7091:2;7079:9;7070:7;7066:23;7062:32;7059:119;;;7097:79;;:::i;:::-;7059:119;7217:1;7242:53;7287:7;7278:6;7267:9;7263:22;7242:53;:::i;:::-;7232:63;;7188:117;6983:329;;;;:::o;7318:442::-;7467:4;7505:2;7494:9;7490:18;7482:26;;7518:71;7586:1;7575:9;7571:17;7562:6;7518:71;:::i;:::-;7599:72;7667:2;7656:9;7652:18;7643:6;7599:72;:::i;:::-;7681;7749:2;7738:9;7734:18;7725:6;7681:72;:::i;:::-;7318:442;;;;;;:::o;7766:474::-;7834:6;7842;7891:2;7879:9;7870:7;7866:23;7862:32;7859:119;;;7897:79;;:::i;:::-;7859:119;8017:1;8042:53;8087:7;8078:6;8067:9;8063:22;8042:53;:::i;:::-;8032:63;;7988:117;8144:2;8170:53;8215:7;8206:6;8195:9;8191:22;8170:53;:::i;:::-;8160:63;;8115:118;7766:474;;;;;:::o;8246:180::-;8294:77;8291:1;8284:88;8391:4;8388:1;8381:15;8415:4;8412:1;8405:15;8432:320;8476:6;8513:1;8507:4;8503:12;8493:22;;8560:1;8554:4;8550:12;8581:18;8571:81;;8637:4;8629:6;8625:17;8615:27;;8571:81;8699:2;8691:6;8688:14;8668:18;8665:38;8662:84;;8718:18;;:::i;:::-;8662:84;8483:269;8432:320;;;:::o;8758:143::-;8815:5;8846:6;8840:13;8831:22;;8862:33;8889:5;8862:33;:::i;:::-;8758:143;;;;:::o;8907:351::-;8977:6;9026:2;9014:9;9005:7;9001:23;8997:32;8994:119;;;9032:79;;:::i;:::-;8994:119;9152:1;9177:64;9233:7;9224:6;9213:9;9209:22;9177:64;:::i;:::-;9167:74;;9123:128;8907:351;;;;:::o;9264:177::-;9404:29;9400:1;9392:6;9388:14;9381:53;9264:177;:::o;9447:366::-;9589:3;9610:67;9674:2;9669:3;9610:67;:::i;:::-;9603:74;;9686:93;9775:3;9686:93;:::i;:::-;9804:2;9799:3;9795:12;9788:19;;9447:366;;;:::o;9819:419::-;9985:4;10023:2;10012:9;10008:18;10000:26;;10072:9;10066:4;10062:20;10058:1;10047:9;10043:17;10036:47;10100:131;10226:4;10100:131;:::i;:::-;10092:139;;9819:419;;;:::o;10244:226::-;10384:34;10380:1;10372:6;10368:14;10361:58;10453:9;10448:2;10440:6;10436:15;10429:34;10244:226;:::o;10476:366::-;10618:3;10639:67;10703:2;10698:3;10639:67;:::i;:::-;10632:74;;10715:93;10804:3;10715:93;:::i;:::-;10833:2;10828:3;10824:12;10817:19;;10476:366;;;:::o;10848:419::-;11014:4;11052:2;11041:9;11037:18;11029:26;;11101:9;11095:4;11091:20;11087:1;11076:9;11072:17;11065:47;11129:131;11255:4;11129:131;:::i;:::-;11121:139;;10848:419;;;:::o;11273:180::-;11321:77;11318:1;11311:88;11418:4;11415:1;11408:15;11442:4;11439:1;11432:15;11459:191;11499:3;11518:20;11536:1;11518:20;:::i;:::-;11513:25;;11552:20;11570:1;11552:20;:::i;:::-;11547:25;;11595:1;11592;11588:9;11581:16;;11616:3;11613:1;11610:10;11607:36;;;11623:18;;:::i;:::-;11607:36;11459:191;;;;:::o;11656:442::-;11805:4;11843:2;11832:9;11828:18;11820:26;;11856:71;11924:1;11913:9;11909:17;11900:6;11856:71;:::i;:::-;11937:72;12005:2;11994:9;11990:18;11981:6;11937:72;:::i;:::-;12019;12087:2;12076:9;12072:18;12063:6;12019:72;:::i;:::-;11656:442;;;;;;:::o;12104:175::-;12244:27;12240:1;12232:6;12228:14;12221:51;12104:175;:::o;12285:366::-;12427:3;12448:67;12512:2;12507:3;12448:67;:::i;:::-;12441:74;;12524:93;12613:3;12524:93;:::i;:::-;12642:2;12637:3;12633:12;12626:19;;12285:366;;;:::o;12657:419::-;12823:4;12861:2;12850:9;12846:18;12838:26;;12910:9;12904:4;12900:20;12896:1;12885:9;12881:17;12874:47;12938:131;13064:4;12938:131;:::i;:::-;12930:139;;12657:419;;;:::o;13082:180::-;13222:32;13218:1;13210:6;13206:14;13199:56;13082:180;:::o;13268:366::-;13410:3;13431:67;13495:2;13490:3;13431:67;:::i;:::-;13424:74;;13507:93;13596:3;13507:93;:::i;:::-;13625:2;13620:3;13616:12;13609:19;;13268:366;;;:::o;13640:419::-;13806:4;13844:2;13833:9;13829:18;13821:26;;13893:9;13887:4;13883:20;13879:1;13868:9;13864:17;13857:47;13921:131;14047:4;13921:131;:::i;:::-;13913:139;;13640:419;;;:::o;14065:143::-;14122:5;14153:6;14147:13;14138:22;;14169:33;14196:5;14169:33;:::i;:::-;14065:143;;;;:::o;14214:351::-;14284:6;14333:2;14321:9;14312:7;14308:23;14304:32;14301:119;;;14339:79;;:::i;:::-;14301:119;14459:1;14484:64;14540:7;14531:6;14520:9;14516:22;14484:64;:::i;:::-;14474:74;;14430:128;14214:351;;;;:::o;14571:102::-;14613:8;14660:5;14657:1;14653:13;14632:34;;14571:102;;;:::o;14679:848::-;14740:5;14747:4;14771:6;14762:15;;14795:5;14786:14;;14809:712;14830:1;14820:8;14817:15;14809:712;;;14925:4;14920:3;14916:14;14910:4;14907:24;14904:50;;;14934:18;;:::i;:::-;14904:50;14984:1;14974:8;14970:16;14967:451;;;15399:4;15392:5;15388:16;15379:25;;14967:451;15449:4;15443;15439:15;15431:23;;15479:32;15502:8;15479:32;:::i;:::-;15467:44;;14809:712;;;14679:848;;;;;;;:::o;15533:1073::-;15587:5;15778:8;15768:40;;15799:1;15790:10;;15801:5;;15768:40;15827:4;15817:36;;15844:1;15835:10;;15846:5;;15817:36;15913:4;15961:1;15956:27;;;;15997:1;15992:191;;;;15906:277;;15956:27;15974:1;15965:10;;15976:5;;;15992:191;16037:3;16027:8;16024:17;16021:43;;;16044:18;;:::i;:::-;16021:43;16093:8;16090:1;16086:16;16077:25;;16128:3;16121:5;16118:14;16115:40;;;16135:18;;:::i;:::-;16115:40;16168:5;;;15906:277;;16292:2;16282:8;16279:16;16273:3;16267:4;16264:13;16260:36;16242:2;16232:8;16229:16;16224:2;16218:4;16215:12;16211:35;16195:111;16192:246;;;16348:8;16342:4;16338:19;16329:28;;16383:3;16376:5;16373:14;16370:40;;;16390:18;;:::i;:::-;16370:40;16423:5;;16192:246;16463:42;16501:3;16491:8;16485:4;16482:1;16463:42;:::i;:::-;16448:57;;;;16537:4;16532:3;16528:14;16521:5;16518:25;16515:51;;;16546:18;;:::i;:::-;16515:51;16595:4;16588:5;16584:16;16575:25;;15533:1073;;;;;;:::o;16612:285::-;16672:5;16696:23;16714:4;16696:23;:::i;:::-;16688:31;;16740:27;16758:8;16740:27;:::i;:::-;16728:39;;16786:104;16823:66;16813:8;16807:4;16786:104;:::i;:::-;16777:113;;16612:285;;;;:::o;16903:410::-;16943:7;16966:20;16984:1;16966:20;:::i;:::-;16961:25;;17000:20;17018:1;17000:20;:::i;:::-;16995:25;;17055:1;17052;17048:9;17077:30;17095:11;17077:30;:::i;:::-;17066:41;;17256:1;17247:7;17243:15;17240:1;17237:22;17217:1;17210:9;17190:83;17167:139;;17286:18;;:::i;:::-;17167:139;16951:362;16903:410;;;;:::o;17319:179::-;17459:31;17455:1;17447:6;17443:14;17436:55;17319:179;:::o;17504:366::-;17646:3;17667:67;17731:2;17726:3;17667:67;:::i;:::-;17660:74;;17743:93;17832:3;17743:93;:::i;:::-;17861:2;17856:3;17852:12;17845:19;;17504:366;;;:::o;17876:419::-;18042:4;18080:2;18069:9;18065:18;18057:26;;18129:9;18123:4;18119:20;18115:1;18104:9;18100:17;18093:47;18157:131;18283:4;18157:131;:::i;:::-;18149:139;;17876:419;;;:::o;18301:172::-;18441:24;18437:1;18429:6;18425:14;18418:48;18301:172;:::o;18479:366::-;18621:3;18642:67;18706:2;18701:3;18642:67;:::i;:::-;18635:74;;18718:93;18807:3;18718:93;:::i;:::-;18836:2;18831:3;18827:12;18820:19;;18479:366;;;:::o;18851:419::-;19017:4;19055:2;19044:9;19040:18;19032:26;;19104:9;19098:4;19094:20;19090:1;19079:9;19075:17;19068:47;19132:131;19258:4;19132:131;:::i;:::-;19124:139;;18851:419;;;:::o;19276:166::-;19416:18;19412:1;19404:6;19400:14;19393:42;19276:166;:::o;19448:366::-;19590:3;19611:67;19675:2;19670:3;19611:67;:::i;:::-;19604:74;;19687:93;19776:3;19687:93;:::i;:::-;19805:2;19800:3;19796:12;19789:19;;19448:366;;;:::o;19820:419::-;19986:4;20024:2;20013:9;20009:18;20001:26;;20073:9;20067:4;20063:20;20059:1;20048:9;20044:17;20037:47;20101:131;20227:4;20101:131;:::i;:::-;20093:139;;19820:419;;;:::o;20245:85::-;20290:7;20319:5;20308:16;;20245:85;;;:::o;20336:158::-;20394:9;20427:61;20445:42;20454:32;20480:5;20454:32;:::i;:::-;20445:42;:::i;:::-;20427:61;:::i;:::-;20414:74;;20336:158;;;:::o;20500:147::-;20595:45;20634:5;20595:45;:::i;:::-;20590:3;20583:58;20500:147;;:::o;20653:807::-;20902:4;20940:3;20929:9;20925:19;20917:27;;20954:71;21022:1;21011:9;21007:17;20998:6;20954:71;:::i;:::-;21035:72;21103:2;21092:9;21088:18;21079:6;21035:72;:::i;:::-;21117:80;21193:2;21182:9;21178:18;21169:6;21117:80;:::i;:::-;21207;21283:2;21272:9;21268:18;21259:6;21207:80;:::i;:::-;21297:73;21365:3;21354:9;21350:19;21341:6;21297:73;:::i;:::-;21380;21448:3;21437:9;21433:19;21424:6;21380:73;:::i;:::-;20653:807;;;;;;;;;:::o;21466:663::-;21554:6;21562;21570;21619:2;21607:9;21598:7;21594:23;21590:32;21587:119;;;21625:79;;:::i;:::-;21587:119;21745:1;21770:64;21826:7;21817:6;21806:9;21802:22;21770:64;:::i;:::-;21760:74;;21716:128;21883:2;21909:64;21965:7;21956:6;21945:9;21941:22;21909:64;:::i;:::-;21899:74;;21854:129;22022:2;22048:64;22104:7;22095:6;22084:9;22080:22;22048:64;:::i;:::-;22038:74;;21993:129;21466:663;;;;;:::o;22135:224::-;22275:34;22271:1;22263:6;22259:14;22252:58;22344:7;22339:2;22331:6;22327:15;22320:32;22135:224;:::o;22365:366::-;22507:3;22528:67;22592:2;22587:3;22528:67;:::i;:::-;22521:74;;22604:93;22693:3;22604:93;:::i;:::-;22722:2;22717:3;22713:12;22706:19;;22365:366;;;:::o;22737:419::-;22903:4;22941:2;22930:9;22926:18;22918:26;;22990:9;22984:4;22980:20;22976:1;22965:9;22961:17;22954:47;23018:131;23144:4;23018:131;:::i;:::-;23010:139;;22737:419;;;:::o;23162:222::-;23302:34;23298:1;23290:6;23286:14;23279:58;23371:5;23366:2;23358:6;23354:15;23347:30;23162:222;:::o;23390:366::-;23532:3;23553:67;23617:2;23612:3;23553:67;:::i;:::-;23546:74;;23629:93;23718:3;23629:93;:::i;:::-;23747:2;23742:3;23738:12;23731:19;;23390:366;;;:::o;23762:419::-;23928:4;23966:2;23955:9;23951:18;23943:26;;24015:9;24009:4;24005:20;24001:1;23990:9;23986:17;23979:47;24043:131;24169:4;24043:131;:::i;:::-;24035:139;;23762:419;;;:::o;24187:224::-;24327:34;24323:1;24315:6;24311:14;24304:58;24396:7;24391:2;24383:6;24379:15;24372:32;24187:224;:::o;24417:366::-;24559:3;24580:67;24644:2;24639:3;24580:67;:::i;:::-;24573:74;;24656:93;24745:3;24656:93;:::i;:::-;24774:2;24769:3;24765:12;24758:19;;24417:366;;;:::o;24789:419::-;24955:4;24993:2;24982:9;24978:18;24970:26;;25042:9;25036:4;25032:20;25028:1;25017:9;25013:17;25006:47;25070:131;25196:4;25070:131;:::i;:::-;25062:139;;24789:419;;;:::o;25214:222::-;25354:34;25350:1;25342:6;25338:14;25331:58;25423:5;25418:2;25410:6;25406:15;25399:30;25214:222;:::o;25442:366::-;25584:3;25605:67;25669:2;25664:3;25605:67;:::i;:::-;25598:74;;25681:93;25770:3;25681:93;:::i;:::-;25799:2;25794:3;25790:12;25783:19;;25442:366;;;:::o;25814:419::-;25980:4;26018:2;26007:9;26003:18;25995:26;;26067:9;26061:4;26057:20;26053:1;26042:9;26038:17;26031:47;26095:131;26221:4;26095:131;:::i;:::-;26087:139;;25814:419;;;:::o;26239:228::-;26379:34;26375:1;26367:6;26363:14;26356:58;26448:11;26443:2;26435:6;26431:15;26424:36;26239:228;:::o;26473:366::-;26615:3;26636:67;26700:2;26695:3;26636:67;:::i;:::-;26629:74;;26712:93;26801:3;26712:93;:::i;:::-;26830:2;26825:3;26821:12;26814:19;;26473:366;;;:::o;26845:419::-;27011:4;27049:2;27038:9;27034:18;27026:26;;27098:9;27092:4;27088:20;27084:1;27073:9;27069:17;27062:47;27126:131;27252:4;27126:131;:::i;:::-;27118:139;;26845:419;;;:::o;27270:180::-;27318:77;27315:1;27308:88;27415:4;27412:1;27405:15;27439:4;27436:1;27429:15;27456:185;27496:1;27513:20;27531:1;27513:20;:::i;:::-;27508:25;;27547:20;27565:1;27547:20;:::i;:::-;27542:25;;27586:1;27576:35;;27591:18;;:::i;:::-;27576:35;27633:1;27630;27626:9;27621:14;;27456:185;;;;:::o;27647:194::-;27687:4;27707:20;27725:1;27707:20;:::i;:::-;27702:25;;27741:20;27759:1;27741:20;:::i;:::-;27736:25;;27785:1;27782;27778:9;27770:17;;27809:1;27803:4;27800:11;27797:37;;;27814:18;;:::i;:::-;27797:37;27647:194;;;;:::o;27847:180::-;27895:77;27892:1;27885:88;27992:4;27989:1;27982:15;28016:4;28013:1;28006:15;28033:180;28081:77;28078:1;28071:88;28178:4;28175:1;28168:15;28202:4;28199:1;28192:15;28219:114;28286:6;28320:5;28314:12;28304:22;;28219:114;;;:::o;28339:184::-;28438:11;28472:6;28467:3;28460:19;28512:4;28507:3;28503:14;28488:29;;28339:184;;;;:::o;28529:132::-;28596:4;28619:3;28611:11;;28649:4;28644:3;28640:14;28632:22;;28529:132;;;:::o;28667:108::-;28744:24;28762:5;28744:24;:::i;:::-;28739:3;28732:37;28667:108;;:::o;28781:179::-;28850:10;28871:46;28913:3;28905:6;28871:46;:::i;:::-;28949:4;28944:3;28940:14;28926:28;;28781:179;;;;:::o;28966:113::-;29036:4;29068;29063:3;29059:14;29051:22;;28966:113;;;:::o;29115:732::-;29234:3;29263:54;29311:5;29263:54;:::i;:::-;29333:86;29412:6;29407:3;29333:86;:::i;:::-;29326:93;;29443:56;29493:5;29443:56;:::i;:::-;29522:7;29553:1;29538:284;29563:6;29560:1;29557:13;29538:284;;;29639:6;29633:13;29666:63;29725:3;29710:13;29666:63;:::i;:::-;29659:70;;29752:60;29805:6;29752:60;:::i;:::-;29742:70;;29598:224;29585:1;29582;29578:9;29573:14;;29538:284;;;29542:14;29838:3;29831:10;;29239:608;;;29115:732;;;;:::o;29853:831::-;30116:4;30154:3;30143:9;30139:19;30131:27;;30168:71;30236:1;30225:9;30221:17;30212:6;30168:71;:::i;:::-;30249:80;30325:2;30314:9;30310:18;30301:6;30249:80;:::i;:::-;30376:9;30370:4;30366:20;30361:2;30350:9;30346:18;30339:48;30404:108;30507:4;30498:6;30404:108;:::i;:::-;30396:116;;30522:72;30590:2;30579:9;30575:18;30566:6;30522:72;:::i;:::-;30604:73;30672:3;30661:9;30657:19;30648:6;30604:73;:::i;:::-;29853:831;;;;;;;;:::o

Swarm Source

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