false
true
0

Contract Address Details

0xeB45a3c4aedd0F47F345fB4c8A1802BB5740d725

Contract Name
NineInchRouter
Creator
0x6d5fc6–642d5e at 0x29dcb0–d1870a
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
710,074 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
25999200
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
NineInchRouter




Optimization enabled
true
Compiler version
v0.8.19+commit.7dd6d404




Optimization runs
999999
EVM Version
default




Verified at
2023-10-26T23:04:01.393823Z

Constructor Arguments

0x0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd7000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27

Arg [0] (address) : 0x5b9f077a77db37f3be0a5b5d31baeff4bc5c0bd7
Arg [1] (address) : 0xa1077a294dde1b09bb078844df40758a5d0f9a27

              

contracts/swap/NineInchRouter.sol

// SPDX-License-Identifier: GPLv3
pragma solidity 0.8.19;

import "./interfaces/INineInchRouter02.sol";
import "./interfaces/INineInchFactory.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./interfaces/IWETH.sol";
import "../libraries/NineInchLibrary.sol";
import "../libraries/TransferHelper.sol";
import "../libraries/SafeMath.sol";

contract NineInchRouter is INineInchRouter02 {
    using SafeMath for uint;

    address public immutable factory;
    address public immutable WETH;

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, "NineInchRouter: EXPIRED");
        _;
    }

    constructor(address _factory, address _WETH) {
        require(_factory != address(0), "NineInchRouter: FACTORY ZERO_ADDRESS");
        require(_WETH != address(0), "NineInchRouter: WETH ZERO_ADDRESS");
        factory = _factory;
        WETH = _WETH;
    }

    receive() external payable {
        assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (INineInchFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            INineInchFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = NineInchLibrary.getReserves(
            factory,
            tokenA,
            tokenB
        );
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = NineInchLibrary.quote(
                amountADesired,
                reserveA,
                reserveB
            );
            if (amountBOptimal <= amountBDesired) {
                require(
                    amountBOptimal >= amountBMin,
                    "NineInchRouter: INSUFFICIENT_B_AMOUNT"
                );
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = NineInchLibrary.quote(
                    amountBDesired,
                    reserveB,
                    reserveA
                );
                assert(amountAOptimal <= amountADesired);
                require(
                    amountAOptimal >= amountAMin,
                    "NineInchRouter: INSUFFICIENT_A_AMOUNT"
                );
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint amountA, uint amountB, uint liquidity)
    {
        (amountA, amountB) = _addLiquidity(
            tokenA,
            tokenB,
            amountADesired,
            amountBDesired,
            amountAMin,
            amountBMin
        );
        address pair = NineInchLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = INineInchPair(pair).mint(to);
    }

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (uint amountToken, uint amountETH, uint liquidity)
    {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = NineInchLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = INineInchPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH)
            TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    )
        public
        virtual
        override
        ensure(deadline)
        returns (uint amountA, uint amountB)
    {
        address pair = NineInchLibrary.pairFor(factory, tokenA, tokenB);
        INineInchPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = INineInchPair(pair).burn(to);
        (address token0, ) = NineInchLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0
            ? (amount0, amount1)
            : (amount1, amount0);
        require(amountA >= amountAMin, "NineInchRouter: INSUFFICIENT_A_AMOUNT");
        require(amountB >= amountBMin, "NineInchRouter: INSUFFICIENT_B_AMOUNT");
    }

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        public
        virtual
        override
        ensure(deadline)
        returns (uint amountToken, uint amountETH)
    {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = NineInchLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? type(uint).max : liquidity;
        INineInchPair(pair).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
        (amountA, amountB) = removeLiquidity(
            tokenA,
            tokenB,
            liquidity,
            amountAMin,
            amountBMin,
            to,
            deadline
        );
    }

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = NineInchLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? type(uint).max : liquidity;
        INineInchPair(pair).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
        (amountToken, amountETH) = removeLiquidityETH(
            token,
            liquidity,
            amountTokenMin,
            amountETHMin,
            to,
            deadline
        );
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(
            token,
            to,
            IERC20(token).balanceOf(address(this))
        );
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = NineInchLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? type(uint).max : liquidity;
        INineInchPair(pair).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token,
            liquidity,
            amountTokenMin,
            amountETHMin,
            to,
            deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(
        uint[] memory amounts,
        address[] memory path,
        address _to
    ) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = NineInchLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0
                ? (uint(0), amountOut)
                : (amountOut, uint(0));
            address to = i < path.length - 2
                ? NineInchLibrary.pairFor(factory, output, path[i + 2])
                : _to;
            INineInchPair(NineInchLibrary.pairFor(factory, input, output)).swap(
                amount0Out,
                amount1Out,
                to,
                new bytes(0)
            );
        }
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        amounts = NineInchLibrary.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "NineInchRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            NineInchLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        amounts = NineInchLibrary.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= amountInMax,
            "NineInchRouter: EXCESSIVE_INPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            NineInchLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, "NineInchRouter: INVALID_PATH");
        amounts = NineInchLibrary.getAmountsOut(factory, msg.value, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "NineInchRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(
            IWETH(WETH).transfer(
                NineInchLibrary.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactETH(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, "NineInchRouter: INVALID_PATH");
        amounts = NineInchLibrary.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= amountInMax,
            "NineInchRouter: EXCESSIVE_INPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            NineInchLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, "NineInchRouter: INVALID_PATH");
        amounts = NineInchLibrary.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "NineInchRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            NineInchLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, "NineInchRouter: INVALID_PATH");
        amounts = NineInchLibrary.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= msg.value,
            "NineInchRouter: EXCESSIVE_INPUT_AMOUNT"
        );
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(
            IWETH(WETH).transfer(
                NineInchLibrary.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0])
            TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(
        address[] memory path,
        address _to
    ) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = NineInchLibrary.sortTokens(input, output);
            INineInchPair pair = INineInchPair(
                NineInchLibrary.pairFor(factory, input, output)
            );
            uint amountInput;
            uint amountOutput;
            {
                // scope to avoid stack too deep errors
                (uint reserve0, uint reserve1, ) = pair.getReserves();
                (uint reserveInput, uint reserveOutput) = input == token0
                    ? (reserve0, reserve1)
                    : (reserve1, reserve0);
                amountInput = IERC20(input).balanceOf(address(pair)).sub(
                    reserveInput
                );
                amountOutput = NineInchLibrary.getAmountOut(
                    amountInput,
                    reserveInput,
                    reserveOutput
                );
            }
            (uint amount0Out, uint amount1Out) = input == token0
                ? (uint(0), amountOutput)
                : (amountOutput, uint(0));
            address to = i < path.length - 2
                ? NineInchLibrary.pairFor(factory, output, path[i + 2])
                : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            NineInchLibrary.pairFor(factory, path[0], path[1]),
            amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >=
                amountOutMin,
            "NineInchRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
    }

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable virtual override ensure(deadline) {
        require(path[0] == WETH, "NineInchRouter: INVALID_PATH");
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(
            IWETH(WETH).transfer(
                NineInchLibrary.pairFor(factory, path[0], path[1]),
                amountIn
            )
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >=
                amountOutMin,
            "NineInchRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
    }

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        require(path[path.length - 1] == WETH, "NineInchRouter: INVALID_PATH");
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            NineInchLibrary.pairFor(factory, path[0], path[1]),
            amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(
            amountOut >= amountOutMin,
            "NineInchRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

    // **** LIBRARY FUNCTIONS ****
    function quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) public pure virtual override returns (uint amountB) {
        return NineInchLibrary.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) public pure virtual override returns (uint amountOut) {
        return NineInchLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut
    ) public pure virtual override returns (uint amountIn) {
        return NineInchLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(
        uint amountIn,
        address[] memory path
    ) public view virtual override returns (uint[] memory amounts) {
        return NineInchLibrary.getAmountsOut(factory, amountIn, path);
    }

    function getAmountsIn(
        uint amountOut,
        address[] memory path
    ) public view virtual override returns (uint[] memory amounts) {
        return NineInchLibrary.getAmountsIn(factory, amountOut, path);
    }
}
        

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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 amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` 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 amount) external returns (bool);
}
          

contracts/libraries/NineInchLibrary.sol

// SPDX-License-Identifier: GPLv3
pragma solidity 0.8.19;

import "./SafeMath.sol";
import "../swap/interfaces/INineInchPair.sol";

library NineInchLibrary {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(
        address tokenA,
        address tokenB
    ) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, "NineInchV2Library: IDENTICAL_ADDRESSES");
        (token0, token1) = tokenA < tokenB
            ? (tokenA, tokenB)
            : (tokenB, tokenA);
        require(token0 != address(0), "NineInchV2Library: ZERO_ADDRESS");
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(
        address factory,
        address tokenA,
        address tokenB
    ) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(
            uint160(
                uint(
                    keccak256(
                        abi.encodePacked(
                            hex"ff",
                            factory,
                            keccak256(abi.encodePacked(token0, token1)),
                            hex"d2cf61d4acad30e9fe5ec59d0f94de554d88701f1bd8fc635546866716718511" // init code hash
                        )
                    )
                )
            )
        );
    }

    // fetches and sorts the reserves for a pair
    function getReserves(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (uint reserveA, uint reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1, ) = INineInchPair(
            pairFor(factory, tokenA, tokenB)
        ).getReserves();
        (reserveA, reserveB) = tokenA == token0
            ? (reserve0, reserve1)
            : (reserve1, reserve0);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) internal pure returns (uint amountB) {
        require(amountA > 0, "NineInchV2Library: INSUFFICIENT_AMOUNT");
        require(
            reserveA > 0 && reserveB > 0,
            "NineInchV2Library: INSUFFICIENT_LIQUIDITY"
        );
        amountB = amountA.mul(reserveB) / reserveA;
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) internal pure returns (uint amountOut) {
        require(amountIn > 0, "NineInchV2Library: INSUFFICIENT_INPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "NineInchV2Library: INSUFFICIENT_LIQUIDITY"
        );
        uint amountInWithFee = amountIn.mul(997);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut
    ) internal pure returns (uint amountIn) {
        require(amountOut > 0, "NineInchV2Library: INSUFFICIENT_OUTPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "NineInchV2Library: INSUFFICIENT_LIQUIDITY"
        );
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(
        address factory,
        uint amountIn,
        address[] memory path
    ) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, "NineInchV2Library: INVALID_PATH");
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint reserveOut) = getReserves(
                factory,
                path[i],
                path[i + 1]
            );
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(
        address factory,
        uint amountOut,
        address[] memory path
    ) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, "NineInchV2Library: INVALID_PATH");
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(
                factory,
                path[i - 1],
                path[i]
            );
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}
          

contracts/libraries/SafeMath.sol

// SPDX-License-Identifier: GPLv3
pragma solidity 0.8.19;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}
          

contracts/libraries/TransferHelper.sol

// SPDX-License-Identifier: GPLv3
pragma solidity 0.8.19;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0x095ea7b3, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper: APPROVE_FAILED"
        );
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper: TRANSFER_FAILED"
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0x23b872dd, from, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper: TRANSFER_FROM_FAILED"
        );
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, "TransferHelper: ETH_TRANSFER_FAILED");
    }
}
          

contracts/swap/interfaces/INineInchFactory.sol

// SPDX-License-Identifier: GPLv3
pragma solidity 0.8.19;

interface INineInchFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);

    function allPairs(uint) external view returns (address pair);

    function allPairsLength() external view returns (uint);

    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}
          

contracts/swap/interfaces/INineInchPair.sol

// SPDX-License-Identifier: GPLv3
pragma solidity 0.8.19;

interface INineInchPair {
    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

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

    function allowance(
        address owner,
        address spender
    ) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);

    function transfer(address to, uint value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external view returns (bytes32);

    function nonces(address owner) external view returns (uint);

    function permit(
        address owner,
        address spender,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(
        address indexed sender,
        uint amount0,
        uint amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);

    function burn(address to) external returns (uint amount0, uint amount1);

    function swap(
        uint amount0Out,
        uint amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}
          

contracts/swap/interfaces/INineInchRouter01.sol

// SPDX-License-Identifier: GPLv3
pragma solidity 0.8.19;

interface INineInchRouter01 {
    function factory() external view returns (address);

    function WETH() external view returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

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

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function swapTokensForExactETH(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) external pure returns (uint amountB);

    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountOut);

    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountIn);

    function getAmountsOut(
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);

    function getAmountsIn(
        uint amountOut,
        address[] calldata path
    ) external view returns (uint[] memory amounts);
}
          

contracts/swap/interfaces/INineInchRouter02.sol

// SPDX-License-Identifier: GPLv3
pragma solidity 0.8.19;

import "./INineInchRouter01.sol";

interface INineInchRouter02 is INineInchRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

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

contracts/swap/interfaces/IWETH.sol

// SPDX-License-Identifier: GPLv3
pragma solidity 0.8.19;

interface IWETH {
    function deposit() external payable;

    function transfer(address to, uint value) external returns (bool);

    function withdraw(uint) external;
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":999999,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_factory","internalType":"address"},{"type":"address","name":"_WETH","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"WETH","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"amountA","internalType":"uint256"},{"type":"uint256","name":"amountB","internalType":"uint256"},{"type":"uint256","name":"liquidity","internalType":"uint256"}],"name":"addLiquidity","inputs":[{"type":"address","name":"tokenA","internalType":"address"},{"type":"address","name":"tokenB","internalType":"address"},{"type":"uint256","name":"amountADesired","internalType":"uint256"},{"type":"uint256","name":"amountBDesired","internalType":"uint256"},{"type":"uint256","name":"amountAMin","internalType":"uint256"},{"type":"uint256","name":"amountBMin","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256","name":"amountToken","internalType":"uint256"},{"type":"uint256","name":"amountETH","internalType":"uint256"},{"type":"uint256","name":"liquidity","internalType":"uint256"}],"name":"addLiquidityETH","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amountTokenDesired","internalType":"uint256"},{"type":"uint256","name":"amountTokenMin","internalType":"uint256"},{"type":"uint256","name":"amountETHMin","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"factory","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"amountIn","internalType":"uint256"}],"name":"getAmountIn","inputs":[{"type":"uint256","name":"amountOut","internalType":"uint256"},{"type":"uint256","name":"reserveIn","internalType":"uint256"},{"type":"uint256","name":"reserveOut","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"amountOut","internalType":"uint256"}],"name":"getAmountOut","inputs":[{"type":"uint256","name":"amountIn","internalType":"uint256"},{"type":"uint256","name":"reserveIn","internalType":"uint256"},{"type":"uint256","name":"reserveOut","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"amounts","internalType":"uint256[]"}],"name":"getAmountsIn","inputs":[{"type":"uint256","name":"amountOut","internalType":"uint256"},{"type":"address[]","name":"path","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"amounts","internalType":"uint256[]"}],"name":"getAmountsOut","inputs":[{"type":"uint256","name":"amountIn","internalType":"uint256"},{"type":"address[]","name":"path","internalType":"address[]"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"amountB","internalType":"uint256"}],"name":"quote","inputs":[{"type":"uint256","name":"amountA","internalType":"uint256"},{"type":"uint256","name":"reserveA","internalType":"uint256"},{"type":"uint256","name":"reserveB","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"amountA","internalType":"uint256"},{"type":"uint256","name":"amountB","internalType":"uint256"}],"name":"removeLiquidity","inputs":[{"type":"address","name":"tokenA","internalType":"address"},{"type":"address","name":"tokenB","internalType":"address"},{"type":"uint256","name":"liquidity","internalType":"uint256"},{"type":"uint256","name":"amountAMin","internalType":"uint256"},{"type":"uint256","name":"amountBMin","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"amountToken","internalType":"uint256"},{"type":"uint256","name":"amountETH","internalType":"uint256"}],"name":"removeLiquidityETH","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"liquidity","internalType":"uint256"},{"type":"uint256","name":"amountTokenMin","internalType":"uint256"},{"type":"uint256","name":"amountETHMin","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"amountETH","internalType":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"liquidity","internalType":"uint256"},{"type":"uint256","name":"amountTokenMin","internalType":"uint256"},{"type":"uint256","name":"amountETHMin","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"amountToken","internalType":"uint256"},{"type":"uint256","name":"amountETH","internalType":"uint256"}],"name":"removeLiquidityETHWithPermit","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"liquidity","internalType":"uint256"},{"type":"uint256","name":"amountTokenMin","internalType":"uint256"},{"type":"uint256","name":"amountETHMin","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"bool","name":"approveMax","internalType":"bool"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"amountETH","internalType":"uint256"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"liquidity","internalType":"uint256"},{"type":"uint256","name":"amountTokenMin","internalType":"uint256"},{"type":"uint256","name":"amountETHMin","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"bool","name":"approveMax","internalType":"bool"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"amountA","internalType":"uint256"},{"type":"uint256","name":"amountB","internalType":"uint256"}],"name":"removeLiquidityWithPermit","inputs":[{"type":"address","name":"tokenA","internalType":"address"},{"type":"address","name":"tokenB","internalType":"address"},{"type":"uint256","name":"liquidity","internalType":"uint256"},{"type":"uint256","name":"amountAMin","internalType":"uint256"},{"type":"uint256","name":"amountBMin","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"},{"type":"bool","name":"approveMax","internalType":"bool"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256[]","name":"amounts","internalType":"uint256[]"}],"name":"swapETHForExactTokens","inputs":[{"type":"uint256","name":"amountOut","internalType":"uint256"},{"type":"address[]","name":"path","internalType":"address[]"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[{"type":"uint256[]","name":"amounts","internalType":"uint256[]"}],"name":"swapExactETHForTokens","inputs":[{"type":"uint256","name":"amountOutMin","internalType":"uint256"},{"type":"address[]","name":"path","internalType":"address[]"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","inputs":[{"type":"uint256","name":"amountOutMin","internalType":"uint256"},{"type":"address[]","name":"path","internalType":"address[]"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256[]","name":"amounts","internalType":"uint256[]"}],"name":"swapExactTokensForETH","inputs":[{"type":"uint256","name":"amountIn","internalType":"uint256"},{"type":"uint256","name":"amountOutMin","internalType":"uint256"},{"type":"address[]","name":"path","internalType":"address[]"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","inputs":[{"type":"uint256","name":"amountIn","internalType":"uint256"},{"type":"uint256","name":"amountOutMin","internalType":"uint256"},{"type":"address[]","name":"path","internalType":"address[]"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256[]","name":"amounts","internalType":"uint256[]"}],"name":"swapExactTokensForTokens","inputs":[{"type":"uint256","name":"amountIn","internalType":"uint256"},{"type":"uint256","name":"amountOutMin","internalType":"uint256"},{"type":"address[]","name":"path","internalType":"address[]"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","inputs":[{"type":"uint256","name":"amountIn","internalType":"uint256"},{"type":"uint256","name":"amountOutMin","internalType":"uint256"},{"type":"address[]","name":"path","internalType":"address[]"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256[]","name":"amounts","internalType":"uint256[]"}],"name":"swapTokensForExactETH","inputs":[{"type":"uint256","name":"amountOut","internalType":"uint256"},{"type":"uint256","name":"amountInMax","internalType":"uint256"},{"type":"address[]","name":"path","internalType":"address[]"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256[]","name":"amounts","internalType":"uint256[]"}],"name":"swapTokensForExactTokens","inputs":[{"type":"uint256","name":"amountOut","internalType":"uint256"},{"type":"uint256","name":"amountInMax","internalType":"uint256"},{"type":"address[]","name":"path","internalType":"address[]"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"deadline","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x60c06040523480156200001157600080fd5b50604051620058fe380380620058fe833981016040819052620000349162000133565b6001600160a01b0382166200009c5760405162461bcd60e51b8152602060048201526024808201527f4e696e65496e6368526f757465723a20464143544f5259205a45524f5f4144446044820152635245535360e01b60648201526084015b60405180910390fd5b6001600160a01b038116620000fe5760405162461bcd60e51b815260206004820152602160248201527f4e696e65496e6368526f757465723a2057455448205a45524f5f4144445245536044820152605360f81b606482015260840162000093565b6001600160a01b039182166080521660a0526200016b565b80516001600160a01b03811681146200012e57600080fd5b919050565b600080604083850312156200014757600080fd5b620001528362000116565b9150620001626020840162000116565b90509250929050565b60805160a051615601620002fd600039600081816101ac015281816103ba015281816105c20152818161062a0152818161074a01528181610a3401528181610ee9015281816110eb015281816115f6015281816117490152818161188a0152818161197401528181611b6601528181611c0101528181611f670152818161205e0152818161214601528181612227015281816122a8015281816128fd01528181612c0601528181612c5c01528181612c9001528181612d5801528181612f01015281816130e701526131820152600081816104860152818161081d0152818161095f01528181610b2701528181610b6001528181610cff01528181610fbc015281816110c9015281816112a801528181611a5301528181611c4001528181611de2015281816122e7015281816125c1015281816128ab015281816128db01528181612aac01528181612c3a01528181612fe0015281816131c101528181613c9401528181613ce401528181613fd6015281816141b3015281816147650152818161483a01526148b101526156016000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e33700146104e8578063f305d71914610523578063fb3bdb411461053657600080fd5b8063c45a015514610474578063d06ca61f146104a8578063ded9382a146104c857600080fd5b8063af2979eb116100b0578063af2979eb14610421578063b6f9de9514610441578063baa2abde1461045457600080fd5b80638803dbee14610388578063ad5c4648146103a8578063ad615dec1461040157600080fd5b80634a25d94a11610138578063791ac94711610112578063791ac947146103355780637ff36ab51461035557806385f8c2591461036857600080fd5b80634a25d94a146102d55780635b0d5984146102f55780635c11d7951461031557600080fd5b80631f00ca74116101695780631f00ca74146102755780632195995c1461029557806338ed1739146102b557600080fd5b806302751cec146101e0578063054d50d41461021a57806318cbafe51461024857600080fd5b366101db573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d9576101d9614cf2565b005b600080fd5b3480156101ec57600080fd5b506102006101fb366004614d56565b610549565b604080519283526020830191909152015b60405180910390f35b34801561022657600080fd5b5061023a610235366004614db4565b6106b1565b604051908152602001610211565b34801561025457600080fd5b50610268610263366004614e25565b6106c6565b6040516102119190614e98565b34801561028157600080fd5b50610268610290366004614f0b565b610b20565b3480156102a157600080fd5b506102006102b0366004615019565b610b56565b3480156102c157600080fd5b506102686102d0366004614e25565b610c8d565b3480156102e157600080fd5b506102686102f0366004614e25565b610e65565b34801561030157600080fd5b5061023a6103103660046150c3565b6110c1565b34801561032157600080fd5b506101d9610330366004614e25565b61120c565b34801561034157600080fd5b506101d9610350366004614e25565b611574565b610268610363366004615159565b611905565b34801561037457600080fd5b5061023a610383366004614db4565b611d63565b34801561039457600080fd5b506102686103a3366004614e25565b611d70565b3480156103b457600080fd5b506103dc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610211565b34801561040d57600080fd5b5061023a61041c366004614db4565b611ee7565b34801561042d57600080fd5b5061023a61043c366004614d56565b611ef4565b6101d961044f366004615159565b6120d9565b34801561046057600080fd5b5061020061046f3660046151c0565b61254c565b34801561048057600080fd5b506103dc7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b457600080fd5b506102686104c3366004614f0b565b6128a4565b3480156104d457600080fd5b506102006104e33660046150c3565b6128d1565b3480156104f457600080fd5b50610508610503366004615232565b612a22565b60408051938452602084019290925290820152606001610211565b610508610531366004614d56565b612b90565b610268610544366004615159565b612e92565b60008082428110156105bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064015b60405180910390fd5b6105eb897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a61254c565b90935091506105fb898685613326565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561068357600080fd5b505af1158015610697573d6000803e3d6000fd5b505050506106a58583613496565b50965096945050505050565b60006106be8484846135a5565b949350505050565b60608142811015610733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686866107776001826152dd565b818110610786576107866152f0565b905060200201602081019061079b919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6108767f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061371f92505050565b915086826001845161088891906152dd565b81518110610898576108986152f0565b6020026020010151101561092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b6109f386866000818110610944576109446152f0565b9050602002016020810190610959919061531f565b336109d37f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610991576109916152f0565b90506020020160208101906109a6919061531f565b8b8b60018181106109b9576109b96152f0565b90506020020160208101906109ce919061531f565b6138c4565b856000815181106109e6576109e66152f0565b60200260200101516139f9565b610a3282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613b97915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551610a7d91906152dd565b81518110610a8d57610a8d6152f0565b60200260200101516040518263ffffffff1660e01b8152600401610ab391815260200190565b600060405180830381600087803b158015610acd57600080fd5b505af1158015610ae1573d6000803e3d6000fd5b50505050610b15848360018551610af891906152dd565b81518110610b0857610b086152f0565b6020026020010151613496565b509695505050505050565b6060610b4d7f00000000000000000000000000000000000000000000000000000000000000008484613dc6565b90505b92915050565b6000806000610b867f00000000000000000000000000000000000000000000000000000000000000008f8f6138c4565b9050600087610b95578c610bb7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015610c4c57600080fd5b505af1158015610c60573d6000803e3d6000fd5b50505050610c738f8f8f8f8f8f8f61254c565b809450819550505050509b509b9950505050505050505050565b60608142811015610cfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b610d587f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061371f92505050565b9150868260018451610d6a91906152dd565b81518110610d7a57610d7a6152f0565b60200260200101511015610e10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b610e2686866000818110610944576109446152f0565b610b1582878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b97915050565b60608142811015610ed2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168686610f166001826152dd565b818110610f2557610f256152f0565b9050602002016020810190610f3a919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614610fb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6110157f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613dc692505050565b9150868260008151811061102b5761102b6152f0565b6020026020010151111561092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e6368526f757465723a204558434553534956455f494e5055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b60008061110f7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006138c4565b905060008661111e578b611140565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c4810186905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b1580156111d557600080fd5b505af11580156111e9573d6000803e3d6000fd5b505050506111fb8d8d8d8d8d8d611ef4565b9d9c50505050505050505050505050565b8042811015611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b6113088585600081811061128d5761128d6152f0565b90506020020160208101906112a2919061531f565b336113027f0000000000000000000000000000000000000000000000000000000000000000898960008181106112da576112da6152f0565b90506020020160208101906112ef919061531f565b8a8a60018181106109b9576109b96152f0565b8a6139f9565b600085856113176001826152dd565b818110611326576113266152f0565b905060200201602081019061133b919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291909116906370a0823190602401602060405180830381865afa1580156113a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cd919061533c565b905061140d868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613f61915050565b866114dc82888861141f6001826152dd565b81811061142e5761142e6152f0565b9050602002016020810190611443919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015291909116906370a08231906024015b602060405180830381865afa1580156114b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d6919061533c565b90614295565b101561156a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b5050505050505050565b80428110156115df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685856116236001826152dd565b818110611632576116326152f0565b9050602002016020810190611647919061531f565b73ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6116da8585600081811061128d5761128d6152f0565b611718858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613f61915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c9919061533c565b90508681101561185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156118e357600080fd5b505af11580156118f7573d6000803e3d6000fd5b5050505061156a8482613496565b60608142811015611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106119bc576119bc6152f0565b90506020020160208101906119d1919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614611a4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b611aac7f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061371f92505050565b9150868260018451611abe91906152dd565b81518110611ace57611ace6152f0565b60200260200101511015611b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110611bb357611bb36152f0565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611c727f0000000000000000000000000000000000000000000000000000000000000000898960008181106112da576112da6152f0565b84600081518110611c8557611c856152f0565b60200260200101516040518363ffffffff1660e01b8152600401611ccb92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0e9190615355565b611d1a57611d1a614cf2565b611d5982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b97915050565b5095945050505050565b60006106be8484846142d7565b60608142811015611ddd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b611e3b7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613dc692505050565b91508682600081518110611e5157611e516152f0565b60200260200101511115610e10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e6368526f757465723a204558434553534956455f494e5055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b60006106be84848461444b565b60008142811015611f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b611f90887f0000000000000000000000000000000000000000000000000000000000000000898989308961254c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290935061202f91508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015612006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202a919061533c565b613326565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156120b757600080fd5b505af11580156120cb573d6000803e3d6000fd5b50505050610b158483613496565b8042811015612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168585600081811061218e5761218e6152f0565b90506020020160208101906121a3919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561228d57600080fd5b505af11580156122a1573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123197f0000000000000000000000000000000000000000000000000000000000000000898960008181106112da576112da6152f0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af115801561238b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123af9190615355565b6123bb576123bb614cf2565b600086866123ca6001826152dd565b8181106123d9576123d96152f0565b90506020020160208101906123ee919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291909116906370a0823190602401602060405180830381865afa15801561245c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612480919061533c565b90506124c0878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613f61915050565b876114dc8289896124d26001826152dd565b8181106124e1576124e16152f0565b90506020020160208101906124f6919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015291909116906370a0823190602401611495565b60008082428110156125ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b60006125e77f00000000000000000000000000000000000000000000000000000000000000008c8c6138c4565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015612663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126879190615355565b506040517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156126fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271e9190615372565b91509150600061272e8e8e61458d565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff161461276b57818361276e565b82825b90975095508a871015612803576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f415f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b89861015612893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f425f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b505050505097509795505050505050565b6060610b4d7f0000000000000000000000000000000000000000000000000000000000000000848461371f565b60008060006129217f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006138c4565b9050600087612930578c612952565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b1580156129e757600080fd5b505af11580156129fb573d6000803e3d6000fd5b50505050612a0d8e8e8e8e8e8e610549565b909f909e509c50505050505050505050505050565b60008060008342811015612a92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b612aa08c8c8c8c8c8c614711565b90945092506000612ad27f00000000000000000000000000000000000000000000000000000000000000008e8e6138c4565b9050612ae08d3383886139f9565b612aec8c3383876139f9565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7e919061533c565b92505050985098509895505050505050565b60008060008342811015612c00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b612c2e8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614711565b90945092506000612c807f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006138c4565b9050612c8e8b3383886139f9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612cf657600080fd5b505af1158015612d0a573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015612da5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc99190615355565b612dd557612dd5614cf2565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e67919061533c565b925083341115612e8457612e8433612e7f86346152dd565b613496565b505096509650969350505050565b60608142811015612eff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686866000818110612f4957612f496152f0565b9050602002016020810190612f5e919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614612fdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6130397f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613dc692505050565b9150348260008151811061304f5761304f6152f0565b602002602001015111156130e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e6368526f757465723a204558434553534956455f494e5055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110613134576131346152f0565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561316757600080fd5b505af115801561317b573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6131f37f0000000000000000000000000000000000000000000000000000000000000000898960008181106112da576112da6152f0565b84600081518110613206576132066152f0565b60200260200101516040518363ffffffff1660e01b815260040161324c92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561326b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328f9190615355565b61329b5761329b614cf2565b6132da82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b97915050565b816000815181106132ed576132ed6152f0565b6020026020010151341115611d5957611d593383600081518110613313576133136152f0565b602002602001015134612e7f91906152dd565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916133bd91906153ba565b6000604051808303816000865af19150503d80600081146133fa576040519150601f19603f3d011682016040523d82523d6000602084013e6133ff565b606091505b50915091508180156134295750805115806134295750808060200190518101906134299190615355565b61348f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016105b3565b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516134cd91906153ba565b60006040518083038185875af1925050503d806000811461350a576040519150601f19603f3d011682016040523d82523d6000602084013e61350f565b606091505b50509050806135a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201527f4c4544000000000000000000000000000000000000000000000000000000000060648201526084016105b3565b505050565b6000808411613636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016105b3565b6000831180156136465750600082115b6136d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4c4951554944495459000000000000000000000000000000000000000000000060648201526084016105b3565b60006136e0856103e5614a6e565b905060006136ee8285614a6e565b9050600061370883613702886103e8614a6e565b90614b26565b905061371481836153d6565b979650505050505050565b606060028251101561378d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e696e65496e636856324c6962726172793a20494e56414c49445f504154480060448201526064016105b3565b815167ffffffffffffffff8111156137a7576137a7614edc565b6040519080825280602002602001820160405280156137d0578160200160208202803683370190505b50905082816000815181106137e7576137e76152f0565b60200260200101818152505060005b6001835161380491906152dd565b8110156138bc5760008061385787868581518110613824576138246152f0565b60200260200101518786600161383a9190615411565b8151811061384a5761384a6152f0565b6020026020010151614b9f565b9150915061387f848481518110613870576138706152f0565b602002602001015183836135a5565b8461388b856001615411565b8151811061389b5761389b6152f0565b602002602001018181525050505080806138b490615424565b9150506137f6565b509392505050565b60008060006138d3858561458d565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016139b99291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527fd2cf61d4acad30e9fe5ec59d0f94de554d88701f1bd8fc635546866716718511603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613a9891906153ba565b6000604051808303816000865af19150503d8060008114613ad5576040519150601f19603f3d011682016040523d82523d6000602084013e613ada565b606091505b5091509150818015613b04575080511580613b04575080806020019051810190613b049190615355565b613b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c45440000000000000000000000000000000000000000000000000000000060648201526084016105b3565b505050505050565b60005b60018351613ba891906152dd565b811015613dc057600080848381518110613bc457613bc46152f0565b602002602001015185846001613bda9190615411565b81518110613bea57613bea6152f0565b6020026020010151915091506000613c02838361458d565b509050600087613c13866001615411565b81518110613c2357613c236152f0565b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613c6b57826000613c6f565b6000835b91509150600060028a51613c8391906152dd565b8810613c8f5788613cdd565b613cdd7f0000000000000000000000000000000000000000000000000000000000000000878c613cc08c6002615411565b81518110613cd057613cd06152f0565b60200260200101516138c4565b9050613d0a7f000000000000000000000000000000000000000000000000000000000000000088886138c4565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613d54576020820181803683370190505b506040518563ffffffff1660e01b8152600401613d7494939291906154a6565b600060405180830381600087803b158015613d8e57600080fd5b505af1158015613da2573d6000803e3d6000fd5b50505050505050505050508080613db890615424565b915050613b9a565b50505050565b6060600282511015613e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e696e65496e636856324c6962726172793a20494e56414c49445f504154480060448201526064016105b3565b815167ffffffffffffffff811115613e4e57613e4e614edc565b604051908082528060200260200182016040528015613e77578160200160208202803683370190505b509050828160018351613e8a91906152dd565b81518110613e9a57613e9a6152f0565b602002602001018181525050600060018351613eb691906152dd565b90505b80156138bc57600080613efc8786613ed26001876152dd565b81518110613ee257613ee26152f0565b602002602001015187868151811061384a5761384a6152f0565b91509150613f24848481518110613f1557613f156152f0565b602002602001015183836142d7565b84613f306001866152dd565b81518110613f4057613f406152f0565b60200260200101818152505050508080613f59906154e1565b915050613eb9565b60005b60018351613f7291906152dd565b8110156135a057600080848381518110613f8e57613f8e6152f0565b602002602001015185846001613fa49190615411565b81518110613fb457613fb46152f0565b6020026020010151915091506000613fcc838361458d565b5090506000613ffc7f000000000000000000000000000000000000000000000000000000000000000085856138c4565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561404f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140739190615534565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808773ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146140d55782846140d8565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152929450909250614139918491908d16906370a0823190602401611495565b95506141468683836135a5565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461418a5782600061418e565b6000835b91509150600060028c516141a291906152dd565b8a106141ae578a6141df565b6141df7f0000000000000000000000000000000000000000000000000000000000000000898e613cc08e6002615411565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f9061424790869086908690602481016154a6565b600060405180830381600087803b15801561426157600080fd5b505af1158015614275573d6000803e3d6000fd5b50505050505050505050505050808061428d90615424565b915050613f64565b6000610b4d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614c9e565b6000808411614368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016105b3565b6000831180156143785750600082115b614404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4c4951554944495459000000000000000000000000000000000000000000000060648201526084016105b3565b600061441c6103e86144168688614a6e565b90614a6e565b905060006144306103e56144168689614295565b9050614441600161370283856153d6565b9695505050505050565b60008084116144dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b6000831180156144ec5750600082115b614578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4c4951554944495459000000000000000000000000000000000000000000000060648201526084016105b3565b826145838584614a6e565b6106be91906153d6565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361464b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e636856324c6962726172793a204944454e544943414c5f41444460448201527f524553534553000000000000000000000000000000000000000000000000000060648201526084016105b3565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614685578284614688565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff821661470a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e696e65496e636856324c6962726172793a205a45524f5f414444524553530060448201526064016105b3565b9250929050565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa1580156147ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147d29190615584565b73ffffffffffffffffffffffffffffffffffffffff16036148a9576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015614883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148a79190615584565b505b6000806148d77f00000000000000000000000000000000000000000000000000000000000000008b8b614b9f565b915091508160001480156148e9575080155b156148f957879350869250614a61565b600061490689848461444b565b90508781116149aa578581101561499f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f425f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b889450925082614a5f565b60006149b789848661444b565b9050898111156149c9576149c9614cf2565b87811015614a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f415f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b94508793505b505b5050965096945050505050565b600082600003614a8057506000610b50565b6000614a8c83856155a1565b905082614a9985836153d6565b14610b4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016105b3565b600080614b338385615411565b905083811015610b4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016105b3565b6000806000614bae858561458d565b509050600080614bbf8888886138c4565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015614c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c2d9190615534565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614614c8c578082614c8f565b81815b90999098509650505050505050565b60008184841115614cdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b391906155b8565b506000614ce984866152dd565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114614d4357600080fd5b50565b8035614d5181614d21565b919050565b60008060008060008060c08789031215614d6f57600080fd5b8635614d7a81614d21565b95506020870135945060408701359350606087013592506080870135614d9f81614d21565b8092505060a087013590509295509295509295565b600080600060608486031215614dc957600080fd5b505081359360208301359350604090920135919050565b60008083601f840112614df257600080fd5b50813567ffffffffffffffff811115614e0a57600080fd5b6020830191508360208260051b850101111561470a57600080fd5b60008060008060008060a08789031215614e3e57600080fd5b8635955060208701359450604087013567ffffffffffffffff811115614e6357600080fd5b614e6f89828a01614de0565b9095509350506060870135614e8381614d21565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b81811015614ed057835183529284019291840191600101614eb4565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215614f1e57600080fd5b8235915060208084013567ffffffffffffffff80821115614f3e57600080fd5b818601915086601f830112614f5257600080fd5b813581811115614f6457614f64614edc565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715614fa757614fa7614edc565b604052918252848201925083810185019189831115614fc557600080fd5b938501935b82851015614fea57614fdb85614d46565b84529385019392850192614fca565b8096505050505050509250929050565b8015158114614d4357600080fd5b803560ff81168114614d5157600080fd5b60008060008060008060008060008060006101608c8e03121561503b57600080fd5b8b3561504681614d21565b9a5060208c013561505681614d21565b995060408c0135985060608c0135975060808c0135965060a08c013561507b81614d21565b955060c08c0135945060e08c013561509281614ffa565b93506150a16101008d01615008565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d0312156150e357600080fd5b8a356150ee81614d21565b995060208b0135985060408b0135975060608b0135965060808b013561511381614d21565b955060a08b0135945060c08b013561512a81614ffa565b935061513860e08c01615008565b92506101008b013591506101208b013590509295989b9194979a5092959850565b60008060008060006080868803121561517157600080fd5b85359450602086013567ffffffffffffffff81111561518f57600080fd5b61519b88828901614de0565b90955093505060408601356151af81614d21565b949793965091946060013592915050565b600080600080600080600060e0888a0312156151db57600080fd5b87356151e681614d21565b965060208801356151f681614d21565b955060408801359450606088013593506080880135925060a088013561521b81614d21565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b03121561524f57600080fd5b883561525a81614d21565b9750602089013561526a81614d21565b965060408901359550606089013594506080890135935060a0890135925060c089013561529681614d21565b8092505060e089013590509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610b5057610b506152ae565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561533157600080fd5b8135610b4d81614d21565b60006020828403121561534e57600080fd5b5051919050565b60006020828403121561536757600080fd5b8151610b4d81614ffa565b6000806040838503121561538557600080fd5b505080516020909101519092909150565b60005b838110156153b1578181015183820152602001615399565b50506000910152565b600082516153cc818460208701615396565b9190910192915050565b60008261540c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115610b5057610b506152ae565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615455576154556152ae565b5060010190565b60008151808452615474816020860160208601615396565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000614441608083018461545c565b6000816154f0576154f06152ae565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b80516dffffffffffffffffffffffffffff81168114614d5157600080fd5b60008060006060848603121561554957600080fd5b61555284615516565b925061556060208501615516565b9150604084015163ffffffff8116811461557957600080fd5b809150509250925092565b60006020828403121561559657600080fd5b8151610b4d81614d21565b8082028115828204841417610b5057610b506152ae565b602081526000610b4d602083018461545c56fea2646970667358221220c637eebf349817693997ab85ef6d811295ffa1e95e8d51f88c675a02268cb15f64736f6c634300081300330000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd7000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27

Deployed ByteCode

0x60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e33700146104e8578063f305d71914610523578063fb3bdb411461053657600080fd5b8063c45a015514610474578063d06ca61f146104a8578063ded9382a146104c857600080fd5b8063af2979eb116100b0578063af2979eb14610421578063b6f9de9514610441578063baa2abde1461045457600080fd5b80638803dbee14610388578063ad5c4648146103a8578063ad615dec1461040157600080fd5b80634a25d94a11610138578063791ac94711610112578063791ac947146103355780637ff36ab51461035557806385f8c2591461036857600080fd5b80634a25d94a146102d55780635b0d5984146102f55780635c11d7951461031557600080fd5b80631f00ca74116101695780631f00ca74146102755780632195995c1461029557806338ed1739146102b557600080fd5b806302751cec146101e0578063054d50d41461021a57806318cbafe51461024857600080fd5b366101db573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2716146101d9576101d9614cf2565b005b600080fd5b3480156101ec57600080fd5b506102006101fb366004614d56565b610549565b604080519283526020830191909152015b60405180910390f35b34801561022657600080fd5b5061023a610235366004614db4565b6106b1565b604051908152602001610211565b34801561025457600080fd5b50610268610263366004614e25565b6106c6565b6040516102119190614e98565b34801561028157600080fd5b50610268610290366004614f0b565b610b20565b3480156102a157600080fd5b506102006102b0366004615019565b610b56565b3480156102c157600080fd5b506102686102d0366004614e25565b610c8d565b3480156102e157600080fd5b506102686102f0366004614e25565b610e65565b34801561030157600080fd5b5061023a6103103660046150c3565b6110c1565b34801561032157600080fd5b506101d9610330366004614e25565b61120c565b34801561034157600080fd5b506101d9610350366004614e25565b611574565b610268610363366004615159565b611905565b34801561037457600080fd5b5061023a610383366004614db4565b611d63565b34801561039457600080fd5b506102686103a3366004614e25565b611d70565b3480156103b457600080fd5b506103dc7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2781565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610211565b34801561040d57600080fd5b5061023a61041c366004614db4565b611ee7565b34801561042d57600080fd5b5061023a61043c366004614d56565b611ef4565b6101d961044f366004615159565b6120d9565b34801561046057600080fd5b5061020061046f3660046151c0565b61254c565b34801561048057600080fd5b506103dc7f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd781565b3480156104b457600080fd5b506102686104c3366004614f0b565b6128a4565b3480156104d457600080fd5b506102006104e33660046150c3565b6128d1565b3480156104f457600080fd5b50610508610503366004615232565b612a22565b60408051938452602084019290925290820152606001610211565b610508610531366004614d56565b612b90565b610268610544366004615159565b612e92565b60008082428110156105bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064015b60405180910390fd5b6105eb897f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a278a8a8a308a61254c565b90935091506105fb898685613326565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561068357600080fd5b505af1158015610697573d6000803e3d6000fd5b505050506106a58583613496565b50965096945050505050565b60006106be8484846135a5565b949350505050565b60608142811015610733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a271686866107776001826152dd565b818110610786576107866152f0565b905060200201602081019061079b919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6108767f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd78988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061371f92505050565b915086826001845161088891906152dd565b81518110610898576108986152f0565b6020026020010151101561092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b6109f386866000818110610944576109446152f0565b9050602002016020810190610959919061531f565b336109d37f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd78a8a6000818110610991576109916152f0565b90506020020160208101906109a6919061531f565b8b8b60018181106109b9576109b96152f0565b90506020020160208101906109ce919061531f565b6138c4565b856000815181106109e6576109e66152f0565b60200260200101516139f9565b610a3282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613b97915050565b7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551610a7d91906152dd565b81518110610a8d57610a8d6152f0565b60200260200101516040518263ffffffff1660e01b8152600401610ab391815260200190565b600060405180830381600087803b158015610acd57600080fd5b505af1158015610ae1573d6000803e3d6000fd5b50505050610b15848360018551610af891906152dd565b81518110610b0857610b086152f0565b6020026020010151613496565b509695505050505050565b6060610b4d7f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd78484613dc6565b90505b92915050565b6000806000610b867f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd78f8f6138c4565b9050600087610b95578c610bb7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015610c4c57600080fd5b505af1158015610c60573d6000803e3d6000fd5b50505050610c738f8f8f8f8f8f8f61254c565b809450819550505050509b509b9950505050505050505050565b60608142811015610cfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b610d587f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd78988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061371f92505050565b9150868260018451610d6a91906152dd565b81518110610d7a57610d7a6152f0565b60200260200101511015610e10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b610e2686866000818110610944576109446152f0565b610b1582878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b97915050565b60608142811015610ed2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27168686610f166001826152dd565b818110610f2557610f256152f0565b9050602002016020810190610f3a919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614610fb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6110157f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd789888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613dc692505050565b9150868260008151811061102b5761102b6152f0565b6020026020010151111561092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e6368526f757465723a204558434553534956455f494e5055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b60008061110f7f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd78d7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276138c4565b905060008661111e578b611140565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c4810186905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b1580156111d557600080fd5b505af11580156111e9573d6000803e3d6000fd5b505050506111fb8d8d8d8d8d8d611ef4565b9d9c50505050505050505050505050565b8042811015611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b6113088585600081811061128d5761128d6152f0565b90506020020160208101906112a2919061531f565b336113027f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd7898960008181106112da576112da6152f0565b90506020020160208101906112ef919061531f565b8a8a60018181106109b9576109b96152f0565b8a6139f9565b600085856113176001826152dd565b818110611326576113266152f0565b905060200201602081019061133b919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291909116906370a0823190602401602060405180830381865afa1580156113a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cd919061533c565b905061140d868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613f61915050565b866114dc82888861141f6001826152dd565b81811061142e5761142e6152f0565b9050602002016020810190611443919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015291909116906370a08231906024015b602060405180830381865afa1580156114b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d6919061533c565b90614295565b101561156a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b5050505050505050565b80428110156115df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a271685856116236001826152dd565b818110611632576116326152f0565b9050602002016020810190611647919061531f565b73ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6116da8585600081811061128d5761128d6152f0565b611718858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613f61915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c9919061533c565b90508681101561185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156118e357600080fd5b505af11580156118f7573d6000803e3d6000fd5b5050505061156a8482613496565b60608142811015611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff16868660008181106119bc576119bc6152f0565b90506020020160208101906119d1919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614611a4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b611aac7f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd73488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061371f92505050565b9150868260018451611abe91906152dd565b81518110611ace57611ace6152f0565b60200260200101511015611b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f4f555460448201527f5055545f414d4f554e540000000000000000000000000000000000000000000060648201526084016105b3565b7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110611bb357611bb36152f0565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611be657600080fd5b505af1158015611bfa573d6000803e3d6000fd5b50505050507f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611c727f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd7898960008181106112da576112da6152f0565b84600081518110611c8557611c856152f0565b60200260200101516040518363ffffffff1660e01b8152600401611ccb92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0e9190615355565b611d1a57611d1a614cf2565b611d5982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b97915050565b5095945050505050565b60006106be8484846142d7565b60608142811015611ddd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b611e3b7f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd789888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613dc692505050565b91508682600081518110611e5157611e516152f0565b60200260200101511115610e10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e6368526f757465723a204558434553534956455f494e5055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b60006106be84848461444b565b60008142811015611f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b611f90887f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27898989308961254c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290935061202f91508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015612006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202a919061533c565b613326565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156120b757600080fd5b505af11580156120cb573d6000803e3d6000fd5b50505050610b158483613496565b8042811015612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff168585600081811061218e5761218e6152f0565b90506020020160208101906121a3919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b60003490507f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561228d57600080fd5b505af11580156122a1573d6000803e3d6000fd5b50505050507f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123197f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd7898960008181106112da576112da6152f0565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af115801561238b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123af9190615355565b6123bb576123bb614cf2565b600086866123ca6001826152dd565b8181106123d9576123d96152f0565b90506020020160208101906123ee919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291909116906370a0823190602401602060405180830381865afa15801561245c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612480919061533c565b90506124c0878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613f61915050565b876114dc8289896124d26001826152dd565b8181106124e1576124e16152f0565b90506020020160208101906124f6919061531f565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015291909116906370a0823190602401611495565b60008082428110156125ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b60006125e77f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd78c8c6138c4565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015612663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126879190615355565b506040517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156126fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271e9190615372565b91509150600061272e8e8e61458d565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff161461276b57818361276e565b82825b90975095508a871015612803576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f415f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b89861015612893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f425f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b505050505097509795505050505050565b6060610b4d7f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd7848461371f565b60008060006129217f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd78e7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276138c4565b9050600087612930578c612952565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b1580156129e757600080fd5b505af11580156129fb573d6000803e3d6000fd5b50505050612a0d8e8e8e8e8e8e610549565b909f909e509c50505050505050505050505050565b60008060008342811015612a92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b612aa08c8c8c8c8c8c614711565b90945092506000612ad27f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd78e8e6138c4565b9050612ae08d3383886139f9565b612aec8c3383876139f9565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7e919061533c565b92505050985098509895505050505050565b60008060008342811015612c00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b612c2e8a7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a278b348c8c614711565b90945092506000612c807f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd78c7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276138c4565b9050612c8e8b3383886139f9565b7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612cf657600080fd5b505af1158015612d0a573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990527f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2716935063a9059cbb925060440190506020604051808303816000875af1158015612da5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc99190615355565b612dd557612dd5614cf2565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e67919061533c565b925083341115612e8457612e8433612e7f86346152dd565b613496565b505096509650969350505050565b60608142811015612eff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e696e65496e6368526f757465723a204558504952454400000000000000000060448201526064016105b3565b7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1686866000818110612f4957612f496152f0565b9050602002016020810190612f5e919061531f565b73ffffffffffffffffffffffffffffffffffffffff1614612fdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e696e65496e6368526f757465723a20494e56414c49445f504154480000000060448201526064016105b3565b6130397f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd788888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613dc692505050565b9150348260008151811061304f5761304f6152f0565b602002602001015111156130e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e6368526f757465723a204558434553534956455f494e5055545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110613134576131346152f0565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561316757600080fd5b505af115801561317b573d6000803e3d6000fd5b50505050507f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6131f37f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd7898960008181106112da576112da6152f0565b84600081518110613206576132066152f0565b60200260200101516040518363ffffffff1660e01b815260040161324c92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af115801561326b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328f9190615355565b61329b5761329b614cf2565b6132da82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613b97915050565b816000815181106132ed576132ed6152f0565b6020026020010151341115611d5957611d593383600081518110613313576133136152f0565b602002602001015134612e7f91906152dd565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916133bd91906153ba565b6000604051808303816000865af19150503d80600081146133fa576040519150601f19603f3d011682016040523d82523d6000602084013e6133ff565b606091505b50915091508180156134295750805115806134295750808060200190518101906134299190615355565b61348f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016105b3565b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516134cd91906153ba565b60006040518083038185875af1925050503d806000811461350a576040519150601f19603f3d011682016040523d82523d6000602084013e61350f565b606091505b50509050806135a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201527f4c4544000000000000000000000000000000000000000000000000000000000060648201526084016105b3565b505050565b6000808411613636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016105b3565b6000831180156136465750600082115b6136d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4c4951554944495459000000000000000000000000000000000000000000000060648201526084016105b3565b60006136e0856103e5614a6e565b905060006136ee8285614a6e565b9050600061370883613702886103e8614a6e565b90614b26565b905061371481836153d6565b979650505050505050565b606060028251101561378d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e696e65496e636856324c6962726172793a20494e56414c49445f504154480060448201526064016105b3565b815167ffffffffffffffff8111156137a7576137a7614edc565b6040519080825280602002602001820160405280156137d0578160200160208202803683370190505b50905082816000815181106137e7576137e76152f0565b60200260200101818152505060005b6001835161380491906152dd565b8110156138bc5760008061385787868581518110613824576138246152f0565b60200260200101518786600161383a9190615411565b8151811061384a5761384a6152f0565b6020026020010151614b9f565b9150915061387f848481518110613870576138706152f0565b602002602001015183836135a5565b8461388b856001615411565b8151811061389b5761389b6152f0565b602002602001018181525050505080806138b490615424565b9150506137f6565b509392505050565b60008060006138d3858561458d565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604051602081830303815290604052805190602001206040516020016139b99291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527fd2cf61d4acad30e9fe5ec59d0f94de554d88701f1bd8fc635546866716718511603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613a9891906153ba565b6000604051808303816000865af19150503d8060008114613ad5576040519150601f19603f3d011682016040523d82523d6000602084013e613ada565b606091505b5091509150818015613b04575080511580613b04575080806020019051810190613b049190615355565b613b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c45440000000000000000000000000000000000000000000000000000000060648201526084016105b3565b505050505050565b60005b60018351613ba891906152dd565b811015613dc057600080848381518110613bc457613bc46152f0565b602002602001015185846001613bda9190615411565b81518110613bea57613bea6152f0565b6020026020010151915091506000613c02838361458d565b509050600087613c13866001615411565b81518110613c2357613c236152f0565b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613c6b57826000613c6f565b6000835b91509150600060028a51613c8391906152dd565b8810613c8f5788613cdd565b613cdd7f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd7878c613cc08c6002615411565b81518110613cd057613cd06152f0565b60200260200101516138c4565b9050613d0a7f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd788886138c4565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613d54576020820181803683370190505b506040518563ffffffff1660e01b8152600401613d7494939291906154a6565b600060405180830381600087803b158015613d8e57600080fd5b505af1158015613da2573d6000803e3d6000fd5b50505050505050505050508080613db890615424565b915050613b9a565b50505050565b6060600282511015613e34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e696e65496e636856324c6962726172793a20494e56414c49445f504154480060448201526064016105b3565b815167ffffffffffffffff811115613e4e57613e4e614edc565b604051908082528060200260200182016040528015613e77578160200160208202803683370190505b509050828160018351613e8a91906152dd565b81518110613e9a57613e9a6152f0565b602002602001018181525050600060018351613eb691906152dd565b90505b80156138bc57600080613efc8786613ed26001876152dd565b81518110613ee257613ee26152f0565b602002602001015187868151811061384a5761384a6152f0565b91509150613f24848481518110613f1557613f156152f0565b602002602001015183836142d7565b84613f306001866152dd565b81518110613f4057613f406152f0565b60200260200101818152505050508080613f59906154e1565b915050613eb9565b60005b60018351613f7291906152dd565b8110156135a057600080848381518110613f8e57613f8e6152f0565b602002602001015185846001613fa49190615411565b81518110613fb457613fb46152f0565b6020026020010151915091506000613fcc838361458d565b5090506000613ffc7f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd785856138c4565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561404f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140739190615534565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808773ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146140d55782846140d8565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152929450909250614139918491908d16906370a0823190602401611495565b95506141468683836135a5565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461418a5782600061418e565b6000835b91509150600060028c516141a291906152dd565b8a106141ae578a6141df565b6141df7f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd7898e613cc08e6002615411565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f9061424790869086908690602481016154a6565b600060405180830381600087803b15801561426157600080fd5b505af1158015614275573d6000803e3d6000fd5b50505050505050505050505050808061428d90615424565b915050613f64565b6000610b4d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614c9e565b6000808411614368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016105b3565b6000831180156143785750600082115b614404576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4c4951554944495459000000000000000000000000000000000000000000000060648201526084016105b3565b600061441c6103e86144168688614a6e565b90614a6e565b905060006144306103e56144168689614295565b9050614441600161370283856153d6565b9695505050505050565b60008084116144dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016105b3565b6000831180156144ec5750600082115b614578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e696e65496e636856324c6962726172793a20494e53554646494349454e545f60448201527f4c4951554944495459000000000000000000000000000000000000000000000060648201526084016105b3565b826145838584614a6e565b6106be91906153d6565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361464b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4e696e65496e636856324c6962726172793a204944454e544943414c5f41444460448201527f524553534553000000000000000000000000000000000000000000000000000060648201526084016105b3565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614685578284614688565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff821661470a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e696e65496e636856324c6962726172793a205a45524f5f414444524553530060448201526064016105b3565b9250929050565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528681166024830152600091829182917f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd79091169063e6a4390590604401602060405180830381865afa1580156147ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147d29190615584565b73ffffffffffffffffffffffffffffffffffffffff16036148a9576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015288811660248301527f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd7169063c9c65396906044016020604051808303816000875af1158015614883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148a79190615584565b505b6000806148d77f0000000000000000000000005b9f077a77db37f3be0a5b5d31baeff4bc5c0bd78b8b614b9f565b915091508160001480156148e9575080155b156148f957879350869250614a61565b600061490689848461444b565b90508781116149aa578581101561499f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f425f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b889450925082614a5f565b60006149b789848661444b565b9050898111156149c9576149c9614cf2565b87811015614a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4e696e65496e6368526f757465723a20494e53554646494349454e545f415f4160448201527f4d4f554e5400000000000000000000000000000000000000000000000000000060648201526084016105b3565b94508793505b505b5050965096945050505050565b600082600003614a8057506000610b50565b6000614a8c83856155a1565b905082614a9985836153d6565b14610b4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f770000000000000000000000000000000000000000000000000000000000000060648201526084016105b3565b600080614b338385615411565b905083811015610b4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016105b3565b6000806000614bae858561458d565b509050600080614bbf8888886138c4565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015614c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c2d9190615534565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614614c8c578082614c8f565b81815b90999098509650505050505050565b60008184841115614cdc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b391906155b8565b506000614ce984866152dd565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114614d4357600080fd5b50565b8035614d5181614d21565b919050565b60008060008060008060c08789031215614d6f57600080fd5b8635614d7a81614d21565b95506020870135945060408701359350606087013592506080870135614d9f81614d21565b8092505060a087013590509295509295509295565b600080600060608486031215614dc957600080fd5b505081359360208301359350604090920135919050565b60008083601f840112614df257600080fd5b50813567ffffffffffffffff811115614e0a57600080fd5b6020830191508360208260051b850101111561470a57600080fd5b60008060008060008060a08789031215614e3e57600080fd5b8635955060208701359450604087013567ffffffffffffffff811115614e6357600080fd5b614e6f89828a01614de0565b9095509350506060870135614e8381614d21565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b81811015614ed057835183529284019291840191600101614eb4565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215614f1e57600080fd5b8235915060208084013567ffffffffffffffff80821115614f3e57600080fd5b818601915086601f830112614f5257600080fd5b813581811115614f6457614f64614edc565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715614fa757614fa7614edc565b604052918252848201925083810185019189831115614fc557600080fd5b938501935b82851015614fea57614fdb85614d46565b84529385019392850192614fca565b8096505050505050509250929050565b8015158114614d4357600080fd5b803560ff81168114614d5157600080fd5b60008060008060008060008060008060006101608c8e03121561503b57600080fd5b8b3561504681614d21565b9a5060208c013561505681614d21565b995060408c0135985060608c0135975060808c0135965060a08c013561507b81614d21565b955060c08c0135945060e08c013561509281614ffa565b93506150a16101008d01615008565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d0312156150e357600080fd5b8a356150ee81614d21565b995060208b0135985060408b0135975060608b0135965060808b013561511381614d21565b955060a08b0135945060c08b013561512a81614ffa565b935061513860e08c01615008565b92506101008b013591506101208b013590509295989b9194979a5092959850565b60008060008060006080868803121561517157600080fd5b85359450602086013567ffffffffffffffff81111561518f57600080fd5b61519b88828901614de0565b90955093505060408601356151af81614d21565b949793965091946060013592915050565b600080600080600080600060e0888a0312156151db57600080fd5b87356151e681614d21565b965060208801356151f681614d21565b955060408801359450606088013593506080880135925060a088013561521b81614d21565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b03121561524f57600080fd5b883561525a81614d21565b9750602089013561526a81614d21565b965060408901359550606089013594506080890135935060a0890135925060c089013561529681614d21565b8092505060e089013590509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610b5057610b506152ae565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561533157600080fd5b8135610b4d81614d21565b60006020828403121561534e57600080fd5b5051919050565b60006020828403121561536757600080fd5b8151610b4d81614ffa565b6000806040838503121561538557600080fd5b505080516020909101519092909150565b60005b838110156153b1578181015183820152602001615399565b50506000910152565b600082516153cc818460208701615396565b9190910192915050565b60008261540c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115610b5057610b506152ae565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615455576154556152ae565b5060010190565b60008151808452615474816020860160208601615396565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000614441608083018461545c565b6000816154f0576154f06152ae565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b80516dffffffffffffffffffffffffffff81168114614d5157600080fd5b60008060006060848603121561554957600080fd5b61555284615516565b925061556060208501615516565b9150604084015163ffffffff8116811461557957600080fd5b809150509250925092565b60006020828403121561559657600080fd5b8151610b4d81614d21565b8082028115828204841417610b5057610b506152ae565b602081526000610b4d602083018461545c56fea2646970667358221220c637eebf349817693997ab85ef6d811295ffa1e95e8d51f88c675a02268cb15f64736f6c63430008130033