ETH Price: $1,566.64 (-0.82%)

Contract

0x37EE78e65eced6433ce8e55B1764Ad37011c2c3A
 

Overview

ETH Balance

0.007100445049554226 ETH

Eth Value

$11.12 (@ $1,566.64/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
SELL147462632022-05-10 3:29:021063 days ago1652153342IN
0x37EE78e6...7011c2c3A
0 ETH0.0215383659.31113612
BUY147362212022-05-08 12:58:121065 days ago1652014692IN
0x37EE78e6...7011c2c3A
0.07919348 ETH0.0066371820.23865101
SELL147344642022-05-08 6:21:501065 days ago1651990910IN
0x37EE78e6...7011c2c3A
0 ETH0.0199720238.17370233
SELL147287502022-05-07 8:40:511066 days ago1651912851IN
0x37EE78e6...7011c2c3A
0 ETH0.0141159340.79255555
SELL147078522022-05-04 0:34:031069 days ago1651624443IN
0x37EE78e6...7011c2c3A
0 ETH0.0175711552.65773924
SELL146635022022-04-27 1:15:081076 days ago1651022108IN
0x37EE78e6...7011c2c3A
0 ETH0.0097191228.08557343
BUY146634772022-04-27 1:09:301076 days ago1651021770IN
0x37EE78e6...7011c2c3A
0.5 ETH0.0115692939.38375909
Deposit Internal146118672022-04-18 22:42:251085 days ago1650321745IN
0x37EE78e6...7011c2c3A
0 ETH0.0036999229.29171675
BUY145588662022-04-10 15:59:171093 days ago1649606357IN
0x37EE78e6...7011c2c3A
0.015 ETH0.0152216651
BUY145526832022-04-09 16:47:331094 days ago1649522853IN
0x37EE78e6...7011c2c3A
0.5 ETH0.0117790840.09790883
BUY145526532022-04-09 16:40:311094 days ago1649522431IN
0x37EE78e6...7011c2c3A
0.5 ETH0.0126656143.11580854
SELL145524192022-04-09 15:49:301094 days ago1649519370IN
0x37EE78e6...7011c2c3A
0 ETH0.0157648845.55771145
SELL145524062022-04-09 15:46:041094 days ago1649519164IN
0x37EE78e6...7011c2c3A
0 ETH0.014910841.06053932
SELL144965792022-03-31 22:17:121103 days ago1648765032IN
0x37EE78e6...7011c2c3A
0 ETH0.0141894338.81997126
SELL144922092022-03-31 6:05:281103 days ago1648706728IN
0x37EE78e6...7011c2c3A
0 ETH0.0215968143.53432162
BUY144755622022-03-28 15:50:581106 days ago1648482658IN
0x37EE78e6...7011c2c3A
0.27 ETH0.0235083578.75760567
SELL144664492022-03-27 5:47:571107 days ago1648360077IN
0x37EE78e6...7011c2c3A
0 ETH0.0067739419.57480751
SELL143908572022-03-15 11:24:351119 days ago1647343475IN
0x37EE78e6...7011c2c3A
0 ETH0.0027218218.60633792
SELL143908572022-03-15 11:24:351119 days ago1647343475IN
0x37EE78e6...7011c2c3A
0 ETH0.0050513815.13978244
BUY143873922022-03-14 22:18:591120 days ago1647296339IN
0x37EE78e6...7011c2c3A
0.15 ETH0.0108738838.64510049
BUY143873902022-03-14 22:18:301120 days ago1647296310IN
0x37EE78e6...7011c2c3A
0.15 ETH0.0110090436.88395481
SELL143693652022-03-12 2:51:501122 days ago1647053510IN
0x37EE78e6...7011c2c3A
0 ETH0.0081862823.65773285
BUY143261162022-03-05 9:43:361129 days ago1646473416IN
0x37EE78e6...7011c2c3A
0.08 ETH0.0075437625.27410585
SELL142555682022-02-22 11:24:191140 days ago1645529059IN
0x37EE78e6...7011c2c3A
0 ETH0.011834234.19874637
BUY142029272022-02-14 7:30:341148 days ago1644823834IN
0x37EE78e6...7011c2c3A
0.16964054 ETH0.0097175634.53561002
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-147462632022-05-10 3:29:021063 days ago1652153342
0x37EE78e6...7011c2c3A
0.64905229 ETH
-147462632022-05-10 3:29:021063 days ago1652153342
0x37EE78e6...7011c2c3A
0.65003968 ETH
-147462632022-05-10 3:29:021063 days ago1652153342
0x37EE78e6...7011c2c3A
0.00087329 ETH
-147362212022-05-08 12:58:121065 days ago1652014692
0x37EE78e6...7011c2c3A
0.00099804 ETH
-147362212022-05-08 12:58:121065 days ago1652014692
0x37EE78e6...7011c2c3A
0.07919348 ETH
-147344642022-05-08 6:21:501065 days ago1651990910
0x37EE78e6...7011c2c3A
0.00545649 ETH
-147344642022-05-08 6:21:501065 days ago1651990910
0x37EE78e6...7011c2c3A
0.00545649 ETH
-147344642022-05-08 6:21:501065 days ago1651990910
0x37EE78e6...7011c2c3A
0.64430616 ETH
-147344642022-05-08 6:21:501065 days ago1651990910
0x37EE78e6...7011c2c3A
0.64528632 ETH
-147344642022-05-08 6:21:501065 days ago1651990910
0x37EE78e6...7011c2c3A
0.0010006 ETH
-147287502022-05-07 8:40:511066 days ago1651912851
0x37EE78e6...7011c2c3A
0.30375098 ETH
-147287502022-05-07 8:40:511066 days ago1651912851
0x37EE78e6...7011c2c3A
0.30421307 ETH
-147287502022-05-07 8:40:511066 days ago1651912851
0x37EE78e6...7011c2c3A
0.00107753 ETH
-147078522022-05-04 0:34:031069 days ago1651624443
0x37EE78e6...7011c2c3A
0.4909184 ETH
-147078522022-05-04 0:34:031069 days ago1651624443
0x37EE78e6...7011c2c3A
0.49166522 ETH
-146635022022-04-27 1:15:081076 days ago1651022108
0x37EE78e6...7011c2c3A
0.47271982 ETH
-146635022022-04-27 1:15:081076 days ago1651022108
0x37EE78e6...7011c2c3A
0.47343895 ETH
-146635022022-04-27 1:15:081076 days ago1651022108
0x37EE78e6...7011c2c3A
0.00102204 ETH
-146634772022-04-27 1:09:301076 days ago1651021770
0x37EE78e6...7011c2c3A
0.00116805 ETH
-146634772022-04-27 1:09:301076 days ago1651021770
0x37EE78e6...7011c2c3A
0.5 ETH
-145588662022-04-10 15:59:171093 days ago1649606357
0x37EE78e6...7011c2c3A
0.015 ETH
-145526832022-04-09 16:47:331094 days ago1649522853
0x37EE78e6...7011c2c3A
0.00133491 ETH
-145526832022-04-09 16:47:331094 days ago1649522853
0x37EE78e6...7011c2c3A
0.5 ETH
-145526532022-04-09 16:40:311094 days ago1649522431
0x37EE78e6...7011c2c3A
0.00152561 ETH
-145526532022-04-09 16:40:311094 days ago1649522431
0x37EE78e6...7011c2c3A
0.5 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FEGexPRO

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 5 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

pragma solidity 0.8.7;     
// SPDX-License-Identifier: UNLICENSED 

// FEGex  PRO  Pair  Deployer

contract FEGmath {

    function btoi(uint256 a)
        internal pure
        returns (uint256)
    {
        return a / 1e18;
    }

    function bfloor(uint256 a)
        internal pure
        returns (uint256)
    {
        return btoi(a) * 1e18;
    }

    function badd(uint256 a, uint256 b)
        internal pure
        returns (uint256)
    {
        uint256 c = a + b;
        require(c >= a, "ERR_ADD_OVERFLOW");
        return c;
    }

    function bsub(uint256 a, uint256 b)
        internal pure
        returns (uint256)
    {
        (uint256 c, bool flag) = bsubSign(a, b);
        require(!flag, "ERR_SUB_UNDERFLOW");
        return c;
    }

    function bsubSign(uint256 a, uint256 b)
        internal pure
        returns (uint, bool)
    {
        if (a >= b) {
            return (a - b, false);
        } else {
            return (b - a, true);
        }
    }

    function bmul(uint256 a, uint256 b)
        internal pure
        returns (uint256)
    {
        uint256 c0 = a * b;
        require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW");
        uint256 c1 = c0 + (1e18 / 2);
        require(c1 >= c0, "ERR_MUL_OVERFLOW");
        uint256 c2 = c1 / 1e18;
        return c2;
    }

    function bdiv(uint256 a, uint256 b)
        internal pure
        returns (uint256)
    {
        require(b != 0, "ERR_DIV_ZERO");
        uint256 c0 = a * 1e18;
        require(a == 0 || c0 / a == 1e18, "ERR_DIV_INTERNAL"); // bmul overflow
        uint256 c1 = c0 + (b / 2);
        require(c1 >= c0, "ERR_DIV_INTERNAL"); //  badd require
        uint256 c2 = c1 / b;
        return c2;
    }

    function bpowi(uint256 a, uint256 n)
        internal pure
        returns (uint256)
    {
        uint256 z = n % 2 != 0 ? a : 1e18;

        for (n /= 2; n != 0; n /= 2) {
            a = bmul(a, a);

            if (n % 2 != 0) {
                z = bmul(z, a);
            }
        }
        return z;
    }

    function bpow(uint256 base, uint256 exp)
        internal pure
        returns (uint256)
    {
        require(base >= 1 wei, "ERR_BPOW_BASE_TOO_LOW");
        require(base <= (2 * 1e18) - 1 wei, "ERR_BPOW_BASE_TOO_HIGH");

        uint256 whole  = bfloor(exp);
        uint256 remain = bsub(exp, whole);

        uint256 wholePow = bpowi(base, btoi(whole));

        if (remain == 0) {
            return wholePow;
        }

        uint256 partialResult = bpowApprox(base, remain, 1e18 / 1e10);
        return bmul(wholePow, partialResult);
    }

    function bpowApprox(uint256 base, uint256 exp, uint256 precision)
        internal pure
        returns (uint256)
    {
        uint256 a     = exp;
        (uint256 x, bool xneg)  = bsubSign(base, 1e18);
        uint256 term = 1e18;
        uint256 sum   = term;
        bool negative = false;


        for (uint256 i = 1; term >= precision; i++) {
            uint256 bigK = i * 1e18;
            (uint256 c, bool cneg) = bsubSign(a, bsub(bigK, 1e18));
            term = bmul(term, bmul(c, x));
            term = bdiv(term, bigK);
            if (term == 0) break;

            if (xneg) negative = !negative;
            if (cneg) negative = !negative;
            if (negative) {
                sum = bsub(sum, term);
            } else {
                sum = badd(sum, term);
            }
        }

        return sum;
    }
}

contract FMath is FEGmath {
    
        function calcSpotPrice(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 swapFee
    )
        public pure
        returns (uint256 spotPrice)
    {
        uint256 numer = bdiv(tokenBalanceIn, tokenWeightIn);
        uint256 denom = bdiv(tokenBalanceOut, tokenWeightOut);
        uint256 ratio = bdiv(numer, denom);
        uint256 scale = bdiv(10**18, bsub(10**18, swapFee));
        return  (spotPrice = bmul(ratio, scale));
    }


    function calcOutGivenIn(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountIn,
        uint256 swapFee
    )
        public pure
        returns (uint256 tokenAmountOut, uint256 tokenInFee)
    {
        uint256 weightRatio = bdiv(tokenWeightIn, tokenWeightOut);
        uint256 adjustedIn = bsub(10**18, swapFee);
        adjustedIn = bmul(tokenAmountIn, adjustedIn);
        uint256 y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
        uint256 foo = bpow(y, weightRatio);
        uint256 bar = bsub(1e18, foo);
        tokenAmountOut = bmul(tokenBalanceOut, bar);
        tokenInFee = bsub(tokenAmountIn, adjustedIn);
        return (tokenAmountOut, tokenInFee);
    }


    function calcInGivenOut(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountOut,
        uint256 swapFee
    )
        public pure
        returns (uint256 tokenAmountIn, uint256 tokenInFee)
    {
        uint256 weightRatio = bdiv(tokenWeightOut, tokenWeightIn);
        uint256 diff = bsub(tokenBalanceOut, tokenAmountOut);
        uint256 y = bdiv(tokenBalanceOut, diff);
        uint256 foo = bpow(y, weightRatio);
        foo = bsub(foo, 1e18);
        foo = bmul(tokenBalanceIn, foo);
        tokenAmountIn = bsub(1e18, swapFee);
        tokenAmountIn = bdiv(foo, tokenAmountIn);
        tokenInFee = bdiv(foo, 1e18);
        tokenInFee = bsub(tokenAmountIn, tokenInFee);
        return (tokenAmountIn, tokenInFee);
    }
}

interface IERC20 {

    function totalSupply() external view returns (uint256);
    function balanceOf(address whom) external view returns (uint256);
    function allowance(address src, address dst) external view returns (uint256);
    function approve(address dst, uint256 amt) external returns (bool);
    function transfer(address dst, uint256 amt) external returns (bool);
    function transferFrom(
        address src, address dst, uint256 amt
    ) external returns (bool);
}

interface wrap {
    function deposit() external payable;
    function withdraw(uint256 amt) external;
    function transfer(address recipient, uint256 amount) external returns (bool);
}

interface swap {
    function depositInternal(address asset, uint256 amt) external;
    function payMain(address payee, uint256 amount) external;
    function payToken(address payee, uint256 amount) external;
    function BUY(uint256 dot, address to, uint256 minAmountOut) external payable;
}

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

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

library Address {
    
    function isContract(address account) internal view returns (bool) {
         bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
    
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
   
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract LPTokenBase is FEGmath {

    mapping(address => uint256)                   internal _balance;
    mapping(address => mapping(address=>uint256)) internal _allowance;
    uint256 public totalSupply = 0;
    event Approval(address indexed src, address indexed dst, uint256 amt);
    event Transfer(address indexed src, address indexed dst, uint256 amt);
    
    function _mint(uint256 amt) internal {
        _balance[address(this)] = badd(_balance[address(this)], amt);
        totalSupply = badd(totalSupply, amt);
        emit Transfer(address(0), address(this), amt);
    }

    function _burn(uint256 amt) internal {
        require(_balance[address(this)] >= amt);
        _balance[address(this)] = bsub(_balance[address(this)], amt);
        totalSupply = bsub(totalSupply, amt);
        emit Transfer(address(this), address(0), amt);
    }

    function _move(address src, address dst, uint256 amt) internal {
        require(_balance[src] >= amt);
        _balance[src] = bsub(_balance[src], amt);
        _balance[dst] = badd(_balance[dst], amt);
        emit Transfer(src, dst, amt);
    }

    function _push(address to, uint256 amt) internal {
        _move(address(this), to, amt);
    }

    function _pull(address from, uint256 amt) internal {
        _move(from, address(this), amt);
    }
}

contract LPToken is LPTokenBase {

    string  public name     = "FEGex PRO";
    string  public symbol   = "LP Token";
    uint8   public decimals = 18;

    function allowance(address src, address dst) external view returns (uint256) {
        return _allowance[src][dst];
    }

    function balanceOf(address whom) external view returns (uint256) {
        return _balance[whom];
    }

    function approve(address dst, uint256 amt) external returns (bool) {
        _allowance[msg.sender][dst] = amt;
        emit Approval(msg.sender, dst, amt);
        return true;
    }

    function increaseApproval(address dst, uint256 amt) external returns (bool) {
        _allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt);
        emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
        return true;
    }

    function decreaseApproval(address dst, uint256 amt) external returns (bool) {
        uint256 oldValue = _allowance[msg.sender][dst];
        if (amt > oldValue) {
            _allowance[msg.sender][dst] = 0;
        } else {
            _allowance[msg.sender][dst] = bsub(oldValue, amt);
        }
        emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
        return true;
    }
}

contract FEXEXDeployer{
    using Address for address;
    event PairCreated(address indexed token0, address indexed token1, address pair, uint256);

    mapping(address => mapping(address => address)) public getPair;
    address[] public allPairs;
    address private made = 0x0f8bAA9bf4e0Ebaa9111F07F8125DF66166A1D9E; 
    address private Main = 0xf786c34106762Ab4Eeb45a51B42a62470E9D5332;
    address private fegp = 0xf2bda964ec2D2fcB1610c886eD4831bf58f64948;
    mapping(address=>bool) private docked;
    
    function dockPair(address token, address token1, bool _bool) public {
        require(msg.sender == 0x86882FA66aC57039b10D78e2D3205592A44664c0);
        docked[token] = _bool;
        docked[token1] = _bool;
    }
    
    function changeStake(address fegstake, address _fegp) public{
        require(msg.sender == 0x86882FA66aC57039b10D78e2D3205592A44664c0);    
       made = fegstake; 
       fegp = _fegp;
    }
    
    function createPair(address token, uint256 liqmain, uint256 liqtoken) external returns (address pair) {
        
        require(getPair[Main][token] == address(0), "FEGex: PAIR_EXISTS");
        require(docked[token] == false, "Cannot use docked token");
        bytes memory bytecode = type(FEGexPRO).creationCode;
        bytes32 salt = keccak256(abi.encodePacked(Main, token));
        assembly {
            pair := create2(0, add(bytecode, 32), mload(bytecode), salt)
        }
        TransferHelper.safeTransferFrom(Main, msg.sender, address(pair), liqmain);
        TransferHelper.safeTransferFrom(token, msg.sender, address(pair), liqtoken);
        FEgexPair(pair).initialize(token, msg.sender, made, fegp, 1001); 
        
        getPair[Main][token] = pair;
        allPairs.push(pair);
    
        FEgexPair(pair).deploySwap(msg.sender, liqmain, liqtoken);
        
        emit PairCreated(Main, token, pair, allPairs.length);
    }
    
    function getPairContract(address tokenA, address tokenB) public view returns(address){
        return getPair[tokenA][tokenB];
    }
}


interface FEgexPair {
    function initialize(address, address, address, address, uint256) external; 
    function deploySwap (address, uint256, uint256) external;
    function userBalanceInternal(address _addr) external returns (uint256, uint256);
}

contract FEGexPRO is LPToken, FMath {
    using Address for address;
    struct Record {
        uint256 index;
        uint256 balance;
    }
    
    struct userLock {
        bool setLock; // true = lockedLiquidity, false = unlockedLiquidity
        uint256 unlockTime; // time liquidity can be released
    }
    
    function getUserLock(address usr) public view returns(bool lock){
        return (_userlock[usr].setLock);
    }

    event LOG_SWAP(
        address indexed caller,
        address indexed tokenIn,
        address indexed tokenOut,
        uint256         tokenAmountIn,
        uint256         tokenAmountOut
);

    event LOG_JOIN(
        address indexed caller,
        address indexed tokenIn,
        uint256         tokenAmountIn,
        uint256         reservesAmount
);

    event LOG_EXIT(
        address indexed caller,
        address indexed tokenOut,
        uint256         tokenAmountOut,
        uint256         reservesAmount
    );

    event LOG_SMARTSWAP(
        address indexed caller,
        address indexed tokenIn,
        address indexed tokenOut,
        uint256         AmountIn,
        uint256         AmountOut
);

    event LOG_CALL(
        bytes4  indexed sig,
        address indexed caller,
        bytes           data
    ) anonymous;

    modifier _logs_() {
        emit LOG_CALL(msg.sig, msg.sender, msg.data);
        _;
    }

    uint256 private spec;
    address private _controller = 0x4c9BC793716e8dC05d1F48D8cA8f84318Ec3043C; 
    address private _setter = 0x86882FA66aC57039b10D78e2D3205592A44664c0;
    address private fegp;
    address private FEG = 0x389999216860AB8E0175387A0c90E5c52522C945;
    address private burn = 0x000000000000000000000000000000000000dEaD;
    address public _poolOwner;
    address public Main = 0xf786c34106762Ab4Eeb45a51B42a62470E9D5332;
    address public Token;
    address public pairRewardPool;
    address public FEGstake;
    address public Bonus;
    uint256 public MAX_BUY_RATIO;
    uint256 public MAX_SELL_RATIO;
    uint256 public PSS = 20; // pairRewardPool Share 0.2% default
    uint256 public RPF = 1000; // Smart Rising Price Floor Setting
    address[] private _tokens;
    uint256 public _totalSupply1;
    uint256 public _totalSupply2;
    uint256 public _totalSupply7;
    uint256 public _totalSupply8;
    uint256 public lockedLiquidity;
    uint256 public totalSentRebates;
    bool private live = false;
    bool public open = false;
    mapping(address=>Record) private  _records;
    mapping(address=>userLock) private  _userlock;
    mapping(address=>userLock) public  _unlockTime;
    mapping(address=>bool) private whiteListContract;
    mapping(address => uint256) private _balances1;
    mapping(address => uint256) private _balances2;
    uint256 private constant MAX_RATIO  = 50; // Max ratio for all trades based on liquidity amount
    uint256 public tx1;
    uint256 public tx2;
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status = _NOT_ENTERED;
    modifier nonReentrant() {
        
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        _status = _ENTERED;

        _;

        _status = _NOT_ENTERED;
    }
   
    function initialize( address _token1, address owner, address _made, address _fegp, uint256 ol) external{
        require(live == false, "Can only use once");
        Token = _token1;
        _poolOwner = owner;
        pairRewardPool = owner;
        spec = ol;
        fegp = _fegp;
        FEGstake = _made;
        MAX_SELL_RATIO = bmul(IERC20(Token).totalSupply(), bdiv(1, 5));
        MAX_BUY_RATIO = 100e18;   
    }
    
    receive() external payable {
    }

    function userBalanceInternal(address _addr) public view returns(uint256, uint256) {
        uint256 main  = _balances2[_addr];
        uint256 token = _balances1[_addr];
        return (token, main);
    } 
    
    function isContract(address account) internal view returns(bool) {
        
        if(IsWhiteListContract(account)) {  return false; }
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
    
    function addWhiteListContract(address _addy, bool boolean) public {
        require(msg.sender == _setter, "You do not have permission");
        whiteListContract[_addy] = boolean;
    }
    
    function IsWhiteListContract(address _addy) public view returns(bool){
        return whiteListContract[_addy];
    }
    
    modifier noContract() {
        require(isContract(msg.sender) == false, "Unapproved contracts are not allowed to interact with the swap");
        _;
    }
    
    function sync() public {  // updates the liquidity to current state
        _records[Token].balance = IERC20(Token).balanceOf(address(this)) - _totalSupply1;  
        uint256 al = (_totalSupply2 +_totalSupply7 + _totalSupply8);
        _records[Main].balance = IERC20(Main).balanceOf(address(this)) - al;
        
    }
    
    function setMaxBuySellRatio(uint256 sellmax, uint256 buymax) public {
        require(msg.sender == _poolOwner, "You do not have permission");
        uint256 tob = IERC20(Token).totalSupply();
        require (sellmax >= tob/1000 && sellmax <= tob, "min 0.1% of token supply, max 100% of token supply"); 
        require (buymax >= 1e18, "1 ETH minimum");
        MAX_SELL_RATIO = sellmax;
        MAX_BUY_RATIO = buymax;
    }
    
    function openit() public{ // Since only sets to true, trading can never be turned off
        require(msg.sender == _poolOwner);
        open = true;
    }
    
    function setBonus(address _bonus) public{ // For tokens that have a 3rd party token reflection
        require(msg.sender == _poolOwner && _bonus != Main  && _bonus != Token, "Not permitted");
        Bonus = _bonus;
    }
    
    function setStakePool(address _stake, address _fegp) public {
        require(msg.sender == _setter && _fegp != address(0));
        FEGstake = _stake;
        fegp = _fegp;
    }
    
    function setPairRewardPool(address _addy) public { // Gives ability to move rewards to future staking protocols 
        require(msg.sender == _setter, "You do not have permission");
        pairRewardPool = _addy;
    }

    function getBalance(address token)
        external view
        returns (uint256)
    {
        
        return _records[token].balance;
    }

    function setCont(address manager, address set, address ad)
        external
    {
        require(msg.sender == _controller);
        _controller = manager;
        _setter = set;
        _poolOwner = ad; // Incase pool owner wallet was compromised and needs new access
    }
    
    function setLockLiquidity() public { //
        address user;
        user = msg.sender;
        bool loc = getUserLock(user);
        require(loc == false, "Liquidity already locked");
        uint256 total = IERC20(address(this)).balanceOf(user);
        userLock storage ulock = _userlock[user];
        userLock storage time = _unlockTime[user];
        ulock.setLock = true;
        time.unlockTime = block.timestamp + 90 days; 
        lockedLiquidity += total;
    }
    
    function deploySwap (address _from, uint256 liqmain, uint256 liqtoken)
        external
        {
        require(live == false, "Can only use once");
        uint256 much = IERC20(Token).balanceOf(address(this));
        uint256 much1 = IERC20(Main).balanceOf(address(this));
        _records[Token] = Record({
            index: _tokens.length,
            balance: much
            
        });
        
        _records[Main] = Record({
            index: _tokens.length,
            balance: much1
        });
        
        _tokens.push(Token);
        _tokens.push(Main);
        uint256 a = bdiv(_records[Token].balance, 1e9);
        uint256 b = bdiv(_records[Main].balance, 1e18);
        uint256 c = a + b;
        _mint(c);
        lockedLiquidity = badd(lockedLiquidity, c);
        _push(_from, c); 
        userLock storage ulock = _userlock[_from];
        userLock storage time = _unlockTime[_from];
        ulock.setLock = true;
        time.unlockTime = block.timestamp + 365 days; 
        live = true;
        tx1 = bmul(100, bdiv(much, liqtoken)); 
        tx2 = bmul(100, bdiv(much1, liqmain)); 
    }
   
    function getSpotPrice(address tokenIn, address tokenOut)
        public view
        returns (uint256 spotPrice)
    {
        
        Record storage inRecord = _records[address(tokenIn)];
        Record storage outRecord = _records[address(tokenOut)];
        return calcSpotPrice(inRecord.balance, bmul(1e18, 25), outRecord.balance, bmul(1e18, 25), 2e15);
    }
        
    function depositInternal(address asset, uint256 amt)  external nonReentrant {
        require(asset == Main || asset == Token);
        require(open == true, "Swap not opened");
        
        if(asset == Token){
        uint256 bef = _records[Token].balance;     
        _pullUnderlying(Token, msg.sender, amt);
        uint256 aft = bsub(IERC20(Token).balanceOf(address(this)), _totalSupply1);  
        uint256 finalAmount = bsub(aft, bef);  
        _totalSupply1 = badd(_totalSupply1, finalAmount);
        _balances1[msg.sender] = badd(_balances1[msg.sender], finalAmount);
        }
        else{
        uint256 bef = _records[Main].balance;
        _pullUnderlying(Main, msg.sender, amt);
        uint256 aft = bsub(IERC20(Main).balanceOf(address(this)), badd(_totalSupply2, badd(_totalSupply7, _totalSupply8)));
        uint256 finalAmount = bsub(aft, bef);
        _totalSupply2  = badd(_totalSupply2, finalAmount);
        _balances2[msg.sender] = badd(_balances2[msg.sender], finalAmount);
        }
        payStake();
    }

    function withdrawInternal(address asset, uint256 amt) external nonReentrant {
        require(asset == Main || asset == Token);
        
        if(asset == Token){
        require(_balances1[msg.sender] >= amt, "Not enough Token");
        _totalSupply1 -= amt;
        _balances1[msg.sender] -= amt;
        _pushUnderlying(Token, msg.sender, amt);
        }
        else{
        require(_balances2[msg.sender] >= amt, "Not enough Main");
        _totalSupply2 -= amt;
        _balances2[msg.sender] -= amt;
        _pushUnderlying(Main, msg.sender, amt);
        }
        payStake();
    }

    function swapToSwap(address path, address asset, address to, uint256 amt) external  nonReentrant {
        require(asset == Main || asset == Token);
        
        if(asset == Main){
        require(_balances2[msg.sender] >= amt, "Not enough Main");
        IERC20(address(Main)).approve(address(path), amt);   
        _totalSupply2 -= amt;
        _balances2[msg.sender] -= amt;
        swap(path).depositInternal(Main, amt);
        (uint256 tokens, uint256 mains) = FEgexPair(path).userBalanceInternal(address(this));
        swap(path).payMain(to, mains);
        tokens = 0;
        }
    
        else{
        require(_balances1[msg.sender] >= amt, "Not enough Token");
        IERC20(address(Token)).approve(address(path), amt);
        _totalSupply1 -= amt;
        _balances1[msg.sender] -= amt;
        swap(path).depositInternal(Token, amt);
        (uint256 tokens, uint256 mains) = FEgexPair(path).userBalanceInternal(address(this));
        swap(path).payToken(to, tokens);
        mains = 0;
        }
        payStake();
        addRebate();
    }
    
    function transfer(address dst, uint256 amt) external returns(bool) {
        bool loc = getUserLock(msg.sender);
        require(loc == false, "Liquidity is locked, you cannot remove liquidity until after lock time.");
        _move(msg.sender, dst, amt);
        return true;
    }

    function transferFrom(address src, address dst, uint256 amt) external returns(bool) {
        require(msg.sender == src || amt <= _allowance[src][msg.sender]);
        bool loc = getUserLock(msg.sender);
        require(loc == false, "Liquidity is locked, you cannot remove liquidity until after lock time.");
        _move(src, dst, amt);
        if (msg.sender != src && _allowance[src][msg.sender] != type(uint256).max) {
            _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt);
            emit Approval(msg.sender, dst, _allowance[src][msg.sender]);
        }
        return true;
    }
    
    function addBothLiquidity(uint256 poolAmountOut, uint[] calldata maxAmountsIn)
    nonReentrant
        external
    {
        
        uint256 poolTotal = totalSupply;
        uint256 ratio = bdiv(poolAmountOut, poolTotal);
        require(ratio != 0, "ERR_MATH_APPROX");
        
        
        bool loc = getUserLock(msg.sender);
        if(loc == true){
        lockedLiquidity += poolAmountOut;    
        }
        
        for (uint256 i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint256 bal = _records[t].balance;
            
            uint256 tokenAmountIn = bmul(ratio, bal); 
            require(tokenAmountIn != 0, "ERR_MATH_APPROX");
            require(tokenAmountIn <= maxAmountsIn[i], "ERR_LIMIT_IN");
            emit LOG_JOIN(msg.sender, t, tokenAmountIn, 0);
            _pullUnderlying(t, msg.sender, tokenAmountIn);
            
        }
        _mint(poolAmountOut);
        _push(msg.sender, poolAmountOut);
        payStake();
        addRebate();
        sync();
    }
   
    function removeBothLiquidity(uint256 poolAmountIn, uint[] calldata minAmountsOut)
    nonReentrant
        external
    {
        
        bool loc = getUserLock(msg.sender);
        require(loc == false, "Liquidity is locked, you cannot remove liquidity until after lock time.");
        
        uint256 poolTotal = totalSupply;
        uint256 ratio = bdiv(poolAmountIn, poolTotal);
        require(ratio != 0, "ERR_MATH_APPROX");

        _pull(msg.sender, poolAmountIn);
        _burn(poolAmountIn);
        
        for (uint256 i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint256 bal = _records[t].balance;
            uint256 tokenAmountOut = bmul(ratio, bal);
            require(tokenAmountOut != 0, "ERR_MATH_APPROX");
            require(tokenAmountOut >= minAmountsOut[i], "Minimum amount out not met");
            emit LOG_EXIT(msg.sender, t, tokenAmountOut, 0);
            _pushUnderlying(t, msg.sender, tokenAmountOut);
        }
        
        sync();
        payStake();
        addRebate();
        if(Bonus != address(0)){
        uint256 bal1 = bmul(ratio, IERC20(Bonus).balanceOf(address(this)));
        if(bal1 > 0){
        _pushUnderlying(Bonus, msg.sender, bal1);
        }
        }
    }
    
    function setTX1(uint256 amt) public {
        require(msg.sender == _setter);
        tx1 = amt;
    }
    
    function sendRebate() internal {
        uint256 re = address(this).balance / 8;
        TransferHelper.safeTransferETH(msg.sender, re);
        totalSentRebates += re;
    }
    
    function BUYSmart(
        uint256 tokenAmountIn,
        uint256 minAmountOut
    )  nonReentrant
        external 
        returns(uint256 tokenAmountOut)
    {

        require(_balances2[msg.sender] >= tokenAmountIn, "Not enough Main, deposit more");
        uint256 hold = IERC20(FEG).balanceOf(address(msg.sender));
        uint256 io = address(this).balance;
        if(io > 0 && tokenAmountIn >= 5e16 && hold >= 2e19){
        sendRebate();
        }
        
        Record storage inRecord = _records[address(Main)];
        Record storage outRecord = _records[address(Token)];

        require(tokenAmountIn <= MAX_BUY_RATIO, "ERR_BUY_IN_RATIO");
        require(tokenAmountOut <= bmul(outRecord.balance, bdiv(MAX_RATIO, 100)), "Over MAX_OUT_RATIO");
        
        uint256 tokenInFee;
        (tokenAmountOut, tokenInFee) = calcOutGivenIn(
                                            inRecord.balance,
                                            bmul(1e18, 25),
                                            outRecord.balance,
                                            bmul(1e18, 25),
                                            bmul(tokenAmountIn, bdiv(999, 1000)),
                                            0
                                        );
                                        
        require(tokenAmountOut >= minAmountOut, "Minimum amount out not met");   
        emit LOG_SMARTSWAP(msg.sender, Main, Token, tokenAmountIn, tokenAmountOut);
        _balances2[msg.sender] -= tokenAmountIn;
        _totalSupply2 -= tokenAmountIn;
        _balances1[msg.sender] += tokenAmountOut;
        _totalSupply1 += tokenAmountOut;
        _totalSupply8 += bmul(tokenAmountIn, bdiv(1, 1000));
        sync();
        
        return(tokenAmountOut);
    }
    
    function BUY(
        uint256 dot,
        address to,
        uint256 minAmountOut
    ) nonReentrant 
        external payable
        returns(uint256 tokenAmountOut)
    {
        
        require(open == true, "Swap not opened");
        
        if(Address.isContract(msg.sender) == true){ 
        require(dot == spec, "Contracts are not allowed to interact with the Swap");
        }
        
        wrap(Main).deposit{value: msg.value}();
        uint256 hold = IERC20(FEG).balanceOf(address(msg.sender));
        uint256 io = address(this).balance;
        if(io > 0 && msg.value >= 5e16 && hold >= 2e19){
        sendRebate();
        }
        
        Record storage inRecord = _records[address(Main)];
        Record storage outRecord = _records[address(Token)];
        
        require(msg.value <= MAX_BUY_RATIO, "ERR_BUY_IN_RATIO");
        require(tokenAmountOut <= bmul(outRecord.balance, bdiv(MAX_RATIO, 100)), "Over MAX_OUT_RATIO");
        
        uint256 tokenInFee;
        (tokenAmountOut, tokenInFee) = calcOutGivenIn(
                                            inRecord.balance,
                                            bmul(1e18, 25),
                                            outRecord.balance,
                                            bmul(1e18, 25),
                                            bmul(msg.value, bdiv(999, 1000)),
                                            0
                                        );
                                        
        require(tokenAmountOut >= minAmountOut, "Minimum amount out not met");
        uint256 oi = bmul(msg.value, bdiv(1, 1000));
        _totalSupply8 += bmul(oi, bdiv(tx2, 100));
        _pushUnderlying(Token, to, tokenAmountOut);
        sync();

        emit LOG_SWAP(msg.sender, Main, Token, msg.value, bmul(tokenAmountOut, bdiv(tx1, 100)));
        return(tokenAmountOut);
    }

    function SELL(
        uint256 dot,
        address to,
        uint256 tokenAmountIn,
        uint256 minAmountOut
    )  nonReentrant 
        external
        returns(uint256 tokenAmountOut)
    {
        
        require(open == true, "Swap not opened");
        if(Address.isContract(msg.sender) == true){ 
        require(dot == spec, "Contracts are not allowed to interact with the Swap");
        }
        
        require(tokenAmountIn <= MAX_SELL_RATIO, "ERR_SELL_RATIO");
        require(tokenAmountOut <= bmul(_records[Main].balance, bdiv(MAX_RATIO, 100)), "Over MAX_OUT_RATIO");
        uint256 hold = IERC20(FEG).balanceOf(address(msg.sender));
        address too = to;
        if(address(this).balance > 0 && tokenAmountOut <= 1e18 && hold >= 2e19){
        sendRebate();
        }
        
        uint256 omm = _records[Token].balance;
        _pullUnderlying(Token, msg.sender, tokenAmountIn);
        _records[Token].balance = IERC20(Token).balanceOf(address(this)) - _totalSupply1;
        uint256 noww = _records[Token].balance;
        
        uint256 tokenInFee;
        uint256 trueamount = bmul((noww - omm), bdiv(998, 1000)); // 0.2% liquidity fee
        (tokenAmountOut, tokenInFee) = calcOutGivenIn(
                                            omm,
                                            bmul(1e18, 25),
                                            _records[Main].balance,
                                            bmul(1e18, 25),
                                            trueamount,
                                            2e15
                                        );
                                        
        require(tokenAmountOut >= minAmountOut, "Minimum amount out not met");
        uint256 toka = bmul(tokenAmountOut, bdiv(RPF, 1000));
        uint256 tokAmountI  = bmul(toka, bdiv(15, 10000));
        uint256 tok = bmul(toka, bdiv(15, 10000));
        uint256 tokAmountI2 =  bmul(toka, bdiv(PSS, 10000));
        uint256 io = (toka - (tokAmountI + tok + tokAmountI2));
        uint256 tokAmountI1 = bmul(io, bdiv(999, 1000));
        uint256 ox = _balances2[address(this)];
        
        if(ox > 1e16){
        _totalSupply2 -= ox;
        _balances2[address(this)] = 0;
        }
        
        wrap(Main).withdraw(tokAmountI1 + ox + tokAmountI);
        TransferHelper.safeTransferETH(too, bmul(tokAmountI1, bdiv(tx2, 100)));
        _totalSupply8 += bmul(io, bdiv(1, 1000));
        uint256 os = bmul(tokAmountI2, bdiv(95, 100));
        _balances2[pairRewardPool] += os;
        _balances2[_controller] += tokAmountI2 - os;
        _totalSupply2 += tokAmountI2;
        _totalSupply7 += tok;
        payStake();
        addRebate();
        _records[Main].balance = IERC20(Main).balanceOf(address(this)) - (_totalSupply2 +_totalSupply7 + _totalSupply8); 
        emit LOG_SWAP(msg.sender, Token, Main, trueamount, bmul(tokAmountI1, bdiv(tx2, 100)));
        return tokenAmountOut;
    }
    
     function SELLSmart(
        uint256 tokenAmountIn,
        uint256 minAmountOut
    )  nonReentrant
        external
        returns(uint256 tokenAmountOut)
    {
        
        uint256 tai = tokenAmountIn;
        require(_balances1[msg.sender] >= tokenAmountIn, "Not enough Token");
        Record storage inRecord = _records[address(Token)];
        Record storage outRecord = _records[address(Main)];
        require(tokenAmountIn <= MAX_SELL_RATIO, "ERR_SELL_RATIO");
        require(tokenAmountOut <= bmul(outRecord.balance, bdiv(MAX_RATIO, 100)), "Over MAX_OUT_RATIO");
        
        uint256 hold = IERC20(FEG).balanceOf(address(msg.sender));
        if(address(this).balance > 0 && tokenAmountOut <= 1e18 && hold >= 2e19){
        sendRebate();
        }
        
        uint256 tokenInFee;
        (tokenAmountOut, tokenInFee) = calcOutGivenIn(
                                            inRecord.balance,
                                            bmul(1e18, 25),
                                            outRecord.balance,
                                            bmul(1e18, 25),
                                            bmul(tokenAmountIn, bdiv(998, 1000)), // 0.2% liquidity fee
                                            2e15
                                        );
        
        uint256 toka = bmul(tokenAmountOut, bdiv(RPF, 1000));
        uint256 tokAmountI  = bmul(toka, bdiv(15, 10000));
        uint256 tok = bmul(toka, bdiv(15, 10000));
        uint256 tokAmountI2 =  bmul(toka, bdiv(PSS, 10000));
        uint256 io = (toka - (tokAmountI + tok + tokAmountI2));
        uint256 tokAmountI1 = bmul(io, bdiv(999, 1000));
        _totalSupply8 += bmul(io, bdiv(1, 1000));
        require(tokAmountI1 >= minAmountOut, "Minimum amount out not met");
        _balances1[msg.sender] -= tokenAmountIn;
        _totalSupply1 -= tokenAmountIn;
        _balances2[msg.sender] += tokAmountI1;
        _balances2[address(this)] += tokAmountI;
        uint256 os = bmul(tokAmountI2, bdiv(95, 100));
        _balances2[pairRewardPool] += os;
        _balances2[_controller] += tokAmountI2 - os;
        _totalSupply2 += (tokAmountI + tokAmountI2 + tokAmountI1);
        _totalSupply7 += tok;
        sync();
        payStake();
        addRebate();
        emit LOG_SMARTSWAP(msg.sender, Token, Main, tai, tokAmountI1);
        return(tokenAmountOut);
    }
        
    function setPSSRPF(uint256 _PSS, uint256 _RPF ) external {
        require(msg.sender == _poolOwner && _records[Main].balance >= 5e18, "You do not have permission");
        
        if(_records[Main].balance >= 5e18) {// Incentive for providing higher liquidity
        require(_RPF >= 990 && _RPF <= 1000, " Cannot set over 1%"); 
        require(_PSS <= 100 && _PSS != 0, " Cannot set over 1%");
        }
        
        if(_records[Main].balance >= 25e18) {// Incentive for providing higher liquidity
        require(_RPF >= 900 && _RPF <= 1000, " Cannot set over 10%"); 
        require(_PSS <= 500 && _PSS != 0, " Cannot set over 5%");
        }
        
        RPF = _RPF;
        PSS = _PSS;
    }
    
    function releaseLiquidity() external { // Allows removal of liquidity after the lock period is over
        address user = msg.sender;
        bool loc = getUserLock(user);
        require(loc == true, "Liquidity not locked");
        uint256 total = IERC20(address(this)).balanceOf(user);
        lockedLiquidity -= total;
        userLock storage ulock = _userlock[user];
        userLock storage time = _unlockTime[user];
        require (block.timestamp >= time.unlockTime, "Liquidity is locked, you cannot remove liquidity until after lock time.");
        ulock.setLock = false; 
    }
    
    function initiateMigration(address user) external { //Incase we upgrade to PROv2 in the future, will offer a 48 hour time delay to allow releasing locked liquidity for migration to new pools.
        require(msg.sender == _controller);
        bool loc = getUserLock(user);
        require(loc == true, "Liquidity not locked");
        userLock storage time = _unlockTime[user];
        time.unlockTime = block.timestamp + 2 days;
    }

    function _pullUnderlying(address erc20, address from, uint256 amount)
        internal
    {   
        bool xfer = IERC20(erc20).transferFrom(from, address(this), amount);
        require(xfer, "ERR_ERC20_FALSE");
    }
    
    function _pushUnderlying(address erc20, address to, uint256 amount)
        internal
    {   
        bool xfer = IERC20(erc20).transfer(to, amount);
        require(xfer, "ERR_ERC20_FALSE");
    }
    
    function addRebate() internal {
        if(_totalSupply8 > 5e15){ 
        wrap(Main).withdraw(_totalSupply8);
        swap(fegp).BUY{value:bmul(_totalSupply8, bdiv(99, 100))}(1001, burn, 1);
        _totalSupply8 = 0;
        }
    }
    
    function payStake() internal {   
        if(_totalSupply7 > 5e15) {
        bool xfer = IERC20(Main).transfer(FEGstake, _totalSupply7);
        require(xfer, "ERR_ERC20_FALSE");
        _totalSupply7 = 0;
        }
    }
    
    function payMain(address payee, uint256 amount)
        external nonReentrant 
        
    {   
        require(_balances2[msg.sender] >= amount, "Not enough token");
        uint256 amt = bmul(amount, bdiv(997, 1000));
        uint256 amt1 = bsub(amount, amt);
        _balances2[msg.sender] -= amount;
        _balances2[payee] += amt;
        _balances2[_controller] += amt1;
    }
    
    function payToken(address payee, uint256 amount)
        external nonReentrant 
        
    {
        require(_balances1[msg.sender] >= amount, "Not enough token");
        uint256 amt = bmul(amount, bdiv(997, 1000));
        uint256 amt1 = bsub(amount, amt);
        _balances1[msg.sender] -= amount;
        _balances1[payee] += amt;
        _balances1[_controller] += amt1;
    }
}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"LOG_CALL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"AmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"AmountOut","type":"uint256"}],"name":"LOG_SMARTSWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_SWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"dot","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"BUY","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"BUYSmart","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Bonus","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEGstake","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addy","type":"address"}],"name":"IsWhiteListContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUY_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SELL_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Main","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PSS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RPF","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dot","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"SELL","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"SELLSmart","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_poolOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply7","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply8","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_unlockTime","outputs":[{"internalType":"bool","name":"setLock","type":"bool"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"addBothLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addy","type":"address"},{"internalType":"bool","name":"boolean","type":"bool"}],"name":"addWhiteListContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"tokenInFee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"tokenInFee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"liqmain","type":"uint256"},{"internalType":"uint256","name":"liqtoken","type":"uint256"}],"name":"deploySwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"depositInternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"getUserLock","outputs":[{"internalType":"bool","name":"lock","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"_made","type":"address"},{"internalType":"address","name":"_fegp","type":"address"},{"internalType":"uint256","name":"ol","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"initiateMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pairRewardPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payee","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"payMain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"payee","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"payToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"removeBothLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bonus","type":"address"}],"name":"setBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"set","type":"address"},{"internalType":"address","name":"ad","type":"address"}],"name":"setCont","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setLockLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellmax","type":"uint256"},{"internalType":"uint256","name":"buymax","type":"uint256"}],"name":"setMaxBuySellRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PSS","type":"uint256"},{"internalType":"uint256","name":"_RPF","type":"uint256"}],"name":"setPSSRPF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addy","type":"address"}],"name":"setPairRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stake","type":"address"},{"internalType":"address","name":"_fegp","type":"address"}],"name":"setStakePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"setTX1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"path","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"swapToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSentRebates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tx1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tx2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"userBalanceInternal","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdrawInternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600060025560c0604052600960808190526846454765782050524f60b81b60a09081526200003191600391906200012f565b50604080518082019091526008808252672628102a37b5b2b760c11b602090920191825262000063916004916200012f565b506005805460ff19166012179055600780546001600160a01b0319908116734c9bc793716e8dc05d1f48d8ca8f84318ec3043c179091556008805482167386882fa66ac57039b10d78e2d3205592a44664c0179055600a8054821673389999216860ab8e0175387a0c90e5c52522c945179055600b8054821661dead179055600d805490911673f786c34106762ab4eeb45a51b42a62470e9d5332179055601480556103e8601555601d805461ffff1916905560016026553480156200012857600080fd5b5062000212565b8280546200013d90620001d5565b90600052602060002090601f016020900481019282620001615760008555620001ac565b82601f106200017c57805160ff1916838001178555620001ac565b82800160010185558215620001ac579182015b82811115620001ac5782518255916020019190600101906200018f565b50620001ba929150620001be565b5090565b5b80821115620001ba5760008155600101620001bf565b600181811c90821680620001ea57607f821691505b602082108114156200020c57634e487b7160e01b600052602260045260246000fd5b50919050565b6155de80620002226000396000f3fe6080604052600436106102e15760003560e01c80627b44a7146102ed5780630149e5c714610316578063036fe1bb1461035f578063055a03c51461037557806306fdde031461038b57806307d729c4146103ad578063095ea7b3146103fd578063103ff68d1461041d57806310510ec11461043f57806312dcff7a1461045f57806315e84af91461047f57806318160ddd1461049f578063185a696f146104b557806319266112146104d55780632140fb40146104f557806323b872dd1461051557806329dfe3b2146105355780632b9abe1a14610555578063313ce567146105a557806331705705146105d1578063390a73e2146105fe5780633f70951714610614578063520bb81b1461063457806365d1a40d1461065457806366188463146106745780636a8ebcd2146106945780636c5c6814146106a957806370a08231146106bf57806371726c92146106f557806371a1e6dd1461071557806372015efc146107355780637bc224f91461074a57806388f60dcb1461076a5780638c340f641461078a57806395d89b41146107aa5780639a6204ed146107bf5780639a78458a146107d5578063a16faa18146107f5578063a221ee491461080a578063a2e70a2e1461082a578063a9059cbb14610840578063add975cc14610860578063ae1931be14610880578063b0711483146108a0578063b4398244146108c0578063ba9530a6146108d6578063bbf12714146108f6578063c172715c14610916578063c241267614610929578063c627fbfa14610949578063cdfec52d14610969578063d62b6f7e1461097f578063d68de8de1461099f578063d73dd623146109bf578063da6d6578146109df578063dd62ed3e146109f5578063ef8fdfd814610a3b578063f1091b6e14610a5b578063f7013ef614610a71578063f8b2cb4f14610a91578063f8d6aed414610aca578063fbe8998914610aea578063fcfff16f14610b00578063fea4393a14610b1f578063fff6cae914610b3f57600080fd5b366102e857005b600080fd5b3480156102f957600080fd5b5061030360155481565b6040519081526020015b60405180910390f35b34801561032257600080fd5b5061034f610331366004614bab565b6001600160a01b031660009081526021602052604090205460ff1690565b604051901515815260200161030d565b34801561036b57600080fd5b5061030360185481565b34801561038157600080fd5b5061030360125481565b34801561039757600080fd5b506103a0610b54565b60405161030d9190614fed565b3480156103b957600080fd5b506103e66103c8366004614bab565b60208052600090815260409020805460019091015460ff9091169082565b60408051921515835260208301919091520161030d565b34801561040957600080fd5b5061034f610418366004614d56565b610be2565b34801561042957600080fd5b5061043d610438366004614d1f565b610c3d565b005b34801561044b57600080fd5b5061043d61045a366004614d56565b610c9b565b34801561046b57600080fd5b5061043d61047a366004614bab565b610da9565b34801561048b57600080fd5b5061030361049a366004614bc6565b610e49565b3480156104ab57600080fd5b5061030360025481565b3480156104c157600080fd5b5061043d6104d0366004614bc6565b610eb7565b3480156104e157600080fd5b5061043d6104f0366004614d56565b610f10565b34801561050157600080fd5b5061034f610510366004614bab565b611098565b34801561052157600080fd5b5061034f610530366004614ce3565b6110b6565b34801561054157600080fd5b5061043d610550366004614e62565b6111fb565b34801561056157600080fd5b50610597610570366004614bab565b6001600160a01b031660009081526023602090815260408083205460229092529091205491565b60405161030d9291906153cf565b3480156105b157600080fd5b506005546105bf9060ff1681565b60405160ff909116815260200161030d565b3480156105dd57600080fd5b50600f546105f1906001600160a01b031681565b60405161030d9190614fc0565b34801561060a57600080fd5b50610303601a5481565b34801561062057600080fd5b5061043d61062f366004614d80565b61148b565b34801561064057600080fd5b50600c546105f1906001600160a01b031681565b34801561066057600080fd5b5061043d61066f366004614d56565b611783565b34801561068057600080fd5b5061034f61068f366004614d56565b61187c565b3480156106a057600080fd5b5061043d611952565b3480156106b557600080fd5b5061030360245481565b3480156106cb57600080fd5b506103036106da366004614bab565b6001600160a01b031660009081526020819052604090205490565b34801561070157600080fd5b5061043d610710366004614bab565b61197a565b34801561072157600080fd5b5061043d610730366004614e62565b6119ee565b34801561074157600080fd5b5061043d611bdc565b34801561075657600080fd5b5061043d610765366004614bf9565b611cee565b34801561077657600080fd5b5061043d610785366004614ee0565b611d44565b34801561079657600080fd5b5061043d6107a5366004614ee0565b611f06565b3480156107b657600080fd5b506103a0612085565b3480156107cb57600080fd5b50610303601c5481565b3480156107e157600080fd5b506010546105f1906001600160a01b031681565b34801561080157600080fd5b5061043d612092565b34801561081657600080fd5b50610303610825366004614f26565b6121c2565b34801561083657600080fd5b5061030360175481565b34801561084c57600080fd5b5061034f61085b366004614d56565b61222c565b34801561086c57600080fd5b5061030361087b366004614e27565b61226d565b34801561088c57600080fd5b5061030361089b366004614ee0565b61292a565b3480156108ac57600080fd5b5061043d6108bb366004614c98565b612df0565b3480156108cc57600080fd5b50610303601b5481565b3480156108e257600080fd5b506105976108f1366004614f61565b6132fa565b34801561090257600080fd5b5061043d610911366004614d56565b61338b565b610303610924366004614e02565b613656565b34801561093557600080fd5b50600e546105f1906001600160a01b031681565b34801561095557600080fd5b5061043d610964366004614bab565b6139b8565b34801561097557600080fd5b5061030360135481565b34801561098b57600080fd5b50600d546105f1906001600160a01b031681565b3480156109ab57600080fd5b5061043d6109ba366004614dd0565b613a04565b3480156109cb57600080fd5b5061034f6109da366004614d56565b613a20565b3480156109eb57600080fd5b5061030360195481565b348015610a0157600080fd5b50610303610a10366004614bc6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a4757600080fd5b506011546105f1906001600160a01b031681565b348015610a6757600080fd5b5061030360145481565b348015610a7d57600080fd5b5061043d610a8c366004614c3c565b613a93565b348015610a9d57600080fd5b50610303610aac366004614bab565b6001600160a01b03166000908152601e602052604090206001015490565b348015610ad657600080fd5b50610597610ae5366004614f61565b613ba5565b348015610af657600080fd5b5061030360255481565b348015610b0c57600080fd5b50601d5461034f90610100900460ff1681565b348015610b2b57600080fd5b50610303610b3a366004614ee0565b613c4f565b348015610b4b57600080fd5b5061043d613f77565b60038054610b619061546b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8d9061546b565b8015610bda5780601f10610baf57610100808354040283529160200191610bda565b820191906000526020600020905b815481529060010190602001808311610bbd57829003601f168201915b505050505081565b3360008181526001602090815260408083206001600160a01b0387168085529252808320859055519192909160008051602061558983398151915290610c2b9086815260200190565b60405180910390a35060015b92915050565b6008546001600160a01b03163314610c705760405162461bcd60e51b8152600401610c6790615020565b60405180910390fd5b6001600160a01b03919091166000908152602160205260409020805460ff1916911515919091179055565b60026026541415610cbe5760405162461bcd60e51b8152600401610c6790615398565b600260265533600090815260226020526040902054811115610cf25760405162461bcd60e51b8152600401610c67906150d4565b6000610d0b82610d066103e56103e86140f2565b6141ce565b90506000610d198383614258565b33600090815260226020526040812080549293508592909190610d3d908490615428565b90915550506001600160a01b03841660009081526022602052604081208054849290610d6a9084906153dd565b90915550506007546001600160a01b031660009081526022602052604081208054839290610d999084906153dd565b9091555050600160265550505050565b600c546001600160a01b031633148015610dd15750600d546001600160a01b03828116911614155b8015610deb5750600e546001600160a01b03828116911614155b610e275760405162461bcd60e51b815260206004820152600d60248201526c139bdd081c195c9b5a5d1d1959609a1b6044820152606401610c67565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038083166000908152601e6020526040808220928416825281206001830154919291610eae90610e89670de0b6b3a764000060196141ce565b8360010154610ea1670de0b6b3a764000060196141ce565b66071afd498d00006121c2565b95945050505050565b6008546001600160a01b031633148015610ed957506001600160a01b03811615155b610ee257600080fd5b601080546001600160a01b039384166001600160a01b03199182161790915560098054929093169116179055565b60026026541415610f335760405162461bcd60e51b8152600401610c6790615398565b6002602655600d546001600160a01b0383811691161480610f615750600e546001600160a01b038381169116145b610f6a57600080fd5b600e546001600160a01b03838116911614156110065733600090815260226020526040902054811115610faf5760405162461bcd60e51b8152600401610c6790615054565b8060176000828254610fc19190615428565b90915550503360009081526022602052604081208054839290610fe5908490615428565b9091555050600e54611001906001600160a01b031633836142b5565b611087565b336000908152602360205260409020548111156110355760405162461bcd60e51b8152600401610c67906151bf565b80601860008282546110479190615428565b9091555050336000908152602360205260408120805483929061106b908490615428565b9091555050600d54611087906001600160a01b031633836142b5565b61108f61435d565b50506001602655565b6001600160a01b03166000908152601f602052604090205460ff1690565b6000336001600160a01b03851614806110f257506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6110fb57600080fd5b600061110633611098565b905080156111265760405162461bcd60e51b8152600401610c6790615152565b611131858585614424565b336001600160a01b0386161480159061116f57506001600160a01b038516600090815260016020908152604080832033845290915290205460001914155b156111f0576001600160a01b03851660009081526001602090815260408083203384529091529020546111a29084614258565b6001600160a01b038681166000908152600160209081526040808320338085529083529281902085905551938452918716929091600080516020615589833981519152910160405180910390a35b506001949350505050565b6002602654141561121e5760405162461bcd60e51b8152600401610c6790615398565b6002602655600061122e33611098565b9050801561124e5760405162461bcd60e51b8152600401610c6790615152565b600254600061125d86836140f2565b90508061127c5760405162461bcd60e51b8152600401610c679061507e565b61128633876144e2565b61128f866144f1565b60005b6016548110156113ac576000601682815481106112b1576112b1615501565b60009182526020808320909101546001600160a01b0316808352601e9091526040822060010154909250906112e685836141ce565b9050806113055760405162461bcd60e51b8152600401610c679061507e565b88888581811061131757611317615501565b9050602002013581101561133d5760405162461bcd60e51b8152600401610c6790615213565b826001600160a01b0316336001600160a01b03167f9d9058fd2f25ccc389fec7720abef0ca83472f5abfafd5f10d37f51e6a0493f38360006040516113839291906153cf565b60405180910390a36113968333836142b5565b50505080806113a4906154a6565b915050611292565b506113b5613f77565b6113bd61435d565b6113c5614571565b6011546001600160a01b03161561147e576011546040516370a0823160e01b815260009161145d9184916001600160a01b0316906370a082319061140d903090600401614fc0565b60206040518083038186803b15801561142557600080fd5b505afa158015611439573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d069190614de9565b9050801561147c5760115461147c906001600160a01b031633836142b5565b505b5050600160265550505050565b601d5460ff16156114ae5760405162461bcd60e51b8152600401610c67906151e8565b600e546040516370a0823160e01b81526000916001600160a01b0316906370a08231906114df903090600401614fc0565b60206040518083038186803b1580156114f757600080fd5b505afa15801561150b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152f9190614de9565b600d546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190611565903090600401614fc0565b60206040518083038186803b15801561157d57600080fd5b505afa158015611591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b59190614de9565b6040805180820182526016805482526020808301878152600e80546001600160a01b039081166000908152601e80865288822097518855935160019788015587518089018952865481528086018a8152600d80548516845295909652888220905181559451948701949094558154855480880187557fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428990810180549284166001600160a01b031993841617905593548654808901909755959093018054958216959093169490941790915554909116815291822001549192509061169d90633b9aca006140f2565b600d546001600160a01b03166000908152601e6020526040812060010154919250906116d190670de0b6b3a76400006140f2565b905060006116df82846153dd565b90506116ea81614683565b6116f6601b54826146e0565b601b556117038882614739565b6001600160a01b0388166000908152601f60209081526040808320918052909120815460ff1916600117825561173d426301e133806153dd565b600180830191909155601d805460ff191690911790556117626064610d06898b6140f2565b6024556117746064610d06888c6140f2565b60255550505050505050505050565b600260265414156117a65760405162461bcd60e51b8152600401610c6790615398565b6002602655336000908152602360205260409020548111156117da5760405162461bcd60e51b8152600401610c67906150d4565b60006117ee82610d066103e56103e86140f2565b905060006117fc8383614258565b33600090815260236020526040812080549293508592909190611820908490615428565b90915550506001600160a01b0384166000908152602360205260408120805484929061184d9084906153dd565b90915550506007546001600160a01b031660009081526023602052604081208054839290610d999084906153dd565b3360009081526001602090815260408083206001600160a01b0386168452909152812054808311156118d1573360009081526001602090815260408083206001600160a01b0388168452909152812055611900565b6118db8184614258565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b03891680855290835292819020549051908152919291600080516020615589833981519152910160405180910390a35060019392505050565b600c546001600160a01b0316331461196957600080fd5b601d805461ff001916610100179055565b6007546001600160a01b0316331461199157600080fd5b600061199c82611098565b90506001811515146119c05760405162461bcd60e51b8152600401610c6790615247565b6001600160a01b038216600090815260208052604090206119e4426202a3006153dd565b6001909101555050565b60026026541415611a115760405162461bcd60e51b8152600401610c6790615398565b60026026819055546000611a2585836140f2565b905080611a445760405162461bcd60e51b8152600401610c679061507e565b6000611a4f33611098565b905060018115151415611a745785601b6000828254611a6e91906153dd565b90915550505b60005b601654811015611bb057600060168281548110611a9657611a96615501565b60009182526020808320909101546001600160a01b0316808352601e909152604082206001015490925090611acb86836141ce565b905080611aea5760405162461bcd60e51b8152600401610c679061507e565b888885818110611afc57611afc615501565b90506020020135811115611b415760405162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b6044820152606401610c67565b826001600160a01b0316336001600160a01b03167f15a8ca63e37b2cff1677df2b6b82d36fcf8a524228bd7a4b4d02d107c28c1e8a836000604051611b879291906153cf565b60405180910390a3611b9a833383614744565b5050508080611ba8906154a6565b915050611a77565b50611bba86614683565b611bc43387614739565b611bcc61435d565b611bd4614571565b61147e613f77565b336000611be882611098565b9050600181151514611c0c5760405162461bcd60e51b8152600401610c6790615247565b6040516370a0823160e01b815260009030906370a0823190611c32908690600401614fc0565b60206040518083038186803b158015611c4a57600080fd5b505afa158015611c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c829190614de9565b905080601b6000828254611c969190615428565b90915550506001600160a01b0383166000908152601f602090815260408083209180529091206001810154421015611ce05760405162461bcd60e51b8152600401610c6790615152565b50805460ff19169055505050565b6007546001600160a01b03163314611d0557600080fd5b600780546001600160a01b039485166001600160a01b0319918216179091556008805493851693821693909317909255600c8054919093169116179055565b600c546001600160a01b031633148015611d835750600d546001600160a01b03166000908152601e6020526040902060010154674563918244f4000011155b611d9f5760405162461bcd60e51b8152600401610c6790615020565b600d546001600160a01b03166000908152601e6020526040902060010154674563918244f4000011611e27576103de8110158015611ddf57506103e88111155b611dfb5760405162461bcd60e51b8152600401610c67906150a7565b60648211158015611e0b57508115155b611e275760405162461bcd60e51b8152600401610c67906150a7565b600d546001600160a01b03166000908152601e602052604090206001015468015af1d78b58c4000011611efe576103848110158015611e6857506103e88111155b611eab5760405162461bcd60e51b81526020600482015260146024820152732043616e6e6f7420736574206f7665722031302560601b6044820152606401610c67565b6101f48211158015611ebc57508115155b611efe5760405162461bcd60e51b81526020600482015260136024820152722043616e6e6f7420736574206f76657220352560681b6044820152606401610c67565b601555601455565b600c546001600160a01b03163314611f305760405162461bcd60e51b8152600401610c6790615020565b600e54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015611f7557600080fd5b505afa158015611f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fad9190614de9565b9050611fbb6103e8826153f5565b8310158015611fca5750808311155b6120315760405162461bcd60e51b815260206004820152603260248201527f6d696e20302e3125206f6620746f6b656e20737570706c792c206d61782031306044820152713025206f6620746f6b656e20737570706c7960701b6064820152608401610c67565b670de0b6b3a76400008210156120795760405162461bcd60e51b815260206004820152600d60248201526c3120455448206d696e696d756d60981b6044820152606401610c67565b50601391909155601255565b60048054610b619061546b565b33600061209e82611098565b905080156120e95760405162461bcd60e51b8152602060048201526018602482015277131a5c5d5a591a5d1e48185b1c9958591e481b1bd8dad95960421b6044820152606401610c67565b6040516370a0823160e01b815260009030906370a082319061210f908690600401614fc0565b60206040518083038186803b15801561212757600080fd5b505afa15801561213b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215f9190614de9565b6001600160a01b0384166000908152601f60209081526040808320918052909120815460ff191660011782559192509061219c426276a7006153dd565b816001018190555082601b60008282546121b691906153dd565b90915550505050505050565b6000806121cf87876140f2565b905060006121dd86866140f2565b905060006121eb83836140f2565b90506000612212670de0b6b3a764000061220d670de0b6b3a764000089614258565b6140f2565b905061221e82826141ce565b9a9950505050505050505050565b60008061223833611098565b905080156122585760405162461bcd60e51b8152600401610c6790615152565b612263338585614424565b5060019392505050565b6000600260265414156122925760405162461bcd60e51b8152600401610c6790615398565b6002602655601d5460ff6101009091041615156001146122c45760405162461bcd60e51b8152600401610c6790615275565b6122cd33614783565b1515600114156122f85760065485146122f85760405162461bcd60e51b8152600401610c679061531c565b60135483111561231a5760405162461bcd60e51b8152600401610c67906152c8565b600d546001600160a01b03166000908152601e602052604090206001015461234890610d06603260646140f2565b8111156123675760405162461bcd60e51b8152600401610c67906152f0565b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612398903390600401614fc0565b60206040518083038186803b1580156123b057600080fd5b505afa1580156123c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e89190614de9565b90508447158015906124025750670de0b6b3a76400008311155b801561241757506801158e460913d000008210155b15612424576124246147bf565b600e546001600160a01b03166000818152601e60205260409020600101549061244e903388614744565b601754600e546040516370a0823160e01b81526001600160a01b03909116906370a0823190612481903090600401614fc0565b60206040518083038186803b15801561249957600080fd5b505afa1580156124ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d19190614de9565b6124db9190615428565b600e80546001600160a01b039081166000908152601e60205260408082206001908101959095559254909116815290812090910154908061252d61251f8585615428565b610d066103e66103e86140f2565b905061258584612546670de0b6b3a764000060196141ce565b600d546001600160a01b03166000908152601e6020526040902060010154612577670de0b6b3a764000060196141ce565b8566071afd498d00006132fa565b9097509150878710156125aa5760405162461bcd60e51b8152600401610c6790615213565b60006125be88610d066015546103e86140f2565b905060006125d382610d06600f6127106140f2565b905060006125e883610d06600f6127106140f2565b905060006125fe84610d066014546127106140f2565b905060008161260d84866153dd565b61261791906153dd565b6126219086615428565b9050600061263782610d066103e76103e86140f2565b30600090815260236020526040902054909150662386f26fc1000081111561268157806018600082825461266b9190615428565b9091555050306000908152602360205260408120555b600d546001600160a01b0316632e1a7d4d8761269d84866153dd565b6126a791906153dd565b6040518263ffffffff1660e01b81526004016126c591815260200190565b600060405180830381600087803b1580156126df57600080fd5b505af11580156126f3573d6000803e3d6000fd5b505050506127118c61270c84610d0660255460646140f2565b6147f2565b61272283610d0660016103e86140f2565b601a600082825461273391906153dd565b909155506000905061274b85610d06605f60646140f2565b600f546001600160a01b031660009081526023602052604081208054929350839290919061277a9084906153dd565b9091555061278a90508186615428565b6007546001600160a01b0316600090815260236020526040812080549091906127b49084906153dd565b9250508190555084601860008282546127cd91906153dd565b9250508190555085601960008282546127e691906153dd565b909155506127f4905061435d565b6127fc614571565b601a5460195460185461280f91906153dd565b61281991906153dd565b600d546040516370a0823160e01b81526001600160a01b03909116906370a0823190612849903090600401614fc0565b60206040518083038186803b15801561286157600080fd5b505afa158015612875573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128999190614de9565b6128a39190615428565b600d80546001600160a01b039081166000908152601e602052604090206001019290925554600e546025549183169216903390600080516020615549833981519152908d906128f9908990610d069060646140f2565b6040516129079291906153cf565b60405180910390a450505050505050505050505050506001602655949350505050565b60006002602654141561294f5760405162461bcd60e51b8152600401610c6790615398565b60026026553360009081526022602052604090205483908111156129855760405162461bcd60e51b8152600401610c6790615054565b600e546001600160a01b039081166000908152601e6020526040808220600d54909316825290206013548611156129ce5760405162461bcd60e51b8152600401610c67906152c8565b6129e28160010154610d06603260646140f2565b841115612a015760405162461bcd60e51b8152600401610c67906152f0565b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612a32903390600401614fc0565b60206040518083038186803b158015612a4a57600080fd5b505afa158015612a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a829190614de9565b9050600047118015612a9c5750670de0b6b3a76400008511155b8015612ab157506801158e460913d000008110155b15612abe57612abe6147bf565b6000612b128460010154612adb670de0b6b3a764000060196141ce565b8560010154612af3670de0b6b3a764000060196141ce565b612b058d610d066103e66103e86140f2565b66071afd498d00006132fa565b80925081975050506000612b2e87610d066015546103e86140f2565b90506000612b4382610d06600f6127106140f2565b90506000612b5883610d06600f6127106140f2565b90506000612b6e84610d066014546127106140f2565b9050600081612b7d84866153dd565b612b8791906153dd565b612b919086615428565b90506000612ba782610d066103e76103e86140f2565b9050612bba82610d0660016103e86140f2565b601a6000828254612bcb91906153dd565b90915550508c811015612bf05760405162461bcd60e51b8152600401610c6790615213565b8d60226000336001600160a01b03166001600160a01b031681526020019081526020016000206000828254612c259190615428565b925050819055508d60176000828254612c3e9190615428565b90915550503360009081526023602052604081208054839290612c629084906153dd565b90915550503060009081526023602052604081208054879290612c869084906153dd565b9091555060009050612c9e84610d06605f60646140f2565b600f546001600160a01b0316600090815260236020526040812080549293508392909190612ccd9084906153dd565b90915550612cdd90508185615428565b6007546001600160a01b031660009081526023602052604081208054909190612d079084906153dd565b90915550829050612d1885886153dd565b612d2291906153dd565b60186000828254612d3391906153dd565b925050819055508460196000828254612d4c91906153dd565b90915550612d5a9050613f77565b612d6261435d565b612d6a614571565b600d60009054906101000a90046001600160a01b03166001600160a01b0316600e60009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03166000805160206155298339815191528f86604051612dd19291906153cf565b60405180910390a4505050505050505050505050600160265592915050565b60026026541415612e135760405162461bcd60e51b8152600401610c6790615398565b6002602655600d546001600160a01b0384811691161480612e415750600e546001600160a01b038481169116145b612e4a57600080fd5b600d546001600160a01b03848116911614156130a25733600090815260236020526040902054811115612e8f5760405162461bcd60e51b8152600401610c67906151bf565b600d5460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390612ec19087908590600401614fd4565b602060405180830381600087803b158015612edb57600080fd5b505af1158015612eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f139190614db3565b508060186000828254612f269190615428565b90915550503360009081526023602052604081208054839290612f4a908490615428565b9091555050600d54604051632efc49c560e21b81526001600160a01b038681169263bbf1271492612f8392909116908590600401614fd4565b600060405180830381600087803b158015612f9d57600080fd5b505af1158015612fb1573d6000803e3d6000fd5b50505050600080856001600160a01b0316632b9abe1a306040518263ffffffff1660e01b8152600401612fe49190614fc0565b6040805180830381600087803b158015612ffd57600080fd5b505af1158015613011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130359190614f02565b6040516365d1a40d60e01b815291935091506001600160a01b038716906365d1a40d906130689087908590600401614fd4565b600060405180830381600087803b15801561308257600080fd5b505af1158015613096573d6000803e3d6000fd5b506132df945050505050565b336000908152602260205260409020548111156130d15760405162461bcd60e51b8152600401610c6790615054565b600e5460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906131039087908590600401614fd4565b602060405180830381600087803b15801561311d57600080fd5b505af1158015613131573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131559190614db3565b5080601760008282546131689190615428565b9091555050336000908152602260205260408120805483929061318c908490615428565b9091555050600e54604051632efc49c560e21b81526001600160a01b038681169263bbf12714926131c592909116908590600401614fd4565b600060405180830381600087803b1580156131df57600080fd5b505af11580156131f3573d6000803e3d6000fd5b50505050600080856001600160a01b0316632b9abe1a306040518263ffffffff1660e01b81526004016132269190614fc0565b6040805180830381600087803b15801561323f57600080fd5b505af1158015613253573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132779190614f02565b6040516310510ec160e01b815291935091506001600160a01b038716906310510ec1906132aa9087908690600401614fd4565b600060405180830381600087803b1580156132c457600080fd5b505af11580156132d8573d6000803e3d6000fd5b5050505050505b6132e761435d565b6132ef614571565b505060016026555050565b600080600061330988876140f2565b9050600061331f670de0b6b3a764000086614258565b905061332b86826141ce565b9050600061333d8b61220d8d856146e0565b9050600061334b82856148c0565b90506000613361670de0b6b3a764000083614258565b905061336d8b826141ce565b96506133798985614258565b95505050505050965096945050505050565b600260265414156133ae5760405162461bcd60e51b8152600401610c6790615398565b6002602655600d546001600160a01b03838116911614806133dc5750600e546001600160a01b038381169116145b6133e557600080fd5b601d5460ff6101009091041615156001146134125760405162461bcd60e51b8152600401610c6790615275565b600e546001600160a01b038381169116141561353357600e546001600160a01b03166000818152601e602052604090206001015490613452903384614744565b600e546040516370a0823160e01b81526000916134e1916001600160a01b03909116906370a0823190613489903090600401614fc0565b60206040518083038186803b1580156134a157600080fd5b505afa1580156134b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d99190614de9565b601754614258565b905060006134ef8284614258565b90506134fd601754826146e0565b6017553360009081526022602052604090205461351a90826146e0565b3360009081526022602052604090205550611087915050565b600d546001600160a01b03166000818152601e60205260409020600101549061355d903384614744565b600d546040516370a0823160e01b8152600091613602916001600160a01b03909116906370a0823190613594903090600401614fc0565b60206040518083038186803b1580156135ac57600080fd5b505afa1580156135c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e49190614de9565b6135fd6018546135f8601954601a546146e0565b6146e0565b614258565b905060006136108284614258565b905061361e601854826146e0565b6018553360009081526023602052604090205461363b90826146e0565b3360009081526023602052604090205550505061108f61435d565b60006002602654141561367b5760405162461bcd60e51b8152600401610c6790615398565b6002602655601d5460ff6101009091041615156001146136ad5760405162461bcd60e51b8152600401610c6790615275565b6136b633614783565b1515600114156136e15760065484146136e15760405162461bcd60e51b8152600401610c679061531c565b600d60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561373157600080fd5b505af1158015613745573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152600094506001600160a01b0390911692506370a08231915061377d903390600401614fc0565b60206040518083038186803b15801561379557600080fd5b505afa1580156137a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137cd9190614de9565b90504780158015906137e6575066b1a2bc2ec500003410155b80156137fb57506801158e460913d000008210155b15613808576138086147bf565b600d546001600160a01b039081166000908152601e6020526040808220600e54909316825290206012543411156138515760405162461bcd60e51b8152600401610c67906150fe565b6138658160010154610d06603260646140f2565b8511156138845760405162461bcd60e51b8152600401610c67906152f0565b60006138d283600101546138a1670de0b6b3a764000060196141ce565b84600101546138b9670de0b6b3a764000060196141ce565b6138cb34610d066103e76103e86140f2565b60006132fa565b9096509050868610156138f75760405162461bcd60e51b8152600401610c6790615213565b600061390a34610d0660016103e86140f2565b905061391d81610d0660255460646140f2565b601a600082825461392e91906153dd565b9091555050600e5461394a906001600160a01b03168a896142b5565b613952613f77565b600e54600d546024546001600160a01b0392831692909116903390600080516020615549833981519152903490613990908d90610d069060646140f2565b60405161399e9291906153cf565b60405180910390a450505050505060016026559392505050565b6008546001600160a01b031633146139e25760405162461bcd60e51b8152600401610c6790615020565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314613a1b57600080fd5b602455565b3360009081526001602090815260408083206001600160a01b0386168452909152812054613a4e90836146e0565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208590555193845290926000805160206155898339815191529101610c2b565b601d5460ff1615613ab65760405162461bcd60e51b8152600401610c67906151e8565b600e80546001600160a01b038088166001600160a01b03199283168117909355600c80548883169084168117909155600f8054841690911790556006849055600980548683169084161790556010805491871691909216179055604080516318160ddd60e01b81529051613b8e92916318160ddd916004808301926020929190829003018186803b158015613b4a57600080fd5b505afa158015613b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b829190614de9565b610d06600160056140f2565b601355505068056bc75e2d63100000601255505050565b6000806000613bb486896140f2565b90506000613bc28887614258565b90506000613bd089836140f2565b90506000613bde82856148c0565b9050613bf281670de0b6b3a7640000614258565b9050613bfe8c826141ce565b9050613c12670de0b6b3a764000088614258565b9550613c1e81876140f2565b9550613c3281670de0b6b3a76400006140f2565b9450613c3e8686614258565b945050505050965096945050505050565b600060026026541415613c745760405162461bcd60e51b8152600401610c6790615398565b600260265533600090815260236020526040902054831115613cd85760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f756768204d61696e2c206465706f736974206d6f72650000006044820152606401610c67565b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190613d09903390600401614fc0565b60206040518083038186803b158015613d2157600080fd5b505afa158015613d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d599190614de9565b9050478015801590613d72575066b1a2bc2ec500008510155b8015613d8757506801158e460913d000008210155b15613d9457613d946147bf565b600d546001600160a01b039081166000908152601e6020526040808220600e5490931682529020601254871115613ddd5760405162461bcd60e51b8152600401610c67906150fe565b613df18160010154610d06603260646140f2565b851115613e105760405162461bcd60e51b8152600401610c67906152f0565b6000613e578360010154613e2d670de0b6b3a764000060196141ce565b8460010154613e45670de0b6b3a764000060196141ce565b6138cb8d610d066103e76103e86140f2565b909650905086861015613e7c5760405162461bcd60e51b8152600401610c6790615213565b600e54600d546040516001600160a01b039283169290911690339060008051602061552983398151915290613eb4908d908c906153cf565b60405180910390a433600090815260236020526040812080548a9290613edb908490615428565b925050819055508760186000828254613ef49190615428565b90915550503360009081526022602052604081208054889290613f189084906153dd565b925050819055508560176000828254613f3191906153dd565b90915550613f48905088610d0660016103e86140f2565b601a6000828254613f5991906153dd565b90915550613f679050613f77565b5050505050600160265592915050565b601754600e546040516370a0823160e01b81526001600160a01b03909116906370a0823190613faa903090600401614fc0565b60206040518083038186803b158015613fc257600080fd5b505afa158015613fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ffa9190614de9565b6140049190615428565b600e546001600160a01b03166000908152601e6020526040812060010191909155601a5460195460185461403891906153dd565b61404291906153dd565b600d546040516370a0823160e01b815291925082916001600160a01b03909116906370a0823190614077903090600401614fc0565b60206040518083038186803b15801561408f57600080fd5b505afa1580156140a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140c79190614de9565b6140d19190615428565b600d546001600160a01b03166000908152601e602052604090206001015550565b6000816141305760405162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b6044820152606401610c67565b600061414484670de0b6b3a7640000615409565b9050831580614163575061415884826153f5565b670de0b6b3a7640000145b61417f5760405162461bcd60e51b8152600401610c6790615128565b600061418c6002856153f5565b61419690836153dd565b9050818110156141b85760405162461bcd60e51b8152600401610c6790615128565b60006141c485836153f5565b9695505050505050565b6000806141db8385615409565b90508315806141f25750826141f085836153f5565b145b61420e5760405162461bcd60e51b8152600401610c679061529e565b6000614222826706f05b59d3b200006153dd565b9050818110156142445760405162461bcd60e51b8152600401610c679061529e565b60006141c4670de0b6b3a7640000836153f5565b600080600061426785856149c4565b9150915080156142ad5760405162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b6044820152606401610c67565b509392505050565b60405163a9059cbb60e01b81526000906001600160a01b0385169063a9059cbb906142e69086908690600401614fd4565b602060405180830381600087803b15801561430057600080fd5b505af1158015614314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143389190614db3565b9050806143575760405162461bcd60e51b8152600401610c679061536f565b50505050565b6611c37937e08000601954111561442257600d5460105460195460405163a9059cbb60e01b81526000936001600160a01b039081169363a9059cbb936143aa939290911691600401614fd4565b602060405180830381600087803b1580156143c457600080fd5b505af11580156143d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143fc9190614db3565b90508061441b5760405162461bcd60e51b8152600401610c679061536f565b5060006019555b565b6001600160a01b03831660009081526020819052604090205481111561444957600080fd5b6001600160a01b03831660009081526020819052604090205461446c9082614258565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461449b90826146e0565b6001600160a01b03838116600081815260208181526040918290209490945551848152909291861691600080516020615569833981519152910160405180910390a3505050565b6144ed823083614424565b5050565b3060009081526020819052604090205481111561450d57600080fd5b306000908152602081905260409020546145279082614258565b306000908152602081905260409020556002546145449082614258565b6002556040518181526000903090600080516020615569833981519152906020015b60405180910390a350565b6611c37937e08000601a54111561442257600d54601a54604051632e1a7d4d60e01b81526001600160a01b0390921691632e1a7d4d916145b79160040190815260200190565b600060405180830381600087803b1580156145d157600080fd5b505af11580156145e5573d6000803e3d6000fd5b5050600954601a546001600160a01b03909116925063c172715c915061461190610d06606360646140f2565b600b5460405160e084901b6001600160e01b03191681526103e960048201526001600160a01b039091166024820152600160448201526064016000604051808303818588803b15801561466357600080fd5b505af1158015614677573d6000803e3d6000fd5b50506000601a55505050565b3060009081526020819052604090205461469d90826146e0565b306000908152602081905260409020556002546146ba90826146e0565b600255604051818152309060009060008051602061556983398151915290602001614566565b6000806146ed83856153dd565b9050838110156147325760405162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b6044820152606401610c67565b9392505050565b6144ed308383614424565b6040516323b872dd60e01b81526001600160a01b03838116600483015230602483015260448201839052600091908516906323b872dd906064016142e6565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906147b757508115155b949350505050565b60006147cc6008476153f5565b90506147d833826147f2565b80601c60008282546147ea91906153dd565b909155505050565b604080516000808252602082019092526001600160a01b03841690839060405161481c9190614fa4565b60006040518083038185875af1925050503d8060008114614859576040519150601f19603f3d011682016040523d82523d6000602084013e61485e565b606091505b50509050806148bb5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610c67565b505050565b6000600183101561490b5760405162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b6044820152606401610c67565b671bc16d674ec7ffff83111561495c5760405162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b6044820152606401610c67565b6000614967836149fb565b905060006149758483614258565b9050600061498b8661498685614a18565b614a2c565b90508161499c579250610c37915050565b60006149ad87846305f5e100614a9f565b90506149b982826141ce565b979650505050505050565b6000808284106149e3576149d88385615428565b6000915091506149f4565b6149ed8484615428565b6001915091505b9250929050565b6000614a0682614a18565b610c3790670de0b6b3a7640000615409565b6000610c37670de0b6b3a7640000836153f5565b600080614a3a6002846154c1565b614a4c57670de0b6b3a7640000614a4e565b835b9050614a5b6002846153f5565b92505b821561473257614a6e84856141ce565b9350614a7b6002846154c1565b15614a8d57614a8a81856141ce565b90505b614a986002846153f5565b9250614a5e565b6000828180614ab687670de0b6b3a76400006149c4565b9092509050670de0b6b3a764000080600060015b888410614b80576000614ae582670de0b6b3a7640000615409565b9050600080614b058a614b0085670de0b6b3a7640000614258565b6149c4565b91509150614b1787610d06848c6141ce565b9650614b2387846140f2565b965086614b3257505050614b80565b8715614b3c579315935b8015614b46579315935b8415614b5d57614b568688614258565b9550614b6a565b614b6786886146e0565b95505b5050508080614b78906154a6565b915050614aca565b50909998505050505050505050565b80356001600160a01b0381168114614ba657600080fd5b919050565b600060208284031215614bbd57600080fd5b61473282614b8f565b60008060408385031215614bd957600080fd5b614be283614b8f565b9150614bf060208401614b8f565b90509250929050565b600080600060608486031215614c0e57600080fd5b614c1784614b8f565b9250614c2560208501614b8f565b9150614c3360408501614b8f565b90509250925092565b600080600080600060a08688031215614c5457600080fd5b614c5d86614b8f565b9450614c6b60208701614b8f565b9350614c7960408701614b8f565b9250614c8760608701614b8f565b949793965091946080013592915050565b60008060008060808587031215614cae57600080fd5b614cb785614b8f565b9350614cc560208601614b8f565b9250614cd360408601614b8f565b9396929550929360600135925050565b600080600060608486031215614cf857600080fd5b614d0184614b8f565b9250614d0f60208501614b8f565b9150604084013590509250925092565b60008060408385031215614d3257600080fd5b614d3b83614b8f565b91506020830135614d4b81615517565b809150509250929050565b60008060408385031215614d6957600080fd5b614d7283614b8f565b946020939093013593505050565b600080600060608486031215614d9557600080fd5b614d9e84614b8f565b95602085013595506040909401359392505050565b600060208284031215614dc557600080fd5b815161473281615517565b600060208284031215614de257600080fd5b5035919050565b600060208284031215614dfb57600080fd5b5051919050565b600080600060608486031215614e1757600080fd5b83359250614d0f60208501614b8f565b60008060008060808587031215614e3d57600080fd5b84359350614e4d60208601614b8f565b93969395505050506040820135916060013590565b600080600060408486031215614e7757600080fd5b8335925060208401356001600160401b0380821115614e9557600080fd5b818601915086601f830112614ea957600080fd5b813581811115614eb857600080fd5b8760208260051b8501011115614ecd57600080fd5b6020830194508093505050509250925092565b60008060408385031215614ef357600080fd5b50508035926020909101359150565b60008060408385031215614f1557600080fd5b505080516020909101519092909150565b600080600080600060a08688031215614f3e57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060008060008060c08789031215614f7a57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60008251614fb681846020870161543f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b602081526000825180602084015261500c81604085016020870161543f565b601f01601f19169190910160400192915050565b6020808252601a90820152792cb7ba903237903737ba103430bb32903832b936b4b9b9b4b7b760311b604082015260600190565b60208082526010908201526f2737ba1032b737bab3b4102a37b5b2b760811b604082015260600190565b6020808252600f908201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604082015260600190565b6020808252601390820152722043616e6e6f7420736574206f76657220312560681b604082015260600190565b60208082526010908201526f2737ba1032b737bab3b4103a37b5b2b760811b604082015260600190565b60208082526010908201526f4552525f4255595f494e5f524154494f60801b604082015260600190565b60208082526010908201526f11549497d1125597d25395115493905360821b604082015260600190565b60208082526047908201527f4c6971756964697479206973206c6f636b65642c20796f752063616e6e6f742060408201527f72656d6f7665206c697175696469747920756e74696c206166746572206c6f6360608201526635903a34b6b29760c91b608082015260a00190565b6020808252600f908201526e2737ba1032b737bab3b41026b0b4b760891b604082015260600190565b60208082526011908201527043616e206f6e6c7920757365206f6e636560781b604082015260600190565b6020808252601a9082015279135a5b9a5b5d5b48185b5bdd5b9d081bdd5d081b9bdd081b595d60321b604082015260600190565b602080825260149082015273131a5c5d5a591a5d1e481b9bdd081b1bd8dad95960621b604082015260600190565b6020808252600f908201526e14ddd85c081b9bdd081bdc195b9959608a1b604082015260600190565b60208082526010908201526f4552525f4d554c5f4f564552464c4f5760801b604082015260600190565b6020808252600e908201526d4552525f53454c4c5f524154494f60901b604082015260600190565b6020808252601290820152714f766572204d41585f4f55545f524154494f60701b604082015260600190565b60208082526033908201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e7460408201527206572616374207769746820746865205377617606c1b606082015260800190565b6020808252600f908201526e4552525f45524332305f46414c534560881b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b918252602082015260400190565b600082198211156153f0576153f06154d5565b500190565b600082615404576154046154eb565b500490565b6000816000190483118215151615615423576154236154d5565b500290565b60008282101561543a5761543a6154d5565b500390565b60005b8381101561545a578181015183820152602001615442565b838111156143575750506000910152565b600181811c9082168061547f57607f821691505b602082108114156154a057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156154ba576154ba6154d5565b5060010190565b6000826154d0576154d06154eb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b801515811461552557600080fd5b5056fec5f954edb6f50c3415e43c4c343ed2fac83243f08807d721c27e2ccb634c36fa908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a264697066735822122002d78c355a352a0a1033f89c5ab6cf3e44b2bd59cec09e0e8d18faef9d4c14d264736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102e15760003560e01c80627b44a7146102ed5780630149e5c714610316578063036fe1bb1461035f578063055a03c51461037557806306fdde031461038b57806307d729c4146103ad578063095ea7b3146103fd578063103ff68d1461041d57806310510ec11461043f57806312dcff7a1461045f57806315e84af91461047f57806318160ddd1461049f578063185a696f146104b557806319266112146104d55780632140fb40146104f557806323b872dd1461051557806329dfe3b2146105355780632b9abe1a14610555578063313ce567146105a557806331705705146105d1578063390a73e2146105fe5780633f70951714610614578063520bb81b1461063457806365d1a40d1461065457806366188463146106745780636a8ebcd2146106945780636c5c6814146106a957806370a08231146106bf57806371726c92146106f557806371a1e6dd1461071557806372015efc146107355780637bc224f91461074a57806388f60dcb1461076a5780638c340f641461078a57806395d89b41146107aa5780639a6204ed146107bf5780639a78458a146107d5578063a16faa18146107f5578063a221ee491461080a578063a2e70a2e1461082a578063a9059cbb14610840578063add975cc14610860578063ae1931be14610880578063b0711483146108a0578063b4398244146108c0578063ba9530a6146108d6578063bbf12714146108f6578063c172715c14610916578063c241267614610929578063c627fbfa14610949578063cdfec52d14610969578063d62b6f7e1461097f578063d68de8de1461099f578063d73dd623146109bf578063da6d6578146109df578063dd62ed3e146109f5578063ef8fdfd814610a3b578063f1091b6e14610a5b578063f7013ef614610a71578063f8b2cb4f14610a91578063f8d6aed414610aca578063fbe8998914610aea578063fcfff16f14610b00578063fea4393a14610b1f578063fff6cae914610b3f57600080fd5b366102e857005b600080fd5b3480156102f957600080fd5b5061030360155481565b6040519081526020015b60405180910390f35b34801561032257600080fd5b5061034f610331366004614bab565b6001600160a01b031660009081526021602052604090205460ff1690565b604051901515815260200161030d565b34801561036b57600080fd5b5061030360185481565b34801561038157600080fd5b5061030360125481565b34801561039757600080fd5b506103a0610b54565b60405161030d9190614fed565b3480156103b957600080fd5b506103e66103c8366004614bab565b60208052600090815260409020805460019091015460ff9091169082565b60408051921515835260208301919091520161030d565b34801561040957600080fd5b5061034f610418366004614d56565b610be2565b34801561042957600080fd5b5061043d610438366004614d1f565b610c3d565b005b34801561044b57600080fd5b5061043d61045a366004614d56565b610c9b565b34801561046b57600080fd5b5061043d61047a366004614bab565b610da9565b34801561048b57600080fd5b5061030361049a366004614bc6565b610e49565b3480156104ab57600080fd5b5061030360025481565b3480156104c157600080fd5b5061043d6104d0366004614bc6565b610eb7565b3480156104e157600080fd5b5061043d6104f0366004614d56565b610f10565b34801561050157600080fd5b5061034f610510366004614bab565b611098565b34801561052157600080fd5b5061034f610530366004614ce3565b6110b6565b34801561054157600080fd5b5061043d610550366004614e62565b6111fb565b34801561056157600080fd5b50610597610570366004614bab565b6001600160a01b031660009081526023602090815260408083205460229092529091205491565b60405161030d9291906153cf565b3480156105b157600080fd5b506005546105bf9060ff1681565b60405160ff909116815260200161030d565b3480156105dd57600080fd5b50600f546105f1906001600160a01b031681565b60405161030d9190614fc0565b34801561060a57600080fd5b50610303601a5481565b34801561062057600080fd5b5061043d61062f366004614d80565b61148b565b34801561064057600080fd5b50600c546105f1906001600160a01b031681565b34801561066057600080fd5b5061043d61066f366004614d56565b611783565b34801561068057600080fd5b5061034f61068f366004614d56565b61187c565b3480156106a057600080fd5b5061043d611952565b3480156106b557600080fd5b5061030360245481565b3480156106cb57600080fd5b506103036106da366004614bab565b6001600160a01b031660009081526020819052604090205490565b34801561070157600080fd5b5061043d610710366004614bab565b61197a565b34801561072157600080fd5b5061043d610730366004614e62565b6119ee565b34801561074157600080fd5b5061043d611bdc565b34801561075657600080fd5b5061043d610765366004614bf9565b611cee565b34801561077657600080fd5b5061043d610785366004614ee0565b611d44565b34801561079657600080fd5b5061043d6107a5366004614ee0565b611f06565b3480156107b657600080fd5b506103a0612085565b3480156107cb57600080fd5b50610303601c5481565b3480156107e157600080fd5b506010546105f1906001600160a01b031681565b34801561080157600080fd5b5061043d612092565b34801561081657600080fd5b50610303610825366004614f26565b6121c2565b34801561083657600080fd5b5061030360175481565b34801561084c57600080fd5b5061034f61085b366004614d56565b61222c565b34801561086c57600080fd5b5061030361087b366004614e27565b61226d565b34801561088c57600080fd5b5061030361089b366004614ee0565b61292a565b3480156108ac57600080fd5b5061043d6108bb366004614c98565b612df0565b3480156108cc57600080fd5b50610303601b5481565b3480156108e257600080fd5b506105976108f1366004614f61565b6132fa565b34801561090257600080fd5b5061043d610911366004614d56565b61338b565b610303610924366004614e02565b613656565b34801561093557600080fd5b50600e546105f1906001600160a01b031681565b34801561095557600080fd5b5061043d610964366004614bab565b6139b8565b34801561097557600080fd5b5061030360135481565b34801561098b57600080fd5b50600d546105f1906001600160a01b031681565b3480156109ab57600080fd5b5061043d6109ba366004614dd0565b613a04565b3480156109cb57600080fd5b5061034f6109da366004614d56565b613a20565b3480156109eb57600080fd5b5061030360195481565b348015610a0157600080fd5b50610303610a10366004614bc6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a4757600080fd5b506011546105f1906001600160a01b031681565b348015610a6757600080fd5b5061030360145481565b348015610a7d57600080fd5b5061043d610a8c366004614c3c565b613a93565b348015610a9d57600080fd5b50610303610aac366004614bab565b6001600160a01b03166000908152601e602052604090206001015490565b348015610ad657600080fd5b50610597610ae5366004614f61565b613ba5565b348015610af657600080fd5b5061030360255481565b348015610b0c57600080fd5b50601d5461034f90610100900460ff1681565b348015610b2b57600080fd5b50610303610b3a366004614ee0565b613c4f565b348015610b4b57600080fd5b5061043d613f77565b60038054610b619061546b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8d9061546b565b8015610bda5780601f10610baf57610100808354040283529160200191610bda565b820191906000526020600020905b815481529060010190602001808311610bbd57829003601f168201915b505050505081565b3360008181526001602090815260408083206001600160a01b0387168085529252808320859055519192909160008051602061558983398151915290610c2b9086815260200190565b60405180910390a35060015b92915050565b6008546001600160a01b03163314610c705760405162461bcd60e51b8152600401610c6790615020565b60405180910390fd5b6001600160a01b03919091166000908152602160205260409020805460ff1916911515919091179055565b60026026541415610cbe5760405162461bcd60e51b8152600401610c6790615398565b600260265533600090815260226020526040902054811115610cf25760405162461bcd60e51b8152600401610c67906150d4565b6000610d0b82610d066103e56103e86140f2565b6141ce565b90506000610d198383614258565b33600090815260226020526040812080549293508592909190610d3d908490615428565b90915550506001600160a01b03841660009081526022602052604081208054849290610d6a9084906153dd565b90915550506007546001600160a01b031660009081526022602052604081208054839290610d999084906153dd565b9091555050600160265550505050565b600c546001600160a01b031633148015610dd15750600d546001600160a01b03828116911614155b8015610deb5750600e546001600160a01b03828116911614155b610e275760405162461bcd60e51b815260206004820152600d60248201526c139bdd081c195c9b5a5d1d1959609a1b6044820152606401610c67565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038083166000908152601e6020526040808220928416825281206001830154919291610eae90610e89670de0b6b3a764000060196141ce565b8360010154610ea1670de0b6b3a764000060196141ce565b66071afd498d00006121c2565b95945050505050565b6008546001600160a01b031633148015610ed957506001600160a01b03811615155b610ee257600080fd5b601080546001600160a01b039384166001600160a01b03199182161790915560098054929093169116179055565b60026026541415610f335760405162461bcd60e51b8152600401610c6790615398565b6002602655600d546001600160a01b0383811691161480610f615750600e546001600160a01b038381169116145b610f6a57600080fd5b600e546001600160a01b03838116911614156110065733600090815260226020526040902054811115610faf5760405162461bcd60e51b8152600401610c6790615054565b8060176000828254610fc19190615428565b90915550503360009081526022602052604081208054839290610fe5908490615428565b9091555050600e54611001906001600160a01b031633836142b5565b611087565b336000908152602360205260409020548111156110355760405162461bcd60e51b8152600401610c67906151bf565b80601860008282546110479190615428565b9091555050336000908152602360205260408120805483929061106b908490615428565b9091555050600d54611087906001600160a01b031633836142b5565b61108f61435d565b50506001602655565b6001600160a01b03166000908152601f602052604090205460ff1690565b6000336001600160a01b03851614806110f257506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6110fb57600080fd5b600061110633611098565b905080156111265760405162461bcd60e51b8152600401610c6790615152565b611131858585614424565b336001600160a01b0386161480159061116f57506001600160a01b038516600090815260016020908152604080832033845290915290205460001914155b156111f0576001600160a01b03851660009081526001602090815260408083203384529091529020546111a29084614258565b6001600160a01b038681166000908152600160209081526040808320338085529083529281902085905551938452918716929091600080516020615589833981519152910160405180910390a35b506001949350505050565b6002602654141561121e5760405162461bcd60e51b8152600401610c6790615398565b6002602655600061122e33611098565b9050801561124e5760405162461bcd60e51b8152600401610c6790615152565b600254600061125d86836140f2565b90508061127c5760405162461bcd60e51b8152600401610c679061507e565b61128633876144e2565b61128f866144f1565b60005b6016548110156113ac576000601682815481106112b1576112b1615501565b60009182526020808320909101546001600160a01b0316808352601e9091526040822060010154909250906112e685836141ce565b9050806113055760405162461bcd60e51b8152600401610c679061507e565b88888581811061131757611317615501565b9050602002013581101561133d5760405162461bcd60e51b8152600401610c6790615213565b826001600160a01b0316336001600160a01b03167f9d9058fd2f25ccc389fec7720abef0ca83472f5abfafd5f10d37f51e6a0493f38360006040516113839291906153cf565b60405180910390a36113968333836142b5565b50505080806113a4906154a6565b915050611292565b506113b5613f77565b6113bd61435d565b6113c5614571565b6011546001600160a01b03161561147e576011546040516370a0823160e01b815260009161145d9184916001600160a01b0316906370a082319061140d903090600401614fc0565b60206040518083038186803b15801561142557600080fd5b505afa158015611439573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d069190614de9565b9050801561147c5760115461147c906001600160a01b031633836142b5565b505b5050600160265550505050565b601d5460ff16156114ae5760405162461bcd60e51b8152600401610c67906151e8565b600e546040516370a0823160e01b81526000916001600160a01b0316906370a08231906114df903090600401614fc0565b60206040518083038186803b1580156114f757600080fd5b505afa15801561150b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152f9190614de9565b600d546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190611565903090600401614fc0565b60206040518083038186803b15801561157d57600080fd5b505afa158015611591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b59190614de9565b6040805180820182526016805482526020808301878152600e80546001600160a01b039081166000908152601e80865288822097518855935160019788015587518089018952865481528086018a8152600d80548516845295909652888220905181559451948701949094558154855480880187557fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428990810180549284166001600160a01b031993841617905593548654808901909755959093018054958216959093169490941790915554909116815291822001549192509061169d90633b9aca006140f2565b600d546001600160a01b03166000908152601e6020526040812060010154919250906116d190670de0b6b3a76400006140f2565b905060006116df82846153dd565b90506116ea81614683565b6116f6601b54826146e0565b601b556117038882614739565b6001600160a01b0388166000908152601f60209081526040808320918052909120815460ff1916600117825561173d426301e133806153dd565b600180830191909155601d805460ff191690911790556117626064610d06898b6140f2565b6024556117746064610d06888c6140f2565b60255550505050505050505050565b600260265414156117a65760405162461bcd60e51b8152600401610c6790615398565b6002602655336000908152602360205260409020548111156117da5760405162461bcd60e51b8152600401610c67906150d4565b60006117ee82610d066103e56103e86140f2565b905060006117fc8383614258565b33600090815260236020526040812080549293508592909190611820908490615428565b90915550506001600160a01b0384166000908152602360205260408120805484929061184d9084906153dd565b90915550506007546001600160a01b031660009081526023602052604081208054839290610d999084906153dd565b3360009081526001602090815260408083206001600160a01b0386168452909152812054808311156118d1573360009081526001602090815260408083206001600160a01b0388168452909152812055611900565b6118db8184614258565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b03891680855290835292819020549051908152919291600080516020615589833981519152910160405180910390a35060019392505050565b600c546001600160a01b0316331461196957600080fd5b601d805461ff001916610100179055565b6007546001600160a01b0316331461199157600080fd5b600061199c82611098565b90506001811515146119c05760405162461bcd60e51b8152600401610c6790615247565b6001600160a01b038216600090815260208052604090206119e4426202a3006153dd565b6001909101555050565b60026026541415611a115760405162461bcd60e51b8152600401610c6790615398565b60026026819055546000611a2585836140f2565b905080611a445760405162461bcd60e51b8152600401610c679061507e565b6000611a4f33611098565b905060018115151415611a745785601b6000828254611a6e91906153dd565b90915550505b60005b601654811015611bb057600060168281548110611a9657611a96615501565b60009182526020808320909101546001600160a01b0316808352601e909152604082206001015490925090611acb86836141ce565b905080611aea5760405162461bcd60e51b8152600401610c679061507e565b888885818110611afc57611afc615501565b90506020020135811115611b415760405162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b6044820152606401610c67565b826001600160a01b0316336001600160a01b03167f15a8ca63e37b2cff1677df2b6b82d36fcf8a524228bd7a4b4d02d107c28c1e8a836000604051611b879291906153cf565b60405180910390a3611b9a833383614744565b5050508080611ba8906154a6565b915050611a77565b50611bba86614683565b611bc43387614739565b611bcc61435d565b611bd4614571565b61147e613f77565b336000611be882611098565b9050600181151514611c0c5760405162461bcd60e51b8152600401610c6790615247565b6040516370a0823160e01b815260009030906370a0823190611c32908690600401614fc0565b60206040518083038186803b158015611c4a57600080fd5b505afa158015611c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c829190614de9565b905080601b6000828254611c969190615428565b90915550506001600160a01b0383166000908152601f602090815260408083209180529091206001810154421015611ce05760405162461bcd60e51b8152600401610c6790615152565b50805460ff19169055505050565b6007546001600160a01b03163314611d0557600080fd5b600780546001600160a01b039485166001600160a01b0319918216179091556008805493851693821693909317909255600c8054919093169116179055565b600c546001600160a01b031633148015611d835750600d546001600160a01b03166000908152601e6020526040902060010154674563918244f4000011155b611d9f5760405162461bcd60e51b8152600401610c6790615020565b600d546001600160a01b03166000908152601e6020526040902060010154674563918244f4000011611e27576103de8110158015611ddf57506103e88111155b611dfb5760405162461bcd60e51b8152600401610c67906150a7565b60648211158015611e0b57508115155b611e275760405162461bcd60e51b8152600401610c67906150a7565b600d546001600160a01b03166000908152601e602052604090206001015468015af1d78b58c4000011611efe576103848110158015611e6857506103e88111155b611eab5760405162461bcd60e51b81526020600482015260146024820152732043616e6e6f7420736574206f7665722031302560601b6044820152606401610c67565b6101f48211158015611ebc57508115155b611efe5760405162461bcd60e51b81526020600482015260136024820152722043616e6e6f7420736574206f76657220352560681b6044820152606401610c67565b601555601455565b600c546001600160a01b03163314611f305760405162461bcd60e51b8152600401610c6790615020565b600e54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015611f7557600080fd5b505afa158015611f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fad9190614de9565b9050611fbb6103e8826153f5565b8310158015611fca5750808311155b6120315760405162461bcd60e51b815260206004820152603260248201527f6d696e20302e3125206f6620746f6b656e20737570706c792c206d61782031306044820152713025206f6620746f6b656e20737570706c7960701b6064820152608401610c67565b670de0b6b3a76400008210156120795760405162461bcd60e51b815260206004820152600d60248201526c3120455448206d696e696d756d60981b6044820152606401610c67565b50601391909155601255565b60048054610b619061546b565b33600061209e82611098565b905080156120e95760405162461bcd60e51b8152602060048201526018602482015277131a5c5d5a591a5d1e48185b1c9958591e481b1bd8dad95960421b6044820152606401610c67565b6040516370a0823160e01b815260009030906370a082319061210f908690600401614fc0565b60206040518083038186803b15801561212757600080fd5b505afa15801561213b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215f9190614de9565b6001600160a01b0384166000908152601f60209081526040808320918052909120815460ff191660011782559192509061219c426276a7006153dd565b816001018190555082601b60008282546121b691906153dd565b90915550505050505050565b6000806121cf87876140f2565b905060006121dd86866140f2565b905060006121eb83836140f2565b90506000612212670de0b6b3a764000061220d670de0b6b3a764000089614258565b6140f2565b905061221e82826141ce565b9a9950505050505050505050565b60008061223833611098565b905080156122585760405162461bcd60e51b8152600401610c6790615152565b612263338585614424565b5060019392505050565b6000600260265414156122925760405162461bcd60e51b8152600401610c6790615398565b6002602655601d5460ff6101009091041615156001146122c45760405162461bcd60e51b8152600401610c6790615275565b6122cd33614783565b1515600114156122f85760065485146122f85760405162461bcd60e51b8152600401610c679061531c565b60135483111561231a5760405162461bcd60e51b8152600401610c67906152c8565b600d546001600160a01b03166000908152601e602052604090206001015461234890610d06603260646140f2565b8111156123675760405162461bcd60e51b8152600401610c67906152f0565b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612398903390600401614fc0565b60206040518083038186803b1580156123b057600080fd5b505afa1580156123c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e89190614de9565b90508447158015906124025750670de0b6b3a76400008311155b801561241757506801158e460913d000008210155b15612424576124246147bf565b600e546001600160a01b03166000818152601e60205260409020600101549061244e903388614744565b601754600e546040516370a0823160e01b81526001600160a01b03909116906370a0823190612481903090600401614fc0565b60206040518083038186803b15801561249957600080fd5b505afa1580156124ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d19190614de9565b6124db9190615428565b600e80546001600160a01b039081166000908152601e60205260408082206001908101959095559254909116815290812090910154908061252d61251f8585615428565b610d066103e66103e86140f2565b905061258584612546670de0b6b3a764000060196141ce565b600d546001600160a01b03166000908152601e6020526040902060010154612577670de0b6b3a764000060196141ce565b8566071afd498d00006132fa565b9097509150878710156125aa5760405162461bcd60e51b8152600401610c6790615213565b60006125be88610d066015546103e86140f2565b905060006125d382610d06600f6127106140f2565b905060006125e883610d06600f6127106140f2565b905060006125fe84610d066014546127106140f2565b905060008161260d84866153dd565b61261791906153dd565b6126219086615428565b9050600061263782610d066103e76103e86140f2565b30600090815260236020526040902054909150662386f26fc1000081111561268157806018600082825461266b9190615428565b9091555050306000908152602360205260408120555b600d546001600160a01b0316632e1a7d4d8761269d84866153dd565b6126a791906153dd565b6040518263ffffffff1660e01b81526004016126c591815260200190565b600060405180830381600087803b1580156126df57600080fd5b505af11580156126f3573d6000803e3d6000fd5b505050506127118c61270c84610d0660255460646140f2565b6147f2565b61272283610d0660016103e86140f2565b601a600082825461273391906153dd565b909155506000905061274b85610d06605f60646140f2565b600f546001600160a01b031660009081526023602052604081208054929350839290919061277a9084906153dd565b9091555061278a90508186615428565b6007546001600160a01b0316600090815260236020526040812080549091906127b49084906153dd565b9250508190555084601860008282546127cd91906153dd565b9250508190555085601960008282546127e691906153dd565b909155506127f4905061435d565b6127fc614571565b601a5460195460185461280f91906153dd565b61281991906153dd565b600d546040516370a0823160e01b81526001600160a01b03909116906370a0823190612849903090600401614fc0565b60206040518083038186803b15801561286157600080fd5b505afa158015612875573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128999190614de9565b6128a39190615428565b600d80546001600160a01b039081166000908152601e602052604090206001019290925554600e546025549183169216903390600080516020615549833981519152908d906128f9908990610d069060646140f2565b6040516129079291906153cf565b60405180910390a450505050505050505050505050506001602655949350505050565b60006002602654141561294f5760405162461bcd60e51b8152600401610c6790615398565b60026026553360009081526022602052604090205483908111156129855760405162461bcd60e51b8152600401610c6790615054565b600e546001600160a01b039081166000908152601e6020526040808220600d54909316825290206013548611156129ce5760405162461bcd60e51b8152600401610c67906152c8565b6129e28160010154610d06603260646140f2565b841115612a015760405162461bcd60e51b8152600401610c67906152f0565b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612a32903390600401614fc0565b60206040518083038186803b158015612a4a57600080fd5b505afa158015612a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a829190614de9565b9050600047118015612a9c5750670de0b6b3a76400008511155b8015612ab157506801158e460913d000008110155b15612abe57612abe6147bf565b6000612b128460010154612adb670de0b6b3a764000060196141ce565b8560010154612af3670de0b6b3a764000060196141ce565b612b058d610d066103e66103e86140f2565b66071afd498d00006132fa565b80925081975050506000612b2e87610d066015546103e86140f2565b90506000612b4382610d06600f6127106140f2565b90506000612b5883610d06600f6127106140f2565b90506000612b6e84610d066014546127106140f2565b9050600081612b7d84866153dd565b612b8791906153dd565b612b919086615428565b90506000612ba782610d066103e76103e86140f2565b9050612bba82610d0660016103e86140f2565b601a6000828254612bcb91906153dd565b90915550508c811015612bf05760405162461bcd60e51b8152600401610c6790615213565b8d60226000336001600160a01b03166001600160a01b031681526020019081526020016000206000828254612c259190615428565b925050819055508d60176000828254612c3e9190615428565b90915550503360009081526023602052604081208054839290612c629084906153dd565b90915550503060009081526023602052604081208054879290612c869084906153dd565b9091555060009050612c9e84610d06605f60646140f2565b600f546001600160a01b0316600090815260236020526040812080549293508392909190612ccd9084906153dd565b90915550612cdd90508185615428565b6007546001600160a01b031660009081526023602052604081208054909190612d079084906153dd565b90915550829050612d1885886153dd565b612d2291906153dd565b60186000828254612d3391906153dd565b925050819055508460196000828254612d4c91906153dd565b90915550612d5a9050613f77565b612d6261435d565b612d6a614571565b600d60009054906101000a90046001600160a01b03166001600160a01b0316600e60009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03166000805160206155298339815191528f86604051612dd19291906153cf565b60405180910390a4505050505050505050505050600160265592915050565b60026026541415612e135760405162461bcd60e51b8152600401610c6790615398565b6002602655600d546001600160a01b0384811691161480612e415750600e546001600160a01b038481169116145b612e4a57600080fd5b600d546001600160a01b03848116911614156130a25733600090815260236020526040902054811115612e8f5760405162461bcd60e51b8152600401610c67906151bf565b600d5460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390612ec19087908590600401614fd4565b602060405180830381600087803b158015612edb57600080fd5b505af1158015612eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f139190614db3565b508060186000828254612f269190615428565b90915550503360009081526023602052604081208054839290612f4a908490615428565b9091555050600d54604051632efc49c560e21b81526001600160a01b038681169263bbf1271492612f8392909116908590600401614fd4565b600060405180830381600087803b158015612f9d57600080fd5b505af1158015612fb1573d6000803e3d6000fd5b50505050600080856001600160a01b0316632b9abe1a306040518263ffffffff1660e01b8152600401612fe49190614fc0565b6040805180830381600087803b158015612ffd57600080fd5b505af1158015613011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130359190614f02565b6040516365d1a40d60e01b815291935091506001600160a01b038716906365d1a40d906130689087908590600401614fd4565b600060405180830381600087803b15801561308257600080fd5b505af1158015613096573d6000803e3d6000fd5b506132df945050505050565b336000908152602260205260409020548111156130d15760405162461bcd60e51b8152600401610c6790615054565b600e5460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906131039087908590600401614fd4565b602060405180830381600087803b15801561311d57600080fd5b505af1158015613131573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131559190614db3565b5080601760008282546131689190615428565b9091555050336000908152602260205260408120805483929061318c908490615428565b9091555050600e54604051632efc49c560e21b81526001600160a01b038681169263bbf12714926131c592909116908590600401614fd4565b600060405180830381600087803b1580156131df57600080fd5b505af11580156131f3573d6000803e3d6000fd5b50505050600080856001600160a01b0316632b9abe1a306040518263ffffffff1660e01b81526004016132269190614fc0565b6040805180830381600087803b15801561323f57600080fd5b505af1158015613253573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132779190614f02565b6040516310510ec160e01b815291935091506001600160a01b038716906310510ec1906132aa9087908690600401614fd4565b600060405180830381600087803b1580156132c457600080fd5b505af11580156132d8573d6000803e3d6000fd5b5050505050505b6132e761435d565b6132ef614571565b505060016026555050565b600080600061330988876140f2565b9050600061331f670de0b6b3a764000086614258565b905061332b86826141ce565b9050600061333d8b61220d8d856146e0565b9050600061334b82856148c0565b90506000613361670de0b6b3a764000083614258565b905061336d8b826141ce565b96506133798985614258565b95505050505050965096945050505050565b600260265414156133ae5760405162461bcd60e51b8152600401610c6790615398565b6002602655600d546001600160a01b03838116911614806133dc5750600e546001600160a01b038381169116145b6133e557600080fd5b601d5460ff6101009091041615156001146134125760405162461bcd60e51b8152600401610c6790615275565b600e546001600160a01b038381169116141561353357600e546001600160a01b03166000818152601e602052604090206001015490613452903384614744565b600e546040516370a0823160e01b81526000916134e1916001600160a01b03909116906370a0823190613489903090600401614fc0565b60206040518083038186803b1580156134a157600080fd5b505afa1580156134b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d99190614de9565b601754614258565b905060006134ef8284614258565b90506134fd601754826146e0565b6017553360009081526022602052604090205461351a90826146e0565b3360009081526022602052604090205550611087915050565b600d546001600160a01b03166000818152601e60205260409020600101549061355d903384614744565b600d546040516370a0823160e01b8152600091613602916001600160a01b03909116906370a0823190613594903090600401614fc0565b60206040518083038186803b1580156135ac57600080fd5b505afa1580156135c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e49190614de9565b6135fd6018546135f8601954601a546146e0565b6146e0565b614258565b905060006136108284614258565b905061361e601854826146e0565b6018553360009081526023602052604090205461363b90826146e0565b3360009081526023602052604090205550505061108f61435d565b60006002602654141561367b5760405162461bcd60e51b8152600401610c6790615398565b6002602655601d5460ff6101009091041615156001146136ad5760405162461bcd60e51b8152600401610c6790615275565b6136b633614783565b1515600114156136e15760065484146136e15760405162461bcd60e51b8152600401610c679061531c565b600d60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561373157600080fd5b505af1158015613745573d6000803e3d6000fd5b5050600a546040516370a0823160e01b8152600094506001600160a01b0390911692506370a08231915061377d903390600401614fc0565b60206040518083038186803b15801561379557600080fd5b505afa1580156137a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137cd9190614de9565b90504780158015906137e6575066b1a2bc2ec500003410155b80156137fb57506801158e460913d000008210155b15613808576138086147bf565b600d546001600160a01b039081166000908152601e6020526040808220600e54909316825290206012543411156138515760405162461bcd60e51b8152600401610c67906150fe565b6138658160010154610d06603260646140f2565b8511156138845760405162461bcd60e51b8152600401610c67906152f0565b60006138d283600101546138a1670de0b6b3a764000060196141ce565b84600101546138b9670de0b6b3a764000060196141ce565b6138cb34610d066103e76103e86140f2565b60006132fa565b9096509050868610156138f75760405162461bcd60e51b8152600401610c6790615213565b600061390a34610d0660016103e86140f2565b905061391d81610d0660255460646140f2565b601a600082825461392e91906153dd565b9091555050600e5461394a906001600160a01b03168a896142b5565b613952613f77565b600e54600d546024546001600160a01b0392831692909116903390600080516020615549833981519152903490613990908d90610d069060646140f2565b60405161399e9291906153cf565b60405180910390a450505050505060016026559392505050565b6008546001600160a01b031633146139e25760405162461bcd60e51b8152600401610c6790615020565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b03163314613a1b57600080fd5b602455565b3360009081526001602090815260408083206001600160a01b0386168452909152812054613a4e90836146e0565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208590555193845290926000805160206155898339815191529101610c2b565b601d5460ff1615613ab65760405162461bcd60e51b8152600401610c67906151e8565b600e80546001600160a01b038088166001600160a01b03199283168117909355600c80548883169084168117909155600f8054841690911790556006849055600980548683169084161790556010805491871691909216179055604080516318160ddd60e01b81529051613b8e92916318160ddd916004808301926020929190829003018186803b158015613b4a57600080fd5b505afa158015613b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b829190614de9565b610d06600160056140f2565b601355505068056bc75e2d63100000601255505050565b6000806000613bb486896140f2565b90506000613bc28887614258565b90506000613bd089836140f2565b90506000613bde82856148c0565b9050613bf281670de0b6b3a7640000614258565b9050613bfe8c826141ce565b9050613c12670de0b6b3a764000088614258565b9550613c1e81876140f2565b9550613c3281670de0b6b3a76400006140f2565b9450613c3e8686614258565b945050505050965096945050505050565b600060026026541415613c745760405162461bcd60e51b8152600401610c6790615398565b600260265533600090815260236020526040902054831115613cd85760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f756768204d61696e2c206465706f736974206d6f72650000006044820152606401610c67565b600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190613d09903390600401614fc0565b60206040518083038186803b158015613d2157600080fd5b505afa158015613d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d599190614de9565b9050478015801590613d72575066b1a2bc2ec500008510155b8015613d8757506801158e460913d000008210155b15613d9457613d946147bf565b600d546001600160a01b039081166000908152601e6020526040808220600e5490931682529020601254871115613ddd5760405162461bcd60e51b8152600401610c67906150fe565b613df18160010154610d06603260646140f2565b851115613e105760405162461bcd60e51b8152600401610c67906152f0565b6000613e578360010154613e2d670de0b6b3a764000060196141ce565b8460010154613e45670de0b6b3a764000060196141ce565b6138cb8d610d066103e76103e86140f2565b909650905086861015613e7c5760405162461bcd60e51b8152600401610c6790615213565b600e54600d546040516001600160a01b039283169290911690339060008051602061552983398151915290613eb4908d908c906153cf565b60405180910390a433600090815260236020526040812080548a9290613edb908490615428565b925050819055508760186000828254613ef49190615428565b90915550503360009081526022602052604081208054889290613f189084906153dd565b925050819055508560176000828254613f3191906153dd565b90915550613f48905088610d0660016103e86140f2565b601a6000828254613f5991906153dd565b90915550613f679050613f77565b5050505050600160265592915050565b601754600e546040516370a0823160e01b81526001600160a01b03909116906370a0823190613faa903090600401614fc0565b60206040518083038186803b158015613fc257600080fd5b505afa158015613fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ffa9190614de9565b6140049190615428565b600e546001600160a01b03166000908152601e6020526040812060010191909155601a5460195460185461403891906153dd565b61404291906153dd565b600d546040516370a0823160e01b815291925082916001600160a01b03909116906370a0823190614077903090600401614fc0565b60206040518083038186803b15801561408f57600080fd5b505afa1580156140a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140c79190614de9565b6140d19190615428565b600d546001600160a01b03166000908152601e602052604090206001015550565b6000816141305760405162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b6044820152606401610c67565b600061414484670de0b6b3a7640000615409565b9050831580614163575061415884826153f5565b670de0b6b3a7640000145b61417f5760405162461bcd60e51b8152600401610c6790615128565b600061418c6002856153f5565b61419690836153dd565b9050818110156141b85760405162461bcd60e51b8152600401610c6790615128565b60006141c485836153f5565b9695505050505050565b6000806141db8385615409565b90508315806141f25750826141f085836153f5565b145b61420e5760405162461bcd60e51b8152600401610c679061529e565b6000614222826706f05b59d3b200006153dd565b9050818110156142445760405162461bcd60e51b8152600401610c679061529e565b60006141c4670de0b6b3a7640000836153f5565b600080600061426785856149c4565b9150915080156142ad5760405162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b6044820152606401610c67565b509392505050565b60405163a9059cbb60e01b81526000906001600160a01b0385169063a9059cbb906142e69086908690600401614fd4565b602060405180830381600087803b15801561430057600080fd5b505af1158015614314573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143389190614db3565b9050806143575760405162461bcd60e51b8152600401610c679061536f565b50505050565b6611c37937e08000601954111561442257600d5460105460195460405163a9059cbb60e01b81526000936001600160a01b039081169363a9059cbb936143aa939290911691600401614fd4565b602060405180830381600087803b1580156143c457600080fd5b505af11580156143d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143fc9190614db3565b90508061441b5760405162461bcd60e51b8152600401610c679061536f565b5060006019555b565b6001600160a01b03831660009081526020819052604090205481111561444957600080fd5b6001600160a01b03831660009081526020819052604090205461446c9082614258565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461449b90826146e0565b6001600160a01b03838116600081815260208181526040918290209490945551848152909291861691600080516020615569833981519152910160405180910390a3505050565b6144ed823083614424565b5050565b3060009081526020819052604090205481111561450d57600080fd5b306000908152602081905260409020546145279082614258565b306000908152602081905260409020556002546145449082614258565b6002556040518181526000903090600080516020615569833981519152906020015b60405180910390a350565b6611c37937e08000601a54111561442257600d54601a54604051632e1a7d4d60e01b81526001600160a01b0390921691632e1a7d4d916145b79160040190815260200190565b600060405180830381600087803b1580156145d157600080fd5b505af11580156145e5573d6000803e3d6000fd5b5050600954601a546001600160a01b03909116925063c172715c915061461190610d06606360646140f2565b600b5460405160e084901b6001600160e01b03191681526103e960048201526001600160a01b039091166024820152600160448201526064016000604051808303818588803b15801561466357600080fd5b505af1158015614677573d6000803e3d6000fd5b50506000601a55505050565b3060009081526020819052604090205461469d90826146e0565b306000908152602081905260409020556002546146ba90826146e0565b600255604051818152309060009060008051602061556983398151915290602001614566565b6000806146ed83856153dd565b9050838110156147325760405162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b6044820152606401610c67565b9392505050565b6144ed308383614424565b6040516323b872dd60e01b81526001600160a01b03838116600483015230602483015260448201839052600091908516906323b872dd906064016142e6565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906147b757508115155b949350505050565b60006147cc6008476153f5565b90506147d833826147f2565b80601c60008282546147ea91906153dd565b909155505050565b604080516000808252602082019092526001600160a01b03841690839060405161481c9190614fa4565b60006040518083038185875af1925050503d8060008114614859576040519150601f19603f3d011682016040523d82523d6000602084013e61485e565b606091505b50509050806148bb5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610c67565b505050565b6000600183101561490b5760405162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b6044820152606401610c67565b671bc16d674ec7ffff83111561495c5760405162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b6044820152606401610c67565b6000614967836149fb565b905060006149758483614258565b9050600061498b8661498685614a18565b614a2c565b90508161499c579250610c37915050565b60006149ad87846305f5e100614a9f565b90506149b982826141ce565b979650505050505050565b6000808284106149e3576149d88385615428565b6000915091506149f4565b6149ed8484615428565b6001915091505b9250929050565b6000614a0682614a18565b610c3790670de0b6b3a7640000615409565b6000610c37670de0b6b3a7640000836153f5565b600080614a3a6002846154c1565b614a4c57670de0b6b3a7640000614a4e565b835b9050614a5b6002846153f5565b92505b821561473257614a6e84856141ce565b9350614a7b6002846154c1565b15614a8d57614a8a81856141ce565b90505b614a986002846153f5565b9250614a5e565b6000828180614ab687670de0b6b3a76400006149c4565b9092509050670de0b6b3a764000080600060015b888410614b80576000614ae582670de0b6b3a7640000615409565b9050600080614b058a614b0085670de0b6b3a7640000614258565b6149c4565b91509150614b1787610d06848c6141ce565b9650614b2387846140f2565b965086614b3257505050614b80565b8715614b3c579315935b8015614b46579315935b8415614b5d57614b568688614258565b9550614b6a565b614b6786886146e0565b95505b5050508080614b78906154a6565b915050614aca565b50909998505050505050505050565b80356001600160a01b0381168114614ba657600080fd5b919050565b600060208284031215614bbd57600080fd5b61473282614b8f565b60008060408385031215614bd957600080fd5b614be283614b8f565b9150614bf060208401614b8f565b90509250929050565b600080600060608486031215614c0e57600080fd5b614c1784614b8f565b9250614c2560208501614b8f565b9150614c3360408501614b8f565b90509250925092565b600080600080600060a08688031215614c5457600080fd5b614c5d86614b8f565b9450614c6b60208701614b8f565b9350614c7960408701614b8f565b9250614c8760608701614b8f565b949793965091946080013592915050565b60008060008060808587031215614cae57600080fd5b614cb785614b8f565b9350614cc560208601614b8f565b9250614cd360408601614b8f565b9396929550929360600135925050565b600080600060608486031215614cf857600080fd5b614d0184614b8f565b9250614d0f60208501614b8f565b9150604084013590509250925092565b60008060408385031215614d3257600080fd5b614d3b83614b8f565b91506020830135614d4b81615517565b809150509250929050565b60008060408385031215614d6957600080fd5b614d7283614b8f565b946020939093013593505050565b600080600060608486031215614d9557600080fd5b614d9e84614b8f565b95602085013595506040909401359392505050565b600060208284031215614dc557600080fd5b815161473281615517565b600060208284031215614de257600080fd5b5035919050565b600060208284031215614dfb57600080fd5b5051919050565b600080600060608486031215614e1757600080fd5b83359250614d0f60208501614b8f565b60008060008060808587031215614e3d57600080fd5b84359350614e4d60208601614b8f565b93969395505050506040820135916060013590565b600080600060408486031215614e7757600080fd5b8335925060208401356001600160401b0380821115614e9557600080fd5b818601915086601f830112614ea957600080fd5b813581811115614eb857600080fd5b8760208260051b8501011115614ecd57600080fd5b6020830194508093505050509250925092565b60008060408385031215614ef357600080fd5b50508035926020909101359150565b60008060408385031215614f1557600080fd5b505080516020909101519092909150565b600080600080600060a08688031215614f3e57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060008060008060c08789031215614f7a57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60008251614fb681846020870161543f565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b602081526000825180602084015261500c81604085016020870161543f565b601f01601f19169190910160400192915050565b6020808252601a90820152792cb7ba903237903737ba103430bb32903832b936b4b9b9b4b7b760311b604082015260600190565b60208082526010908201526f2737ba1032b737bab3b4102a37b5b2b760811b604082015260600190565b6020808252600f908201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604082015260600190565b6020808252601390820152722043616e6e6f7420736574206f76657220312560681b604082015260600190565b60208082526010908201526f2737ba1032b737bab3b4103a37b5b2b760811b604082015260600190565b60208082526010908201526f4552525f4255595f494e5f524154494f60801b604082015260600190565b60208082526010908201526f11549497d1125597d25395115493905360821b604082015260600190565b60208082526047908201527f4c6971756964697479206973206c6f636b65642c20796f752063616e6e6f742060408201527f72656d6f7665206c697175696469747920756e74696c206166746572206c6f6360608201526635903a34b6b29760c91b608082015260a00190565b6020808252600f908201526e2737ba1032b737bab3b41026b0b4b760891b604082015260600190565b60208082526011908201527043616e206f6e6c7920757365206f6e636560781b604082015260600190565b6020808252601a9082015279135a5b9a5b5d5b48185b5bdd5b9d081bdd5d081b9bdd081b595d60321b604082015260600190565b602080825260149082015273131a5c5d5a591a5d1e481b9bdd081b1bd8dad95960621b604082015260600190565b6020808252600f908201526e14ddd85c081b9bdd081bdc195b9959608a1b604082015260600190565b60208082526010908201526f4552525f4d554c5f4f564552464c4f5760801b604082015260600190565b6020808252600e908201526d4552525f53454c4c5f524154494f60901b604082015260600190565b6020808252601290820152714f766572204d41585f4f55545f524154494f60701b604082015260600190565b60208082526033908201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e7460408201527206572616374207769746820746865205377617606c1b606082015260800190565b6020808252600f908201526e4552525f45524332305f46414c534560881b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b918252602082015260400190565b600082198211156153f0576153f06154d5565b500190565b600082615404576154046154eb565b500490565b6000816000190483118215151615615423576154236154d5565b500290565b60008282101561543a5761543a6154d5565b500390565b60005b8381101561545a578181015183820152602001615442565b838111156143575750506000910152565b600181811c9082168061547f57607f821691505b602082108114156154a057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156154ba576154ba6154d5565b5060010190565b6000826154d0576154d06154eb565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b801515811461552557600080fd5b5056fec5f954edb6f50c3415e43c4c343ed2fac83243f08807d721c27e2ccb634c36fa908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a264697066735822122002d78c355a352a0a1033f89c5ab6cf3e44b2bd59cec09e0e8d18faef9d4c14d264736f6c63430008070033

Deployed Bytecode Sourcemap

14721:28319:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16892:25;;;;;;;;;;;;;;;;;;;20939::1;;;20927:2;20912:18;16892:25:0;;;;;;;;19390:119;;;;;;;;;;-1:-1:-1;19390:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;19477:24:0;19454:4;19477:24;;;:17;:24;;;;;;;;;19390:119;;;;7953:14:1;;7946:22;7928:41;;7916:2;7901:18;19390:119:0;7788:187:1;17027:28:0;;;;;;;;;;;;;;;;16754;;;;;;;;;;;;;;;;11141:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;17371:46::-;;;;;;;;;;-1:-1:-1;17371:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8173:14:1;;8166:22;8148:41;;8220:2;8205:18;;8198:34;;;;8121:18;17371:46:0;7980:258:1;11509:187:0;;;;;;;;;;-1:-1:-1;11509:187:0;;;;;:::i;:::-;;:::i;19188:190::-;;;;;;;;;;-1:-1:-1;19188:190:0;;;;;:::i;:::-;;:::i;:::-;;42644:393;;;;;;;;;;-1:-1:-1;42644:393:0;;;;;:::i;:::-;;:::i;20646:225::-;;;;;;;;;;-1:-1:-1;20646:225:0;;;;;:::i;:::-;;:::i;23425:372::-;;;;;;;;;;-1:-1:-1;23425:372:0;;;;;:::i;:::-;;:::i;9928:30::-;;;;;;;;;;;;;;;;20883:183;;;;;;;;;;-1:-1:-1;20883:183:0;;;;;:::i;:::-;;:::i;24883:610::-;;;;;;;;;;-1:-1:-1;24883:610:0;;;;;:::i;:::-;;:::i;15055:114::-;;;;;;;;;;-1:-1:-1;15055:114:0;;;;;:::i;:::-;;:::i;26901:626::-;;;;;;;;;;-1:-1:-1;26901:626:0;;;;;:::i;:::-;;:::i;28619:1292::-;;;;;;;;;;-1:-1:-1;28619:1292:0;;;;;:::i;:::-;;:::i;18567:209::-;;;;;;;;;;-1:-1:-1;18567:209:0;;;;;:::i;:::-;-1:-1:-1;;;;;18676:17:0;18631:7;18676:17;;;:10;:17;;;;;;;;;18720:10;:17;;;;;;;;18567:209;;;;;;;;;:::i;11228:28::-;;;;;;;;;;-1:-1:-1;11228:28:0;;;;;;;;;;;21661:4:1;21649:17;;;21631:36;;21619:2;21604:18;11228:28:0;21489:184:1;16661:29:0;;;;;;;;;;-1:-1:-1;16661:29:0;;;;-1:-1:-1;;;;;16661:29:0;;;;;;;;;;:::i;17097:28::-;;;;;;;;;;;;;;;;22256:1158;;;;;;;;;;-1:-1:-1;22256:1158:0;;;;;:::i;:::-;;:::i;16531:25::-;;;;;;;;;;-1:-1:-1;16531:25:0;;;;-1:-1:-1;;;;;16531:25:0;;;42237:395;;;;;;;;;;-1:-1:-1;42237:395:0;;;;;:::i;:::-;;:::i;11967:403::-;;;;;;;;;;-1:-1:-1;11967:403:0;;;;;:::i;:::-;;:::i;20476:158::-;;;;;;;;;;;;;:::i;17686:18::-;;;;;;;;;;;;;;;;11396:105;;;;;;;;;;-1:-1:-1;11396:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;11479:14:0;11452:7;11479:14;;;;;;;;;;;;11396:105;40845:442;;;;;;;;;;-1:-1:-1;40845:442:0;;;;;:::i;:::-;;:::i;27539:1069::-;;;;;;;;;;-1:-1:-1;27539:1069:0;;;;;:::i;:::-;;:::i;40232:601::-;;;;;;;;;;;;;:::i;21466:282::-;;;;;;;;;;-1:-1:-1;21466:282:0;;;;;:::i;:::-;;:::i;39497:723::-;;;;;;;;;;-1:-1:-1;39497:723:0;;;;;:::i;:::-;;:::i;20029:435::-;;;;;;;;;;-1:-1:-1;20029:435:0;;;;;:::i;:::-;;:::i;11185:36::-;;;;;;;;;;;;;:::i;17169:31::-;;;;;;;;;;;;;;;;16697:23;;;;;;;;;;-1:-1:-1;16697:23:0;;;;-1:-1:-1;;;;;16697:23:0;;;21760:484;;;;;;;;;;;;;:::i;3615:543::-;;;;;;;;;;-1:-1:-1;3615:543:0;;;;;:::i;:::-;;:::i;16992:28::-;;;;;;;;;;;;;;;;26606:287;;;;;;;;;;-1:-1:-1;26606:287:0;;;;;:::i;:::-;;:::i;34003:3026::-;;;;;;;;;;-1:-1:-1;34003:3026:0;;;;;:::i;:::-;;:::i;37042:2439::-;;;;;;;;;;-1:-1:-1;37042:2439:0;;;;;:::i;:::-;;:::i;25501:1093::-;;;;;;;;;;-1:-1:-1;25501:1093:0;;;;;:::i;:::-;;:::i;17132:30::-;;;;;;;;;;;;;;;;4168:810;;;;;;;;;;-1:-1:-1;4168:810:0;;;;;:::i;:::-;;:::i;23813:1062::-;;;;;;;;;;-1:-1:-1;23813:1062:0;;;;;:::i;:::-;;:::i;32063:1932::-;;;;;;:::i;:::-;;:::i;16634:20::-;;;;;;;;;;-1:-1:-1;16634:20:0;;;;-1:-1:-1;;;;;16634:20:0;;;21078:223;;;;;;;;;;-1:-1:-1;21078:223:0;;;;;:::i;:::-;;:::i;16789:29::-;;;;;;;;;;;;;;;;16563:64;;;;;;;;;;-1:-1:-1;16563:64:0;;;;-1:-1:-1;;;;;16563:64:0;;;29923:105;;;;;;;;;;-1:-1:-1;29923:105:0;;;;;:::i;:::-;;:::i;11704:255::-;;;;;;;;;;-1:-1:-1;11704:255:0;;;;;:::i;:::-;;:::i;17062:28::-;;;;;;;;;;;;;;;;11265:123;;;;;;;;;;-1:-1:-1;11265:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;11360:15:0;;;11333:7;11360:15;;;-1:-1:-1;11360:15:0;;;;;;;;:20;;;;;;;;;;;;;11265:123;16727:20;;;;;;;;;;-1:-1:-1;16727:20:0;;;;-1:-1:-1;;;;;16727:20:0;;;16825:23;;;;;;;;;;;;;;;;18080:432;;;;;;;;;;-1:-1:-1;18080:432:0;;;;;:::i;:::-;;:::i;21309:149::-;;;;;;;;;;-1:-1:-1;21309:149:0;;;;;:::i;:::-;-1:-1:-1;;;;;21427:15:0;21385:7;21427:15;;;:8;:15;;;;;-1:-1:-1;21427:23:0;;;21309:149;4988:853;;;;;;;;;;-1:-1:-1;4988:853:0;;;;;:::i;:::-;;:::i;17711:18::-;;;;;;;;;;;;;;;;17239:24;;;;;;;;;;-1:-1:-1;17239:24:0;;;;;;;;;;;30230:1821;;;;;;;;;;-1:-1:-1;30230:1821:0;;;;;:::i;:::-;;:::i;19692:325::-;;;;;;;;;;;;;:::i;11141:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11509:187::-;11598:10;11570:4;11587:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11587:27:0;;;;;;;;;;:33;;;11636:30;11570:4;;11587:27;;-1:-1:-1;;;;;;;;;;;20939:25:1;;;-1:-1:-1;20927:2:1;20912:18;11636:30:0;;;;;;;;-1:-1:-1;11684:4:0;11509:187;;;;;:::o;19188:190::-;19287:7;;-1:-1:-1;;;;;19287:7:0;19273:10;:21;19265:60;;;;-1:-1:-1;;;19265:60:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;19336:24:0;;;;;;;;:17;:24;;;;;:34;;-1:-1:-1;;19336:34:0;;;;;;;;;;19188:190::o;42644:393::-;17820:1;17926:7;;:19;;17918:63;;;;-1:-1:-1;;;17918:63:0;;;;;;;:::i;:::-;17820:1;17994:7;:18;42770:10:::1;42759:22;::::0;;;:10:::1;:22;::::0;;;;;:32;-1:-1:-1;42759:32:0::1;42751:61;;;::::0;-1:-1:-1;;;42751:61:0;;::::1;::::0;::::1;;;:::i;:::-;42823:11;42837:29;42842:6;42850:15;42855:3;42860:4;42850;:15::i;:::-;42837:4;:29::i;:::-;42823:43;;42877:12;42892:17;42897:6;42905:3;42892:4;:17::i;:::-;42931:10;42920:22;::::0;;;:10:::1;:22;::::0;;;;:32;;42877;;-1:-1:-1;42946:6:0;;42920:22;;;:32:::1;::::0;42946:6;;42920:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;42963:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:24;;42984:3;;42963:17;:24:::1;::::0;42984:3;;42963:24:::1;:::i;:::-;::::0;;;-1:-1:-1;;43009:11:0::1;::::0;-1:-1:-1;;;;;43009:11:0::1;42998:23;::::0;;;:10:::1;:23;::::0;;;;:31;;43025:4;;42998:23;:31:::1;::::0;43025:4;;42998:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;17776:1:0;18039:7;:22;-1:-1:-1;;;;42644:393:0:o;20646:225::-;20772:10;;-1:-1:-1;;;;;20772:10:0;20758;:24;:42;;;;-1:-1:-1;20796:4:0;;-1:-1:-1;;;;;20786:14:0;;;20796:4;;20786:14;;20758:42;:62;;;;-1:-1:-1;20815:5:0;;-1:-1:-1;;;;;20805:15:0;;;20815:5;;20805:15;;20758:62;20750:88;;;;-1:-1:-1;;;20750:88:0;;11289:2:1;20750:88:0;;;11271:21:1;11328:2;11308:18;;;11301:30;-1:-1:-1;;;11347:18:1;;;11340:43;11400:18;;20750:88:0;11087:337:1;20750:88:0;20849:5;:14;;-1:-1:-1;;;;;;20849:14:0;-1:-1:-1;;;;;20849:14:0;;;;;;;;;;20646:225::o;23425:372::-;-1:-1:-1;;;;;23592:26:0;;;23521:17;23592:26;;;:8;:26;;;;;;23656:27;;;;;;;-1:-1:-1;23715:16:0;;;23521:17;;23592:26;23701:88;;23733:14;23738:4;23744:2;23733:4;:14::i;:::-;23749:9;:17;;;23768:14;23773:4;23779:2;23768:4;:14::i;:::-;23784:4;23701:13;:88::i;:::-;23694:95;23425:372;-1:-1:-1;;;;;23425:372:0:o;20883:183::-;20976:7;;-1:-1:-1;;;;;20976:7:0;20962:10;:21;:44;;;;-1:-1:-1;;;;;;20987:19:0;;;;20962:44;20954:53;;;;;;21018:8;:17;;-1:-1:-1;;;;;21018:17:0;;;-1:-1:-1;;;;;;21018:17:0;;;;;;;21046:4;:12;;;;;;;;;;;20883:183::o;24883:610::-;17820:1;17926:7;;:19;;17918:63;;;;-1:-1:-1;;;17918:63:0;;;;;;;:::i;:::-;17820:1;17994:7;:18;24987:4:::1;::::0;-1:-1:-1;;;;;24978:13:0;;::::1;24987:4:::0;::::1;24978:13;::::0;:31:::1;;-1:-1:-1::0;25004:5:0::1;::::0;-1:-1:-1;;;;;24995:14:0;;::::1;25004:5:::0;::::1;24995:14;24978:31;24970:40;;;::::0;::::1;;25043:5;::::0;-1:-1:-1;;;;;25034:14:0;;::::1;25043:5:::0;::::1;25034:14;25031:434;;;25079:10;25068:22;::::0;;;:10:::1;:22;::::0;;;;;:29;-1:-1:-1;25068:29:0::1;25060:58;;;::::0;-1:-1:-1;;;25060:58:0;;::::1;::::0;::::1;;;:::i;:::-;25146:3;25129:13;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;25171:10:0::1;25160:22;::::0;;;:10:::1;:22;::::0;;;;:29;;25186:3;;25160:22;:29:::1;::::0;25186:3;;25160:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;25216:5:0::1;::::0;25200:39:::1;::::0;-1:-1:-1;;;;;25216:5:0::1;25223:10;25235:3:::0;25200:15:::1;:39::i;:::-;25031:434;;;25295:10;25284:22;::::0;;;:10:::1;:22;::::0;;;;;:29;-1:-1:-1;25284:29:0::1;25276:57;;;::::0;-1:-1:-1;;;25276:57:0;;::::1;::::0;::::1;;;:::i;:::-;25361:3;25344:13;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;25386:10:0::1;25375:22;::::0;;;:10:::1;:22;::::0;;;;:29;;25401:3;;25375:22;:29:::1;::::0;25401:3;;25375:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;25431:4:0::1;::::0;25415:38:::1;::::0;-1:-1:-1;;;;;25431:4:0::1;25437:10;25449:3:::0;25415:15:::1;:38::i;:::-;25475:10;:8;:10::i;:::-;-1:-1:-1::0;;17776:1:0;18039:7;:22;24883:610::o;15055:114::-;-1:-1:-1;;;;;15138:14:0;15109:9;15138:14;;;:9;:14;;;;;:22;;;;15055:114::o;26901:626::-;26979:4;-1:-1:-1;;;;;27004:17:0;;:10;:17;;:55;;-1:-1:-1;;;;;;27032:15:0;;;;;;-1:-1:-1;27032:15:0;;;;;;;;27048:10;27032:27;;;;;;;;27025:34;;;27004:55;26996:64;;;;;;27071:8;27082:23;27094:10;27082:11;:23::i;:::-;27071:34;-1:-1:-1;27124:12:0;;27116:96;;;;-1:-1:-1;;;27116:96:0;;;;;;;:::i;:::-;27223:20;27229:3;27234;27239;27223:5;:20::i;:::-;-1:-1:-1;;;;;27258:17:0;;:10;:17;;;;:69;;-1:-1:-1;;;;;;27279:15:0;;;;;;-1:-1:-1;27279:15:0;;;;;;;;27295:10;27279:27;;;;;;;;-1:-1:-1;;27279:48:0;;27258:69;27254:244;;;-1:-1:-1;;;;;27379:15:0;;;;;;-1:-1:-1;27379:15:0;;;;;;;;27395:10;27379:27;;;;;;;;27374:38;;27408:3;27374:4;:38::i;:::-;-1:-1:-1;;;;;27344:15:0;;;;;;;-1:-1:-1;27344:15:0;;;;;;;;27360:10;27344:27;;;;;;;;;:68;;;27432:54;;20939:25:1;;;-1:-1:-1;;27432:54:0;;;;27360:10;;27432:54;;27344:15;;-1:-1:-1;27344:15:0;-1:-1:-1;;;;;27432:54:0;20912:18:1;27432:54:0;;;;;;;27254:244;-1:-1:-1;27515:4:0;;26901:626;-1:-1:-1;;;;26901:626:0:o;28619:1292::-;17820:1;17926:7;;:19;;17918:63;;;;-1:-1:-1;;;17918:63:0;;;;;;;:::i;:::-;17820:1;17994:7;:18;28763:8:::1;28774:23;28786:10;28774:11;:23::i;:::-;28763:34:::0;-1:-1:-1;28816:12:0;::::1;28808:96;;;::::0;-1:-1:-1;;;28808:96:0;;::::1;::::0;::::1;;;:::i;:::-;28945:11;::::0;28925:17:::1;28983:29;28988:12:::0;28945:11;28983:4:::1;:29::i;:::-;28967:45:::0;-1:-1:-1;29031:10:0;29023:38:::1;;;::::0;-1:-1:-1;;;29023:38:0;;::::1;::::0;::::1;;;:::i;:::-;29074:31;29080:10;29092:12;29074:5;:31::i;:::-;29116:19;29122:12;29116:5;:19::i;:::-;29161:9;29156:471;29180:7;:14:::0;29176:18;::::1;29156:471;;;29216:9;29228:7;29236:1;29228:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;29228:10:0::1;29267:11:::0;;;:8:::1;:11:::0;;;;;;-1:-1:-1;29267:19:0::1;::::0;29228:10;;-1:-1:-1;29267:19:0;29326:16:::1;29331:5:::0;29267:19;29326:4:::1;:16::i;:::-;29301:41:::0;-1:-1:-1;29365:19:0;29357:47:::1;;;::::0;-1:-1:-1;;;29357:47:0;;::::1;::::0;::::1;;;:::i;:::-;29445:13;;29459:1;29445:16;;;;;;;:::i;:::-;;;;;;;29427:14;:34;;29419:73;;;::::0;-1:-1:-1;;;29419:73:0;;::::1;::::0;::::1;;;:::i;:::-;29512:42;::::0;-1:-1:-1;;;;;29512:42:0;::::1;::::0;29521:10:::1;::::0;29512:42:::1;::::0;::::1;::::0;29536:14;;29552:1:::1;::::0;29512:42:::1;:::i;:::-;;;;;;;;29569:46;29585:1;29588:10;29600:14;29569:15;:46::i;:::-;29201:426;;;29196:3;;;;;:::i;:::-;;;;29156:471;;;;29647:6;:4;:6::i;:::-;29664:10;:8;:10::i;:::-;29685:11;:9;:11::i;:::-;29710:5;::::0;-1:-1:-1;;;;;29710:5:0::1;:19:::0;29707:197:::1;;29775:5;::::0;29768:38:::1;::::0;-1:-1:-1;;;29768:38:0;;29741:12:::1;::::0;29756:51:::1;::::0;29761:5;;-1:-1:-1;;;;;29775:5:0::1;::::0;-1:-1:-1;;29768:38:0::1;::::0;29800:4:::1;::::0;29768:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29756:51::-;29741:66:::0;-1:-1:-1;29821:8:0;;29818:75:::1;;29857:5;::::0;29841:40:::1;::::0;-1:-1:-1;;;;;29857:5:0::1;29864:10;29876:4:::0;29841:15:::1;:40::i;:::-;29730:174;29707:197;-1:-1:-1::0;;17776:1:0;18039:7;:22;-1:-1:-1;;;;28619:1292:0:o;22256:1158::-;22373:4;;;;:13;22365:43;;;;-1:-1:-1;;;22365:43:0;;;;;;;:::i;:::-;22441:5;;22434:38;;-1:-1:-1;;;22434:38:0;;22419:12;;-1:-1:-1;;;;;22441:5:0;;-1:-1:-1;;22434:38:0;;22466:4;;22434:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22506:4;;22499:37;;-1:-1:-1;;;22499:37:0;;22419:53;;-1:-1:-1;22483:13:0;;-1:-1:-1;;;;;22506:4:0;;;;-1:-1:-1;;22499:37:0;;22530:4;;22499:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22565:97;;;;;;;;22594:7;:14;;22565:97;;;;;;;;;22556:5;;;-1:-1:-1;;;;;22556:5:0;;;-1:-1:-1;22547:15:0;;;:8;:15;;;;;;:115;;;;;;-1:-1:-1;22547:115:0;;;;22700:84;;;;;;;22729:14;;22700:84;;;;;;;;22692:4;;;;;22683:14;;;;;;;;;:101;;;;;;;;;;;;;22818:5;;22805:19;;;;;;;;;;;;;22818:5;;;-1:-1:-1;;;;;;22805:19:0;;;;;;22848:4;;22835:18;;;;;;;;;;;;;;22848:4;;;22835:18;;;;;;;;;;;22890:5;;;;22881:15;;;;;:23;;22700:84;;-1:-1:-1;;22876:34:0;;22906:3;22876:4;:34::i;:::-;22947:4;;-1:-1:-1;;;;;22947:4:0;22921:9;22938:14;;;:8;:14;;;;;-1:-1:-1;22938:22:0;;22864:46;;-1:-1:-1;22921:9:0;22933:34;;22962:4;22933;:34::i;:::-;22921:46;-1:-1:-1;22978:9:0;22990:5;22921:46;22990:1;:5;:::i;:::-;22978:17;;23006:8;23012:1;23006:5;:8::i;:::-;23043:24;23048:15;;23065:1;23043:4;:24::i;:::-;23025:15;:42;23078:15;23084:5;23091:1;23078:5;:15::i;:::-;-1:-1:-1;;;;;23130:16:0;;23105:22;23130:16;;;:9;:16;;;;;;;;23181:18;;;;;;23210:20;;-1:-1:-1;;23210:20:0;-1:-1:-1;23210:20:0;;;23259:26;:15;23277:8;23259:26;:::i;:::-;23241:15;;;;:44;;;;23297:4;:11;;-1:-1:-1;;23297:11:0;;;;;;23325:31;23330:3;23335:20;23340:4;23346:8;23335:4;:20::i;23325:31::-;23319:3;:37;23374:31;23379:3;23384:20;23389:5;23396:7;23384:4;:20::i;23374:31::-;23368:3;:37;-1:-1:-1;;;;;;;;;;22256:1158:0:o;42237:395::-;17820:1;17926:7;;:19;;17918:63;;;;-1:-1:-1;;;17918:63:0;;;;;;;:::i;:::-;17820:1;17994:7;:18;42365:10:::1;42354:22;::::0;;;:10:::1;:22;::::0;;;;;:32;-1:-1:-1;42354:32:0::1;42346:61;;;::::0;-1:-1:-1;;;42346:61:0;;::::1;::::0;::::1;;;:::i;:::-;42418:11;42432:29;42437:6;42445:15;42450:3;42455:4;42445;:15::i;42432:29::-;42418:43;;42472:12;42487:17;42492:6;42500:3;42487:4;:17::i;:::-;42526:10;42515:22;::::0;;;:10:::1;:22;::::0;;;;:32;;42472;;-1:-1:-1;42541:6:0;;42515:22;;;:32:::1;::::0;42541:6;;42515:32:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;42558:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;:24;;42579:3;;42558:17;:24:::1;::::0;42579:3;;42558:24:::1;:::i;:::-;::::0;;;-1:-1:-1;;42604:11:0::1;::::0;-1:-1:-1;;;;;42604:11:0::1;42593:23;::::0;;;:10:::1;:23;::::0;;;;:31;;42620:4;;42593:23;:31:::1;::::0;42620:4;;42593:31:::1;:::i;11967:403::-:0;12084:10;12037:4;12073:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12073:27:0;;;;;;;;;;12115:14;;;12111:160;;;12157:10;12176:1;12146:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12146:27:0;;;;;;;;;:31;12111:160;;;12240:19;12245:8;12255:3;12240:4;:19::i;:::-;12221:10;12210:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12210:27:0;;;;;;;;;:49;12111:160;12295:10;12312:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12286:54:0;;12312:27;;;;;;;;;;12286:54;;20939:25:1;;;-1:-1:-1;;12286:54:0;;12295:10;12312:22;;-1:-1:-1;12312:22:0;-1:-1:-1;;;;;12286:54:0;20912:18:1;12286:54:0;;;;;;;-1:-1:-1;12358:4:0;;11967:403;-1:-1:-1;;;11967:403:0:o;20476:158::-;20593:10;;-1:-1:-1;;;;;20593:10:0;20579;:24;20571:33;;;;;;20615:4;:11;;-1:-1:-1;;20615:11:0;;;;;20476:158::o;40845:442::-;41068:11;;-1:-1:-1;;;;;41068:11:0;41054:10;:25;41046:34;;;;;;41091:8;41102:17;41114:4;41102:11;:17::i;:::-;41091:28;-1:-1:-1;41145:4:0;41138:11;;;;41130:44;;;;-1:-1:-1;;;41130:44:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41209:17:0;;41185:21;41209:17;;;:11;:17;;;;;41255:24;:15;41273:6;41255:24;:::i;:::-;41237:15;;;;:42;-1:-1:-1;;40845:442:0:o;27539:1069::-;17820:1;17926:7;;:19;;17918:63;;;;-1:-1:-1;;;17918:63:0;;;;;;;:::i;:::-;17820:1;17994:7;:18;;;27700:11;27680:17:::1;27738:30;27743:13:::0;27700:11;27738:4:::1;:30::i;:::-;27722:46:::0;-1:-1:-1;27787:10:0;27779:38:::1;;;::::0;-1:-1:-1;;;27779:38:0;;::::1;::::0;::::1;;;:::i;:::-;27848:8;27859:23;27871:10;27859:11;:23::i;:::-;27848:34:::0;-1:-1:-1;27903:4:0::1;27896:11:::0;::::1;;;27893:74;;;27938:13;27919:15;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;27893:74:0::1;27992:9;27987:480;28011:7;:14:::0;28007:18;::::1;27987:480;;;28047:9;28059:7;28067:1;28059:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;28059:10:0::1;28098:11:::0;;;:8:::1;:11:::0;;;;;;-1:-1:-1;28098:19:0::1;::::0;28059:10;;-1:-1:-1;28098:19:0;28170:16:::1;28175:5:::0;28098:19;28170:4:::1;:16::i;:::-;28146:40:::0;-1:-1:-1;28210:18:0;28202:46:::1;;;::::0;-1:-1:-1;;;28202:46:0;;::::1;::::0;::::1;;;:::i;:::-;28288:12;;28301:1;28288:15;;;;;;;:::i;:::-;;;;;;;28271:13;:32;;28263:57;;;::::0;-1:-1:-1;;;28263:57:0;;13565:2:1;28263:57:0::1;::::0;::::1;13547:21:1::0;13604:2;13584:18;;;13577:30;-1:-1:-1;;;13623:18:1;;;13616:42;13675:18;;28263:57:0::1;13363:336:1::0;28263:57:0::1;28340:41;::::0;-1:-1:-1;;;;;28340:41:0;::::1;::::0;28349:10:::1;::::0;28340:41:::1;::::0;::::1;::::0;28364:13;;28379:1:::1;::::0;28340:41:::1;:::i;:::-;;;;;;;;28396:45;28412:1;28415:10;28427:13;28396:15;:45::i;:::-;28032:435;;;28027:3;;;;;:::i;:::-;;;;27987:480;;;;28477:20;28483:13;28477:5;:20::i;:::-;28508:32;28514:10;28526:13;28508:5;:32::i;:::-;28551:10;:8;:10::i;:::-;28572:11;:9;:11::i;:::-;28594:6;:4;:6::i;40232:601::-:0;40356:10;40341:12;40388:17;40356:10;40388:11;:17::i;:::-;40377:28;-1:-1:-1;40431:4:0;40424:11;;;;40416:44;;;;-1:-1:-1;;;40416:44:0;;;;;;;:::i;:::-;40487:37;;-1:-1:-1;;;40487:37:0;;40471:13;;40502:4;;-1:-1:-1;;40487:37:0;;40519:4;;40487:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40471:53;;40554:5;40535:15;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;40595:15:0;;40570:22;40595:15;;;:9;:15;;;;;;;;40645:17;;;;;;-1:-1:-1;40701:15:0;;;40682;:34;;40673:119;;;;-1:-1:-1;;;40673:119:0;;;;;;;:::i;:::-;-1:-1:-1;40803:21:0;;-1:-1:-1;;40803:21:0;;;-1:-1:-1;;;40232:601:0:o;21466:282::-;21581:11;;-1:-1:-1;;;;;21581:11:0;21567:10;:25;21559:34;;;;;;21604:11;:21;;-1:-1:-1;;;;;21604:21:0;;;-1:-1:-1;;;;;;21604:21:0;;;;;;;21636:7;:13;;;;;;;;;;;;;;;21660:10;:15;;;;;;;;;;;21466:282::o;39497:723::-;39587:10;;-1:-1:-1;;;;;39587:10:0;39573;:24;:58;;;;-1:-1:-1;39610:4:0;;-1:-1:-1;;;;;39610:4:0;39601:14;;;;:8;:14;;;;;-1:-1:-1;39601:22:0;;39627:4;-1:-1:-1;39601:30:0;39573:58;39565:97;;;;-1:-1:-1;;;39565:97:0;;;;;;;:::i;:::-;39695:4;;-1:-1:-1;;;;;39695:4:0;39686:14;;;;:8;:14;;;;;-1:-1:-1;39686:22:0;;39712:4;-1:-1:-1;39683:228:0;;39788:3;39780:4;:11;;:27;;;;;39803:4;39795;:12;;39780:27;39772:59;;;;-1:-1:-1;;;39772:59:0;;;;;;;:::i;:::-;39859:3;39851:4;:11;;:24;;;;-1:-1:-1;39866:9:0;;;39851:24;39843:56;;;;-1:-1:-1;;;39843:56:0;;;;;;;:::i;:::-;39943:4;;-1:-1:-1;;;;;39943:4:0;39934:14;;;;:8;:14;;;;;-1:-1:-1;39934:22:0;;39960:5;-1:-1:-1;39931:230:0;;40037:3;40029:4;:11;;:27;;;;;40052:4;40044;:12;;40029:27;40021:60;;;;-1:-1:-1;;;40021:60:0;;15300:2:1;40021:60:0;;;15282:21:1;15339:2;15319:18;;;15312:30;-1:-1:-1;;;15358:18:1;;;15351:50;15418:18;;40021:60:0;15098:344:1;40021:60:0;40109:3;40101:4;:11;;:24;;;;-1:-1:-1;40116:9:0;;;40101:24;40093:56;;;;-1:-1:-1;;;40093:56:0;;19936:2:1;40093:56:0;;;19918:21:1;19975:2;19955:18;;;19948:30;-1:-1:-1;;;19994:18:1;;;19987:49;20053:18;;40093:56:0;19734:343:1;40093:56:0;40181:3;:10;40202:3;:10;39497:723::o;20029:435::-;20130:10;;-1:-1:-1;;;;;20130:10:0;20116;:24;20108:63;;;;-1:-1:-1;;;20108:63:0;;;;;;;:::i;:::-;20203:5;;20196:27;;;-1:-1:-1;;;20196:27:0;;;;20182:11;;-1:-1:-1;;;;;20203:5:0;;-1:-1:-1;;20196:27:0;;;;;;;;;;;;;;20203:5;20196:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20182:41;-1:-1:-1;20254:8:0;20258:4;20182:41;20254:8;:::i;:::-;20243:7;:19;;:37;;;;;20277:3;20266:7;:14;;20243:37;20234:101;;;;-1:-1:-1;;;20234:101:0;;13146:2:1;20234:101:0;;;13128:21:1;13185:2;13165:18;;;13158:30;13224:34;13204:18;;;13197:62;-1:-1:-1;;;13275:18:1;;;13268:48;13333:19;;20234:101:0;12944:414:1;20234:101:0;20366:4;20356:6;:14;;20347:41;;;;-1:-1:-1;;;20347:41:0;;9202:2:1;20347:41:0;;;9184:21:1;9241:2;9221:18;;;9214:30;-1:-1:-1;;;9260:18:1;;;9253:43;9313:18;;20347:41:0;9000:337:1;20347:41:0;-1:-1:-1;20399:14:0;:24;;;;20434:13;:22;20029:435::o;11185:36::-;;;;;;;:::i;21760:484::-;21839:10;21809:12;21871:17;21839:10;21871:11;:17::i;:::-;21860:28;-1:-1:-1;21907:12:0;;21899:49;;;;-1:-1:-1;;;21899:49:0;;10588:2:1;21899:49:0;;;10570:21:1;10627:2;10607:18;;;10600:30;-1:-1:-1;;;10646:18:1;;;10639:54;10710:18;;21899:49:0;10386:348:1;21899:49:0;21975:37;;-1:-1:-1;;;21975:37:0;;21959:13;;21990:4;;-1:-1:-1;;21975:37:0;;22007:4;;21975:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;22048:15:0;;22023:22;22048:15;;;:9;:15;;;;;;;;22098:17;;;;;;22126:20;;-1:-1:-1;;22126:20:0;-1:-1:-1;22126:20:0;;;21959:53;;-1:-1:-1;22048:15:0;22175:25;:15;22193:7;22175:25;:::i;:::-;22157:4;:15;;:43;;;;22231:5;22212:15;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;21760:484:0:o;3615:543::-;3842:17;3877:13;3893:35;3898:14;3914:13;3893:4;:35::i;:::-;3877:51;;3939:13;3955:37;3960:15;3977:14;3955:4;:37::i;:::-;3939:53;;4003:13;4019:18;4024:5;4031;4019:4;:18::i;:::-;4003:34;;4048:13;4064:35;4069:6;4077:21;4082:6;4090:7;4077:4;:21::i;:::-;4064:4;:35::i;:::-;4048:51;;4131:18;4136:5;4143;4131:4;:18::i;:::-;4119:30;3615:543;-1:-1:-1;;;;;;;;;;3615:543:0:o;26606:287::-;26667:4;26684:8;26695:23;26707:10;26695:11;:23::i;:::-;26684:34;-1:-1:-1;26737:12:0;;26729:96;;;;-1:-1:-1;;;26729:96:0;;;;;;;:::i;:::-;26836:27;26842:10;26854:3;26859;26836:5;:27::i;:::-;-1:-1:-1;26881:4:0;;26606:287;-1:-1:-1;;;26606:287:0:o;34003:3026::-;34180:22;17820:1;17926:7;;:19;;17918:63;;;;-1:-1:-1;;;17918:63:0;;;;;;;:::i;:::-;17820:1;17994:7;:18;34238:4:::1;::::0;::::1;;::::0;;::::1;;:12;;:4;:12;34230:40;;;::::0;-1:-1:-1;;;34230:40:0;;::::1;::::0;::::1;;;:::i;:::-;34284:30;34303:10;34284:18;:30::i;:::-;:38;;34318:4;34284:38;34281:141;;;34350:4;;34343:3;:11;34335:75;;;::::0;-1:-1:-1;;;34335:75:0;;::::1;::::0;::::1;;;:::i;:::-;34467:14;;34450:13;:31;;34442:58;;;::::0;-1:-1:-1;;;34442:58:0;;::::1;::::0;::::1;;;:::i;:::-;34551:4;::::0;-1:-1:-1;;;;;34551:4:0::1;34542:14;::::0;;;:8:::1;:14;::::0;;;;-1:-1:-1;34542:22:0::1;::::0;34537:50:::1;::::0;34566:20:::1;17623:2;34582:3;34566:4;:20::i;34537:50::-;34519:14;:68;;34511:99;;;::::0;-1:-1:-1;;;34511:99:0;;::::1;::::0;::::1;;;:::i;:::-;34643:3;::::0;34636:42:::1;::::0;-1:-1:-1;;;34636:42:0;;34621:12:::1;::::0;-1:-1:-1;;;;;34643:3:0::1;::::0;-1:-1:-1;;34636:42:0::1;::::0;34666:10:::1;::::0;34636:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34621:57:::0;-1:-1:-1;34703:2:0;34719:21:::1;:25:::0;;;;:51:::1;;;34766:4;34748:14;:22;;34719:51;:67;;;;;34782:4;34774;:12;;34719:67;34716:106;;;34798:12;:10;:12::i;:::-;34865:5;::::0;-1:-1:-1;;;;;34865:5:0::1;34842:11;34856:15:::0;;;:8:::1;:15;::::0;;;;-1:-1:-1;34856:23:0::1;::::0;;34890:49:::1;::::0;34913:10:::1;34925:13:::0;34890:15:::1;:49::i;:::-;35017:13;::::0;34983:5:::1;::::0;34976:38:::1;::::0;-1:-1:-1;;;34976:38:0;;-1:-1:-1;;;;;34983:5:0;;::::1;::::0;-1:-1:-1;;34976:38:0::1;::::0;35008:4:::1;::::0;34976:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;34959:5;::::0;;-1:-1:-1;;;;;34959:5:0;;::::1;34950:15;::::0;;;:8:::1;:15;::::0;;;;;-1:-1:-1;34950:23:0;;::::1;:80:::0;;;;35065:5;;;;::::1;35056:15:::0;;;;;:23;;::::1;::::0;;34950:15;35150:35:::1;35156:10;35163:3:::0;35056:23;35156:10:::1;:::i;:::-;35169:15;35174:3;35179:4;35169;:15::i;35150:35::-;35129:56;;35249:406;35310:3;35360:14;35365:4;35371:2;35360:4;:14::i;:::-;35430:4;::::0;-1:-1:-1;;;;;35430:4:0::1;35421:14;::::0;;;:8:::1;:14;::::0;;;;-1:-1:-1;35421:22:0::1;::::0;35490:14:::1;35495:4;35501:2;35490:4;:14::i;:::-;35551:10;35608:4;35249:14;:406::i;:::-;35218:437:::0;;-1:-1:-1;35218:437:0;-1:-1:-1;35716:30:0;;::::1;;35708:69;;;::::0;-1:-1:-1;;;35708:69:0;;::::1;::::0;::::1;;;:::i;:::-;35788:12;35803:37;35808:14;35824:15;35829:3;;35834:4;35824;:15::i;35803:37::-;35788:52;;35851:18;35873:27;35878:4;35884:15;35889:2;35893:5;35884:4;:15::i;35873:27::-;35851:49;;35911:11;35925:27;35930:4;35936:15;35941:2;35945:5;35936:4;:15::i;35925:27::-;35911:41;;35963:19;35986:28;35991:4;35997:16;36002:3;;36007:5;35997:4;:16::i;35986:28::-;35963:51:::0;-1:-1:-1;36025:10:0::1;35963:51:::0;36047:16:::1;36060:3:::0;36047:10;:16:::1;:::i;:::-;:30;;;;:::i;:::-;36039:39;::::0;:4;:39:::1;:::i;:::-;36025:54;;36090:19;36112:25;36117:2;36121:15;36126:3;36131:4;36121;:15::i;36112:25::-;36180:4;36148:10;36161:25:::0;;;:10:::1;:25;::::0;;;;;36090:47;;-1:-1:-1;36215:4:0::1;36210:9:::0;::::1;36207:95;;;36248:2;36231:13;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36280:4:0::1;36289:1;36261:25:::0;;;:10:::1;:25;::::0;;;;:29;36207:95:::1;36327:4;::::0;-1:-1:-1;;;;;36327:4:0::1;36322:19;36361:10:::0;36342:16:::1;36356:2:::0;36342:11;:16:::1;:::i;:::-;:29;;;;:::i;:::-;36322:50;;;;;;;;;;;;;20939:25:1::0;;20927:2;20912:18;;20793:177;36322:50:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36383:70;36414:3;36419:33;36424:11;36437:14;36442:3;;36447;36437:4;:14::i;36419:33::-;36383:30;:70::i;:::-;36481:23;36486:2;36490:13;36495:1;36498:4;36490;:13::i;36481:23::-;36464:13;;:40;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;36515:10:0::1;::::0;-1:-1:-1;36528:32:0::1;36533:11:::0;36546:13:::1;36551:2;36555:3;36546:4;:13::i;36528:32::-;36582:14;::::0;-1:-1:-1;;;;;36582:14:0::1;36571:26;::::0;;;:10:::1;:26;::::0;;;;:32;;36515:45;;-1:-1:-1;36515:45:0;;36571:26;;;:32:::1;::::0;36515:45;;36571:32:::1;:::i;:::-;::::0;;;-1:-1:-1;36641:16:0::1;::::0;-1:-1:-1;36655:2:0;36641:11;:16:::1;:::i;:::-;36625:11;::::0;-1:-1:-1;;;;;36625:11:0::1;36614:23;::::0;;;:10:::1;:23;::::0;;;;:43;;:23;;;:43:::1;::::0;;;::::1;:::i;:::-;;;;;;;;36685:11;36668:13;;:28;;;;;;;:::i;:::-;;;;;;;;36724:3;36707:13;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;36738:10:0::1;::::0;-1:-1:-1;36738:8:0::1;:10::i;:::-;36759:11;:9;:11::i;:::-;36878:13;;36862;;36847;;:28;;;;:::i;:::-;:44;;;;:::i;:::-;36813:4;::::0;36806:37:::1;::::0;-1:-1:-1;;;36806:37:0;;-1:-1:-1;;;;;36813:4:0;;::::1;::::0;-1:-1:-1;;36806:37:0::1;::::0;36837:4:::1;::::0;36806:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:86;;;;:::i;:::-;36790:4;::::0;;-1:-1:-1;;;;;36790:4:0;;::::1;36781:14;::::0;;;:8:::1;:14;::::0;;;;36790:4;36781:22:::1;:111:::0;;;;36937:4;36930:5:::1;::::0;36978:3:::1;::::0;36937:4;;::::1;::::0;36930:5:::1;::::0;36918:10:::1;::::0;-1:-1:-1;;;;;;;;;;;36909:80:0;36943:10;;36955:33:::1;::::0;36960:11;;36973:14:::1;::::0;36983:3:::1;36973:4;:14::i;36955:33::-;36909:80;;;;;;;:::i;:::-;;;;;;;;37000:21;;;;;;;;;;;;;;17776:1:::0;18039:7;:22;34003:3026;;-1:-1:-1;;;;34003:3026:0:o;37042:2439::-;37180:22;17820:1;17926:7;;:19;;17918:63;;;;-1:-1:-1;;;17918:63:0;;;;;;;:::i;:::-;17820:1;17994:7;:18;37287:10:::1;37230:11;37276:22:::0;;;:10:::1;:22;::::0;;;;;37244:13;;37276:39;-1:-1:-1;37276:39:0::1;37268:68;;;::::0;-1:-1:-1;;;37268:68:0;;::::1;::::0;::::1;;;:::i;:::-;37390:5;::::0;-1:-1:-1;;;;;37390:5:0;;::::1;37347:23;37373:24:::0;;;:8:::1;:24;::::0;;;;;37452:4:::1;::::0;;;::::1;37435:23:::0;;;;37494:14:::1;::::0;37477:31;::::1;;37469:58;;;::::0;-1:-1:-1;;;37469:58:0;;::::1;::::0;::::1;;;:::i;:::-;37564:45;37569:9;:17;;;37588:20;17623:2;37604:3;37588:4;:20::i;37564:45::-;37546:14;:63;;37538:94;;;::::0;-1:-1:-1;;;37538:94:0;;::::1;::::0;::::1;;;:::i;:::-;37675:3;::::0;37668:42:::1;::::0;-1:-1:-1;;;37668:42:0;;37653:12:::1;::::0;-1:-1:-1;;;;;37675:3:0::1;::::0;-1:-1:-1;;37668:42:0::1;::::0;37698:10:::1;::::0;37668:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37653:57;;37748:1;37724:21;:25;:51;;;;;37771:4;37753:14;:22;;37724:51;:67;;;;;37787:4;37779;:12;;37724:67;37721:106;;;37803:12;:10;:12::i;:::-;37847:18;37907:462;37968:8;:16;;;38031:14;38036:4;38042:2;38031:4;:14::i;:::-;38092:9;:17;;;38156:14;38161:4;38167:2;38156:4;:14::i;:::-;38217:36;38222:13;38237:15;38242:3;38247:4;38237;:15::i;38217:36::-;38322:4;37907:14;:462::i;:::-;37876:493;;;;;;;;38390:12;38405:37;38410:14;38426:15;38431:3;;38436:4;38426;:15::i;38405:37::-;38390:52;;38453:18;38475:27;38480:4;38486:15;38491:2;38495:5;38486:4;:15::i;38475:27::-;38453:49;;38513:11;38527:27;38532:4;38538:15;38543:2;38547:5;38538:4;:15::i;38527:27::-;38513:41;;38565:19;38588:28;38593:4;38599:16;38604:3;;38609:5;38599:4;:16::i;38588:28::-;38565:51:::0;-1:-1:-1;38627:10:0::1;38565:51:::0;38649:16:::1;38662:3:::0;38649:10;:16:::1;:::i;:::-;:30;;;;:::i;:::-;38641:39;::::0;:4;:39:::1;:::i;:::-;38627:54;;38692:19;38714:25;38719:2;38723:15;38728:3;38733:4;38723;:15::i;38714:25::-;38692:47;;38767:23;38772:2;38776:13;38781:1;38784:4;38776;:13::i;38767:23::-;38750:13;;:40;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;38809:27:0;;::::1;;38801:66;;;::::0;-1:-1:-1;;;38801:66:0;;::::1;::::0;::::1;;;:::i;:::-;38904:13;38878:10;:22;38889:10;-1:-1:-1::0;;;;;38878:22:0::1;-1:-1:-1::0;;;;;38878:22:0::1;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;38945:13;38928;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;38980:10:0::1;38969:22;::::0;;;:10:::1;:22;::::0;;;;:37;;38995:11;;38969:22;:37:::1;::::0;38995:11;;38969:37:::1;:::i;:::-;::::0;;;-1:-1:-1;;39036:4:0::1;39017:25;::::0;;;:10:::1;:25;::::0;;;;:39;;39046:10;;39017:25;:39:::1;::::0;39046:10;;39017:39:::1;:::i;:::-;::::0;;;-1:-1:-1;39067:10:0::1;::::0;-1:-1:-1;39080:32:0::1;39085:11:::0;39098:13:::1;39103:2;39107:3;39098:4;:13::i;39080:32::-;39134:14;::::0;-1:-1:-1;;;;;39134:14:0::1;39123:26;::::0;;;:10:::1;:26;::::0;;;;:32;;39067:45;;-1:-1:-1;39067:45:0;;39123:26;;;:32:::1;::::0;39067:45;;39123:32:::1;:::i;:::-;::::0;;;-1:-1:-1;39193:16:0::1;::::0;-1:-1:-1;39207:2:0;39193:11;:16:::1;:::i;:::-;39177:11;::::0;-1:-1:-1;;;;;39177:11:0::1;39166:23;::::0;;;:10:::1;:23;::::0;;;;:43;;:23;;;:43:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;39265:11:0;;-1:-1:-1;39238:24:0::1;39251:11:::0;39238:10;:24:::1;:::i;:::-;:38;;;;:::i;:::-;39220:13;;:57;;;;;;;:::i;:::-;;;;;;;;39305:3;39288:13;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;39319:6:0::1;::::0;-1:-1:-1;39319:4:0::1;:6::i;:::-;39336:10;:8;:10::i;:::-;39357:11;:9;:11::i;:::-;39417:4;::::0;39410:5:::1;::::0;39417:4:::1;-1:-1:-1::0;;;;;;;39417:4:0;;::::1;::::0;39410:5;;::::1;::::0;39398:10:::1;::::0;39417:4;-1:-1:-1;;39417:4:0;-1:-1:-1;;;;;39423:3:0::1;39428:11;39384:56;;;;;;;:::i;:::-;;;;;;;;39451:22;;;;;;;;;;;;17776:1:::0;18039:7;:22;37042:2439;;-1:-1:-1;;37042:2439:0:o;25501:1093::-;17820:1;17926:7;;:19;;17918:63;;;;-1:-1:-1;;;17918:63:0;;;;;;;:::i;:::-;17820:1;17994:7;:18;25626:4:::1;::::0;-1:-1:-1;;;;;25617:13:0;;::::1;25626:4:::0;::::1;25617:13;::::0;:31:::1;;-1:-1:-1::0;25643:5:0::1;::::0;-1:-1:-1;;;;;25634:14:0;;::::1;25643:5:::0;::::1;25634:14;25617:31;25609:40;;;::::0;::::1;;25682:4;::::0;-1:-1:-1;;;;;25673:13:0;;::::1;25682:4:::0;::::1;25673:13;25670:874;;;25717:10;25706:22;::::0;;;:10:::1;:22;::::0;;;;;:29;-1:-1:-1;25706:29:0::1;25698:57;;;::::0;-1:-1:-1;;;25698:57:0;;::::1;::::0;::::1;;;:::i;:::-;25781:4;::::0;25766:49:::1;::::0;-1:-1:-1;;;25766:49:0;;-1:-1:-1;;;;;25781:4:0;;::::1;::::0;-1:-1:-1;;25766:49:0::1;::::0;25804:4;;25811:3;;25766:49:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25846:3;25829:13;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;25871:10:0::1;25860:22;::::0;;;:10:::1;:22;::::0;;;;:29;;25886:3;;25860:22;:29:::1;::::0;25886:3;;25860:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;25927:4:0::1;::::0;25900:37:::1;::::0;-1:-1:-1;;;25900:37:0;;-1:-1:-1;;;;;25900:26:0;;::::1;::::0;::::1;::::0;:37:::1;::::0;25927:4;;::::1;::::0;25933:3;;25900:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25982:50:0::1;::::0;-1:-1:-1;;;25982:50:0;;25949:14:::1;::::0;-1:-1:-1;25949:14:0;;-1:-1:-1;;;;;;25982:35:0;::::1;::::0;::::1;::::0;:50:::1;::::0;26026:4:::1;::::0;25982:50:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26043:29;::::0;-1:-1:-1;;;26043:29:0;;25948:84;;-1:-1:-1;25948:84:0;-1:-1:-1;;;;;;26043:18:0;::::1;::::0;-1:-1:-1;;26043:29:0::1;::::0;26062:2;;25948:84;;26043:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;25670:874:0::1;::::0;-1:-1:-1;;;;;25670:874:0::1;;26155:10;26144:22;::::0;;;:10:::1;:22;::::0;;;;;:29;-1:-1:-1;26144:29:0::1;26136:58;;;::::0;-1:-1:-1;;;26136:58:0;;::::1;::::0;::::1;;;:::i;:::-;26220:5;::::0;26205:50:::1;::::0;-1:-1:-1;;;26205:50:0;;-1:-1:-1;;;;;26220:5:0;;::::1;::::0;-1:-1:-1;;26205:50:0::1;::::0;26244:4;;26251:3;;26205:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26283:3;26266:13;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;26308:10:0::1;26297:22;::::0;;;:10:::1;:22;::::0;;;;:29;;26323:3;;26297:22;:29:::1;::::0;26323:3;;26297:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;26364:5:0::1;::::0;26337:38:::1;::::0;-1:-1:-1;;;26337:38:0;;-1:-1:-1;;;;;26337:26:0;;::::1;::::0;::::1;::::0;:38:::1;::::0;26364:5;;::::1;::::0;26371:3;;26337:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;26420:50:0::1;::::0;-1:-1:-1;;;26420:50:0;;26387:14:::1;::::0;-1:-1:-1;26387:14:0;;-1:-1:-1;;;;;;26420:35:0;::::1;::::0;::::1;::::0;:50:::1;::::0;26464:4:::1;::::0;26420:50:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26481:31;::::0;-1:-1:-1;;;26481:31:0;;26386:84;;-1:-1:-1;26386:84:0;-1:-1:-1;;;;;;26481:19:0;::::1;::::0;-1:-1:-1;;26481:31:0::1;::::0;26501:2;;26386:84;;26481:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;25670:874:0::1;26554:10;:8;:10::i;:::-;26575:11;:9;:11::i;:::-;-1:-1:-1::0;;17776:1:0;18039:7;:22;-1:-1:-1;;25501:1093:0:o;4168:810::-;4428:22;4452:18;4488:19;4510:35;4515:13;4530:14;4510:4;:35::i;:::-;4488:57;;4556:18;4577:21;4582:6;4590:7;4577:4;:21::i;:::-;4556:42;;4622:31;4627:13;4642:10;4622:4;:31::i;:::-;4609:44;;4664:9;4676:54;4681:14;4697:32;4702:14;4718:10;4697:4;:32::i;4676:54::-;4664:66;;4741:11;4755:20;4760:1;4763:11;4755:4;:20::i;:::-;4741:34;;4786:11;4800:15;4805:4;4811:3;4800:4;:15::i;:::-;4786:29;;4843:26;4848:15;4865:3;4843:4;:26::i;:::-;4826:43;;4893:31;4898:13;4913:10;4893:4;:31::i;:::-;4880:44;;4935:35;;;;;4168:810;;;;;;;;;:::o;23813:1062::-;17820:1;17926:7;;:19;;17918:63;;;;-1:-1:-1;;;17918:63:0;;;;;;;:::i;:::-;17820:1;17994:7;:18;23917:4:::1;::::0;-1:-1:-1;;;;;23908:13:0;;::::1;23917:4:::0;::::1;23908:13;::::0;:31:::1;;-1:-1:-1::0;23934:5:0::1;::::0;-1:-1:-1;;;;;23925:14:0;;::::1;23934:5:::0;::::1;23925:14;23908:31;23900:40;;;::::0;::::1;;23959:4;::::0;::::1;;::::0;;::::1;;:12;;:4;:12;23951:40;;;::::0;-1:-1:-1;;;23951:40:0;;::::1;::::0;::::1;;;:::i;:::-;24024:5;::::0;-1:-1:-1;;;;;24015:14:0;;::::1;24024:5:::0;::::1;24015:14;24012:835;;;24064:5;::::0;-1:-1:-1;;;;;24064:5:0::1;24041:11;24055:15:::0;;;:8:::1;:15;::::0;;;;-1:-1:-1;24055:23:0::1;::::0;;24094:39:::1;::::0;24117:10:::1;24129:3:::0;24094:15:::1;:39::i;:::-;24170:5;::::0;24163:38:::1;::::0;-1:-1:-1;;;24163:38:0;;24144:11:::1;::::0;24158:59:::1;::::0;-1:-1:-1;;;;;24170:5:0;;::::1;::::0;-1:-1:-1;;24163:38:0::1;::::0;24195:4:::1;::::0;24163:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24203:13;;24158:4;:59::i;:::-;24144:73;;24230:19;24252:14;24257:3;24262;24252:4;:14::i;:::-;24230:36;;24295:32;24300:13;;24315:11;24295:4;:32::i;:::-;24279:13;:48:::0;24379:10:::1;24368:22;::::0;;;:10:::1;:22;::::0;;;;;24363:41:::1;::::0;24392:11;24363:4:::1;:41::i;:::-;24349:10;24338:22;::::0;;;:10:::1;:22;::::0;;;;:66;-1:-1:-1;24012:835:0::1;::::0;-1:-1:-1;;24012:835:0::1;;24464:4;::::0;-1:-1:-1;;;;;24464:4:0::1;24441:11;24455:14:::0;;;:8:::1;:14;::::0;;;;-1:-1:-1;24455:22:0::1;::::0;;24488:38:::1;::::0;24510:10:::1;24522:3:::0;24488:15:::1;:38::i;:::-;24563:4;::::0;24556:37:::1;::::0;-1:-1:-1;;;24556:37:0;;24537:11:::1;::::0;24551:100:::1;::::0;-1:-1:-1;;;;;24563:4:0;;::::1;::::0;-1:-1:-1;;24556:37:0::1;::::0;24587:4:::1;::::0;24556:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24595:55;24600:13;;24615:34;24620:13;;24635;;24615:4;:34::i;:::-;24595:4;:55::i;:::-;24551:4;:100::i;:::-;24537:114;;24662:19;24684:14;24689:3;24694;24684:4;:14::i;:::-;24662:36;;24726:32;24731:13;;24746:11;24726:4;:32::i;:::-;24709:13;:49:::0;24810:10:::1;24799:22;::::0;;;:10:::1;:22;::::0;;;;;24794:41:::1;::::0;24823:11;24794:4:::1;:41::i;:::-;24780:10;24769:22;::::0;;;:10:::1;:22;::::0;;;;:66;-1:-1:-1;;;24857:10:0::1;:8;:10::i;32063:1932::-:0;32214:22;17820:1;17926:7;;:19;;17918:63;;;;-1:-1:-1;;;17918:63:0;;;;;;;:::i;:::-;17820:1;17994:7;:18;32272:4:::1;::::0;::::1;;::::0;;::::1;;:12;;:4;:12;32264:40;;;::::0;-1:-1:-1;;;32264:40:0;;::::1;::::0;::::1;;;:::i;:::-;32328:30;32347:10;32328:18;:30::i;:::-;:38;;32362:4;32328:38;32325:141;;;32394:4;;32387:3;:11;32379:75;;;::::0;-1:-1:-1;;;32379:75:0;;::::1;::::0;::::1;;;:::i;:::-;32491:4;::::0;32486:38:::1;::::0;;-1:-1:-1;;;32486:38:0;;;;-1:-1:-1;;;;;32491:4:0;;::::1;::::0;32486:18:::1;::::0;32512:9:::1;::::0;32486:38:::1;::::0;;::::1;::::0;32491:4:::1;::::0;32486:38;;;;;;;32512:9;32491:4;32486:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;32557:3:0::1;::::0;32550:42:::1;::::0;-1:-1:-1;;;32550:42:0;;32535:12:::1;::::0;-1:-1:-1;;;;;;32557:3:0;;::::1;::::0;-1:-1:-1;;;;32550:42:0::1;::::0;32580:10:::1;::::0;32550:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32535:57:::0;-1:-1:-1;32616:21:0::1;32651:6:::0;;;;;:27:::1;;;32674:4;32661:9;:17;;32651:27;:43;;;;;32690:4;32682;:12;;32651:43;32648:82;;;32706:12;:10;:12::i;:::-;32793:4;::::0;-1:-1:-1;;;;;32793:4:0;;::::1;32750:23;32776::::0;;;:8:::1;:23;::::0;;;;;32854:5:::1;::::0;;;::::1;32837:24:::0;;;;32903:13:::1;::::0;32890:9:::1;:26;;32882:55;;;::::0;-1:-1:-1;;;32882:55:0;;::::1;::::0;::::1;;;:::i;:::-;32974:45;32979:9;:17;;;32998:20;17623:2;33014:3;32998:4;:20::i;32974:45::-;32956:14;:63;;32948:94;;;::::0;-1:-1:-1;;;32948:94:0;;::::1;::::0;::::1;;;:::i;:::-;33063:18;33123:433;33184:8;:16;;;33247:14;33252:4;33258:2;33247:4;:14::i;:::-;33308:9;:17;;;33372:14;33377:4;33383:2;33372:4;:14::i;:::-;33433:32;33438:9;33449:15;33454:3;33459:4;33449;:15::i;33433:32::-;33512:1;33123:14;:433::i;:::-;33092:464:::0;;-1:-1:-1;33092:464:0;-1:-1:-1;33617:30:0;;::::1;;33609:69;;;::::0;-1:-1:-1;;;33609:69:0;;::::1;::::0;::::1;;;:::i;:::-;33689:10;33702:30;33707:9;33718:13;33723:1;33726:4;33718;:13::i;33702:30::-;33689:43;;33760:24;33765:2;33769:14;33774:3;;33779;33769:4;:14::i;33760:24::-;33743:13;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;33811:5:0::1;::::0;33795:42:::1;::::0;-1:-1:-1;;;;;33811:5:0::1;33818:2:::0;33822:14;33795:15:::1;:42::i;:::-;33848:6;:4;:6::i;:::-;33899:5;::::0;33893:4:::1;::::0;33943:3:::1;::::0;-1:-1:-1;;;;;;;;33899:5:0;;::::1;::::0;33893:4;;::::1;::::0;33881:10:::1;::::0;33943:3;-1:-1:-1;;;;;;;;;33872:82:0;33906:9:::1;::::0;33917:36:::1;::::0;33922:14;;33938::::1;::::0;33948:3:::1;33938:4;:14::i;33917:36::-;33872:82;;;;;;;:::i;:::-;;;;;;;;33965:22;;;;;;17776:1:::0;18039:7;:22;32063:1932;;-1:-1:-1;;;32063:1932:0:o;21078:223::-;21222:7;;-1:-1:-1;;;;;21222:7:0;21208:10;:21;21200:60;;;;-1:-1:-1;;;21200:60:0;;;;;;;:::i;:::-;21271:14;:22;;-1:-1:-1;;;;;;21271:22:0;-1:-1:-1;;;;;21271:22:0;;;;;;;;;;21078:223::o;29923:105::-;29992:7;;-1:-1:-1;;;;;29992:7:0;29978:10;:21;29970:30;;;;;;30011:3;:9;29923:105::o;11704:255::-;11837:10;11774:4;11826:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11826:27:0;;;;;;;;;;11821:38;;11855:3;11821:4;:38::i;:::-;11802:10;11791:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11791:27:0;;;;;;;;;;;:68;;;11875:54;;20939:25:1;;;-1:-1:-1;;11791:27:0;;:22;;;;-1:-1:-1;11791:22:0;-1:-1:-1;;;;;11875:54:0;20912:18:1;11875:54:0;20793:177:1;18080:432:0;18202:4;;;;:13;18194:43;;;;-1:-1:-1;;;18194:43:0;;;;;;;:::i;:::-;18248:5;:15;;-1:-1:-1;;;;;18248:15:0;;;-1:-1:-1;;;;;;18248:15:0;;;;;;;;18274:10;:18;;;;;;;;;;;;;18303:14;:22;;;;;;;;;18336:4;:9;;;-1:-1:-1;18356:12:0;;;;;;;;;;;18379:8;:16;;;;;;;;;;;;18428:27;;;-1:-1:-1;;;18428:27:0;;;;18423:45;;18248:15;-1:-1:-1;;18428:27:0;;;;;;;;;;;;;;18248:15;18428:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18457:10;18462:1;18465;18457:4;:10::i;18423:45::-;18406:14;:62;-1:-1:-1;;18495:6:0;18479:13;:22;-1:-1:-1;;;18080:432:0:o;4988:853::-;5249:21;5272:18;5308:19;5330:35;5335:14;5351:13;5330:4;:35::i;:::-;5308:57;;5376:12;5391:37;5396:15;5413:14;5391:4;:37::i;:::-;5376:52;;5439:9;5451:27;5456:15;5473:4;5451;:27::i;:::-;5439:39;;5489:11;5503:20;5508:1;5511:11;5503:4;:20::i;:::-;5489:34;;5540:15;5545:3;5550:4;5540;:15::i;:::-;5534:21;;5572:25;5577:14;5593:3;5572:4;:25::i;:::-;5566:31;;5624:19;5629:4;5635:7;5624:4;:19::i;:::-;5608:35;;5670:24;5675:3;5680:13;5670:4;:24::i;:::-;5654:40;;5718:15;5723:3;5728:4;5718;:15::i;:::-;5705:28;;5757:31;5762:13;5777:10;5757:4;:31::i;:::-;5744:44;;5799:34;;;;4988:853;;;;;;;;;:::o;30230:1821::-;30368:22;17820:1;17926:7;;:19;;17918:63;;;;-1:-1:-1;;;17918:63:0;;;;;;;:::i;:::-;17820:1;17994:7;:18;30429:10:::1;30418:22;::::0;;;:10:::1;:22;::::0;;;;;:39;-1:-1:-1;30418:39:0::1;30410:81;;;::::0;-1:-1:-1;;;30410:81:0;;18139:2:1;30410:81:0::1;::::0;::::1;18121:21:1::0;18178:2;18158:18;;;18151:30;18217:31;18197:18;;;18190:59;18266:18;;30410:81:0::1;17937:353:1::0;30410:81:0::1;30524:3;::::0;30517:42:::1;::::0;-1:-1:-1;;;30517:42:0;;30502:12:::1;::::0;-1:-1:-1;;;;;30524:3:0::1;::::0;-1:-1:-1;;30517:42:0::1;::::0;30547:10:::1;::::0;30517:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30502:57:::0;-1:-1:-1;30583:21:0::1;30618:6:::0;;;;;:31:::1;;;30645:4;30628:13;:21;;30618:31;:47;;;;;30661:4;30653;:12;;30618:47;30615:86;;;30677:12;:10;:12::i;:::-;30764:4;::::0;-1:-1:-1;;;;;30764:4:0;;::::1;30721:23;30747::::0;;;:8:::1;:23;::::0;;;;;30825:5:::1;::::0;;;::::1;30808:24:::0;;;;30870:13:::1;::::0;30853:30;::::1;;30845:59;;;::::0;-1:-1:-1;;;30845:59:0;;::::1;::::0;::::1;;;:::i;:::-;30941:45;30946:9;:17;;;30965:20;17623:2;30981:3;30965:4;:20::i;30941:45::-;30923:14;:63;;30915:94;;;::::0;-1:-1:-1;;;30915:94:0;;::::1;::::0;::::1;;;:::i;:::-;31030:18;31090:437;31151:8;:16;;;31214:14;31219:4;31225:2;31214:4;:14::i;:::-;31275:9;:17;;;31339:14;31344:4;31350:2;31339:4;:14::i;:::-;31400:36;31405:13;31420:15;31425:3;31430:4;31420;:15::i;31090:437::-;31059:468:::0;;-1:-1:-1;31059:468:0;-1:-1:-1;31588:30:0;;::::1;;31580:69;;;::::0;-1:-1:-1;;;31580:69:0;;::::1;::::0;::::1;;;:::i;:::-;31700:5;::::0;31694:4:::1;::::0;31668:69:::1;::::0;-1:-1:-1;;;;;;;;31700:5:0;;::::1;::::0;31694:4;;::::1;::::0;31682:10:::1;::::0;31668:69;-1:-1:-1;;;;;;;;;31668:69:0;::::1;::::0;31707:13;;31722:14;;31668:69:::1;:::i;:::-;;;;;;;;31759:10;31748:22;::::0;;;:10:::1;:22;::::0;;;;:39;;31774:13;;31748:22;:39:::1;::::0;31774:13;;31748:39:::1;:::i;:::-;;;;;;;;31815:13;31798;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;31850:10:0::1;31839:22;::::0;;;:10:::1;:22;::::0;;;;:40;;31865:14;;31839:22;:40:::1;::::0;31865:14;;31839:40:::1;:::i;:::-;;;;;;;;31907:14;31890:13;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;31949:34:0::1;::::0;-1:-1:-1;31954:13:0;31969::::1;31974:1;31977:4;31969;:13::i;31949:34::-;31932:13;;:51;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;31994:6:0::1;::::0;-1:-1:-1;31994:4:0::1;:6::i;:::-;32021:22;;;;;17776:1:::0;18039:7;:22;30230:1821;;-1:-1:-1;;30230:1821:0:o;19692:325::-;19836:13;;19802:5;;19795:38;;-1:-1:-1;;;19795:38:0;;-1:-1:-1;;;;;19802:5:0;;;;-1:-1:-1;;19795:38:0;;19827:4;;19795:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;19778:5;;-1:-1:-1;;;;;19778:5:0;19769:15;;;;:8;:15;;;;;-1:-1:-1;19769:23:0;:80;;;;19907:13;;19891;;19876;;:28;;19891:13;19876:28;:::i;:::-;:44;;;;:::i;:::-;19964:4;;19957:37;;-1:-1:-1;;;19957:37:0;;19862:59;;-1:-1:-1;19862:59:0;;-1:-1:-1;;;;;19964:4:0;;;;-1:-1:-1;;19957:37:0;;19988:4;;19957:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;19941:4;;-1:-1:-1;;;;;19941:4:0;19932:14;;;;:8;:14;;;;;-1:-1:-1;19932:22:0;:67;-1:-1:-1;19692:325:0:o;1379:405::-;1456:7;1489:6;1481:31;;;;-1:-1:-1;;;1481:31:0;;16338:2:1;1481:31:0;;;16320:21:1;16377:2;16357:18;;;16350:30;-1:-1:-1;;;16396:18:1;;;16389:42;16448:18;;1481:31:0;16136:336:1;1481:31:0;1523:10;1536:8;:1;1540:4;1536:8;:::i;:::-;1523:21;-1:-1:-1;1563:6:0;;;:24;;-1:-1:-1;1573:6:0;1578:1;1573:2;:6;:::i;:::-;1583:4;1573:14;1563:24;1555:53;;;;-1:-1:-1;;;1555:53:0;;;;;;;:::i;:::-;1636:10;1655:5;1659:1;1655;:5;:::i;:::-;1649:12;;:2;:12;:::i;:::-;1636:25;;1686:2;1680;:8;;1672:37;;;;-1:-1:-1;;;1672:37:0;;;;;;;:::i;:::-;1737:10;1750:6;1755:1;1750:2;:6;:::i;:::-;1737:19;1379:405;-1:-1:-1;;;;;;1379:405:0:o;1042:329::-;1119:7;;1157:5;1161:1;1157;:5;:::i;:::-;1144:18;-1:-1:-1;1181:6:0;;;:21;;-1:-1:-1;1201:1:0;1191:6;1196:1;1191:2;:6;:::i;:::-;:11;1181:21;1173:50;;;;-1:-1:-1;;;1173:50:0;;;;;;;:::i;:::-;1234:10;1247:15;:2;1253:8;1247:15;:::i;:::-;1234:28;;1287:2;1281;:8;;1273:37;;;;-1:-1:-1;;;1273:37:0;;;;;;;:::i;:::-;1321:10;1334:9;1339:4;1334:2;:9;:::i;583:214::-;660:7;686:9;697;710:14;719:1;722;710:8;:14::i;:::-;685:39;;;;744:4;743:5;735:35;;;;-1:-1:-1;;;735:35:0;;19245:2:1;735:35:0;;;19227:21:1;19284:2;19264:18;;;19257:30;-1:-1:-1;;;19303:18:1;;;19296:47;19360:18;;735:35:0;19043:341:1;735:35:0;-1:-1:-1;788:1:0;583:214;-1:-1:-1;;;583:214:0:o;41532:202::-;41649:34;;-1:-1:-1;;;41649:34:0;;41637:9;;-1:-1:-1;;;;;41649:22:0;;;-1:-1:-1;;41649:34:0;;41672:2;;41676:6;;41649:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41637:46;;41702:4;41694:32;;;;-1:-1:-1;;;41694:32:0;;;;;;;:::i;:::-;41623:111;41532:202;;;:::o;41998:227::-;42060:4;42044:13;;:20;42041:177;;;42096:4;;42111:8;;42121:13;;42089:46;;-1:-1:-1;;;42089:46:0;;42077:9;;-1:-1:-1;;;;;42096:4:0;;;;-1:-1:-1;;42089:46:0;;42111:8;;;;;42089:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42077:58;;42154:4;42146:32;;;;-1:-1:-1;;;42146:32:0;;;;;;;:::i;:::-;-1:-1:-1;42205:1:0;42189:13;:17;42041:177;41998:227::o;10627:252::-;-1:-1:-1;;;;;10709:13:0;;:8;:13;;;;;;;;;;;-1:-1:-1;;10709:20:0;10701:29;;;;;;-1:-1:-1;;;;;10762:13:0;;:8;:13;;;;;;;;;;;10757:24;;10777:3;10757:4;:24::i;:::-;-1:-1:-1;;;;;10741:13:0;;;:8;:13;;;;;;;;;;;:40;;;;10813:13;;;;;;;10808:24;;10828:3;10808:4;:24::i;:::-;-1:-1:-1;;;;;10792:13:0;;;:8;:13;;;;;;;;;;;;:40;;;;10848:23;20939:25:1;;;10792:13:0;;10848:23;;;;-1:-1:-1;;;;;;;;;;;10848:23:0;20912:18:1;10848:23:0;;;;;;;10627:252;;;:::o;10992:101::-;11054:31;11060:4;11074;11081:3;11054:5;:31::i;:::-;10992:101;;:::o;10350:269::-;10423:4;10406:8;:23;;;;;;;;;;;:30;-1:-1:-1;10406:30:0;10398:39;;;;;;10496:4;10479:8;:23;;;;;;;;;;;10474:34;;10504:3;10474:4;:34::i;:::-;10465:4;10448:8;:23;;;;;;;;;;:60;10538:11;;10533:22;;10551:3;10533:4;:22::i;:::-;10519:11;:36;10571:40;;20939:25:1;;;10603:1:0;;10588:4;;-1:-1:-1;;;;;;;;;;;10571:40:0;20927:2:1;20912:18;10571:40:0;;;;;;;;10350:269;:::o;41746:240::-;41806:4;41790:13;;:20;41787:192;;;41828:4;;41843:13;;41823:34;;-1:-1:-1;;;41823:34:0;;;;;20939:25:1;;;;-1:-1:-1;;;;;41828:4:0;;;;-1:-1:-1;;20912:18:1;;41823:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41873:4:0;;41894:13;;-1:-1:-1;;;;;41873:4:0;;;;-1:-1:-1;41868:14:0;;-1:-1:-1;41889:34:0;;41909:13;41914:2;41918:3;41909:4;:13::i;41889:34::-;41931:4;;41868:71;;;-1:-1:-1;;;;;;41868:71:0;;;;;;;41925:4;41868:71;;;8464:25:1;-1:-1:-1;;;;;41931:4:0;;;8505:18:1;;;8498:60;-1:-1:-1;8574:18:1;;;8567:34;41868:71:0;8437:18:1;;;;;-1:-1:-1;;41868:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41966:1:0;41950:13;:17;-1:-1:-1;;;41746:240:0:o;10123:219::-;10219:4;10202:8;:23;;;;;;;;;;;10197:34;;10227:3;10197:4;:34::i;:::-;10188:4;10171:8;:23;;;;;;;;;;:60;10261:11;;10256:22;;10274:3;10256:4;:22::i;:::-;10242:11;:36;10294:40;;20939:25:1;;;10323:4:0;;10311:1;;-1:-1:-1;;;;;;;;;;;10294:40:0;20927:2:1;20912:18;10294:40:0;20793:177:1;383:192:0;460:7;;497:5;501:1;497;:5;:::i;:::-;485:17;;526:1;521;:6;;513:35;;;;-1:-1:-1;;;513:35:0;;19591:2:1;513:35:0;;;19573:21:1;19630:2;19610:18;;;19603:30;-1:-1:-1;;;19649:18:1;;;19642:46;19705:18;;513:35:0;19389:340:1;513:35:0;566:1;383:192;-1:-1:-1;;;383:192:0:o;10887:97::-;10947:29;10961:4;10968:2;10972:3;10947:5;:29::i;41295:225::-;41414:55;;-1:-1:-1;;;41414:55:0;;-1:-1:-1;;;;;7387:15:1;;;41414:55:0;;;7369:34:1;41455:4:0;7419:18:1;;;7412:43;7471:18;;;7464:34;;;-1:-1:-1;;41414:26:0;;;;-1:-1:-1;;7304:18:1;;41414:55:0;7129:375:1;7443:318:0;7503:4;7670:20;;7570:66;7710:23;;;;;;:42;;-1:-1:-1;7737:15:0;;;7710:42;7702:51;7443:318;-1:-1:-1;;;;7443:318:0:o;30040:178::-;30082:10;30095:25;30119:1;30095:21;:25;:::i;:::-;30082:38;;30131:46;30162:10;30174:2;30131:30;:46::i;:::-;30208:2;30188:16;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;30040:178:0:o;7209:198::-;7320:12;;;7282;7320;;;;;;;;;;7282;-1:-1:-1;;;;;7299:7:0;;;7313:5;;7299:34;;7320:12;7299:34;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7281:52;;;7352:7;7344:55;;;;-1:-1:-1;;;7344:55:0;;18841:2:1;7344:55:0;;;18823:21:1;18880:2;18860:18;;;18853:30;18919:34;18899:18;;;18892:62;-1:-1:-1;;;18970:18:1;;;18963:33;19013:19;;7344:55:0;18639:399:1;7344:55:0;7270:137;7209:198;;:::o;2126:567::-;2208:7;2249:5;2241:4;:13;;2233:47;;;;-1:-1:-1;;;2233:47:0;;17789:2:1;2233:47:0;;;17771:21:1;17828:2;17808:18;;;17801:30;-1:-1:-1;;;17847:18:1;;;17840:51;17908:18;;2233:47:0;17587:345:1;2233:47:0;2307:18;2299:4;:26;;2291:61;;;;-1:-1:-1;;;2291:61:0;;20644:2:1;2291:61:0;;;20626:21:1;20683:2;20663:18;;;20656:30;-1:-1:-1;;;20702:18:1;;;20695:52;20764:18;;2291:61:0;20442:346:1;2291:61:0;2365:13;2382:11;2389:3;2382:6;:11::i;:::-;2365:28;;2404:14;2421:16;2426:3;2431:5;2421:4;:16::i;:::-;2404:33;;2450:16;2469:24;2475:4;2481:11;2486:5;2481:4;:11::i;:::-;2469:5;:24::i;:::-;2450:43;-1:-1:-1;2510:11:0;2506:59;;2545:8;-1:-1:-1;2538:15:0;;-1:-1:-1;;2538:15:0;2506:59;2577:21;2601:37;2612:4;2618:6;2626:11;2601:10;:37::i;:::-;2577:61;;2656:29;2661:8;2671:13;2656:4;:29::i;:::-;2649:36;2126:567;-1:-1:-1;;;;;;;2126:567:0:o;805:229::-;886:4;892;923:1;918;:6;914:113;;949:5;953:1;949;:5;:::i;:::-;956;941:21;;;;;;914:113;1003:5;1007:1;1003;:5;:::i;:::-;1010:4;995:20;;;;914:113;805:229;;;;;:::o;253:122::-;321:7;353;358:1;353:4;:7::i;:::-;:14;;363:4;353:14;:::i;131:114::-;197:7;229:8;233:4;229:1;:8;:::i;1792:326::-;1870:7;;1907:5;1911:1;1907;:5;:::i;:::-;:21;;1924:4;1907:21;;;1920:1;1907:21;1895:33;-1:-1:-1;1946:6:0;1951:1;1946:6;;:::i;:::-;;;1941:151;1954:6;;1941:151;;1989:10;1994:1;1997;1989:4;:10::i;:::-;1985:14;-1:-1:-1;2020:5:0;2024:1;2020;:5;:::i;:::-;:10;2016:65;;2055:10;2060:1;2063;2055:4;:10::i;:::-;2051:14;;2016:65;1962:6;1967:1;1962:6;;:::i;:::-;;;1941:151;;2701:864;2808:7;2849:3;2808:7;;2889:20;2898:4;2904;2889:8;:20::i;:::-;2863:46;;-1:-1:-1;2863:46:0;-1:-1:-1;2935:4:0;;2920:12;3034:1;3017:518;3045:9;3037:4;:17;3017:518;;3076:12;3091:8;:1;3095:4;3091:8;:::i;:::-;3076:23;;3115:9;3126;3139:29;3148:1;3151:16;3156:4;3162;3151;:16::i;:::-;3139:8;:29::i;:::-;3114:54;;;;3190:22;3195:4;3201:10;3206:1;3209;3201:4;:10::i;3190:22::-;3183:29;;3234:16;3239:4;3245;3234;:16::i;:::-;3227:23;-1:-1:-1;3269:9:0;3265:20;;3280:5;;;;;3265:20;3306:4;3302:30;;;3323:9;;;3302:30;3351:4;3347:30;;;3368:9;;;3347:30;3396:8;3392:132;;;3431:15;3436:3;3441:4;3431;:15::i;:::-;3425:21;;3392:132;;;3493:15;3498:3;3503:4;3493;:15::i;:::-;3487:21;;3392:132;3061:474;;;3056:3;;;;;:::i;:::-;;;;3017:518;;;-1:-1:-1;3554:3:0;;2701:864;-1:-1:-1;;;;;;;;;2701:864:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:334::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;938:38;972:2;961:9;957:18;938:38;:::i;:::-;928:48;;648:334;;;;;:::o;987:478::-;1082:6;1090;1098;1106;1114;1167:3;1155:9;1146:7;1142:23;1138:33;1135:53;;;1184:1;1181;1174:12;1135:53;1207:29;1226:9;1207:29;:::i;:::-;1197:39;;1255:38;1289:2;1278:9;1274:18;1255:38;:::i;:::-;1245:48;;1312:38;1346:2;1335:9;1331:18;1312:38;:::i;:::-;1302:48;;1369:38;1403:2;1392:9;1388:18;1369:38;:::i;:::-;987:478;;;;-1:-1:-1;987:478:1;;1454:3;1439:19;1426:33;;987:478;-1:-1:-1;;987:478:1:o;1470:403::-;1556:6;1564;1572;1580;1633:3;1621:9;1612:7;1608:23;1604:33;1601:53;;;1650:1;1647;1640:12;1601:53;1673:29;1692:9;1673:29;:::i;:::-;1663:39;;1721:38;1755:2;1744:9;1740:18;1721:38;:::i;:::-;1711:48;;1778:38;1812:2;1801:9;1797:18;1778:38;:::i;:::-;1470:403;;;;-1:-1:-1;1768:48:1;;1863:2;1848:18;1835:32;;-1:-1:-1;;1470:403:1:o;1878:328::-;1955:6;1963;1971;2024:2;2012:9;2003:7;1999:23;1995:32;1992:52;;;2040:1;2037;2030:12;1992:52;2063:29;2082:9;2063:29;:::i;:::-;2053:39;;2111:38;2145:2;2134:9;2130:18;2111:38;:::i;:::-;2101:48;;2196:2;2185:9;2181:18;2168:32;2158:42;;1878:328;;;;;:::o;2211:315::-;2276:6;2284;2337:2;2325:9;2316:7;2312:23;2308:32;2305:52;;;2353:1;2350;2343:12;2305:52;2376:29;2395:9;2376:29;:::i;:::-;2366:39;;2455:2;2444:9;2440:18;2427:32;2468:28;2490:5;2468:28;:::i;:::-;2515:5;2505:15;;;2211:315;;;;;:::o;2531:254::-;2599:6;2607;2660:2;2648:9;2639:7;2635:23;2631:32;2628:52;;;2676:1;2673;2666:12;2628:52;2699:29;2718:9;2699:29;:::i;:::-;2689:39;2775:2;2760:18;;;;2747:32;;-1:-1:-1;;;2531:254:1:o;2790:322::-;2867:6;2875;2883;2936:2;2924:9;2915:7;2911:23;2907:32;2904:52;;;2952:1;2949;2942:12;2904:52;2975:29;2994:9;2975:29;:::i;:::-;2965:39;3051:2;3036:18;;3023:32;;-1:-1:-1;3102:2:1;3087:18;;;3074:32;;2790:322;-1:-1:-1;;;2790:322:1:o;3117:245::-;3184:6;3237:2;3225:9;3216:7;3212:23;3208:32;3205:52;;;3253:1;3250;3243:12;3205:52;3285:9;3279:16;3304:28;3326:5;3304:28;:::i;3367:180::-;3426:6;3479:2;3467:9;3458:7;3454:23;3450:32;3447:52;;;3495:1;3492;3485:12;3447:52;-1:-1:-1;3518:23:1;;3367:180;-1:-1:-1;3367:180:1:o;3552:184::-;3622:6;3675:2;3663:9;3654:7;3650:23;3646:32;3643:52;;;3691:1;3688;3681:12;3643:52;-1:-1:-1;3714:16:1;;3552:184;-1:-1:-1;3552:184:1:o;3741:322::-;3818:6;3826;3834;3887:2;3875:9;3866:7;3862:23;3858:32;3855:52;;;3903:1;3900;3893:12;3855:52;3939:9;3926:23;3916:33;;3968:38;4002:2;3991:9;3987:18;3968:38;:::i;4068:391::-;4154:6;4162;4170;4178;4231:3;4219:9;4210:7;4206:23;4202:33;4199:53;;;4248:1;4245;4238:12;4199:53;4284:9;4271:23;4261:33;;4313:38;4347:2;4336:9;4332:18;4313:38;:::i;:::-;4068:391;;4303:48;;-1:-1:-1;;;;4398:2:1;4383:18;;4370:32;;4449:2;4434:18;4421:32;;4068:391::o;4464:683::-;4559:6;4567;4575;4628:2;4616:9;4607:7;4603:23;4599:32;4596:52;;;4644:1;4641;4634:12;4596:52;4667:23;;;-1:-1:-1;4741:2:1;4726:18;;4713:32;-1:-1:-1;;;;;4794:14:1;;;4791:34;;;4821:1;4818;4811:12;4791:34;4859:6;4848:9;4844:22;4834:32;;4904:7;4897:4;4893:2;4889:13;4885:27;4875:55;;4926:1;4923;4916:12;4875:55;4966:2;4953:16;4992:2;4984:6;4981:14;4978:34;;;5008:1;5005;4998:12;4978:34;5061:7;5056:2;5046:6;5043:1;5039:14;5035:2;5031:23;5027:32;5024:45;5021:65;;;5082:1;5079;5072:12;5021:65;5113:2;5109;5105:11;5095:21;;5135:6;5125:16;;;;;4464:683;;;;;:::o;5152:248::-;5220:6;5228;5281:2;5269:9;5260:7;5256:23;5252:32;5249:52;;;5297:1;5294;5287:12;5249:52;-1:-1:-1;;5320:23:1;;;5390:2;5375:18;;;5362:32;;-1:-1:-1;5152:248:1:o;5405:245::-;5484:6;5492;5545:2;5533:9;5524:7;5520:23;5516:32;5513:52;;;5561:1;5558;5551:12;5513:52;-1:-1:-1;;5584:16:1;;5640:2;5625:18;;;5619:25;5584:16;;5619:25;;-1:-1:-1;5405:245:1:o;5655:454::-;5750:6;5758;5766;5774;5782;5835:3;5823:9;5814:7;5810:23;5806:33;5803:53;;;5852:1;5849;5842:12;5803:53;-1:-1:-1;;5875:23:1;;;5945:2;5930:18;;5917:32;;-1:-1:-1;5996:2:1;5981:18;;5968:32;;6047:2;6032:18;;6019:32;;-1:-1:-1;6098:3:1;6083:19;6070:33;;-1:-1:-1;5655:454:1;-1:-1:-1;5655:454:1:o;6114:523::-;6218:6;6226;6234;6242;6250;6258;6311:3;6299:9;6290:7;6286:23;6282:33;6279:53;;;6328:1;6325;6318:12;6279:53;-1:-1:-1;;6351:23:1;;;6421:2;6406:18;;6393:32;;-1:-1:-1;6472:2:1;6457:18;;6444:32;;6523:2;6508:18;;6495:32;;-1:-1:-1;6574:3:1;6559:19;;6546:33;;-1:-1:-1;6626:3:1;6611:19;6598:33;;-1:-1:-1;6114:523:1;-1:-1:-1;6114:523:1:o;6642:274::-;6771:3;6809:6;6803:13;6825:53;6871:6;6866:3;6859:4;6851:6;6847:17;6825:53;:::i;:::-;6894:16;;;;;6642:274;-1:-1:-1;;6642:274:1:o;6921:203::-;-1:-1:-1;;;;;7085:32:1;;;;7067:51;;7055:2;7040:18;;6921:203::o;7509:274::-;-1:-1:-1;;;;;7701:32:1;;;;7683:51;;7765:2;7750:18;;7743:34;7671:2;7656:18;;7509:274::o;8612:383::-;8761:2;8750:9;8743:21;8724:4;8793:6;8787:13;8836:6;8831:2;8820:9;8816:18;8809:34;8852:66;8911:6;8906:2;8895:9;8891:18;8886:2;8878:6;8874:15;8852:66;:::i;:::-;8979:2;8958:15;-1:-1:-1;;8954:29:1;8939:45;;;;8986:2;8935:54;;8612:383;-1:-1:-1;;8612:383:1:o;9342:350::-;9544:2;9526:21;;;9583:2;9563:18;;;9556:30;-1:-1:-1;;;9617:2:1;9602:18;;9595:56;9683:2;9668:18;;9342:350::o;9697:340::-;9899:2;9881:21;;;9938:2;9918:18;;;9911:30;-1:-1:-1;;;9972:2:1;9957:18;;9950:46;10028:2;10013:18;;9697:340::o;10042:339::-;10244:2;10226:21;;;10283:2;10263:18;;;10256:30;-1:-1:-1;;;10317:2:1;10302:18;;10295:45;10372:2;10357:18;;10042:339::o;10739:343::-;10941:2;10923:21;;;10980:2;10960:18;;;10953:30;-1:-1:-1;;;11014:2:1;10999:18;;10992:49;11073:2;11058:18;;10739:343::o;11429:340::-;11631:2;11613:21;;;11670:2;11650:18;;;11643:30;-1:-1:-1;;;11704:2:1;11689:18;;11682:46;11760:2;11745:18;;11429:340::o;11774:::-;11976:2;11958:21;;;12015:2;11995:18;;;11988:30;-1:-1:-1;;;12049:2:1;12034:18;;12027:46;12105:2;12090:18;;11774:340::o;12119:::-;12321:2;12303:21;;;12360:2;12340:18;;;12333:30;-1:-1:-1;;;12394:2:1;12379:18;;12372:46;12450:2;12435:18;;12119:340::o;12464:475::-;12666:2;12648:21;;;12705:2;12685:18;;;12678:30;12744:34;12739:2;12724:18;;12717:62;12815:34;12810:2;12795:18;;12788:62;-1:-1:-1;;;12881:3:1;12866:19;;12859:38;12929:3;12914:19;;12464:475::o;13704:339::-;13906:2;13888:21;;;13945:2;13925:18;;;13918:30;-1:-1:-1;;;13979:2:1;13964:18;;13957:45;14034:2;14019:18;;13704:339::o;14048:341::-;14250:2;14232:21;;;14289:2;14269:18;;;14262:30;-1:-1:-1;;;14323:2:1;14308:18;;14301:47;14380:2;14365:18;;14048:341::o;14394:350::-;14596:2;14578:21;;;14635:2;14615:18;;;14608:30;-1:-1:-1;;;14669:2:1;14654:18;;14647:56;14735:2;14720:18;;14394:350::o;14749:344::-;14951:2;14933:21;;;14990:2;14970:18;;;14963:30;-1:-1:-1;;;15024:2:1;15009:18;;15002:50;15084:2;15069:18;;14749:344::o;15447:339::-;15649:2;15631:21;;;15688:2;15668:18;;;15661:30;-1:-1:-1;;;15722:2:1;15707:18;;15700:45;15777:2;15762:18;;15447:339::o;15791:340::-;15993:2;15975:21;;;16032:2;16012:18;;;16005:30;-1:-1:-1;;;16066:2:1;16051:18;;16044:46;16122:2;16107:18;;15791:340::o;16477:338::-;16679:2;16661:21;;;16718:2;16698:18;;;16691:30;-1:-1:-1;;;16752:2:1;16737:18;;16730:44;16806:2;16791:18;;16477:338::o;16820:342::-;17022:2;17004:21;;;17061:2;17041:18;;;17034:30;-1:-1:-1;;;17095:2:1;17080:18;;17073:48;17153:2;17138:18;;16820:342::o;17167:415::-;17369:2;17351:21;;;17408:2;17388:18;;;17381:30;17447:34;17442:2;17427:18;;17420:62;-1:-1:-1;;;17513:2:1;17498:18;;17491:49;17572:3;17557:19;;17167:415::o;18295:339::-;18497:2;18479:21;;;18536:2;18516:18;;;18509:30;-1:-1:-1;;;18570:2:1;18555:18;;18548:45;18625:2;18610:18;;18295:339::o;20082:355::-;20284:2;20266:21;;;20323:2;20303:18;;;20296:30;20362:33;20357:2;20342:18;;20335:61;20428:2;20413:18;;20082:355::o;20975:256::-;21157:25;;;21213:2;21198:18;;21191:34;21145:2;21130:18;;20975:256::o;21678:128::-;21718:3;21749:1;21745:6;21742:1;21739:13;21736:39;;;21755:18;;:::i;:::-;-1:-1:-1;21791:9:1;;21678:128::o;21811:120::-;21851:1;21877;21867:35;;21882:18;;:::i;:::-;-1:-1:-1;21916:9:1;;21811:120::o;21936:168::-;21976:7;22042:1;22038;22034:6;22030:14;22027:1;22024:21;22019:1;22012:9;22005:17;22001:45;21998:71;;;22049:18;;:::i;:::-;-1:-1:-1;22089:9:1;;21936:168::o;22109:125::-;22149:4;22177:1;22174;22171:8;22168:34;;;22182:18;;:::i;:::-;-1:-1:-1;22219:9:1;;22109:125::o;22239:258::-;22311:1;22321:113;22335:6;22332:1;22329:13;22321:113;;;22411:11;;;22405:18;22392:11;;;22385:39;22357:2;22350:10;22321:113;;;22452:6;22449:1;22446:13;22443:48;;;-1:-1:-1;;22487:1:1;22469:16;;22462:27;22239:258::o;22502:380::-;22581:1;22577:12;;;;22624;;;22645:61;;22699:4;22691:6;22687:17;22677:27;;22645:61;22752:2;22744:6;22741:14;22721:18;22718:38;22715:161;;;22798:10;22793:3;22789:20;22786:1;22779:31;22833:4;22830:1;22823:15;22861:4;22858:1;22851:15;22715:161;;22502:380;;;:::o;22887:135::-;22926:3;-1:-1:-1;;22947:17:1;;22944:43;;;22967:18;;:::i;:::-;-1:-1:-1;23014:1:1;23003:13;;22887:135::o;23027:112::-;23059:1;23085;23075:35;;23090:18;;:::i;:::-;-1:-1:-1;23124:9:1;;23027:112::o;23144:127::-;23205:10;23200:3;23196:20;23193:1;23186:31;23236:4;23233:1;23226:15;23260:4;23257:1;23250:15;23276:127;23337:10;23332:3;23328:20;23325:1;23318:31;23368:4;23365:1;23358:15;23392:4;23389:1;23382:15;23408:127;23469:10;23464:3;23460:20;23457:1;23450:31;23500:4;23497:1;23490:15;23524:4;23521:1;23514:15;23672:118;23758:5;23751:13;23744:21;23737:5;23734:32;23724:60;;23780:1;23777;23770:12;23724:60;23672:118;:::o

Swarm Source

ipfs://02d78c355a352a0a1033f89c5ab6cf3e44b2bd59cec09e0e8d18faef9d4c14d2

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
Loading...
Loading
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.