ETH Price: $2,272.52 (-6.14%)

Contract

0x8D9E65fc5560d20fC97B2b8fc6b732A51732bf5C
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw Eth159550172022-11-12 16:06:11673 days ago1668269171IN
0x8D9E65fc...51732bf5C
0 ETH0.0004719815.36811643
Swap Assets159550112022-11-12 16:04:59673 days ago1668269099IN
0x8D9E65fc...51732bf5C
0 ETH0.0158964116.18830415
Withdraw Eth159450522022-11-11 6:41:47674 days ago1668148907IN
0x8D9E65fc...51732bf5C
0 ETH0.0004775315.5489501
Payback159367562022-11-10 2:51:59676 days ago1668048719IN
0x8D9E65fc...51732bf5C
0.44386979 ETH0.0056892324.79554637
Withdraw Eth159309742022-11-09 7:25:59676 days ago1667978759IN
0x8D9E65fc...51732bf5C
0 ETH0.0004602214.98518435
Loan Ether159240092022-11-08 8:06:47677 days ago1667894807IN
0x8D9E65fc...51732bf5C
0 ETH0.0084957916.86958384
Payback159203472022-11-07 19:50:35678 days ago1667850635IN
0x8D9E65fc...51732bf5C
0.17945531 ETH0.0046842520.41549719
Loan Ether159201242022-11-07 19:05:59678 days ago1667847959IN
0x8D9E65fc...51732bf5C
0 ETH0.0093966218.75254898
Update Native To...159196992022-11-07 17:40:23678 days ago1667842823IN
0x8D9E65fc...51732bf5C
0 ETH0.0005714718.14553893
Update Native To...159196782022-11-07 17:36:11678 days ago1667842571IN
0x8D9E65fc...51732bf5C
0 ETH0.0005861318.62508169
Loan Ether159101812022-11-06 9:48:23679 days ago1667728103IN
0x8D9E65fc...51732bf5C
0 ETH0.0052095810.1038087
Payback159060442022-11-05 19:57:11680 days ago1667678231IN
0x8D9E65fc...51732bf5C
0.16083556 ETH0.0027832512.38886133
Transfer159027372022-11-05 8:51:11680 days ago1667638271IN
0x8D9E65fc...51732bf5C
1 ETH0.0002829412.64036621
Loan Ether159023422022-11-05 7:31:47680 days ago1667633507IN
0x8D9E65fc...51732bf5C
0 ETH0.0056326911.42437295
Payback159023222022-11-05 7:27:47680 days ago1667633267IN
0x8D9E65fc...51732bf5C
0.12245745 ETH0.0025735111.45585657
Loan Ether158989062022-11-04 20:01:11681 days ago1667592071IN
0x8D9E65fc...51732bf5C
0 ETH0.0091693917.87229347
Payback158886292022-11-03 9:33:11682 days ago1667467991IN
0x8D9E65fc...51732bf5C
0.35606907 ETH0.005256323.39817413
Loan Ether158886122022-11-03 9:29:47682 days ago1667467787IN
0x8D9E65fc...51732bf5C
0 ETH0.0128641825.19939339
Update Eth Limit158885882022-11-03 9:24:35682 days ago1667467475IN
0x8D9E65fc...51732bf5C
0 ETH0.0008114723.86828088
Loan Ether158881082022-11-03 7:48:23682 days ago1667461703IN
0x8D9E65fc...51732bf5C
0 ETH0.0066614321.90181684
Loan Ether158881032022-11-03 7:47:23682 days ago1667461643IN
0x8D9E65fc...51732bf5C
0 ETH0.0061724120.29396752
Loan Ether158880622022-11-03 7:39:11682 days ago1667461151IN
0x8D9E65fc...51732bf5C
0 ETH0.0059295618.45780499
Payback158878952022-11-03 7:05:47682 days ago1667459147IN
0x8D9E65fc...51732bf5C
0.00055377 ETH0.0010378314.74487211
Payback158878872022-11-03 7:04:11682 days ago1667459051IN
0x8D9E65fc...51732bf5C
0.00166097 ETH0.0012275216.32910274
Loan Ether158878662022-11-03 6:59:59682 days ago1667458799IN
0x8D9E65fc...51732bf5C
0 ETH0.0045685415.02070446
View all transactions

Latest 16 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
159550172022-11-12 16:06:11673 days ago1668269171
0x8D9E65fc...51732bf5C
0.48304268 ETH
159550112022-11-12 16:04:59673 days ago1668269099
0x8D9E65fc...51732bf5C
0.47370817 ETH
159550112022-11-12 16:04:59673 days ago1668269099
0x8D9E65fc...51732bf5C
0.00933451 ETH
159450522022-11-11 6:41:47674 days ago1668148907
0x8D9E65fc...51732bf5C
0.44386979 ETH
159309742022-11-09 7:25:59676 days ago1667978759
0x8D9E65fc...51732bf5C
1.31333723 ETH
159240092022-11-08 8:06:47677 days ago1667894807
0x8D9E65fc...51732bf5C
0.6016749 ETH
159201242022-11-07 19:05:59678 days ago1667847959
0x8D9E65fc...51732bf5C
0.41483158 ETH
159101812022-11-06 9:48:23679 days ago1667728103
0x8D9E65fc...51732bf5C
0.17255318 ETH
159023422022-11-05 7:31:47680 days ago1667633507
0x8D9E65fc...51732bf5C
0.15464958 ETH
158989062022-11-04 20:01:11681 days ago1667592071
0x8D9E65fc...51732bf5C
0.11774755 ETH
158886122022-11-03 9:29:47682 days ago1667467787
0x8D9E65fc...51732bf5C
0.34237411 ETH
158881082022-11-03 7:48:23682 days ago1667461703
0x8D9E65fc...51732bf5C
0.00076891 ETH
158881032022-11-03 7:47:23682 days ago1667461643
0x8D9E65fc...51732bf5C
0.00051261 ETH
158880622022-11-03 7:39:11682 days ago1667461151
0x8D9E65fc...51732bf5C
0.00051261 ETH
158878662022-11-03 6:59:59682 days ago1667458799
0x8D9E65fc...51732bf5C
0.00051754 ETH
158878432022-11-03 6:55:23682 days ago1667458523
0x8D9E65fc...51732bf5C
0.00155231 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Loan

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-02
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.7.0 <0.9.0;

// TODO(zx): Replace all instances of SafeMath with OZ implementation
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by 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;
    }

    // Only used in the  BondingCalculator.sol
    function sqrrt(uint256 a) internal pure returns (uint256 c) {
        if (a > 3) {
            c = a;
            uint256 b = add(div(a, 2), 1);
            while (b < c) {
                c = b;
                b = div(add(div(a, b), b), 2);
            }
        } else if (a != 0) {
            c = 1;
        }
    }
}

interface IERC20 {
    function increaseAllowance(address spender, uint256 addedValue)
        external
        returns (bool);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

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

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

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

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

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

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

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

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

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

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

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

contract Loan is Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    uint256 public loanMaxEth; 
    uint256 public loanMinEth; 
    uint256 public nativeTokenMin;
    address public nativeTokenAddress;
    address public operator;

    struct LoanPool {
        uint256 loanDuration;
        uint256 loanLimit;
        uint256 loanLimitNative;
        uint256 repayRate;
        bool closed;
    }

    struct LoanRequest {
        address borrower;
        address token;
        uint256 loanAmount;
        uint256 collateralAmount;
        uint256 paybackAmount;
        uint256 loanDueDate;
        uint256 duration;
        uint256 loanId;
        bool isPayback;
    }

    uint256 public lastSwapTs;
    mapping(address => address[]) public swapPaths;
    mapping(address => uint256) public userLoansCount;
    mapping(address => mapping(uint256 => LoanRequest)) public loans;

    address[] public collateralTokens;
    address[] public loanUsers;
    mapping(address => uint256) public loanPoolLength;
    mapping(address => mapping(uint256 => LoanPool)) public loanPools;

    IUniswapV2Router02 public immutable uniswapV2Router;

    event NewAddLoanPool(
        address collateralToken,
        uint256 loanDuration,
        uint256 loanLimit,
        uint256 loanLimitNative,
        uint256 repayRate
    );

    event NewLoanEther(
        address indexed borrower,
        uint256 loanAmount,
        uint256 collateralAmount,
        uint256 paybackAmount,
        uint256 loanDueDate,
        uint256 duration
    );

    event PayBack(
        address borrower,
        bool paybackSuccess,
        uint256 paybackTime,
        uint256 paybackAmount,
        uint256 returnCollateralAmount
    );

    event Received(address, uint256);

    event UpdatePairToken(address collateralToken, address[] swapPath);

    constructor(
        address _nativeTokenAddress,
        address _routerAddress,
        uint256 _nativeMin
        
    ) {
        loanMaxEth = 10 ** 18;
        loanMinEth = 10 ** 17;
        nativeTokenMin = _nativeMin;
        nativeTokenAddress = _nativeTokenAddress;
        operator = msg.sender;
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            _routerAddress
        );
        uniswapV2Router = _uniswapV2Router;
    }

    // Operator CAN do modifier
    modifier onlyOperator() {
        require(operator == msg.sender, "operator: caller is not the operator");
        _;
    }

    modifier onlyOwnerOrOperator() {
        require(
            (msg.sender == owner()) || (msg.sender == operator),
            "Not owner or operator"
        );
        _;
    }

    receive() external payable {
        emit Received(msg.sender, msg.value);
    }

    function addLoanPool(
        address _collateralToken,
        uint256 _loanDuration,
        uint256 _loanLimit,
        uint256 _loanLimitNative,
        uint256 _repayRate,
        address[] memory _path
    ) public onlyOwner {
        require(
            _collateralToken != address(0),
            "update: Zero collateral address"
        );
        require(_loanLimit < 100, "add: Can't over 100% limit");
        require(_loanLimitNative < 100, "add: Can't over 100% limit");
        require(_repayRate >= 100, "add: shold be over 100%");

        bool isColToken = isCollateralToken(_collateralToken);
        if (!isColToken) {
            collateralTokens.push(_collateralToken);
            swapPaths[_collateralToken] = _path;
        }
        LoanPool memory newLoanPool;
        newLoanPool.loanDuration = _loanDuration;
        newLoanPool.loanLimit = _loanLimit;

        newLoanPool.loanLimitNative = _loanLimitNative;
        newLoanPool.repayRate = _repayRate;
        newLoanPool.closed = false;
        uint256 loanPoolLen = loanPoolLength[_collateralToken];

        loanPools[_collateralToken][loanPoolLen] = newLoanPool;
        loanPoolLength[_collateralToken]++;

        emit NewAddLoanPool(
            _collateralToken,
            _loanDuration,
            _loanLimit,
            _loanLimitNative,
            _repayRate
        );
    }

    function updateLoanPool(
        address _collateralToken,
        uint256 _index,
        uint256 _loanDuration,
        uint256 _loanLimit,
        uint256 _loanLimitNative,
        uint256 _repayRate
    ) public onlyOwner {
        require(
            _collateralToken != address(0),
            "update: Zero collateral address"
        );
        bool isColToken = isCollateralToken(_collateralToken);
        require(isColToken, "update: No collateral token");
        uint256 loanIdLen = loanPoolLength[_collateralToken];
        require(_index < loanIdLen, "update: No valid index");
        require(_loanLimit < 100, "add: Can't over 100% limit");
        require(_loanLimitNative < 100, "add: Can't over 100% limit");
        require(_repayRate >= 100, "add: shold be over 100%");

        loanPools[_collateralToken][_index].loanDuration = _loanDuration;
        loanPools[_collateralToken][_index].loanLimit = _loanLimit;
        loanPools[_collateralToken][_index].loanLimitNative = _loanLimitNative;
        loanPools[_collateralToken][_index].repayRate = _repayRate;
    }

    function updateSwapPath(address _collateralToken, address[] memory _path)
        public
        onlyOwner
    {
        require(
            _collateralToken != address(0),
            "update: Zero collateral address"
        );
        bool isColToken = isCollateralToken(_collateralToken);
        require(isColToken, "update: No collateral token");
        swapPaths[_collateralToken] = _path;

        emit UpdatePairToken(_collateralToken, _path);
    }

    function setLoanPoolClose(
        address _collateralToken,
        uint256 _loanPoolId,
        bool _closed
    ) public onlyOwner {
        require(
            _collateralToken != address(0),
            "update: Zero collateral address"
        );
        bool isColToken = isCollateralToken(_collateralToken);
        require(isColToken, "update: No collateral token");
        uint256 loanIdLen = loanPoolLength[_collateralToken];
        require(_loanPoolId < loanIdLen, "set: No valid loan pool id");
        loanPools[_collateralToken][_loanPoolId].closed = _closed;
    }

    function isCollateralToken(address _addr) public view returns (bool) {
        uint256 len = collateralTokens.length;
        bool isToken = false;
        for (uint256 i = 0; i < len; i++) {
            if (_addr == collateralTokens[i]) {
                isToken = true;
                break;
            }
        }
        return isToken;
    }

    function isNativeTokenHolder(address _user) public view returns (bool) {
        uint256 balance = IERC20(nativeTokenAddress).balanceOf(_user);
        if (balance > nativeTokenMin) {
            return true;
        }
        return false;
    }

    function updateNativeToken(address _tokenAddress, uint256 _min)
        public
        onlyOwner
    {
        require(_tokenAddress != address(0), "native: zero token address");
        nativeTokenAddress = _tokenAddress;
        nativeTokenMin = _min;
    }

    function updateEthLimit(uint256 _loanMaxEth, uint256 _loanMinEth) public onlyOwner {
        loanMaxEth = _loanMaxEth;
        loanMinEth = _loanMinEth;
    }

    // calculate require colleteral token amount by passing ether amount
    function countCollateralFromEther(
        address _collateralToken,
        uint256 _limit,
        uint256 _amount
    ) public view returns (uint256) {
        address[] memory path = swapPaths[_collateralToken];
        uint256[] memory amounts = new uint256[](path.length);
        amounts = uniswapV2Router.getAmountsIn(_amount, path);
        uint256 result = amounts[0].div(_limit).mul(100);
        return result;
    }

    // calculate require ether amount by passing collateral amount
    function countEtherFromCollateral(
        address _collateralToken,
        uint256 _limit,
        uint256 _tokenAmount
    ) public view returns (uint256) {
        address[] memory path = swapPaths[_collateralToken];
        uint256[] memory amounts = new uint256[](path.length);
        amounts = uniswapV2Router.getAmountsOut(_tokenAmount, path);
        uint256 result = amounts[path.length - 1].mul(_limit).div(100);
        return result;
    }

    function checkLoanEthLimit(uint256 _amount) public view returns (bool) {
        uint256 totalEth = address(this).balance;
        if (_amount <= loanMaxEth && _amount > loanMinEth && _amount < totalEth) {
            return true;
        } else {
            return false;
        }
    }

    function TokenTransfer(
        address _user,
        address _collateralToken,
        uint256 _tokenAmount
    ) private returns (bool) {
        bool transferred = IERC20(_collateralToken).transferFrom(
            _user,
            address(this),
            _tokenAmount
        );
        return transferred;
    }

    function loanEther(
        address _collateralToken,
        uint256 _loanPoolId,
        uint256 _tokenAmount
    ) public nonReentrant {

        bool isColToken = isCollateralToken(_collateralToken);
        require(isColToken, "loanEther: No collateral token");

        uint256 tokenAmount = _tokenAmount;
        address collateralToken = _collateralToken;
        uint256 loanPoolId = _loanPoolId;
        uint256 loanPoolLen = loanPoolLength[collateralToken];

        require(loanPoolLen > loanPoolId, "loanEther: no valid loan Id");
        require(
            !loanPools[_collateralToken][_loanPoolId].closed,
            "loanEther: Loan Pool is closed"
        );

        uint256 balance = IERC20(collateralToken).balanceOf(msg.sender);
        require(balance > tokenAmount, "loanEther: not enough token balance");

        bool isHolder = isNativeTokenHolder(msg.sender);
        uint256 limit = !isHolder
            ? loanPools[collateralToken][loanPoolId].loanLimit
            : loanPools[collateralToken][loanPoolId].loanLimitNative;
        uint256 beforeBalance = IERC20(collateralToken).balanceOf(
            address(this)
        );

        require(
            TokenTransfer(msg.sender, collateralToken, tokenAmount),
            "loanEther: Transfer token from user to contract failed"
        );
        
        uint256 afterBalance = IERC20(collateralToken).balanceOf(address(this));
        uint256 tokenAmountReal = afterBalance - beforeBalance;
        uint256 ethAmountReal = countEtherFromCollateral(
            collateralToken,
            limit,
            tokenAmountReal
        );
        bool isOldUser = false;
        for (uint256 i = 0; i < loanUsers.length; i++) {
            if (loanUsers[i] == msg.sender) {
                isOldUser = true;
                break;
            }
        }
        if (isOldUser == false) {
            loanUsers.push(msg.sender);
        }
        require(
            checkLoanEthLimit(ethAmountReal),
            "loanEther: not enough liquidity or can't borrow limited ETH amount"
        );
        LoanRequest memory newLoan;
        newLoan.borrower = msg.sender;
        newLoan.loanAmount = ethAmountReal;
        newLoan.collateralAmount = tokenAmountReal;
        newLoan.loanId = userLoansCount[msg.sender];
        newLoan.isPayback = false;
        newLoan.token = collateralToken;
        uint256 repayRate = loanPools[collateralToken][loanPoolId].repayRate;
        uint256 loanDuration = loanPools[collateralToken][loanPoolId]
            .loanDuration;
        newLoan.paybackAmount = ethAmountReal.mul(repayRate).div(100);
        newLoan.loanDueDate = block.timestamp + loanDuration;
        newLoan.duration = loanDuration;

        loans[msg.sender][userLoansCount[msg.sender]] = newLoan;
        userLoansCount[msg.sender]++;
        payable(msg.sender).transfer(ethAmountReal);
        emit NewLoanEther(
            msg.sender,
            newLoan.loanAmount,
            newLoan.collateralAmount,
            newLoan.paybackAmount,
            newLoan.loanDueDate,
            newLoan.duration
        );
    }

    function payback(uint256 _id)
        public
        payable
        nonReentrant
    {
        LoanRequest storage loanReq = loans[msg.sender][_id];
        address collateralToken = loanReq.token;
        require(
            loanReq.borrower == msg.sender,
            "payback: Only borrower can payback"
        );
        require(!loanReq.isPayback, "payback: payback already");
        require(
            block.timestamp <= loanReq.loanDueDate,
            "payback: exceed due date"
        );
        require(
            msg.value >= loanReq.paybackAmount,
            "payback: Not enough ether"
        );
        loanReq.isPayback = true;
        require(
            IERC20(collateralToken).transfer(
                msg.sender,
                loanReq.collateralAmount
            ),
            "payback: Transfer collateral from contract to user failed"
        );
        emit PayBack(
            msg.sender,
            loanReq.isPayback,
            block.timestamp,
            loanReq.paybackAmount,
            loanReq.collateralAmount
        );
    }

    function getAllUserLoans(address _user)
        public
        view
        returns (LoanRequest[] memory)
    {
        LoanRequest[] memory requests = new LoanRequest[](
            userLoansCount[_user]
        );
        for (uint256 i = 0; i < userLoansCount[_user]; i++) {
            requests[i] = loans[_user][i];
        }
        return requests;
    }

    function getUserOngoingLoans(address _user)
        public
        view
        returns (LoanRequest[] memory)
    {
        LoanRequest[] memory ongoing = new LoanRequest[](userLoansCount[_user]);
        for (uint256 i = 0; i < userLoansCount[_user]; i++) {
            LoanRequest memory req = loans[_user][i];
            if (!req.isPayback && req.loanDueDate > block.timestamp) {
                ongoing[i] = req;
            }
        }
        return ongoing;
    }

    function getUserOverdueLoans(address _user)
        public
        view
        returns (LoanRequest[] memory)
    {
        LoanRequest[] memory overdue = new LoanRequest[](userLoansCount[_user]);
        for (uint256 i = 0; i < userLoansCount[_user]; i++) {
            LoanRequest memory req = loans[_user][i];
            if (!req.isPayback && req.loanDueDate < block.timestamp) {
                overdue[i] = req;
            }
        }
        return overdue;
    }

    function getUserOverdueLoansFrom(address _user, uint256 _from)
        public
        view
        returns (LoanRequest[] memory)
    {
        LoanRequest[] memory overdue = new LoanRequest[](userLoansCount[_user]);
        for (uint256 i = 0; i < userLoansCount[_user]; i++) {
            LoanRequest memory req = loans[_user][i];
            if (
                !req.isPayback &&
                req.loanDueDate < block.timestamp &&
                _from < req.loanDueDate
            ) {
                overdue[i] = req;
            }
        }
        return overdue;
    }

    function countSwapAmount(address _token) public view returns (uint256) {
        uint256 tokenSwapAmount;
        for (uint256 k = 0; k < loanUsers.length; k++) {
            address user = loanUsers[k];
            LoanRequest[] memory loanUser = getUserOverdueLoansFrom(
                user,
                lastSwapTs
            );
            for (uint256 i = 0; i < loanUser.length; i++) {
                if (_token == loanUser[i].token) {
                    tokenSwapAmount = tokenSwapAmount.add(
                        loanUser[i].collateralAmount
                    );
                }
            }
        }
        return tokenSwapAmount;
    }

    function isSwappable() public view returns (bool) {
        uint256 totalSwapAmount = 0;
        bool isEnable;
        for (uint256 i = 0; i < collateralTokens.length; i++) {
            uint256 tokenAmount = countSwapAmount(collateralTokens[i]);
            totalSwapAmount = totalSwapAmount.add(tokenAmount);
        }
        if (totalSwapAmount > 0) {
            isEnable = true;
        }
        return isEnable;
    }

    function swapAssets() public onlyOperator {
        for (uint256 i = 0; i < collateralTokens.length; i++) {
            uint256 tokenAmount = countSwapAmount(collateralTokens[i]);
            if (tokenAmount > 0) {
                IERC20(collateralTokens[i]).approve(
                    address(uniswapV2Router),
                    tokenAmount
                );
                address[] memory path = swapPaths[collateralTokens[i]];
                uniswapV2Router
                    .swapExactTokensForETHSupportingFeeOnTransferTokens(
                        tokenAmount,
                        0, // accept any amount of ETH
                        path,
                        address(this),
                        block.timestamp
                    );
            }
        }
        lastSwapTs = block.timestamp;
    }

    function transferOperator(address _opeator) public onlyOwner {
        require(_opeator != address(0), "operator: Zero Address");
        operator = _opeator;
    }

    function withdrawEth(uint256 _amount) external onlyOwnerOrOperator {
        uint256 totalEth = address(this).balance;
        require(
            _amount <= totalEth,
            "withdraw: Can't exceed more than totalLiquidity"
        );
        address payable _owner = payable(msg.sender);
        _owner.transfer(_amount);
    }

    function emergencyWithdrawToken(address _token, uint256 _amount) external onlyOwnerOrOperator {
        IERC20(_token).transfer(msg.sender, _amount);
    }

    function recoverERC20(address _token) public onlyOperator {
        bool isColToken = isCollateralToken(_token);
        if (!isColToken) {
            uint256 balance = IERC20(_token).balanceOf(address(this));
            IERC20(_token).transfer(msg.sender, balance);
        }
    }

    function getCollateralLen() public view returns (uint256) {
        return collateralTokens.length;
    }

    function getTotalLiquidity() public view returns (uint256) {
        return address(this).balance;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_nativeTokenAddress","type":"address"},{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"uint256","name":"_nativeMin","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"loanDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanLimitNative","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repayRate","type":"uint256"}],"name":"NewAddLoanPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"loanAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"NewLoanEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"bool","name":"paybackSuccess","type":"bool"},{"indexed":false,"internalType":"uint256","name":"paybackTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnCollateralAmount","type":"uint256"}],"name":"PayBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"address[]","name":"swapPath","type":"address[]"}],"name":"UpdatePairToken","type":"event"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanDuration","type":"uint256"},{"internalType":"uint256","name":"_loanLimit","type":"uint256"},{"internalType":"uint256","name":"_loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"_repayRate","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"addLoanPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"checkLoanEthLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collateralTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"countCollateralFromEther","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"countEtherFromCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"countSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getAllUserLoans","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollateralLen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserOngoingLoans","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserOverdueLoans","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_from","type":"uint256"}],"name":"getUserOverdueLoansFrom","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isCollateralToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isNativeTokenHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwappable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanPoolId","type":"uint256"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"loanEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"loanMaxEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"loanMinEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"loanPoolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"loanPools","outputs":[{"internalType":"uint256","name":"loanDuration","type":"uint256"},{"internalType":"uint256","name":"loanLimit","type":"uint256"},{"internalType":"uint256","name":"loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"repayRate","type":"uint256"},{"internalType":"bool","name":"closed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"loanUsers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"loans","outputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeTokenMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"payback","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanPoolId","type":"uint256"},{"internalType":"bool","name":"_closed","type":"bool"}],"name":"setLoanPoolClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"swapPaths","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_opeator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_loanMaxEth","type":"uint256"},{"internalType":"uint256","name":"_loanMinEth","type":"uint256"}],"name":"updateEthLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_loanDuration","type":"uint256"},{"internalType":"uint256","name":"_loanLimit","type":"uint256"},{"internalType":"uint256","name":"_loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"_repayRate","type":"uint256"}],"name":"updateLoanPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"updateNativeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"updateSwapPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLoansCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b50604051620039c3380380620039c38339810160408190526200003491620000e5565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055670de0b6b3a764000060025567016345785d8a0000600355600455600580546001600160a01b039384166001600160a01b03199182161790915560068054909116331790551660805262000126565b80516001600160a01b0381168114620000e057600080fd5b919050565b600080600060608486031215620000fb57600080fd5b6200010684620000c8565b92506200011660208501620000c8565b9150604084015190509250925092565b6080516138656200015e600039600081816102b601528181611398015281816114c201528181612aa30152612d1e01526138656000f3fe6080604052600436106102605760003560e01c80637eff539411610144578063a846c2fd116100b6578063e31323ac1161007a578063e31323ac14610807578063e39f9f2a1461081d578063e7177ece1461089f578063ed921a14146108bf578063f2fde38b146108df578063f8915391146108ff57600080fd5b8063a846c2fd1461077f578063acc4565914610792578063b8118bbe146107a7578063c311d049146107c7578063db8bb3a1146107e757600080fd5b80639e8c708e116101085780639e8c708e146106d45780639f4749af146106f4578063a007945e1461070a578063a12af8961461071f578063a4c3b0911461073f578063a803180d1461075f57600080fd5b80637eff539414610578578063888eb1ee146105985780638a918694146105b85780638da5cb5b146105e557806398c61c371461060357600080fd5b806344b8044a116101dd578063570ca735116101a1578063570ca735146104ce57806360ab8988146104ee57806367f7b06f1461050e5780636df9d3791461052e578063715018a614610543578063769db6151461055857600080fd5b806344b8044a1461041b5780634766162c1461044b5780634c0a79fb1461046b5780634d0047ee146104985780634e509f74146104b857600080fd5b8063293308f111610224578063293308f11461037757806329605e77146103a55780632cd1d250146103c55780632f759d91146103db57806335c7e9251461040857600080fd5b80631694505e146102a4578063172c48c7146102f55780631fffb6981461031557806324350de314610337578063274dca921461035757600080fd5b3661029f57604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b3480156102b057600080fd5b506102d87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561030157600080fd5b506102d86103103660046130c6565b61091f565b34801561032157600080fd5b506103356103303660046131d8565b610949565b005b34801561034357600080fd5b5061033561035236600461324b565b610bd3565b34801561036357600080fd5b50610335610372366004613295565b610d78565b34801561038357600080fd5b506103976103923660046132b7565b610dad565b6040519081526020016102ec565b3480156103b157600080fd5b506103356103c03660046132b7565b610e9e565b3480156103d157600080fd5b5061039760045481565b3480156103e757600080fd5b506103fb6103f63660046132b7565b610f39565b6040516102ec91906132d2565b34801561041457600080fd5b5047610397565b34801561042757600080fd5b5061043b6104363660046130c6565b61108f565b60405190151581526020016102ec565b34801561045757600080fd5b5061043b6104663660046132b7565b6110c9565b34801561047757600080fd5b506103976104863660046132b7565b60096020526000908152604090205481565b3480156104a457600080fd5b506005546102d8906001600160a01b031681565b3480156104c457600080fd5b5061039760035481565b3480156104da57600080fd5b506006546102d8906001600160a01b031681565b3480156104fa57600080fd5b50610335610509366004613389565b61112f565b34801561051a57600080fd5b506103356105293660046133c9565b61124b565b34801561053a57600080fd5b506103356112f1565b34801561054f57600080fd5b50610335611550565b34801561056457600080fd5b506103fb6105733660046132b7565b6115c4565b34801561058457600080fd5b506103356105933660046133f3565b61172f565b3480156105a457600080fd5b506103356105b3366004613426565b611eaa565b3480156105c457600080fd5b506103976105d33660046132b7565b600d6020526000908152604090205481565b3480156105f157600080fd5b506000546001600160a01b03166102d8565b34801561060f57600080fd5b5061068361061e3660046133c9565b600a6020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b039788169897909616969495939492939192909160ff1689565b604080516001600160a01b039a8b1681529990981660208a0152968801959095526060870193909352608086019190915260a085015260c084015260e08301521515610100820152610120016102ec565b3480156106e057600080fd5b506103356106ef3660046132b7565b611f8c565b34801561070057600080fd5b5061039760025481565b34801561071657600080fd5b50600b54610397565b34801561072b57600080fd5b506103fb61073a3660046132b7565b6120ae565b34801561074b57600080fd5b5061033561075a3660046133c9565b612219565b34801561076b57600080fd5b506102d861077a3660046130c6565b6122f6565b61033561078d3660046130c6565b612306565b34801561079e57600080fd5b5061043b612642565b3480156107b357600080fd5b5061043b6107c23660046132b7565b61269d565b3480156107d357600080fd5b506103356107e23660046130c6565b612724565b3480156107f357600080fd5b506102d86108023660046133c9565b612823565b34801561081357600080fd5b5061039760075481565b34801561082957600080fd5b506108756108383660046133c9565b600e602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016102ec565b3480156108ab57600080fd5b506103fb6108ba3660046133c9565b61285b565b3480156108cb57600080fd5b506103976108da3660046133f3565b6129d5565b3480156108eb57600080fd5b506103356108fa3660046132b7565b612b66565b34801561090b57600080fd5b5061039761091a3660046133f3565b612c50565b600b818154811061092f57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b0316331461097c5760405162461bcd60e51b815260040161097390613474565b60405180910390fd5b6001600160a01b0386166109a25760405162461bcd60e51b8152600401610973906134a9565b606484106109c25760405162461bcd60e51b8152600401610973906134e0565b606483106109e25760405162461bcd60e51b8152600401610973906134e0565b6064821015610a2d5760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610973565b6000610a38876110c9565b905080610aa957600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b03891690811790915560009081526008602090815260409091208351610aa792850190612fec565b505b610add6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b86815260208082018781526040808401888152606085018881526000608087018181526001600160a01b038f16808352600d8089528684208054600e8b528886208187528b529785208b518155985160018a0155955160028901559351600388015590516004909601805460ff191696151596909617909555938452909352825490929091610b6b8361352d565b9091555050604080516001600160a01b038b168152602081018a905290810188905260608101879052608081018690527f4cb98f3b8ae6aaa3e3a10d19c96b00eac0ed7b5b7415a40edf7583c26c24914b9060a00160405180910390a1505050505050505050565b6000546001600160a01b03163314610bfd5760405162461bcd60e51b815260040161097390613474565b6001600160a01b038616610c235760405162461bcd60e51b8152600401610973906134a9565b6000610c2e876110c9565b905080610c4d5760405162461bcd60e51b815260040161097390613546565b6001600160a01b0387166000908152600d6020526040902054808710610cae5760405162461bcd60e51b81526020600482015260166024820152750eae0c8c2e8ca74409cde40ecc2d8d2c840d2dcc8caf60531b6044820152606401610973565b60648510610cce5760405162461bcd60e51b8152600401610973906134e0565b60648410610cee5760405162461bcd60e51b8152600401610973906134e0565b6064831015610d395760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610973565b50506001600160a01b03959095166000908152600e60209081526040808320968352959052939093209182556001820155600281019190915560030155565b6000546001600160a01b03163314610da25760405162461bcd60e51b815260040161097390613474565b600291909155600355565b60008060005b600c54811015610e97576000600c8281548110610dd257610dd261357d565b60009182526020822001546007546001600160a01b039091169250610df890839061285b565b905060005b8151811015610e8157818181518110610e1857610e1861357d565b6020026020010151602001516001600160a01b0316876001600160a01b031603610e6f57610e6c828281518110610e5157610e5161357d565b60200260200101516060015186612ddc90919063ffffffff16565b94505b80610e798161352d565b915050610dfd565b5050508080610e8f9061352d565b915050610db3565b5092915050565b6000546001600160a01b03163314610ec85760405162461bcd60e51b815260040161097390613474565b6001600160a01b038116610f175760405162461bcd60e51b81526020600482015260166024820152756f70657261746f723a205a65726f204164647265737360501b6044820152606401610973565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600960205260408120546060919067ffffffffffffffff811115610f6e57610f6e6130fb565b604051908082528060200260200182016040528015610fa757816020015b610f94613051565b815260200190600190039081610f8c5790505b50905060005b6001600160a01b038416600090815260096020526040902054811015610e97576001600160a01b038085166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff16151561010082015282518390839081106110715761107161357d565b602002602001018190525080806110879061352d565b915050610fad565b600254600090479083118015906110a7575060035483115b80156110b257508083105b156110c05750600192915050565b50600092915050565b600b5460009081805b8281101561112757600b81815481106110ed576110ed61357d565b6000918252602090912001546001600160a01b03908116908616036111155760019150611127565b8061111f8161352d565b9150506110d2565b509392505050565b6000546001600160a01b031633146111595760405162461bcd60e51b815260040161097390613474565b6001600160a01b03831661117f5760405162461bcd60e51b8152600401610973906134a9565b600061118a846110c9565b9050806111a95760405162461bcd60e51b815260040161097390613546565b6001600160a01b0384166000908152600d60205260409020548084106112115760405162461bcd60e51b815260206004820152601a60248201527f7365743a204e6f2076616c6964206c6f616e20706f6f6c2069640000000000006044820152606401610973565b50506001600160a01b03929092166000908152600e6020908152604080832093835292905220600401805460ff1916911515919091179055565b6000546001600160a01b031633146112755760405162461bcd60e51b815260040161097390613474565b6001600160a01b0382166112cb5760405162461bcd60e51b815260206004820152601a60248201527f6e61746976653a207a65726f20746f6b656e20616464726573730000000000006044820152606401610973565b600580546001600160a01b0319166001600160a01b039390931692909217909155600455565b6006546001600160a01b0316331461131b5760405162461bcd60e51b815260040161097390613593565b60005b600b5481101561154957600061135a600b83815481106113405761134061357d565b6000918252602090912001546001600160a01b0316610dad565b9050801561153657600b82815481106113755761137561357d565b60009182526020909120015460405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af11580156113f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141591906135d7565b50600060086000600b858154811061142f5761142f61357d565b60009182526020808320909101546001600160a01b031683528281019390935260409182019020805482518185028101850190935280835291929091908301828280156114a557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611487575b505060405163791ac94760e01b8152939450506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263791ac947925061150291508590600090869030904290600401613638565b600060405180830381600087803b15801561151c57600080fd5b505af1158015611530573d6000803e3d6000fd5b50505050505b50806115418161352d565b91505061131e565b5042600755565b6000546001600160a01b0316331461157a5760405162461bcd60e51b815260040161097390613474565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b0381166000908152600960205260408120546060919067ffffffffffffffff8111156115f9576115f96130fb565b60405190808252806020026020018201604052801561163257816020015b61161f613051565b8152602001906001900390816116175790505b50905060005b6001600160a01b038416600090815260096020526040902054811015610e97576001600160a01b038085166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526116f85750428160a00151115b1561171c57808383815181106117105761171061357d565b60200260200101819052505b50806117278161352d565b915050611638565b6002600154036117815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610973565b60026001556000611791846110c9565b9050806117e05760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204e6f20636f6c6c61746572616c20746f6b656e00006044820152606401610973565b6001600160a01b0384166000908152600d602052604090205482908590859081811161184e5760405162461bcd60e51b815260206004820152601b60248201527f6c6f616e45746865723a206e6f2076616c6964206c6f616e20496400000000006044820152606401610973565b6001600160a01b0388166000908152600e602090815260408083208a845290915290206004015460ff16156118c55760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204c6f616e20506f6f6c20697320636c6f73656400006044820152606401610973565b6040516370a0823160e01b81523360048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa15801561190c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119309190613674565b905084811161198d5760405162461bcd60e51b815260206004820152602360248201527f6c6f616e45746865723a206e6f7420656e6f75676820746f6b656e2062616c616044820152626e636560e81b6064820152608401610973565b60006119983361269d565b9050600081156119ce576001600160a01b0386166000908152600e602090815260408083208884529091529020600201546119f6565b6001600160a01b0386166000908152600e602090815260408083208884529091529020600101545b6040516370a0823160e01b81523060048201529091506000906001600160a01b038816906370a0823190602401602060405180830381865afa158015611a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a649190613674565b9050611a7133888a612e42565b611adc5760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a205472616e7366657220746f6b656e2066726f6d20756044820152751cd95c881d1bc818dbdb9d1c9858dd0819985a5b195960521b6064820152608401610973565b6040516370a0823160e01b81523060048201526000906001600160a01b038916906370a0823190602401602060405180830381865afa158015611b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b479190613674565b90506000611b55838361368d565b90506000611b648a8684612c50565b90506000805b600c54811015611bc657336001600160a01b0316600c8281548110611b9157611b9161357d565b6000918252602090912001546001600160a01b031603611bb45760019150611bc6565b80611bbe8161352d565b915050611b6a565b50801515600003611c1457600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b031916331790555b611c1d8261108f565b611c9a5760405162461bcd60e51b815260206004820152604260248201527f6c6f616e45746865723a206e6f7420656e6f756768206c69717569646974792060448201527f6f722063616e277420626f72726f77206c696d697465642045544820616d6f756064820152611b9d60f21b608482015260a401610973565b611ca2613051565b338082526040808301859052606083018690526000918252600960209081528183205460e085015261010084018390526001600160a01b038f168185018190528352600e81528183208e84529052902060038101549054611d0e6064611d088785612ec9565b90612f4b565b6080840152611d1d81426136a0565b60a0840190815260c08401828152336000818152600a602090815260408083206009808452828520805486529184528285208b5181546001600160a01b039182166001600160a01b0319918216178355868e0151600184018054919093169116179055928b0151600284015560608b0151600384015560808b01516004840155965160058301559451600682015560e089015160078201556101008901516008909101805491151560ff19909216919091179055918152929052805491611de38361352d565b9091555050604051339086156108fc029087906000818181858888f19350505050158015611e15573d6000803e3d6000fd5b50336001600160a01b03167f6ec47479b666ea2a5d4da977be8256c787c5724698308bd3c981e7dcd2285fa48460400151856060015186608001518760a001518860c00151604051611e89959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a25050600180555050505050505050505050505050505050565b6000546001600160a01b03163314611ed45760405162461bcd60e51b815260040161097390613474565b6001600160a01b038216611efa5760405162461bcd60e51b8152600401610973906134a9565b6000611f05836110c9565b905080611f245760405162461bcd60e51b815260040161097390613546565b6001600160a01b03831660009081526008602090815260409091208351611f4d92850190612fec565b507f078e8a4737553c8d944056c4087a42039847a7c1ed868d8c0e5d82a224f94f588383604051611f7f9291906136b3565b60405180910390a1505050565b6006546001600160a01b03163314611fb65760405162461bcd60e51b815260040161097390613593565b6000611fc1826110c9565b9050806120aa576040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561200f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120339190613674565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015612083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a791906135d7565b50505b5050565b6001600160a01b0381166000908152600960205260408120546060919067ffffffffffffffff8111156120e3576120e36130fb565b60405190808252806020026020018201604052801561211c57816020015b612109613051565b8152602001906001900390816121015790505b50905060005b6001600160a01b038416600090815260096020526040902054811015610e97576001600160a01b038085166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526121e25750428160a00151105b1561220657808383815181106121fa576121fa61357d565b60200260200101819052505b50806122118161352d565b915050612122565b6000546001600160a01b031633148061223c57506006546001600160a01b031633145b6122805760405162461bcd60e51b81526020600482015260156024820152742737ba1037bbb732b91037b91037b832b930ba37b960591b6044820152606401610973565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156122cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f191906135d7565b505050565b600c818154811061092f57600080fd5b6002600154036123585760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610973565b60026001908155336000818152600a6020908152604080832086845290915290209182015482546001600160a01b03918216929116146123e55760405162461bcd60e51b815260206004820152602260248201527f7061796261636b3a204f6e6c7920626f72726f7765722063616e207061796261604482015261636b60f01b6064820152608401610973565b600882015460ff161561243a5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a207061796261636b20616c726561647900000000000000006044820152606401610973565b816005015442111561248e5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a2065786365656420647565206461746500000000000000006044820152606401610973565b81600401543410156124e25760405162461bcd60e51b815260206004820152601960248201527f7061796261636b3a204e6f7420656e6f756768206574686572000000000000006044820152606401610973565b60088201805460ff19166001179055600382015460405163a9059cbb60e01b815233600482015260248101919091526001600160a01b0382169063a9059cbb906044016020604051808303816000875af1158015612544573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256891906135d7565b6125da5760405162461bcd60e51b815260206004820152603960248201527f7061796261636b3a205472616e7366657220636f6c6c61746572616c2066726f60448201527f6d20636f6e747261637420746f2075736572206661696c6564000000000000006064820152608401610973565b6008820154600483015460038401546040805133815260ff90941615156020850152428482015260608401929092526080830152517ff022a4d91d174959862c530aa30a63411b4f0e37186283bd5fc0000acc217a859181900360a00190a150506001805550565b60008080805b600b5481101561268c57600061266a600b83815481106113405761134061357d565b90506126768482612ddc565b93505080806126849061352d565b915050612648565b508115612697575060015b92915050565b6005546040516370a0823160e01b81526001600160a01b03838116600483015260009283929116906370a0823190602401602060405180830381865afa1580156126eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270f9190613674565b90506004548111156110c05750600192915050565b6000546001600160a01b031633148061274757506006546001600160a01b031633145b61278b5760405162461bcd60e51b81526020600482015260156024820152742737ba1037bbb732b91037b91037b832b930ba37b960591b6044820152606401610973565b47808211156127f45760405162461bcd60e51b815260206004820152602f60248201527f77697468647261773a2043616e277420657863656564206d6f7265207468616e60448201526e20746f74616c4c697175696469747960881b6064820152608401610973565b6040513390819084156108fc029085906000818181858888f193505050501580156120a7573d6000803e3d6000fd5b6008602052816000526040600020818154811061283f57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b0382166000908152600960205260408120546060919067ffffffffffffffff811115612890576128906130fb565b6040519080825280602002602001820160405280156128c957816020015b6128b6613051565b8152602001906001900390816128ae5790505b50905060005b6001600160a01b038516600090815260096020526040902054811015611127576001600160a01b038086166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff16158015610100830181905261298f5750428160a00151105b801561299e57508060a0015185105b156129c257808383815181106129b6576129b661357d565b60200260200101819052505b50806129cd8161352d565b9150506128cf565b6001600160a01b038316600090815260086020908152604080832080548251818502810185019093528083528493830182828015612a3c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a1e575b505050505090506000815167ffffffffffffffff811115612a5f57612a5f6130fb565b604051908082528060200260200182016040528015612a88578160200160208202803683370190505b506040516307c0329d60e21b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631f00ca7490612ada90879086906004016136d7565b600060405180830381865afa158015612af7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b1f91908101906136f0565b90506000612b5b6064612b558885600081518110612b3f57612b3f61357d565b6020026020010151612f4b90919063ffffffff16565b90612ec9565b979650505050505050565b6000546001600160a01b03163314612b905760405162461bcd60e51b815260040161097390613474565b6001600160a01b038116612bf55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610973565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316600090815260086020908152604080832080548251818502810185019093528083528493830182828015612cb757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c99575b505050505090506000815167ffffffffffffffff811115612cda57612cda6130fb565b604051908082528060200260200182016040528015612d03578160200160208202803683370190505b5060405163d06ca61f60e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d06ca61f90612d5590879086906004016136d7565b600060405180830381865afa158015612d72573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d9a91908101906136f0565b90506000612b5b6064611d08888560018851612db6919061368d565b81518110612dc657612dc661357d565b6020026020010151612ec990919063ffffffff16565b600080612de983856136a0565b905083811015612e3b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610973565b9392505050565b6040516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820183905260009182918516906323b872dd906064016020604051808303816000875af1158015612e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec091906135d7565b95945050505050565b600082600003612edb57506000612697565b6000612ee78385613776565b905082612ef485836137a3565b14612e3b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610973565b6000612e3b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183612fa95760405162461bcd60e51b815260040161097391906137b7565b506000612fb684866137a3565b9050612fc28486613805565b612fcc8286613776565b612fd691906136a0565b8514612fe457612fe4613819565b949350505050565b828054828255906000526020600020908101928215613041579160200282015b8281111561304157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061300c565b5061304d9291506130b1565b5090565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5b8082111561304d57600081556001016130b2565b6000602082840312156130d857600080fd5b5035919050565b80356001600160a01b03811681146130f657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561313a5761313a6130fb565b604052919050565b600067ffffffffffffffff82111561315c5761315c6130fb565b5060051b60200190565b600082601f83011261317757600080fd5b8135602061318c61318783613142565b613111565b82815260059290921b840181019181810190868411156131ab57600080fd5b8286015b848110156131cd576131c0816130df565b83529183019183016131af565b509695505050505050565b60008060008060008060c087890312156131f157600080fd5b6131fa876130df565b95506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff81111561323257600080fd5b61323e89828a01613166565b9150509295509295509295565b60008060008060008060c0878903121561326457600080fd5b61326d876130df565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b600080604083850312156132a857600080fd5b50508035926020909101359150565b6000602082840312156132c957600080fd5b612e3b826130df565b602080825282518282018190526000919060409081850190868401855b8281101561336b57815180516001600160a01b0390811686528782015116878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e080820151908601526101009081015115159085015261012090930192908501906001016132ef565b5091979650505050505050565b801515811461338657600080fd5b50565b60008060006060848603121561339e57600080fd5b6133a7846130df565b92506020840135915060408401356133be81613378565b809150509250925092565b600080604083850312156133dc57600080fd5b6133e5836130df565b946020939093013593505050565b60008060006060848603121561340857600080fd5b613411846130df565b95602085013595506040909401359392505050565b6000806040838503121561343957600080fd5b613442836130df565b9150602083013567ffffffffffffffff81111561345e57600080fd5b61346a85828601613166565b9150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f7570646174653a205a65726f20636f6c6c61746572616c206164647265737300604082015260600190565b6020808252601a908201527f6164643a2043616e2774206f7665722031303025206c696d6974000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161353f5761353f613517565b5060010190565b6020808252601b908201527f7570646174653a204e6f20636f6c6c61746572616c20746f6b656e0000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b6000602082840312156135e957600080fd5b8151612e3b81613378565b600081518084526020808501945080840160005b8381101561362d5781516001600160a01b031687529582019590820190600101613608565b509495945050505050565b85815284602082015260a06040820152600061365760a08301866135f4565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561368657600080fd5b5051919050565b8181038181111561269757612697613517565b8082018082111561269757612697613517565b6001600160a01b0383168152604060208201819052600090612fe4908301846135f4565b828152604060208201526000612fe460408301846135f4565b6000602080838503121561370357600080fd5b825167ffffffffffffffff81111561371a57600080fd5b8301601f8101851361372b57600080fd5b805161373961318782613142565b81815260059190911b8201830190838101908783111561375857600080fd5b928401925b82841015612b5b5783518252928401929084019061375d565b808202811582820484141761269757612697613517565b634e487b7160e01b600052601260045260246000fd5b6000826137b2576137b261378d565b500490565b600060208083528351808285015260005b818110156137e4578581018301518582016040015282016137c8565b506000604082860101526040601f19601f8301168501019250505092915050565b6000826138145761381461378d565b500690565b634e487b7160e01b600052600160045260246000fdfea26469706673582212206c0cbcf552323b1621e997c4d0a53688cbcf3d54515338adda293f2f5126b1c564736f6c63430008110033000000000000000000000000e13879194578c6f1a591a96c45b65022c43cec070000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000024f2beb1aa000

Deployed Bytecode

0x6080604052600436106102605760003560e01c80637eff539411610144578063a846c2fd116100b6578063e31323ac1161007a578063e31323ac14610807578063e39f9f2a1461081d578063e7177ece1461089f578063ed921a14146108bf578063f2fde38b146108df578063f8915391146108ff57600080fd5b8063a846c2fd1461077f578063acc4565914610792578063b8118bbe146107a7578063c311d049146107c7578063db8bb3a1146107e757600080fd5b80639e8c708e116101085780639e8c708e146106d45780639f4749af146106f4578063a007945e1461070a578063a12af8961461071f578063a4c3b0911461073f578063a803180d1461075f57600080fd5b80637eff539414610578578063888eb1ee146105985780638a918694146105b85780638da5cb5b146105e557806398c61c371461060357600080fd5b806344b8044a116101dd578063570ca735116101a1578063570ca735146104ce57806360ab8988146104ee57806367f7b06f1461050e5780636df9d3791461052e578063715018a614610543578063769db6151461055857600080fd5b806344b8044a1461041b5780634766162c1461044b5780634c0a79fb1461046b5780634d0047ee146104985780634e509f74146104b857600080fd5b8063293308f111610224578063293308f11461037757806329605e77146103a55780632cd1d250146103c55780632f759d91146103db57806335c7e9251461040857600080fd5b80631694505e146102a4578063172c48c7146102f55780631fffb6981461031557806324350de314610337578063274dca921461035757600080fd5b3661029f57604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b3480156102b057600080fd5b506102d87f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561030157600080fd5b506102d86103103660046130c6565b61091f565b34801561032157600080fd5b506103356103303660046131d8565b610949565b005b34801561034357600080fd5b5061033561035236600461324b565b610bd3565b34801561036357600080fd5b50610335610372366004613295565b610d78565b34801561038357600080fd5b506103976103923660046132b7565b610dad565b6040519081526020016102ec565b3480156103b157600080fd5b506103356103c03660046132b7565b610e9e565b3480156103d157600080fd5b5061039760045481565b3480156103e757600080fd5b506103fb6103f63660046132b7565b610f39565b6040516102ec91906132d2565b34801561041457600080fd5b5047610397565b34801561042757600080fd5b5061043b6104363660046130c6565b61108f565b60405190151581526020016102ec565b34801561045757600080fd5b5061043b6104663660046132b7565b6110c9565b34801561047757600080fd5b506103976104863660046132b7565b60096020526000908152604090205481565b3480156104a457600080fd5b506005546102d8906001600160a01b031681565b3480156104c457600080fd5b5061039760035481565b3480156104da57600080fd5b506006546102d8906001600160a01b031681565b3480156104fa57600080fd5b50610335610509366004613389565b61112f565b34801561051a57600080fd5b506103356105293660046133c9565b61124b565b34801561053a57600080fd5b506103356112f1565b34801561054f57600080fd5b50610335611550565b34801561056457600080fd5b506103fb6105733660046132b7565b6115c4565b34801561058457600080fd5b506103356105933660046133f3565b61172f565b3480156105a457600080fd5b506103356105b3366004613426565b611eaa565b3480156105c457600080fd5b506103976105d33660046132b7565b600d6020526000908152604090205481565b3480156105f157600080fd5b506000546001600160a01b03166102d8565b34801561060f57600080fd5b5061068361061e3660046133c9565b600a6020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b039788169897909616969495939492939192909160ff1689565b604080516001600160a01b039a8b1681529990981660208a0152968801959095526060870193909352608086019190915260a085015260c084015260e08301521515610100820152610120016102ec565b3480156106e057600080fd5b506103356106ef3660046132b7565b611f8c565b34801561070057600080fd5b5061039760025481565b34801561071657600080fd5b50600b54610397565b34801561072b57600080fd5b506103fb61073a3660046132b7565b6120ae565b34801561074b57600080fd5b5061033561075a3660046133c9565b612219565b34801561076b57600080fd5b506102d861077a3660046130c6565b6122f6565b61033561078d3660046130c6565b612306565b34801561079e57600080fd5b5061043b612642565b3480156107b357600080fd5b5061043b6107c23660046132b7565b61269d565b3480156107d357600080fd5b506103356107e23660046130c6565b612724565b3480156107f357600080fd5b506102d86108023660046133c9565b612823565b34801561081357600080fd5b5061039760075481565b34801561082957600080fd5b506108756108383660046133c9565b600e602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016102ec565b3480156108ab57600080fd5b506103fb6108ba3660046133c9565b61285b565b3480156108cb57600080fd5b506103976108da3660046133f3565b6129d5565b3480156108eb57600080fd5b506103356108fa3660046132b7565b612b66565b34801561090b57600080fd5b5061039761091a3660046133f3565b612c50565b600b818154811061092f57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b0316331461097c5760405162461bcd60e51b815260040161097390613474565b60405180910390fd5b6001600160a01b0386166109a25760405162461bcd60e51b8152600401610973906134a9565b606484106109c25760405162461bcd60e51b8152600401610973906134e0565b606483106109e25760405162461bcd60e51b8152600401610973906134e0565b6064821015610a2d5760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610973565b6000610a38876110c9565b905080610aa957600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b03891690811790915560009081526008602090815260409091208351610aa792850190612fec565b505b610add6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b86815260208082018781526040808401888152606085018881526000608087018181526001600160a01b038f16808352600d8089528684208054600e8b528886208187528b529785208b518155985160018a0155955160028901559351600388015590516004909601805460ff191696151596909617909555938452909352825490929091610b6b8361352d565b9091555050604080516001600160a01b038b168152602081018a905290810188905260608101879052608081018690527f4cb98f3b8ae6aaa3e3a10d19c96b00eac0ed7b5b7415a40edf7583c26c24914b9060a00160405180910390a1505050505050505050565b6000546001600160a01b03163314610bfd5760405162461bcd60e51b815260040161097390613474565b6001600160a01b038616610c235760405162461bcd60e51b8152600401610973906134a9565b6000610c2e876110c9565b905080610c4d5760405162461bcd60e51b815260040161097390613546565b6001600160a01b0387166000908152600d6020526040902054808710610cae5760405162461bcd60e51b81526020600482015260166024820152750eae0c8c2e8ca74409cde40ecc2d8d2c840d2dcc8caf60531b6044820152606401610973565b60648510610cce5760405162461bcd60e51b8152600401610973906134e0565b60648410610cee5760405162461bcd60e51b8152600401610973906134e0565b6064831015610d395760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610973565b50506001600160a01b03959095166000908152600e60209081526040808320968352959052939093209182556001820155600281019190915560030155565b6000546001600160a01b03163314610da25760405162461bcd60e51b815260040161097390613474565b600291909155600355565b60008060005b600c54811015610e97576000600c8281548110610dd257610dd261357d565b60009182526020822001546007546001600160a01b039091169250610df890839061285b565b905060005b8151811015610e8157818181518110610e1857610e1861357d565b6020026020010151602001516001600160a01b0316876001600160a01b031603610e6f57610e6c828281518110610e5157610e5161357d565b60200260200101516060015186612ddc90919063ffffffff16565b94505b80610e798161352d565b915050610dfd565b5050508080610e8f9061352d565b915050610db3565b5092915050565b6000546001600160a01b03163314610ec85760405162461bcd60e51b815260040161097390613474565b6001600160a01b038116610f175760405162461bcd60e51b81526020600482015260166024820152756f70657261746f723a205a65726f204164647265737360501b6044820152606401610973565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600960205260408120546060919067ffffffffffffffff811115610f6e57610f6e6130fb565b604051908082528060200260200182016040528015610fa757816020015b610f94613051565b815260200190600190039081610f8c5790505b50905060005b6001600160a01b038416600090815260096020526040902054811015610e97576001600160a01b038085166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff16151561010082015282518390839081106110715761107161357d565b602002602001018190525080806110879061352d565b915050610fad565b600254600090479083118015906110a7575060035483115b80156110b257508083105b156110c05750600192915050565b50600092915050565b600b5460009081805b8281101561112757600b81815481106110ed576110ed61357d565b6000918252602090912001546001600160a01b03908116908616036111155760019150611127565b8061111f8161352d565b9150506110d2565b509392505050565b6000546001600160a01b031633146111595760405162461bcd60e51b815260040161097390613474565b6001600160a01b03831661117f5760405162461bcd60e51b8152600401610973906134a9565b600061118a846110c9565b9050806111a95760405162461bcd60e51b815260040161097390613546565b6001600160a01b0384166000908152600d60205260409020548084106112115760405162461bcd60e51b815260206004820152601a60248201527f7365743a204e6f2076616c6964206c6f616e20706f6f6c2069640000000000006044820152606401610973565b50506001600160a01b03929092166000908152600e6020908152604080832093835292905220600401805460ff1916911515919091179055565b6000546001600160a01b031633146112755760405162461bcd60e51b815260040161097390613474565b6001600160a01b0382166112cb5760405162461bcd60e51b815260206004820152601a60248201527f6e61746976653a207a65726f20746f6b656e20616464726573730000000000006044820152606401610973565b600580546001600160a01b0319166001600160a01b039390931692909217909155600455565b6006546001600160a01b0316331461131b5760405162461bcd60e51b815260040161097390613593565b60005b600b5481101561154957600061135a600b83815481106113405761134061357d565b6000918252602090912001546001600160a01b0316610dad565b9050801561153657600b82815481106113755761137561357d565b60009182526020909120015460405163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af11580156113f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141591906135d7565b50600060086000600b858154811061142f5761142f61357d565b60009182526020808320909101546001600160a01b031683528281019390935260409182019020805482518185028101850190935280835291929091908301828280156114a557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611487575b505060405163791ac94760e01b8152939450506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169263791ac947925061150291508590600090869030904290600401613638565b600060405180830381600087803b15801561151c57600080fd5b505af1158015611530573d6000803e3d6000fd5b50505050505b50806115418161352d565b91505061131e565b5042600755565b6000546001600160a01b0316331461157a5760405162461bcd60e51b815260040161097390613474565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b0381166000908152600960205260408120546060919067ffffffffffffffff8111156115f9576115f96130fb565b60405190808252806020026020018201604052801561163257816020015b61161f613051565b8152602001906001900390816116175790505b50905060005b6001600160a01b038416600090815260096020526040902054811015610e97576001600160a01b038085166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526116f85750428160a00151115b1561171c57808383815181106117105761171061357d565b60200260200101819052505b50806117278161352d565b915050611638565b6002600154036117815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610973565b60026001556000611791846110c9565b9050806117e05760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204e6f20636f6c6c61746572616c20746f6b656e00006044820152606401610973565b6001600160a01b0384166000908152600d602052604090205482908590859081811161184e5760405162461bcd60e51b815260206004820152601b60248201527f6c6f616e45746865723a206e6f2076616c6964206c6f616e20496400000000006044820152606401610973565b6001600160a01b0388166000908152600e602090815260408083208a845290915290206004015460ff16156118c55760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204c6f616e20506f6f6c20697320636c6f73656400006044820152606401610973565b6040516370a0823160e01b81523360048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa15801561190c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119309190613674565b905084811161198d5760405162461bcd60e51b815260206004820152602360248201527f6c6f616e45746865723a206e6f7420656e6f75676820746f6b656e2062616c616044820152626e636560e81b6064820152608401610973565b60006119983361269d565b9050600081156119ce576001600160a01b0386166000908152600e602090815260408083208884529091529020600201546119f6565b6001600160a01b0386166000908152600e602090815260408083208884529091529020600101545b6040516370a0823160e01b81523060048201529091506000906001600160a01b038816906370a0823190602401602060405180830381865afa158015611a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a649190613674565b9050611a7133888a612e42565b611adc5760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a205472616e7366657220746f6b656e2066726f6d20756044820152751cd95c881d1bc818dbdb9d1c9858dd0819985a5b195960521b6064820152608401610973565b6040516370a0823160e01b81523060048201526000906001600160a01b038916906370a0823190602401602060405180830381865afa158015611b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b479190613674565b90506000611b55838361368d565b90506000611b648a8684612c50565b90506000805b600c54811015611bc657336001600160a01b0316600c8281548110611b9157611b9161357d565b6000918252602090912001546001600160a01b031603611bb45760019150611bc6565b80611bbe8161352d565b915050611b6a565b50801515600003611c1457600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b031916331790555b611c1d8261108f565b611c9a5760405162461bcd60e51b815260206004820152604260248201527f6c6f616e45746865723a206e6f7420656e6f756768206c69717569646974792060448201527f6f722063616e277420626f72726f77206c696d697465642045544820616d6f756064820152611b9d60f21b608482015260a401610973565b611ca2613051565b338082526040808301859052606083018690526000918252600960209081528183205460e085015261010084018390526001600160a01b038f168185018190528352600e81528183208e84529052902060038101549054611d0e6064611d088785612ec9565b90612f4b565b6080840152611d1d81426136a0565b60a0840190815260c08401828152336000818152600a602090815260408083206009808452828520805486529184528285208b5181546001600160a01b039182166001600160a01b0319918216178355868e0151600184018054919093169116179055928b0151600284015560608b0151600384015560808b01516004840155965160058301559451600682015560e089015160078201556101008901516008909101805491151560ff19909216919091179055918152929052805491611de38361352d565b9091555050604051339086156108fc029087906000818181858888f19350505050158015611e15573d6000803e3d6000fd5b50336001600160a01b03167f6ec47479b666ea2a5d4da977be8256c787c5724698308bd3c981e7dcd2285fa48460400151856060015186608001518760a001518860c00151604051611e89959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a25050600180555050505050505050505050505050505050565b6000546001600160a01b03163314611ed45760405162461bcd60e51b815260040161097390613474565b6001600160a01b038216611efa5760405162461bcd60e51b8152600401610973906134a9565b6000611f05836110c9565b905080611f245760405162461bcd60e51b815260040161097390613546565b6001600160a01b03831660009081526008602090815260409091208351611f4d92850190612fec565b507f078e8a4737553c8d944056c4087a42039847a7c1ed868d8c0e5d82a224f94f588383604051611f7f9291906136b3565b60405180910390a1505050565b6006546001600160a01b03163314611fb65760405162461bcd60e51b815260040161097390613593565b6000611fc1826110c9565b9050806120aa576040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561200f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120339190613674565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015612083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a791906135d7565b50505b5050565b6001600160a01b0381166000908152600960205260408120546060919067ffffffffffffffff8111156120e3576120e36130fb565b60405190808252806020026020018201604052801561211c57816020015b612109613051565b8152602001906001900390816121015790505b50905060005b6001600160a01b038416600090815260096020526040902054811015610e97576001600160a01b038085166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526121e25750428160a00151105b1561220657808383815181106121fa576121fa61357d565b60200260200101819052505b50806122118161352d565b915050612122565b6000546001600160a01b031633148061223c57506006546001600160a01b031633145b6122805760405162461bcd60e51b81526020600482015260156024820152742737ba1037bbb732b91037b91037b832b930ba37b960591b6044820152606401610973565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156122cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f191906135d7565b505050565b600c818154811061092f57600080fd5b6002600154036123585760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610973565b60026001908155336000818152600a6020908152604080832086845290915290209182015482546001600160a01b03918216929116146123e55760405162461bcd60e51b815260206004820152602260248201527f7061796261636b3a204f6e6c7920626f72726f7765722063616e207061796261604482015261636b60f01b6064820152608401610973565b600882015460ff161561243a5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a207061796261636b20616c726561647900000000000000006044820152606401610973565b816005015442111561248e5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a2065786365656420647565206461746500000000000000006044820152606401610973565b81600401543410156124e25760405162461bcd60e51b815260206004820152601960248201527f7061796261636b3a204e6f7420656e6f756768206574686572000000000000006044820152606401610973565b60088201805460ff19166001179055600382015460405163a9059cbb60e01b815233600482015260248101919091526001600160a01b0382169063a9059cbb906044016020604051808303816000875af1158015612544573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256891906135d7565b6125da5760405162461bcd60e51b815260206004820152603960248201527f7061796261636b3a205472616e7366657220636f6c6c61746572616c2066726f60448201527f6d20636f6e747261637420746f2075736572206661696c6564000000000000006064820152608401610973565b6008820154600483015460038401546040805133815260ff90941615156020850152428482015260608401929092526080830152517ff022a4d91d174959862c530aa30a63411b4f0e37186283bd5fc0000acc217a859181900360a00190a150506001805550565b60008080805b600b5481101561268c57600061266a600b83815481106113405761134061357d565b90506126768482612ddc565b93505080806126849061352d565b915050612648565b508115612697575060015b92915050565b6005546040516370a0823160e01b81526001600160a01b03838116600483015260009283929116906370a0823190602401602060405180830381865afa1580156126eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270f9190613674565b90506004548111156110c05750600192915050565b6000546001600160a01b031633148061274757506006546001600160a01b031633145b61278b5760405162461bcd60e51b81526020600482015260156024820152742737ba1037bbb732b91037b91037b832b930ba37b960591b6044820152606401610973565b47808211156127f45760405162461bcd60e51b815260206004820152602f60248201527f77697468647261773a2043616e277420657863656564206d6f7265207468616e60448201526e20746f74616c4c697175696469747960881b6064820152608401610973565b6040513390819084156108fc029085906000818181858888f193505050501580156120a7573d6000803e3d6000fd5b6008602052816000526040600020818154811061283f57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b0382166000908152600960205260408120546060919067ffffffffffffffff811115612890576128906130fb565b6040519080825280602002602001820160405280156128c957816020015b6128b6613051565b8152602001906001900390816128ae5790505b50905060005b6001600160a01b038516600090815260096020526040902054811015611127576001600160a01b038086166000908152600a602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff16158015610100830181905261298f5750428160a00151105b801561299e57508060a0015185105b156129c257808383815181106129b6576129b661357d565b60200260200101819052505b50806129cd8161352d565b9150506128cf565b6001600160a01b038316600090815260086020908152604080832080548251818502810185019093528083528493830182828015612a3c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a1e575b505050505090506000815167ffffffffffffffff811115612a5f57612a5f6130fb565b604051908082528060200260200182016040528015612a88578160200160208202803683370190505b506040516307c0329d60e21b81529091506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1690631f00ca7490612ada90879086906004016136d7565b600060405180830381865afa158015612af7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b1f91908101906136f0565b90506000612b5b6064612b558885600081518110612b3f57612b3f61357d565b6020026020010151612f4b90919063ffffffff16565b90612ec9565b979650505050505050565b6000546001600160a01b03163314612b905760405162461bcd60e51b815260040161097390613474565b6001600160a01b038116612bf55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610973565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316600090815260086020908152604080832080548251818502810185019093528083528493830182828015612cb757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c99575b505050505090506000815167ffffffffffffffff811115612cda57612cda6130fb565b604051908082528060200260200182016040528015612d03578160200160208202803683370190505b5060405163d06ca61f60e01b81529091506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063d06ca61f90612d5590879086906004016136d7565b600060405180830381865afa158015612d72573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d9a91908101906136f0565b90506000612b5b6064611d08888560018851612db6919061368d565b81518110612dc657612dc661357d565b6020026020010151612ec990919063ffffffff16565b600080612de983856136a0565b905083811015612e3b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610973565b9392505050565b6040516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820183905260009182918516906323b872dd906064016020604051808303816000875af1158015612e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec091906135d7565b95945050505050565b600082600003612edb57506000612697565b6000612ee78385613776565b905082612ef485836137a3565b14612e3b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610973565b6000612e3b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183612fa95760405162461bcd60e51b815260040161097391906137b7565b506000612fb684866137a3565b9050612fc28486613805565b612fcc8286613776565b612fd691906136a0565b8514612fe457612fe4613819565b949350505050565b828054828255906000526020600020908101928215613041579160200282015b8281111561304157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061300c565b5061304d9291506130b1565b5090565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5b8082111561304d57600081556001016130b2565b6000602082840312156130d857600080fd5b5035919050565b80356001600160a01b03811681146130f657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561313a5761313a6130fb565b604052919050565b600067ffffffffffffffff82111561315c5761315c6130fb565b5060051b60200190565b600082601f83011261317757600080fd5b8135602061318c61318783613142565b613111565b82815260059290921b840181019181810190868411156131ab57600080fd5b8286015b848110156131cd576131c0816130df565b83529183019183016131af565b509695505050505050565b60008060008060008060c087890312156131f157600080fd5b6131fa876130df565b95506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff81111561323257600080fd5b61323e89828a01613166565b9150509295509295509295565b60008060008060008060c0878903121561326457600080fd5b61326d876130df565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b600080604083850312156132a857600080fd5b50508035926020909101359150565b6000602082840312156132c957600080fd5b612e3b826130df565b602080825282518282018190526000919060409081850190868401855b8281101561336b57815180516001600160a01b0390811686528782015116878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e080820151908601526101009081015115159085015261012090930192908501906001016132ef565b5091979650505050505050565b801515811461338657600080fd5b50565b60008060006060848603121561339e57600080fd5b6133a7846130df565b92506020840135915060408401356133be81613378565b809150509250925092565b600080604083850312156133dc57600080fd5b6133e5836130df565b946020939093013593505050565b60008060006060848603121561340857600080fd5b613411846130df565b95602085013595506040909401359392505050565b6000806040838503121561343957600080fd5b613442836130df565b9150602083013567ffffffffffffffff81111561345e57600080fd5b61346a85828601613166565b9150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f7570646174653a205a65726f20636f6c6c61746572616c206164647265737300604082015260600190565b6020808252601a908201527f6164643a2043616e2774206f7665722031303025206c696d6974000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60006001820161353f5761353f613517565b5060010190565b6020808252601b908201527f7570646174653a204e6f20636f6c6c61746572616c20746f6b656e0000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b6000602082840312156135e957600080fd5b8151612e3b81613378565b600081518084526020808501945080840160005b8381101561362d5781516001600160a01b031687529582019590820190600101613608565b509495945050505050565b85815284602082015260a06040820152600061365760a08301866135f4565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561368657600080fd5b5051919050565b8181038181111561269757612697613517565b8082018082111561269757612697613517565b6001600160a01b0383168152604060208201819052600090612fe4908301846135f4565b828152604060208201526000612fe460408301846135f4565b6000602080838503121561370357600080fd5b825167ffffffffffffffff81111561371a57600080fd5b8301601f8101851361372b57600080fd5b805161373961318782613142565b81815260059190911b8201830190838101908783111561375857600080fd5b928401925b82841015612b5b5783518252928401929084019061375d565b808202811582820484141761269757612697613517565b634e487b7160e01b600052601260045260246000fd5b6000826137b2576137b261378d565b500490565b600060208083528351808285015260005b818110156137e4578581018301518582016040015282016137c8565b506000604082860101526040601f19601f8301168501019250505092915050565b6000826138145761381461378d565b500690565b634e487b7160e01b600052600160045260246000fdfea26469706673582212206c0cbcf552323b1621e997c4d0a53688cbcf3d54515338adda293f2f5126b1c564736f6c63430008110033

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

000000000000000000000000e13879194578c6f1a591a96c45b65022c43cec070000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000024f2beb1aa000

-----Decoded View---------------
Arg [0] : _nativeTokenAddress (address): 0xe13879194578C6F1A591a96C45B65022c43CEc07
Arg [1] : _routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _nativeMin (uint256): 650000000000000

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000e13879194578c6f1a591a96c45b65022c43cec07
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 00000000000000000000000000000000000000000000000000024f2beb1aa000


Deployed Bytecode Sourcemap

16876:18760:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19675:31;;;19684:10;188:51:1;;19696:9:0;270:2:1;255:18;;248:34;19675:31:0;;161:18:1;19675:31:0;;;;;;;16876:18760;;;;;18013:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;483:32:1;;;465:51;;453:2;438:18;18013:51:0;;;;;;;;17810:33;;;;;;;;;;-1:-1:-1;17810:33:0;;;;;:::i;:::-;;:::i;19722:1414::-;;;;;;;;;;-1:-1:-1;19722:1414:0;;;;;:::i;:::-;;:::i;:::-;;21144:1113;;;;;;;;;;-1:-1:-1;21144:1113:0;;;;;:::i;:::-;;:::i;24251:161::-;;;;;;;;;;-1:-1:-1;24251:161:0;;;;;:::i;:::-;;:::i;32430:679::-;;;;;;;;;;-1:-1:-1;32430:679:0;;;;;:::i;:::-;;:::i;:::-;;;4197:25:1;;;4185:2;4170:18;32430:679:0;4051:177:1;34423:167:0;;;;;;;;;;-1:-1:-1;34423:167:0;;;;;:::i;:::-;;:::i;17024:29::-;;;;;;;;;;;;;;;;30457:374;;;;;;;;;;-1:-1:-1;30457:374:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35527:106::-;;;;;;;;;;-1:-1:-1;35604:21:0;35527:106;;25479:296;;;;;;;;;;-1:-1:-1;25479:296:0;;;;;:::i;:::-;;:::i;:::-;;;5951:14:1;;5944:22;5926:41;;5914:2;5899:18;25479:296:0;5786:187:1;23351:358:0;;;;;;;;;;-1:-1:-1;23351:358:0;;;;;:::i;:::-;;:::i;17681:49::-;;;;;;;;;;-1:-1:-1;17681:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;17060:33;;;;;;;;;;-1:-1:-1;17060:33:0;;;;-1:-1:-1;;;;;17060:33:0;;;16991:25;;;;;;;;;;;;;;;;17100:23;;;;;;;;;;-1:-1:-1;17100:23:0;;;;-1:-1:-1;;;;;17100:23:0;;;22746:597;;;;;;;;;;-1:-1:-1;22746:597:0;;;;;:::i;:::-;;:::i;23977:266::-;;;;;;;;;;-1:-1:-1;23977:266:0;;;;;:::i;:::-;;:::i;33562:853::-;;;;;;;;;;;;;:::i;13698:148::-;;;;;;;;;;;;;:::i;30839:485::-;;;;;;;;;;-1:-1:-1;30839:485:0;;;;;:::i;:::-;;:::i;26124:3204::-;;;;;;;;;;-1:-1:-1;26124:3204:0;;;;;:::i;:::-;;:::i;22265:473::-;;;;;;;;;;-1:-1:-1;22265:473:0;;;;;:::i;:::-;;:::i;17883:49::-;;;;;;;;;;-1:-1:-1;17883:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;13056:79;;;;;;;;;;-1:-1:-1;13094:7:0;13121:6;-1:-1:-1;;;;;13121:6:0;13056:79;;17737:64;;;;;;;;;;-1:-1:-1;17737:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17737:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7923:15:1;;;7905:34;;7975:15;;;;7970:2;7955:18;;7948:43;8007:18;;;8000:34;;;;8065:2;8050:18;;8043:34;;;;8108:3;8093:19;;8086:35;;;;7885:3;8137:19;;8130:35;8196:3;8181:19;;8174:35;8240:3;8225:19;;8218:35;8297:14;8290:22;8284:3;8269:19;;8262:51;7854:3;7839:19;17737:64:0;7502:817:1;35114:290:0;;;;;;;;;;-1:-1:-1;35114:290:0;;;;;:::i;:::-;;:::i;16958:25::-;;;;;;;;;;;;;;;;35412:107;;;;;;;;;;-1:-1:-1;35488:16:0;:23;35412:107;;31332:485;;;;;;;;;;-1:-1:-1;31332:485:0;;;;;:::i;:::-;;:::i;34949:157::-;;;;;;;;;;-1:-1:-1;34949:157:0;;;;;:::i;:::-;;:::i;17850:26::-;;;;;;;;;;-1:-1:-1;17850:26:0;;;;;:::i;:::-;;:::i;29336:1113::-;;;;;;:::i;:::-;;:::i;33117:437::-;;;;;;;;;;;;;:::i;23717:252::-;;;;;;;;;;-1:-1:-1;23717:252:0;;;;;:::i;:::-;;:::i;34598:343::-;;;;;;;;;;-1:-1:-1;34598:343:0;;;;;:::i;:::-;;:::i;17628:46::-;;;;;;;;;;-1:-1:-1;17628:46:0;;;;;:::i;:::-;;:::i;17596:25::-;;;;;;;;;;;;;;;;17939:65;;;;;;;;;;-1:-1:-1;17939:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8577:25:1;;;8633:2;8618:18;;8611:34;;;;8661:18;;;8654:34;;;;8719:2;8704:18;;8697:34;8775:14;8768:22;8762:3;8747:19;;8740:51;8564:3;8549:19;17939:65:0;8324:473:1;31825:597:0;;;;;;;;;;-1:-1:-1;31825:597:0;;;;;:::i;:::-;;:::i;24494:438::-;;;;;;;;;;-1:-1:-1;24494:438:0;;;;;:::i;:::-;;:::i;14001:281::-;;;;;;;;;;-1:-1:-1;14001:281:0;;;;;:::i;:::-;;:::i;25008:463::-;;;;;;;;;;-1:-1:-1;25008:463:0;;;;;:::i;:::-;;:::i;17810:33::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17810:33:0;;-1:-1:-1;17810:33:0;:::o;19722:1414::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;19993:30:0;::::1;19971:111;;;;-1:-1:-1::0;;;19971:111:0::1;;;;;;;:::i;:::-;20114:3;20101:10;:16;20093:55;;;;-1:-1:-1::0;;;20093:55:0::1;;;;;;;:::i;:::-;20186:3;20167:16;:22;20159:61;;;;-1:-1:-1::0;;;20159:61:0::1;;;;;;;:::i;:::-;20253:3;20239:10;:17;;20231:53;;;::::0;-1:-1:-1;;;20231:53:0;;10080:2:1;20231:53:0::1;::::0;::::1;10062:21:1::0;10119:2;10099:18;;;10092:30;-1:-1:-1;;;10138:18:1;;;10131:53;10201:18;;20231:53:0::1;9878:347:1::0;20231:53:0::1;20297:15;20315:35;20333:16;20315:17;:35::i;:::-;20297:53;;20366:10;20361:133;;20393:16;:39:::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;20393:39:0::1;-1:-1:-1::0;;;;;20393:39:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20447:27:0;;;:9:::1;20393:39;20447:27:::0;;;;;;;:35;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;20361:133;20504:27;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20504:27:0::1;20542:40:::0;;;20593:21:::1;::::0;;::::1;:34:::0;;;20640:27:::1;::::0;;::::1;:46:::0;;;20697:21:::1;::::0;::::1;:34:::0;;;-1:-1:-1;20742:18:0::1;::::0;::::1;:26:::0;;;-1:-1:-1;;;;;20801:32:0;::::1;::::0;;;:14:::1;:32:::0;;;;;;;;20846:9:::1;:27:::0;;;;;:40;;;;;;;;:54;;;;;;20742:26;20846:54;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;20846:54:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;20911:32;;;;;;:34;;20801:32;;20911:34;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;20963:165:0::1;::::0;;-1:-1:-1;;;;;10779:32:1;;10761:51;;10843:2;10828:18;;10821:34;;;10871:18;;;10864:34;;;10929:2;10914:18;;10907:34;;;10972:3;10957:19;;10950:35;;;20963:165:0::1;::::0;10748:3:1;10733:19;20963:165:0::1;;;;;;;19960:1176;;;19722:1414:::0;;;;;;:::o;21144:1113::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21410:30:0;::::1;21388:111;;;;-1:-1:-1::0;;;21388:111:0::1;;;;;;;:::i;:::-;21510:15;21528:35;21546:16;21528:17;:35::i;:::-;21510:53;;21582:10;21574:50;;;;-1:-1:-1::0;;;21574:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21655:32:0;::::1;21635:17;21655:32:::0;;;:14:::1;:32;::::0;;;;;21706:18;;::::1;21698:53;;;::::0;-1:-1:-1;;;21698:53:0;;11554:2:1;21698:53:0::1;::::0;::::1;11536:21:1::0;11593:2;11573:18;;;11566:30;-1:-1:-1;;;11612:18:1;;;11605:52;11674:18;;21698:53:0::1;11352:346:1::0;21698:53:0::1;21783:3;21770:10;:16;21762:55;;;;-1:-1:-1::0;;;21762:55:0::1;;;;;;;:::i;:::-;21855:3;21836:16;:22;21828:61;;;;-1:-1:-1::0;;;21828:61:0::1;;;;;;;:::i;:::-;21922:3;21908:10;:17;;21900:53;;;::::0;-1:-1:-1;;;21900:53:0;;10080:2:1;21900:53:0::1;::::0;::::1;10062:21:1::0;10119:2;10099:18;;;10092:30;-1:-1:-1;;;10138:18:1;;;10131:53;10201:18;;21900:53:0::1;9878:347:1::0;21900:53:0::1;-1:-1:-1::0;;;;;;;21966:27:0;;;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:35;;;;;;;;;;:64;;;22041:45:::1;::::0;::::1;:58:::0;22110:51:::1;::::0;::::1;:70:::0;;;;22191:45:::1;;:58:::0;21144:1113::o;24251:161::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;24345:10:::1;:24:::0;;;;24380:10:::1;:24:::0;24251:161::o;32430:679::-;32492:7;32512:23;32551:9;32546:523;32570:9;:16;32566:20;;32546:523;;;32608:12;32623:9;32633:1;32623:12;;;;;;;;:::i;:::-;;;;;;;;;;32747:10;;-1:-1:-1;;;;;32623:12:0;;;;-1:-1:-1;32682:90:0;;32623:12;;32682:23;:90::i;:::-;32650:122;;32792:9;32787:271;32811:8;:15;32807:1;:19;32787:271;;;32866:8;32875:1;32866:11;;;;;;;;:::i;:::-;;;;;;;:17;;;-1:-1:-1;;;;;32856:27:0;:6;-1:-1:-1;;;;;32856:27:0;;32852:191;;32926:97;32972:8;32981:1;32972:11;;;;;;;;:::i;:::-;;;;;;;:28;;;32926:15;:19;;:97;;;;:::i;:::-;32908:115;;32852:191;32828:3;;;;:::i;:::-;;;;32787:271;;;;32593:476;;32588:3;;;;;:::i;:::-;;;;32546:523;;;-1:-1:-1;33086:15:0;32430:679;-1:-1:-1;;32430:679:0:o;34423:167::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34503:22:0;::::1;34495:57;;;::::0;-1:-1:-1;;;34495:57:0;;12037:2:1;34495:57:0::1;::::0;::::1;12019:21:1::0;12076:2;12056:18;;;12049:30;-1:-1:-1;;;12095:18:1;;;12088:52;12157:18;;34495:57:0::1;11835:346:1::0;34495:57:0::1;34563:8;:19:::0;;-1:-1:-1;;;;;;34563:19:0::1;-1:-1:-1::0;;;;;34563:19:0;;;::::1;::::0;;;::::1;::::0;;34423:167::o;30457:374::-;-1:-1:-1;;;;;30647:21:0;;30583:29;30647:21;;;:14;:21;;;;;;30545:20;;30583:29;30615:64;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;30583:96;;30695:9;30690:108;-1:-1:-1;;;;;30714:21:0;;;;;;:14;:21;;;;;;30710:25;;30690:108;;;-1:-1:-1;;;;;30771:12:0;;;;;;;:5;:12;;;;;;;;:15;;;;;;;;;30757:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;;:8;;30784:1;;30757:11;;;;;;:::i;:::-;;;;;;:29;;;;30737:3;;;;;:::i;:::-;;;;30690:108;;25479:296;25627:10;;25544:4;;25580:21;;25616;;;;;:45;;;25651:10;;25641:7;:20;25616:45;:67;;;;;25675:8;25665:7;:18;25616:67;25612:156;;;-1:-1:-1;25707:4:0;;25479:296;-1:-1:-1;;25479:296:0:o;25612:156::-;-1:-1:-1;25751:5:0;;25479:296;-1:-1:-1;;25479:296:0:o;23351:358::-;23445:16;:23;23414:4;;;;23510:167;23534:3;23530:1;:7;23510:167;;;23572:16;23589:1;23572:19;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23572:19:0;;;23563:28;;;;23559:107;;23622:4;23612:14;;23645:5;;23559:107;23539:3;;;;:::i;:::-;;;;23510:167;;;-1:-1:-1;23694:7:0;23351:358;-1:-1:-1;;;23351:358:0:o;22746:597::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22917:30:0;::::1;22895:111;;;;-1:-1:-1::0;;;22895:111:0::1;;;;;;;:::i;:::-;23017:15;23035:35;23053:16;23035:17;:35::i;:::-;23017:53;;23089:10;23081:50;;;;-1:-1:-1::0;;;23081:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23162:32:0;::::1;23142:17;23162:32:::0;;;:14:::1;:32;::::0;;;;;23213:23;;::::1;23205:62;;;::::0;-1:-1:-1;;;23205:62:0;;12388:2:1;23205:62:0::1;::::0;::::1;12370:21:1::0;12427:2;12407:18;;;12400:30;12466:28;12446:18;;;12439:56;12512:18;;23205:62:0::1;12186:350:1::0;23205:62:0::1;-1:-1:-1::0;;;;;;;23278:27:0;;;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:40;;;;;;;:47:::1;;:57:::0;;-1:-1:-1;;23278:57:0::1;::::0;::::1;;::::0;;;::::1;::::0;;22746:597::o;23977:266::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24100:27:0;::::1;24092:66;;;::::0;-1:-1:-1;;;24092:66:0;;12743:2:1;24092:66:0::1;::::0;::::1;12725:21:1::0;12782:2;12762:18;;;12755:30;12821:28;12801:18;;;12794:56;12867:18;;24092:66:0::1;12541:350:1::0;24092:66:0::1;24169:18;:34:::0;;-1:-1:-1;;;;;;24169:34:0::1;-1:-1:-1::0;;;;;24169:34:0;;;::::1;::::0;;;::::1;::::0;;;24214:14:::1;:21:::0;23977:266::o;33562:853::-;19349:8;;-1:-1:-1;;;;;19349:8:0;19361:10;19349:22;19341:71;;;;-1:-1:-1;;;19341:71:0;;;;;;;:::i;:::-;33620:9:::1;33615:754;33639:16;:23:::0;33635:27;::::1;33615:754;;;33684:19;33706:36;33722:16;33739:1;33722:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;33722:19:0::1;33706:15;:36::i;:::-;33684:58:::0;-1:-1:-1;33761:15:0;;33757:601:::1;;33804:16;33821:1;33804:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;33797:135:::1;::::0;-1:-1:-1;;;33797:135:0;;-1:-1:-1;;;;;33863:15:0::1;206:32:1::0;;33797:135:0::1;::::0;::::1;188:51:1::0;255:18;;;248:34;;;33804:19:0;;::::1;::::0;33797:35:::1;::::0;161:18:1;;33797:135:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33951:21;33975:9;:30;33985:16;34002:1;33985:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;33985:19:0::1;33975:30:::0;;;;::::1;::::0;;;;;;;;;;33951:54;;;;;;::::1;::::0;;;;;;;;;;;;33975:30;;33951:54;;::::1;33975:30:::0;33951:54;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;33951:54:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;34024:318:0::1;::::0;-1:-1:-1;;;34024:318:0;;33951:54;;-1:-1:-1;;;;;;;34024:15:0::1;:88;::::0;::::1;::::0;-1:-1:-1;34024:318:0::1;::::0;-1:-1:-1;34139:11:0;;34177:1:::1;::::0;33951:54;;34272:4:::1;::::0;34304:15:::1;::::0;34024:318:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33778:580;33757:601;-1:-1:-1::0;33664:3:0;::::1;::::0;::::1;:::i;:::-;;;;33615:754;;;-1:-1:-1::0;34392:15:0::1;34379:10;:28:::0;33562:853::o;13698:148::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;13805:1:::1;13789:6:::0;;13768:40:::1;::::0;-1:-1:-1;;;;;13789:6:0;;::::1;::::0;13768:40:::1;::::0;13805:1;;13768:40:::1;13836:1;13819:19:::0;;-1:-1:-1;;;;;;13819:19:0::1;::::0;;13698:148::o;30839:485::-;-1:-1:-1;;;;;31018:21:0;;30969:28;31018:21;;;:14;:21;;;;;;30931:20;;30969:28;31000:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;30969:71;;31056:9;31051:241;-1:-1:-1;;;;;31075:21:0;;;;;;:14;:21;;;;;;31071:25;;31051:241;;;-1:-1:-1;;;;;31143:12:0;;;31118:22;31143:12;;;:5;:12;;;;;;;;:15;;;;;;;;;31118:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31177:51;;;31213:15;31195:3;:15;;;:33;31177:51;31173:108;;;31262:3;31249:7;31257:1;31249:10;;;;;;;;:::i;:::-;;;;;;:16;;;;31173:108;-1:-1:-1;31098:3:0;;;;:::i;:::-;;;;31051:241;;26124:3204;15931:1;16527:7;;:19;16519:63;;;;-1:-1:-1;;;16519:63:0;;14806:2:1;16519:63:0;;;14788:21:1;14845:2;14825:18;;;14818:30;14884:33;14864:18;;;14857:61;14935:18;;16519:63:0;14604:355:1;16519:63:0;15931:1;16660:7;:18;26279:15:::1;26297:35;26315:16:::0;26297:17:::1;:35::i;:::-;26279:53;;26351:10;26343:53;;;::::0;-1:-1:-1;;;26343:53:0;;15166:2:1;26343:53:0::1;::::0;::::1;15148:21:1::0;15205:2;15185:18;;;15178:30;15244:32;15224:18;;;15217:60;15294:18;;26343:53:0::1;14964:354:1::0;26343:53:0::1;-1:-1:-1::0;;;;;26572:31:0;::::1;26409:19;26572:31:::0;;;:14:::1;:31;::::0;;;;;26431:12;;26480:16;;26528:11;;26624:24;;::::1;26616:64;;;::::0;-1:-1:-1;;;26616:64:0;;15525:2:1;26616:64:0::1;::::0;::::1;15507:21:1::0;15564:2;15544:18;;;15537:30;15603:29;15583:18;;;15576:57;15650:18;;26616:64:0::1;15323:351:1::0;26616:64:0::1;-1:-1:-1::0;;;;;26714:27:0;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:40;;;;;;;;:47:::1;;::::0;::::1;;26713:48;26691:128;;;::::0;-1:-1:-1;;;26691:128:0;;15881:2:1;26691:128:0::1;::::0;::::1;15863:21:1::0;15920:2;15900:18;;;15893:30;15959:32;15939:18;;;15932:60;16009:18;;26691:128:0::1;15679:354:1::0;26691:128:0::1;26850:45;::::0;-1:-1:-1;;;26850:45:0;;26884:10:::1;26850:45;::::0;::::1;465:51:1::0;26832:15:0::1;::::0;-1:-1:-1;;;;;26850:33:0;::::1;::::0;::::1;::::0;438:18:1;;26850:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26832:63;;26924:11;26914:7;:21;26906:69;;;::::0;-1:-1:-1;;;26906:69:0;;16429:2:1;26906:69:0::1;::::0;::::1;16411:21:1::0;16468:2;16448:18;;;16441:30;16507:34;16487:18;;;16480:62;-1:-1:-1;;;16558:18:1;;;16551:33;16601:19;;26906:69:0::1;16227:399:1::0;26906:69:0::1;26988:13;27004:31;27024:10;27004:19;:31::i;:::-;26988:47;;27046:13;27063:8;27062:9;:143;;-1:-1:-1::0;;;;;27151:26:0;::::1;;::::0;;;:9:::1;:26;::::0;;;;;;;:38;;;;;;;;:54:::1;;::::0;27062:143:::1;;;-1:-1:-1::0;;;;;27087:26:0;::::1;;::::0;;;:9:::1;:26;::::0;;;;;;;:38;;;;;;;;:48:::1;;::::0;27062:143:::1;27240:72;::::0;-1:-1:-1;;;27240:72:0;;27296:4:::1;27240:72;::::0;::::1;465:51:1::0;27046:159:0;;-1:-1:-1;27216:21:0::1;::::0;-1:-1:-1;;;;;27240:33:0;::::1;::::0;::::1;::::0;438:18:1;;27240:72:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27216:96;;27347:55;27361:10;27373:15;27390:11;27347:13;:55::i;:::-;27325:159;;;::::0;-1:-1:-1;;;27325:159:0;;16833:2:1;27325:159:0::1;::::0;::::1;16815:21:1::0;16872:2;16852:18;;;16845:30;16911:34;16891:18;;;16884:62;-1:-1:-1;;;16962:18:1;;;16955:52;17024:19;;27325:159:0::1;16631:418:1::0;27325:159:0::1;27528:48;::::0;-1:-1:-1;;;27528:48:0;;27570:4:::1;27528:48;::::0;::::1;465:51:1::0;27505:20:0::1;::::0;-1:-1:-1;;;;;27528:33:0;::::1;::::0;::::1;::::0;438:18:1;;27528:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27505:71:::0;-1:-1:-1;27587:23:0::1;27613:28;27628:13:::0;27505:71;27613:28:::1;:::i;:::-;27587:54;;27652:21;27676:115;27715:15;27745:5;27765:15;27676:24;:115::i;:::-;27652:139;;27802:14;27840:9:::0;27835:180:::1;27859:9;:16:::0;27855:20;::::1;27835:180;;;27917:10;-1:-1:-1::0;;;;;27901:26:0::1;:9;27911:1;27901:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;27901:12:0::1;:26:::0;27897:107:::1;;27960:4;27948:16;;27983:5;;27897:107;27877:3:::0;::::1;::::0;::::1;:::i;:::-;;;;27835:180;;;-1:-1:-1::0;28029:18:0;::::1;;28042:5;28029:18:::0;28025:77:::1;;28064:9;:26:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;28064:26:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;28064:26:0::1;28079:10;28064:26;::::0;;28025:77:::1;28134:32;28152:13;28134:17;:32::i;:::-;28112:148;;;::::0;-1:-1:-1;;;28112:148:0;;17389:2:1;28112:148:0::1;::::0;::::1;17371:21:1::0;17428:2;17408:18;;;17401:30;17467:34;17447:18;;;17440:62;17538:34;17518:18;;;17511:62;-1:-1:-1;;;17589:19:1;;;17582:33;17632:19;;28112:148:0::1;17187:470:1::0;28112:148:0::1;28271:26;;:::i;:::-;28327:10;28308:29:::0;;;28348:18:::1;::::0;;::::1;:34:::0;;;28393:24:::1;::::0;::::1;:42:::0;;;-1:-1:-1;28463:26:0;;;:14:::1;:26;::::0;;;;;;;28446:14:::1;::::0;::::1;:43:::0;28500:17:::1;::::0;::::1;:25:::0;;;-1:-1:-1;;;;;28536:31:0;::::1;:13:::0;;::::1;:31:::0;;;28598:26;;:9:::1;:26:::0;;;;;:38;;;;;;;:48:::1;::::0;::::1;::::0;28680:65;;28780:37:::1;28813:3;28780:28;28348:34:::0;28598:48;28780:17:::1;:28::i;:::-;:32:::0;::::1;:37::i;:::-;28756:21;::::0;::::1;:61:::0;28850:30:::1;28868:12:::0;28850:15:::1;:30;:::i;:::-;28828:19;::::0;::::1;:52:::0;;;28891:16:::1;::::0;::::1;:31:::0;;;28941:10:::1;-1:-1:-1::0;28935:17:0;;;:5:::1;:17;::::0;;;;;;;28953:14:::1;:26:::0;;;;;;;;28935:45;;;;;;;;:55;;;;-1:-1:-1;;;;;28935:55:0;;::::1;-1:-1:-1::0;;;;;;28935:55:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;28935:55:0;;::::1;::::0;;;::::1;::::0;;29001:26;;;;;;:28;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;29040:43:0::1;::::0;29048:10:::1;::::0;29040:43;::::1;;;::::0;29069:13;;29040:43:::1;::::0;;;29069:13;29048:10;29040:43;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;29126:10;-1:-1:-1::0;;;;;29099:221:0::1;;29151:7;:18;;;29184:7;:24;;;29223:7;:21;;;29259:7;:19;;;29293:7;:16;;;29099:221;;;;;;;;;18051:25:1::0;;;18107:2;18092:18;;18085:34;;;;18150:2;18135:18;;18128:34;;;;18193:2;18178:18;;18171:34;18236:3;18221:19;;18214:35;18038:3;18023:19;;17792:463;29099:221:0::1;;;;;;;;-1:-1:-1::0;;15887:1:0;16839:22;;-1:-1:-1;;;;;;;;;;;;;;;;;26124:3204:0:o;22265:473::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22412:30:0;::::1;22390:111;;;;-1:-1:-1::0;;;22390:111:0::1;;;;;;;:::i;:::-;22512:15;22530:35;22548:16;22530:17;:35::i;:::-;22512:53;;22584:10;22576:50;;;;-1:-1:-1::0;;;22576:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22637:27:0;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:35;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;22690:40;22706:16;22724:5;22690:40;;;;;;;:::i;:::-;;;;;;;;22379:359;22265:473:::0;;:::o;35114:290::-;19349:8;;-1:-1:-1;;;;;19349:8:0;19361:10;19349:22;19341:71;;;;-1:-1:-1;;;19341:71:0;;;;;;;:::i;:::-;35183:15:::1;35201:25;35219:6;35201:17;:25::i;:::-;35183:43;;35242:10;35237:160;;35287:39;::::0;-1:-1:-1;;;35287:39:0;;35320:4:::1;35287:39;::::0;::::1;465:51:1::0;35269:15:0::1;::::0;-1:-1:-1;;;;;35287:24:0;::::1;::::0;::::1;::::0;438:18:1;;35287:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35341:44;::::0;-1:-1:-1;;;35341:44:0;;35365:10:::1;35341:44;::::0;::::1;188:51:1::0;255:18;;;248:34;;;35269:57:0;;-1:-1:-1;;;;;;35341:23:0;::::1;::::0;::::1;::::0;161:18:1;;35341:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35254:143;35237:160;35172:232;35114:290:::0;:::o;31332:485::-;-1:-1:-1;;;;;31511:21:0;;31462:28;31511:21;;;:14;:21;;;;;;31424:20;;31462:28;31493:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;31462:71;;31549:9;31544:241;-1:-1:-1;;;;;31568:21:0;;;;;;:14;:21;;;;;;31564:25;;31544:241;;;-1:-1:-1;;;;;31636:12:0;;;31611:22;31636:12;;;:5;:12;;;;;;;;:15;;;;;;;;;31611:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31670:51;;;31706:15;31688:3;:15;;;:33;31670:51;31666:108;;;31755:3;31742:7;31750:1;31742:10;;;;;;;;:::i;:::-;;;;;;:16;;;;31666:108;-1:-1:-1;31591:3:0;;;;:::i;:::-;;;;31544:241;;34949:157;13094:7;13121:6;-1:-1:-1;;;;;13121:6:0;19505:10;:21;;19504:51;;-1:-1:-1;19546:8:0;;-1:-1:-1;;;;;19546:8:0;19532:10;:22;19504:51;19482:122;;;;-1:-1:-1;;;19482:122:0;;18825:2:1;19482:122:0;;;18807:21:1;18864:2;18844:18;;;18837:30;-1:-1:-1;;;18883:18:1;;;18876:51;18944:18;;19482:122:0;18623:345:1;19482:122:0;35054:44:::1;::::0;-1:-1:-1;;;35054:44:0;;35078:10:::1;35054:44;::::0;::::1;188:51:1::0;255:18;;;248:34;;;-1:-1:-1;;;;;35054:23:0;::::1;::::0;::::1;::::0;161:18:1;;35054:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34949:157:::0;;:::o;17850:26::-;;;;;;;;;;;;29336:1113;15931:1;16527:7;;:19;16519:63;;;;-1:-1:-1;;;16519:63:0;;14806:2:1;16519:63:0;;;14788:21:1;14845:2;14825:18;;;14818:30;14884:33;14864:18;;;14857:61;14935:18;;16519:63:0;14604:355:1;16519:63:0;15931:1;16660:7;:18;;;29473:10:::1;29437:27;29467:17:::0;;;:5:::1;:17;::::0;;;;;;;:22;;;;;;;;29526:13;;::::1;::::0;29572:16;;-1:-1:-1;;;;;29526:13:0;;::::1;::::0;29572:16;::::1;:30;29550:114;;;::::0;-1:-1:-1;;;29550:114:0;;19175:2:1;29550:114:0::1;::::0;::::1;19157:21:1::0;19214:2;19194:18;;;19187:30;19253:34;19233:18;;;19226:62;-1:-1:-1;;;19304:18:1;;;19297:32;19346:19;;29550:114:0::1;18973:398:1::0;29550:114:0::1;29684:17;::::0;::::1;::::0;::::1;;29683:18;29675:55;;;::::0;-1:-1:-1;;;29675:55:0;;19578:2:1;29675:55:0::1;::::0;::::1;19560:21:1::0;19617:2;19597:18;;;19590:30;19656:26;19636:18;;;19629:54;19700:18;;29675:55:0::1;19376:348:1::0;29675:55:0::1;29782:7;:19;;;29763:15;:38;;29741:112;;;::::0;-1:-1:-1;;;29741:112:0;;19931:2:1;29741:112:0::1;::::0;::::1;19913:21:1::0;19970:2;19950:18;;;19943:30;20009:26;19989:18;;;19982:54;20053:18;;29741:112:0::1;19729:348:1::0;29741:112:0::1;29899:7;:21;;;29886:9;:34;;29864:109;;;::::0;-1:-1:-1;;;29864:109:0;;20284:2:1;29864:109:0::1;::::0;::::1;20266:21:1::0;20323:2;20303:18;;;20296:30;20362:27;20342:18;;;20335:55;20407:18;;29864:109:0::1;20082:349:1::0;29864:109:0::1;29984:17;::::0;::::1;:24:::0;;-1:-1:-1;;29984:24:0::1;30004:4;29984:24;::::0;;30121::::1;::::0;::::1;::::0;30041:119:::1;::::0;-1:-1:-1;;;30041:119:0;;30092:10:::1;30041:119;::::0;::::1;188:51:1::0;255:18;;;248:34;;;;-1:-1:-1;;;;;30041:32:0;::::1;::::0;::::1;::::0;161:18:1;;30041:119:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30019:226;;;::::0;-1:-1:-1;;;30019:226:0;;20638:2:1;30019:226:0::1;::::0;::::1;20620:21:1::0;20677:2;20657:18;;;20650:30;20716:34;20696:18;;;20689:62;20787:27;20767:18;;;20760:55;20832:19;;30019:226:0::1;20436:421:1::0;30019:226:0::1;30308:17;::::0;::::1;::::0;30370:21:::1;::::0;::::1;::::0;30406:24:::1;::::0;::::1;::::0;30261:180:::1;::::0;;30283:10:::1;21115:51:1::0;;30308:17:0::1;::::0;;::::1;21209:14:1::0;21202:22;21197:2;21182:18;;21175:50;30340:15:0::1;21241:18:1::0;;;21234:34;21299:2;21284:18;;21277:34;;;;21342:3;21327:19;;21320:35;30261:180:0;::::1;::::0;;;;21102:3:1;30261:180:0;;::::1;-1:-1:-1::0;;15887:1:0;16839:22;;-1:-1:-1;29336:1113:0:o;33117:437::-;33161:4;;;;33240:204;33264:16;:23;33260:27;;33240:204;;;33309:19;33331:36;33347:16;33364:1;33347:19;;;;;;;;:::i;33331:36::-;33309:58;-1:-1:-1;33400:32:0;:15;33309:58;33400:19;:32::i;:::-;33382:50;;33294:150;33289:3;;;;;:::i;:::-;;;;33240:204;;;-1:-1:-1;33458:19:0;;33454:67;;-1:-1:-1;33505:4:0;33454:67;33538:8;33117:437;-1:-1:-1;;33117:437:0:o;23717:252::-;23824:18;;23817:43;;-1:-1:-1;;;23817:43:0;;-1:-1:-1;;;;;483:32:1;;;23817:43:0;;;465:51:1;23782:4:0;;;;23824:18;;;23817:36;;438:18:1;;23817:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23799:61;;23885:14;;23875:7;:24;23871:68;;;-1:-1:-1;23923:4:0;;23717:252;-1:-1:-1;;23717:252:0:o;34598:343::-;13094:7;13121:6;-1:-1:-1;;;;;13121:6:0;19505:10;:21;;19504:51;;-1:-1:-1;19546:8:0;;-1:-1:-1;;;;;19546:8:0;19532:10;:22;19504:51;19482:122;;;;-1:-1:-1;;;19482:122:0;;18825:2:1;19482:122:0;;;18807:21:1;18864:2;18844:18;;;18837:30;-1:-1:-1;;;18883:18:1;;;18876:51;18944:18;;19482:122:0;18623:345:1;19482:122:0;34695:21:::1;34749:19:::0;;::::1;;34727:116;;;::::0;-1:-1:-1;;;34727:116:0;;21568:2:1;34727:116:0::1;::::0;::::1;21550:21:1::0;21607:2;21587:18;;;21580:30;21646:34;21626:18;;;21619:62;-1:-1:-1;;;21697:18:1;;;21690:45;21752:19;;34727:116:0::1;21366:411:1::0;34727:116:0::1;34909:24;::::0;34887:10:::1;::::0;;;34909:24;::::1;;;::::0;34925:7;;34854:22:::1;34909:24:::0;34854:22;34909:24;34925:7;34887:10;34909:24;::::1;;;;;;;;;;;;;::::0;::::1;;;;17628:46:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17628:46:0;;-1:-1:-1;17628:46:0;;-1:-1:-1;17628:46:0:o;31825:597::-;-1:-1:-1;;;;;32023:21:0;;31974:28;32023:21;;;:14;:21;;;;;;31936:20;;31974:28;32005:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;31974:71;;32061:9;32056:334;-1:-1:-1;;;;;32080:21:0;;;;;;:14;:21;;;;;;32076:25;;32056:334;;;-1:-1:-1;;;;;32148:12:0;;;32123:22;32148:12;;;:5;:12;;;;;;;;:15;;;;;;;;;32123:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32200:68;;;32253:15;32235:3;:15;;;:33;32200:68;:112;;;;;32297:3;:15;;;32289:5;:23;32200:112;32178:201;;;32360:3;32347:7;32355:1;32347:10;;;;;;;;:::i;:::-;;;;;;:16;;;;32178:201;-1:-1:-1;32103:3:0;;;;:::i;:::-;;;;32056:334;;24494:438;-1:-1:-1;;;;;24686:27:0;;24642:7;24686:27;;;:9;:27;;;;;;;;24662:51;;;;;;;;;;;;;;;;;24642:7;;24662:51;;24686:27;24662:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24662:51:0;;;;;;;;;;;;;;;;;;;;;;;24724:24;24765:4;:11;24751:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24751:26:0;-1:-1:-1;24798:43:0;;-1:-1:-1;;;24798:43:0;;24724:53;;-1:-1:-1;;;;;;24798:15:0;:28;;;;:43;;24827:7;;24836:4;;24798:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24798:43:0;;;;;;;;;;;;:::i;:::-;24788:53;;24852:14;24869:31;24896:3;24869:22;24884:6;24869:7;24877:1;24869:10;;;;;;;;:::i;:::-;;;;;;;:14;;:22;;;;:::i;:::-;:26;;:31::i;:::-;24852:48;24494:438;-1:-1:-1;;;;;;;24494:438:0:o;14001:281::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14104:22:0;::::1;14082:110;;;::::0;-1:-1:-1;;;14082:110:0;;23207:2:1;14082:110:0::1;::::0;::::1;23189:21:1::0;23246:2;23226:18;;;23219:30;23285:34;23265:18;;;23258:62;-1:-1:-1;;;23336:18:1;;;23329:36;23382:19;;14082:110:0::1;23005:402:1::0;14082:110:0::1;14229:6;::::0;;14208:38:::1;::::0;-1:-1:-1;;;;;14208:38:0;;::::1;::::0;14229:6;::::1;::::0;14208:38:::1;::::0;::::1;14257:6;:17:::0;;-1:-1:-1;;;;;;14257:17:0::1;-1:-1:-1::0;;;;;14257:17:0;;;::::1;::::0;;;::::1;::::0;;14001:281::o;25008:463::-;-1:-1:-1;;;;;25205:27:0;;25161:7;25205:27;;;:9;:27;;;;;;;;25181:51;;;;;;;;;;;;;;;;;25161:7;;25181:51;;25205:27;25181:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25181:51:0;;;;;;;;;;;;;;;;;;;;;;;25243:24;25284:4;:11;25270:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25270:26:0;-1:-1:-1;25317:49:0;;-1:-1:-1;;;25317:49:0;;25243:53;;-1:-1:-1;;;;;;25317:15:0;:29;;;;:49;;25347:12;;25361:4;;25317:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25317:49:0;;;;;;;;;;;;:::i;:::-;25307:59;;25377:14;25394:45;25435:3;25394:36;25423:6;25394:7;25416:1;25402:4;:11;:15;;;;:::i;:::-;25394:24;;;;;;;;:::i;:::-;;;;;;;:28;;:36;;;;:::i;170:181::-;228:7;;260:5;264:1;260;:5;:::i;:::-;248:17;;289:1;284;:6;;276:46;;;;-1:-1:-1;;;276:46:0;;23614:2:1;276:46:0;;;23596:21:1;23653:2;23633:18;;;23626:30;23692:29;23672:18;;;23665:57;23739:18;;276:46:0;23412:351:1;276:46:0;342:1;170:181;-1:-1:-1;;;170:181:0:o;25783:333::-;25956:123;;-1:-1:-1;;;25956:123:0;;-1:-1:-1;;;;;24026:15:1;;;25956:123:0;;;24008:34:1;26036:4:0;24058:18:1;;;24051:43;24110:18;;;24103:34;;;25920:4:0;;;;25956:37;;;;;23943:18:1;;25956:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25937:142;25783:333;-1:-1:-1;;;;;25783:333:0:o;737:250::-;795:7;819:1;824;819:6;815:47;;-1:-1:-1;849:1:0;842:8;;815:47;874:9;886:5;890:1;886;:5;:::i;:::-;874:17;-1:-1:-1;919:1:0;910:5;914:1;874:17;910:5;:::i;:::-;:10;902:56;;;;-1:-1:-1;;;902:56:0;;24780:2:1;902:56:0;;;24762:21:1;24819:2;24799:18;;;24792:30;24858:34;24838:18;;;24831:62;-1:-1:-1;;;24909:18:1;;;24902:31;24950:19;;902:56:0;24578:397:1;995:132:0;1053:7;1080:39;1084:1;1087;1080:39;;;;;;;;;;;;;;;;;1255:7;1290:12;1283:5;1275:28;;;;-1:-1:-1;;;1275:28:0;;;;;;;;:::i;:::-;-1:-1:-1;1314:9:0;1326:5;1330:1;1326;:5;:::i;:::-;1314:17;-1:-1:-1;1363:5:0;1367:1;1363;:5;:::i;:::-;1354;1358:1;1354;:5;:::i;:::-;:15;;;;:::i;:::-;1349:1;:20;1342:28;;;;:::i;:::-;1437:1;1135:311;-1:-1:-1;;;;1135:311:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;527:180:1;586:6;639:2;627:9;618:7;614:23;610:32;607:52;;;655:1;652;645:12;607:52;-1:-1:-1;678:23:1;;527:180;-1:-1:-1;527:180:1:o;920:173::-;988:20;;-1:-1:-1;;;;;1037:31:1;;1027:42;;1017:70;;1083:1;1080;1073:12;1017:70;920:173;;;:::o;1098:127::-;1159:10;1154:3;1150:20;1147:1;1140:31;1190:4;1187:1;1180:15;1214:4;1211:1;1204:15;1230:275;1301:2;1295:9;1366:2;1347:13;;-1:-1:-1;;1343:27:1;1331:40;;1401:18;1386:34;;1422:22;;;1383:62;1380:88;;;1448:18;;:::i;:::-;1484:2;1477:22;1230:275;;-1:-1:-1;1230:275:1:o;1510:183::-;1570:4;1603:18;1595:6;1592:30;1589:56;;;1625:18;;:::i;:::-;-1:-1:-1;1670:1:1;1666:14;1682:4;1662:25;;1510:183::o;1698:668::-;1752:5;1805:3;1798:4;1790:6;1786:17;1782:27;1772:55;;1823:1;1820;1813:12;1772:55;1859:6;1846:20;1885:4;1909:60;1925:43;1965:2;1925:43;:::i;:::-;1909:60;:::i;:::-;2003:15;;;2089:1;2085:10;;;;2073:23;;2069:32;;;2034:12;;;;2113:15;;;2110:35;;;2141:1;2138;2131:12;2110:35;2177:2;2169:6;2165:15;2189:148;2205:6;2200:3;2197:15;2189:148;;;2271:23;2290:3;2271:23;:::i;:::-;2259:36;;2315:12;;;;2222;;2189:148;;;-1:-1:-1;2355:5:1;1698:668;-1:-1:-1;;;;;;1698:668:1:o;2371:697::-;2500:6;2508;2516;2524;2532;2540;2593:3;2581:9;2572:7;2568:23;2564:33;2561:53;;;2610:1;2607;2600:12;2561:53;2633:29;2652:9;2633:29;:::i;:::-;2623:39;;2709:2;2698:9;2694:18;2681:32;2671:42;;2760:2;2749:9;2745:18;2732:32;2722:42;;2811:2;2800:9;2796:18;2783:32;2773:42;;2862:3;2851:9;2847:19;2834:33;2824:43;;2918:3;2907:9;2903:19;2890:33;2946:18;2938:6;2935:30;2932:50;;;2978:1;2975;2968:12;2932:50;3001:61;3054:7;3045:6;3034:9;3030:22;3001:61;:::i;:::-;2991:71;;;2371:697;;;;;;;;:::o;3073:529::-;3177:6;3185;3193;3201;3209;3217;3270:3;3258:9;3249:7;3245:23;3241:33;3238:53;;;3287:1;3284;3277:12;3238:53;3310:29;3329:9;3310:29;:::i;:::-;3300:39;3386:2;3371:18;;3358:32;;-1:-1:-1;3437:2:1;3422:18;;3409:32;;3488:2;3473:18;;3460:32;;-1:-1:-1;3539:3:1;3524:19;;3511:33;;-1:-1:-1;3591:3:1;3576:19;3563:33;;-1:-1:-1;3073:529:1;-1:-1:-1;;;3073:529:1:o;3607:248::-;3675:6;3683;3736:2;3724:9;3715:7;3711:23;3707:32;3704:52;;;3752:1;3749;3742:12;3704:52;-1:-1:-1;;3775:23:1;;;3845:2;3830:18;;;3817:32;;-1:-1:-1;3607:248:1:o;3860:186::-;3919:6;3972:2;3960:9;3951:7;3947:23;3943:32;3940:52;;;3988:1;3985;3978:12;3940:52;4011:29;4030:9;4011:29;:::i;4329:1452::-;4558:2;4610:21;;;4680:13;;4583:18;;;4702:22;;;4529:4;;4558:2;4743;;4761:18;;;;4802:15;;;4529:4;4845:910;4859:6;4856:1;4853:13;4845:910;;;4918:13;;5002:9;;-1:-1:-1;;;;;4998:18:1;;;4986:31;;5061:11;;;5055:18;5051:27;5037:12;;;5030:49;5119:11;;;5113:18;5099:12;;;5092:40;5155:4;5199:11;;;5193:18;5179:12;;;5172:40;5235:4;5279:11;;;5273:18;5259:12;;;5252:40;4962:3;5359:11;;;5353:18;5339:12;;;5332:40;5395:4;5439:11;;;5433:18;5419:12;;;5412:40;5475:4;5519:11;;;5513:18;5499:12;;;5492:40;5556:6;5601:12;;;5595:19;4303:13;4296:21;5657:13;;;4284:34;5700:6;5691:16;;;;5730:15;;;;4881:1;4874:9;4845:910;;;-1:-1:-1;5772:3:1;;4329:1452;-1:-1:-1;;;;;;;4329:1452:1:o;5978:118::-;6064:5;6057:13;6050:21;6043:5;6040:32;6030:60;;6086:1;6083;6076:12;6030:60;5978:118;:::o;6101:383::-;6175:6;6183;6191;6244:2;6232:9;6223:7;6219:23;6215:32;6212:52;;;6260:1;6257;6250:12;6212:52;6283:29;6302:9;6283:29;:::i;:::-;6273:39;;6359:2;6348:9;6344:18;6331:32;6321:42;;6413:2;6402:9;6398:18;6385:32;6426:28;6448:5;6426:28;:::i;:::-;6473:5;6463:15;;;6101:383;;;;;:::o;6489:254::-;6557:6;6565;6618:2;6606:9;6597:7;6593:23;6589:32;6586:52;;;6634:1;6631;6624:12;6586:52;6657:29;6676:9;6657:29;:::i;:::-;6647:39;6733:2;6718:18;;;;6705:32;;-1:-1:-1;;;6489:254:1:o;6748:322::-;6825:6;6833;6841;6894:2;6882:9;6873:7;6869:23;6865:32;6862:52;;;6910:1;6907;6900:12;6862:52;6933:29;6952:9;6933:29;:::i;:::-;6923:39;7009:2;6994:18;;6981:32;;-1:-1:-1;7060:2:1;7045:18;;;7032:32;;6748:322;-1:-1:-1;;;6748:322:1:o;7075:422::-;7168:6;7176;7229:2;7217:9;7208:7;7204:23;7200:32;7197:52;;;7245:1;7242;7235:12;7197:52;7268:29;7287:9;7268:29;:::i;:::-;7258:39;;7348:2;7337:9;7333:18;7320:32;7375:18;7367:6;7364:30;7361:50;;;7407:1;7404;7397:12;7361:50;7430:61;7483:7;7474:6;7463:9;7459:22;7430:61;:::i;:::-;7420:71;;;7075:422;;;;;:::o;8802:356::-;9004:2;8986:21;;;9023:18;;;9016:30;9082:34;9077:2;9062:18;;9055:62;9149:2;9134:18;;8802:356::o;9163:355::-;9365:2;9347:21;;;9404:2;9384:18;;;9377:30;9443:33;9438:2;9423:18;;9416:61;9509:2;9494:18;;9163:355::o;9523:350::-;9725:2;9707:21;;;9764:2;9744:18;;;9737:30;9803:28;9798:2;9783:18;;9776:56;9864:2;9849:18;;9523:350::o;10230:127::-;10291:10;10286:3;10282:20;10279:1;10272:31;10322:4;10319:1;10312:15;10346:4;10343:1;10336:15;10362:135;10401:3;10422:17;;;10419:43;;10442:18;;:::i;:::-;-1:-1:-1;10489:1:1;10478:13;;10362:135::o;10996:351::-;11198:2;11180:21;;;11237:2;11217:18;;;11210:30;11276:29;11271:2;11256:18;;11249:57;11338:2;11323:18;;10996:351::o;11703:127::-;11764:10;11759:3;11755:20;11752:1;11745:31;11795:4;11792:1;11785:15;11819:4;11816:1;11809:15;12896:400;13098:2;13080:21;;;13137:2;13117:18;;;13110:30;13176:34;13171:2;13156:18;;13149:62;-1:-1:-1;;;13242:2:1;13227:18;;13220:34;13286:3;13271:19;;12896:400::o;13301:245::-;13368:6;13421:2;13409:9;13400:7;13396:23;13392:32;13389:52;;;13437:1;13434;13427:12;13389:52;13469:9;13463:16;13488:28;13510:5;13488:28;:::i;13551:461::-;13604:3;13642:5;13636:12;13669:6;13664:3;13657:19;13695:4;13724:2;13719:3;13715:12;13708:19;;13761:2;13754:5;13750:14;13782:1;13792:195;13806:6;13803:1;13800:13;13792:195;;;13871:13;;-1:-1:-1;;;;;13867:39:1;13855:52;;13927:12;;;;13962:15;;;;13903:1;13821:9;13792:195;;;-1:-1:-1;14003:3:1;;13551:461;-1:-1:-1;;;;;13551:461:1:o;14017:582::-;14316:6;14305:9;14298:25;14359:6;14354:2;14343:9;14339:18;14332:34;14402:3;14397:2;14386:9;14382:18;14375:31;14279:4;14423:57;14475:3;14464:9;14460:19;14452:6;14423:57;:::i;:::-;-1:-1:-1;;;;;14516:32:1;;;;14511:2;14496:18;;14489:60;-1:-1:-1;14580:3:1;14565:19;14558:35;14415:65;14017:582;-1:-1:-1;;;14017:582:1:o;16038:184::-;16108:6;16161:2;16149:9;16140:7;16136:23;16132:32;16129:52;;;16177:1;16174;16167:12;16129:52;-1:-1:-1;16200:16:1;;16038:184;-1:-1:-1;16038:184:1:o;17054:128::-;17121:9;;;17142:11;;;17139:37;;;17156:18;;:::i;17662:125::-;17727:9;;;17748:10;;;17745:36;;;17761:18;;:::i;18260:358::-;-1:-1:-1;;;;;18467:32:1;;18449:51;;18536:2;18531;18516:18;;18509:30;;;-1:-1:-1;;18556:56:1;;18593:18;;18585:6;18556:56;:::i;21782:332::-;21989:6;21978:9;21971:25;22032:2;22027;22016:9;22012:18;22005:30;21952:4;22052:56;22104:2;22093:9;22089:18;22081:6;22052:56;:::i;22119:881::-;22214:6;22245:2;22288;22276:9;22267:7;22263:23;22259:32;22256:52;;;22304:1;22301;22294:12;22256:52;22337:9;22331:16;22370:18;22362:6;22359:30;22356:50;;;22402:1;22399;22392:12;22356:50;22425:22;;22478:4;22470:13;;22466:27;-1:-1:-1;22456:55:1;;22507:1;22504;22497:12;22456:55;22536:2;22530:9;22559:60;22575:43;22615:2;22575:43;:::i;22559:60::-;22653:15;;;22735:1;22731:10;;;;22723:19;;22719:28;;;22684:12;;;;22759:19;;;22756:39;;;22791:1;22788;22781:12;22756:39;22815:11;;;;22835:135;22851:6;22846:3;22843:15;22835:135;;;22917:10;;22905:23;;22868:12;;;;22948;;;;22835:135;;24148:168;24221:9;;;24252;;24269:15;;;24263:22;;24249:37;24239:71;;24290:18;;:::i;24321:127::-;24382:10;24377:3;24373:20;24370:1;24363:31;24413:4;24410:1;24403:15;24437:4;24434:1;24427:15;24453:120;24493:1;24519;24509:35;;24524:18;;:::i;:::-;-1:-1:-1;24558:9:1;;24453:120::o;24980:548::-;25092:4;25121:2;25150;25139:9;25132:21;25182:6;25176:13;25225:6;25220:2;25209:9;25205:18;25198:34;25250:1;25260:140;25274:6;25271:1;25268:13;25260:140;;;25369:14;;;25365:23;;25359:30;25335:17;;;25354:2;25331:26;25324:66;25289:10;;25260:140;;;25264:3;25449:1;25444:2;25435:6;25424:9;25420:22;25416:31;25409:42;25519:2;25512;25508:7;25503:2;25495:6;25491:15;25487:29;25476:9;25472:45;25468:54;25460:62;;;;24980:548;;;;:::o;25533:112::-;25565:1;25591;25581:35;;25596:18;;:::i;:::-;-1:-1:-1;25630:9:1;;25533:112::o;25650:127::-;25711:10;25706:3;25702:20;25699:1;25692:31;25742:4;25739:1;25732:15;25766:4;25763:1;25756:15

Swarm Source

ipfs://6c0cbcf552323b1621e997c4d0a53688cbcf3d54515338adda293f2f5126b1c5

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.