Contract 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350

Txn Hash
Block
From
To
Value [Txn Fee]
0x5d3c3d78776f710f129dee41b6bc0548082018d188ddc80cbcad0f7a5954bd4b(pending)2021-06-18 18:52:302 secs ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN 0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT(Pending)
0xef3b889427ca522d902d972033bb4a0ba90ecee145945a0d0b99ee6a74eefc4957162052021-06-18 18:52:239 secs ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.005022295
0x9f488757f5e5bf07d059ed78580181733c1980fed94192ea37eec75dcf51eb8c57162002021-06-18 18:52:0824 secs ago0x5931697277a873246119100a26ca95d8912cbc76 IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.000148362
0x577ccff6010a594708ae03ac4adc13a767ce43d7259b6f8438cc85bc753ebc6757161282021-06-18 18:48:324 mins ago0x3a07193589bd432ce619b71c0f2398dfaf6cae4a IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.0002126064
0x70590c975a712eb69202a026b0cc0b85bf5f9007a3723b949a7f8c4fc8c88e5657161252021-06-18 18:48:234 mins ago0xc2f86340253010c7a3f3bfcc9885d47a5a6f3862 IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b35019.379405483362962 HT0.0002116572
0xbce0ae290367b465ca61d9de0e5d570d9de0f0b5d17671491bb5f6d1c36fd65b57161002021-06-18 18:47:085 mins ago0xa550c7e61b12a7e7addc78fa90c6ffbdd3640736 IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.0001267428
0x895e8c326bb2295b00f78a2362012093a1a6edd3a65b2e03ca0cf635d937aaff57160832021-06-18 18:46:176 mins ago0xc2f86340253010c7a3f3bfcc9885d47a5a6f3862 IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b35013.860268704383247 HT0.0001842708
0xca498bd3a53d786c7f8d7b9eda73149a6f65eea61cdd4c6429201ad47663ccdf57160762021-06-18 18:45:566 mins ago0xc2f86340253010c7a3f3bfcc9885d47a5a6f3862 IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.0002211672
0x97701034238d773d42a44f1d1a95fa9b59cccfe4bfa815d3cb4b2b397b9a4d0557160722021-06-18 18:45:446 mins ago0x5d1025189c8adf8652b397646ce8934cb75b3533 IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.000178327
0x79087df53a3d93735d8c285d00e2e254843d32df9976e40f36e67d8a172c71fc57160612021-06-18 18:45:117 mins ago0x5d1025189c8adf8652b397646ce8934cb75b3533 IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.000200222
0xc50b7bf03d0c7922f7094d5ef53a2562f5820fb63db700c957bf59fb8ce9b29557160522021-06-18 18:44:447 mins ago0xc2f86340253010c7a3f3bfcc9885d47a5a6f3862 IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.0001591416
0x03a261c29fbe54ed5d78ee352b60b9e490ca088f4c30f4869a1dea0e6d93a26e57160432021-06-18 18:44:178 mins ago0x5d1025189c8adf8652b397646ce8934cb75b3533 IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.000188503
0x2494eb8dec92f78b7577c80196c9d5a6501ed7e0d1f49aa35076314d3660742a57160422021-06-18 18:44:148 mins ago0xc2f86340253010c7a3f3bfcc9885d47a5a6f3862 IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.0002211672
0x3b1598da5ab12830d7460195ad5c23bc9417b149d74d21eefbdafd16b2124dcb57160292021-06-18 18:43:358 mins ago0xc2f86340253010c7a3f3bfcc9885d47a5a6f3862 IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.000232872
0x62698377204aa2834680d313ad15afb0493af51bd755a64149c808485b1f5cb057160082021-06-18 18:42:3210 mins ago0x1e6b565d3d1106fa3fed89f04fef78e0e5a13434 IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.000106256
0xd0dc02c8edeb91c2d478e246f2f39abcb367250774c9ff08b55579f2be763abd57160002021-06-18 18:42:0810 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.005023279
0x09ae94ca5bba76a9957056f7cc935b040e23d38a8d9f3cfb7bfda98d8e67618e57159812021-06-18 18:41:1111 mins ago0x64a1d2d69e2024d4b0abd941b9bb27c869ed553d IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.000175779
0xcc3538cde5b2c40e49768ea8f563855f5d91d8683e90dc5c558d74c94947e47157159792021-06-18 18:41:0511 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.005023279
0x5c19ad1c427e79da6c863eb2294027173392fedc5046127403abd921825299a457159772021-06-18 18:40:5911 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.005135783
0x027a7c6d9f3aa538c66bcf3d4642c83bd07fe29235232e53d2fb3e812c39a3fe57159702021-06-18 18:40:3811 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.005022295
0x8525dcd70adcf5f3bd6858d616a53ce18018a7658524db502df39c4d12be20d557159672021-06-18 18:40:2912 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.005026641
0x10b0385591a9ecf82aca4b0fa02c109015a22a1dd2c2a862461cfb6853acd06057159612021-06-18 18:40:1112 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b35043.916348 HT0.004949561
0x299eca30d707df50bac69c3348d45ffd50329f8aed5537b1a94c30fd9819b5b757159592021-06-18 18:40:0512 mins ago0xef5ce53e1b3e7e0e3be0b1ec1e834c607016e2cf IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.000223164
0x481a5647c62e213e4538551542b14a3b80e6d85d521839dd69e54380381c474c57159592021-06-18 18:40:0512 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.005022295
0x3cf1710390a516b15da54e88b3d890d47ace78c0776da0a1772b8e1fcf99cfc257159582021-06-18 18:40:0212 mins ago0xaa3e34c024271c476a979fafc181aadb9d8ecffd IN  0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500 HT0.005134799
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x70590c975a712eb69202a026b0cc0b85bf5f9007a3723b949a7f8c4fc8c88e5657161252021-06-18 18:48:234 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500xc2f86340253010c7a3f3bfcc9885d47a5a6f38621 wei
0x70590c975a712eb69202a026b0cc0b85bf5f9007a3723b949a7f8c4fc8c88e5657161252021-06-18 18:48:234 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350 Huobi: Wrapped Huobi Token19.37940548336296261 HT
0x895e8c326bb2295b00f78a2362012093a1a6edd3a65b2e03ca0cf635d937aaff57160832021-06-18 18:46:176 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350 Huobi: Wrapped Huobi Token13.86026870438324713 HT
0xc50b7bf03d0c7922f7094d5ef53a2562f5820fb63db700c957bf59fb8ce9b29557160522021-06-18 18:44:447 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500xc2f86340253010c7a3f3bfcc9885d47a5a6f38626.94057756459874929 HT
0xc50b7bf03d0c7922f7094d5ef53a2562f5820fb63db700c957bf59fb8ce9b29557160522021-06-18 18:44:447 mins ago Huobi: Wrapped Huobi Token 0x539a9fbb81d1d2dc805c698b55c8df81cba6b3506.94057756459874929 HT
0x3b1598da5ab12830d7460195ad5c23bc9417b149d74d21eefbdafd16b2124dcb57160292021-06-18 18:43:358 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500xc2f86340253010c7a3f3bfcc9885d47a5a6f386237.162054149116769406 HT
0x3b1598da5ab12830d7460195ad5c23bc9417b149d74d21eefbdafd16b2124dcb57160292021-06-18 18:43:358 mins ago Huobi: Wrapped Huobi Token 0x539a9fbb81d1d2dc805c698b55c8df81cba6b35037.162054149116769406 HT
0x10b0385591a9ecf82aca4b0fa02c109015a22a1dd2c2a862461cfb6853acd06057159612021-06-18 18:40:1112 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350 Huobi: Wrapped Huobi Token43.916348 HT
0x27a5183f809ce4fa7cec08ac0a5e5526c857c42c42ae6ebc527c2fb18541fc9a57159372021-06-18 18:38:5913 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350 Huobi: Wrapped Huobi Token25.114227250000003072 HT
0xccc8f1f1dc168472979e0545fd050f73af090d2465c85e343af0fdf8f9b8411057158752021-06-18 18:35:5316 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350 Huobi: Wrapped Huobi Token19.882974492984147968 HT
0xe93e6352a305e17ca37df55160c279b10bd8e7dbff545aadf9ab51918ab38e1457158742021-06-18 18:35:5016 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350 Huobi: Wrapped Huobi Token19.880393063771430912 HT
0xfd6974328a0c9083a9320dc6a148896ea7d812eb1dea3fd962f1079cafa3b57557156202021-06-18 18:23:0829 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350 Huobi: Wrapped Huobi Token39.451543038412914688 HT
0x664fa4440f4d07c009dc778a432b7cd275e1cb95d02fbc149fd006c5ef771eaf57156072021-06-18 18:22:2930 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350 Huobi: Wrapped Huobi Token16.344011250000001024 HT
0xf3f21e84cb54ed8f9ed6325b0ae84576a5c4f96f47feab690909192593c5bfa957155862021-06-18 18:21:2631 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350 Huobi: Wrapped Huobi Token18.282347124999999488 HT
0xab50fad397be29049df5fdcc33dbea0b3eec4fc6efb22afbc1931dc46e059fc657155452021-06-18 18:19:2333 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350 Huobi: Wrapped Huobi Token21.251538875000000512 HT
0xf55f43ddf1d46db92b1beaec6a2a30cb382f962fa450a29711e6d3dc813e0f4157155392021-06-18 18:19:0533 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500xbe474feb987565e59672920c73a0661d609073c57.969079701710945267 HT
0xf55f43ddf1d46db92b1beaec6a2a30cb382f962fa450a29711e6d3dc813e0f4157155392021-06-18 18:19:0533 mins ago Huobi: Wrapped Huobi Token 0x539a9fbb81d1d2dc805c698b55c8df81cba6b3507.969079701710945267 HT
0x24cdc2af272f9b8a740bde54ba1fd3dee9fb715c2b9d88580af3d840b7d2e73057155052021-06-18 18:17:2335 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350 Huobi: Wrapped Huobi Token21.155088499999997952 HT
0x07879c8f35215200e7fafe02a384999ed5dd44c5695565e7cb9cab073159c77d57154402021-06-18 18:14:0838 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500xc2f86340253010c7a3f3bfcc9885d47a5a6f38620.093086283790306611 HT
0x07879c8f35215200e7fafe02a384999ed5dd44c5695565e7cb9cab073159c77d57154402021-06-18 18:14:0838 mins ago Huobi: Wrapped Huobi Token 0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500.093086283790306611 HT
0x5bce56ec7286e597b2a38eb27c15dcbb8a7bfe6c09021cee33ef8fd23366203657153802021-06-18 18:11:0841 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500xc2f86340253010c7a3f3bfcc9885d47a5a6f38621 wei
0x5bce56ec7286e597b2a38eb27c15dcbb8a7bfe6c09021cee33ef8fd23366203657153802021-06-18 18:11:0841 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350 Huobi: Wrapped Huobi Token44.651296418864604886 HT
0x9b6b4855f58692d4af0586483ac7a761b48aead223763ee3b0369eae1b51124757152992021-06-18 18:07:0545 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b3500xc2f86340253010c7a3f3bfcc9885d47a5a6f386260.649587139106887616 HT
0x9b6b4855f58692d4af0586483ac7a761b48aead223763ee3b0369eae1b51124757152992021-06-18 18:07:0545 mins ago Huobi: Wrapped Huobi Token 0x539a9fbb81d1d2dc805c698b55c8df81cba6b35060.649587139106887616 HT
0xb66b748abf5d3316ea8a2a51b71f68b2443b6a1e12902088b947eb3864517a3257152872021-06-18 18:06:2946 mins ago 0x539a9fbb81d1d2dc805c698b55c8df81cba6b350 Huobi: Wrapped Huobi Token18.023425000000002048 HT
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapV2Router02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-02-25
*/

/**
 *Submitted for verification at Etherscan.io on 2020-09-04
*/

// File: contracts/uniswapv2/interfaces/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// File: contracts/uniswapv2/libraries/SafeMath.sol

pragma solidity =0.6.12;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMathUniswap {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
}


// File: contracts/uniswapv2/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeRate() external view returns (uint);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// File: contracts/uniswapv2/libraries/UniswapV2Library.sol

pragma solidity >=0.5.0;



library UniswapV2Library {
    using SafeMathUniswap for uint;

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

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

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

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

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

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

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

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

// File: contracts/uniswapv2/libraries/TransferHelper.sol

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.6.0;

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

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

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

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

// File: contracts/uniswapv2/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external view returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external view returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

// File: contracts/uniswapv2/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


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

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


// File: contracts/uniswapv2/interfaces/IERC20.sol

pragma solidity >=0.5.0;

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

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

// File: contracts/uniswapv2/interfaces/IWETH.sol

pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

// File: contracts/uniswapv2/UniswapV2Router02.sol

pragma solidity =0.6.12;

contract UniswapV2Router02 is IUniswapV2Router02 {
    using SafeMathUniswap for uint;

    address public immutable override factory;
    address public immutable override WETH;

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

    constructor(address _factory, address _WETH) public {
        factory = _factory;
        WETH = _WETH;
    }

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
            IUniswapV2Factory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IUniswapV2Pair(pair).mint(to);
    }
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IUniswapV2Pair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);
        (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20Uniswap(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = UniswapV2Library.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
            IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path, IUniswapV2Factory(factory).feeRate());
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path, IUniswapV2Factory(factory).feeRate());
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path, IUniswapV2Factory(factory).feeRate());
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path, IUniswapV2Factory(factory).feeRate());
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path, IUniswapV2Factory(factory).feeRate());
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path, IUniswapV2Factory(factory).feeRate());
        require(amounts[0] <= msg.value, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = UniswapV2Library.sortTokens(input, output);
            IUniswapV2Pair pair = IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20Uniswap(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = UniswapV2Library.getAmountOut(amountInput, reserveInput, reserveOutput, IUniswapV2Factory(factory).feeRate());
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20Uniswap(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

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

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
        public
        view
        virtual
        override
        returns (uint amountOut)
    {
        return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut, IUniswapV2Factory(factory).feeRate());
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
        public
        view
        virtual
        override
        returns (uint amountIn)
    {
        return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut, IUniswapV2Factory(factory).feeRate());
    }

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

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

Contract ABI

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

60c060405234801561001057600080fd5b5060405162004bad38038062004bad8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6149f1620001bc6000398061015f5280610ce45280610d1f5280610e9b528061114452806115ad528061176d5280611b1c5280611bf75280611cd15280611d9f5280611f3f5280611fc752806122e2528061235d528061241152806124dd528061257252806125e65280612b1d5280612d875280612ddd5280612e115280612e85528061301352806131b05280613238525080610dbb5280610f295280610f94528061108b528061120a528061122d52806112c85280611403528061146e528061163b52806116a6528061174b52806118bb5280611e325280611e9d5280611ff9528061210552806121d85280612243528061261852806128565280612a4e5280612a775280612a9a5280612afb5280612c685280612dbb52806130a65280613111528061326a5280613af65280613b395280613e145280613f3d5280613fde52806143d3528061448c528061453f52506149f16000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610e4b565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611203945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356112be565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b0381351690602001356113b8565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561155d565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611743565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611851565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b038135169060200135611ace565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611d57565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b50803590602081013590604001356120fb565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b03813516906020013561218d565b34801561088157600080fd5b5061088a6122e0565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135612304565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612311565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612497565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612808565b348015610a1c57600080fd5b5061088a612a4c565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612a70945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612af1565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612c05565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612d38565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612fcb565b6000808242811015610cde576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612808565b9093509150610d1d89868561339e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da58583613508565b50965096945050505050565b6000610e438484847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663978bbdb96040518163ffffffff1660e01b815260040160206040518083038186803b158015610e1257600080fd5b505afa158015610e26573d6000803e3d6000fd5b505050506040513d6020811015610e3c57600080fd5b5051613600565b949350505050565b60608142811015610e91576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610ecb57fe5b905060200201356001600160a01b03166001600160a01b031614610f24576040805162461bcd60e51b815260206004820152601d60248201526000805160206148b9833981519152604482015290519081900360640190fd5b61100d7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805163978bbdb960e01b815290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063978bbdb992506004808301926020929190829003018186803b158015610fdc57600080fd5b505afa158015610ff0573d6000803e3d6000fd5b505050506040513d602081101561100657600080fd5b50516136dc565b9150868260018451038151811061102057fe5b602002602001015110156110655760405162461bcd60e51b815260040180806020018281038252602b815260200180614922602b913960400191505060405180910390fd5b6111038686600081811061107557fe5b905060200201356001600160a01b0316336110e97f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106110b757fe5b905060200201356001600160a01b03168b8b60018181106110d457fe5b905060200201356001600160a01b031661382a565b856000815181106110f657fe5b60200260200101516138ea565b61114282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613a47915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061118157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b505050506111f884836001855103815181106111eb57fe5b6020026020010151613508565b509695505050505050565b60606112b57f000000000000000000000000000000000000000000000000000000000000000084847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663978bbdb96040518163ffffffff1660e01b815260040160206040518083038186803b15801561128457600080fd5b505afa158015611298573d6000803e3d6000fd5b505050506040513d60208110156112ae57600080fd5b5051613c84565b90505b92915050565b60008060006112ee7f00000000000000000000000000000000000000000000000000000000000000008f8f61382a565b90506000876112fd578c611301565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561137757600080fd5b505af115801561138b573d6000803e3d6000fd5b5050505061139e8f8f8f8f8f8f8f612808565b809450819550505050509b509b9950505050505050505050565b606081428110156113fe576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b6114b67f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805163978bbdb960e01b815290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063978bbdb992506004808301926020929190829003018186803b158015610fdc57600080fd5b915086826001845103815181106114c957fe5b6020026020010151101561150e5760405162461bcd60e51b815260040180806020018281038252602b815260200180614922602b913960400191505060405180910390fd5b61151e8686600081811061107557fe5b6111f882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613a47915050565b606081428110156115a3576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106115dd57fe5b905060200201356001600160a01b03166001600160a01b031614611636576040805162461bcd60e51b815260206004820152601d60248201526000805160206148b9833981519152604482015290519081900360640190fd5b6116ee7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805163978bbdb960e01b815290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063978bbdb992506004808301926020929190829003018186803b15801561128457600080fd5b915086826000815181106116fe57fe5b602002602001015111156110655760405162461bcd60e51b81526004018080602001828103825260278152602001806148926027913960400191505060405180910390fd5b6000806117917f00000000000000000000000000000000000000000000000000000000000000008d7f000000000000000000000000000000000000000000000000000000000000000061382a565b90506000866117a0578b6117a4565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561181a57600080fd5b505af115801561182e573d6000803e3d6000fd5b505050506118408d8d8d8d8d8d612311565b9d9c50505050505050505050505050565b8042811015611895576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b61190a858560008181106118a557fe5b905060200201356001600160a01b0316336119047f0000000000000000000000000000000000000000000000000000000000000000898960008181106118e757fe5b905060200201356001600160a01b03168a8a60018181106110d457fe5b8a6138ea565b60008585600019810181811061191c57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561197857600080fd5b505afa15801561198c573d6000803e3d6000fd5b505050506040513d60208110156119a257600080fd5b505160408051602088810282810182019093528882529293506119e4929091899189918291850190849080828437600092019190915250889250613dbd915050565b86611a8782888860001981018181106119f957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a5557600080fd5b505afa158015611a69573d6000803e3d6000fd5b505050506040513d6020811015611a7f57600080fd5b505190614113565b1015611ac45760405162461bcd60e51b815260040180806020018281038252602b815260200180614922602b913960400191505060405180910390fd5b5050505050505050565b8042811015611b12576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856000198101818110611b4c57fe5b905060200201356001600160a01b03166001600160a01b031614611ba5576040805162461bcd60e51b815260206004820152601d60248201526000805160206148b9833981519152604482015290519081900360640190fd5b611bb5858560008181106118a557fe5b611bf3858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613dbd915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c6257600080fd5b505afa158015611c76573d6000803e3d6000fd5b505050506040513d6020811015611c8c57600080fd5b5051905086811015611ccf5760405162461bcd60e51b815260040180806020018281038252602b815260200180614922602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611d3557600080fd5b505af1158015611d49573d6000803e3d6000fd5b50505050611ac48482613508565b60608142811015611d9d576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611dd457fe5b905060200201356001600160a01b03166001600160a01b031614611e2d576040805162461bcd60e51b815260206004820152601d60248201526000805160206148b9833981519152604482015290519081900360640190fd5b611ee57f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805163978bbdb960e01b815290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063978bbdb992506004808301926020929190829003018186803b158015610fdc57600080fd5b91508682600184510381518110611ef857fe5b60200260200101511015611f3d5760405162461bcd60e51b815260040180806020018281038252602b815260200180614922602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611f7957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611fac57600080fd5b505af1158015611fc0573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6120257f0000000000000000000000000000000000000000000000000000000000000000898960008181106118e757fe5b8460008151811061203257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561208057600080fd5b505af1158015612094573d6000803e3d6000fd5b505050506040513d60208110156120aa57600080fd5b50516120b257fe5b6120f182878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613a47915050565b5095945050505050565b6000610e438484847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663978bbdb96040518163ffffffff1660e01b815260040160206040518083038186803b15801561215c57600080fd5b505afa158015612170573d6000803e3d6000fd5b505050506040513d602081101561218657600080fd5b5051614163565b606081428110156121d3576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b61228b7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805163978bbdb960e01b815290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063978bbdb992506004808301926020929190829003018186803b15801561128457600080fd5b9150868260008151811061229b57fe5b6020026020010151111561150e5760405162461bcd60e51b81526004018080602001828103825260278152602001806148926027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610e4384848461423f565b60008142811015612357576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b612386887f00000000000000000000000000000000000000000000000000000000000000008989893089612808565b90508092505061240f88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123de57600080fd5b505afa1580156123f2573d6000803e3d6000fd5b505050506040513d602081101561240857600080fd5b505161339e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561247557600080fd5b505af1158015612489573d6000803e3d6000fd5b505050506111f88483613508565b80428110156124db576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061251257fe5b905060200201356001600160a01b03166001600160a01b03161461256b576040805162461bcd60e51b815260206004820152601d60248201526000805160206148b9833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125cb57600080fd5b505af11580156125df573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6126447f0000000000000000000000000000000000000000000000000000000000000000898960008181106118e757fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561268b57600080fd5b505af115801561269f573d6000803e3d6000fd5b505050506040513d60208110156126b557600080fd5b50516126bd57fe5b6000868660001981018181106126cf57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561272b57600080fd5b505afa15801561273f573d6000803e3d6000fd5b505050506040513d602081101561275557600080fd5b505160408051602089810282810182019093528982529293506127979290918a918a918291850190849080828437600092019190915250899250613dbd915050565b87611a8782898960001981018181106127ac57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a5557600080fd5b600080824281101561284f576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b600061287c7f00000000000000000000000000000000000000000000000000000000000000008c8c61382a565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156128d757600080fd5b505af11580156128eb573d6000803e3d6000fd5b505050506040513d602081101561290157600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561294e57600080fd5b505af1158015612962573d6000803e3d6000fd5b505050506040513d604081101561297857600080fd5b508051602090910151909250905060006129928e8e6142e5565b509050806001600160a01b03168e6001600160a01b0316146129b55781836129b8565b82825b90975095508a8710156129fc5760405162461bcd60e51b81526004018080602001828103825260268152602001806148d96026913960400191505060405180910390fd5b89861015612a3b5760405162461bcd60e51b815260040180806020018281038252602681526020018061481f6026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606112b57f000000000000000000000000000000000000000000000000000000000000000084847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663978bbdb96040518163ffffffff1660e01b815260040160206040518083038186803b158015610fdc57600080fd5b6000806000612b417f00000000000000000000000000000000000000000000000000000000000000008e7f000000000000000000000000000000000000000000000000000000000000000061382a565b9050600087612b50578c612b54565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612bca57600080fd5b505af1158015612bde573d6000803e3d6000fd5b50505050612bf08e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b60008060008342811015612c4e576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b612c5c8c8c8c8c8c8c6143c3565b90945092506000612c8e7f00000000000000000000000000000000000000000000000000000000000000008e8e61382a565b9050612c9c8d3383886138ea565b612ca88c3383876138ea565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612cf757600080fd5b505af1158015612d0b573d6000803e3d6000fd5b505050506040513d6020811015612d2157600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612d81576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b612daf8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6143c3565b90945092506000612e017f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061382a565b9050612e0f8b3383886138ea565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e6a57600080fd5b505af1158015612e7e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612efa57600080fd5b505af1158015612f0e573d6000803e3d6000fd5b505050506040513d6020811015612f2457600080fd5b5051612f2c57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612f7b57600080fd5b505af1158015612f8f573d6000803e3d6000fd5b505050506040513d6020811015612fa557600080fd5b5051925034841015612fbd57612fbd33853403613508565b505096509650969350505050565b60608142811015613011576040805162461bcd60e51b8152602060048201526018602482015260008051602061499c833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061304857fe5b905060200201356001600160a01b03166001600160a01b0316146130a1576040805162461bcd60e51b815260206004820152601d60248201526000805160206148b9833981519152604482015290519081900360640190fd5b6131597f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040805163978bbdb960e01b815290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063978bbdb992506004808301926020929190829003018186803b15801561128457600080fd5b9150348260008151811061316957fe5b602002602001015111156131ae5760405162461bcd60e51b81526004018080602001828103825260278152602001806148926027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106131ea57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561321d57600080fd5b505af1158015613231573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6132967f0000000000000000000000000000000000000000000000000000000000000000898960008181106118e757fe5b846000815181106132a357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156132f157600080fd5b505af1158015613305573d6000803e3d6000fd5b505050506040513d602081101561331b57600080fd5b505161332357fe5b61336282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613a47915050565b8160008151811061336f57fe5b60200260200101513411156120f1576120f1338360008151811061338f57fe5b60200260200101513403613508565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061341b5780518252601f1990920191602091820191016133fc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461347d576040519150601f19603f3d011682016040523d82523d6000602084013e613482565b606091505b50915091508180156134b05750805115806134b057508080602001905160208110156134ad57600080fd5b50515b613501576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106135545780518252601f199092019160209182019101613535565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146135b6576040519150601f19603f3d011682016040523d82523d6000602084013e6135bb565b606091505b50509050806135fb5760405162461bcd60e51b81526004018080602001828103825260238152602001806148ff6023913960400191505060405180910390fd5b505050565b60008085116136405760405162461bcd60e51b815260040180806020018281038252602b815260200180614971602b913960400191505060405180910390fd5b6000841180156136505750600083115b61368b5760405162461bcd60e51b81526004018080602001828103825260288152602001806148456028913960400191505060405180910390fd5b600061369c866103e8859003614654565b905060006136aa8286614654565b905060006136c4836136be896103e8614654565b906146b7565b90508082816136cf57fe5b0498975050505050505050565b6060600283511015613735576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b825167ffffffffffffffff8111801561374d57600080fd5b50604051908082528060200260200182016040528015613777578160200160208202803683370190505b509050838160008151811061378857fe5b60200260200101818152505060005b6001845103811015613821576000806137da888785815181106137b657fe5b60200260200101518886600101815181106137cd57fe5b6020026020010151614706565b915091506137fd8484815181106137ed57fe5b6020026020010151838388613600565b84846001018151811061380c57fe5b60209081029190910101525050600101613797565b50949350505050565b600080600061383985856142e5565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f06d32be9fe9b1c75a1ce7e2b362c735bcb731596b9330b99412fde52d753e3f0609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061396f5780518252601f199092019160209182019101613950565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146139d1576040519150601f19603f3d011682016040523d82523d6000602084013e6139d6565b606091505b5091509150818015613a04575080511580613a045750808060200190516020811015613a0157600080fd5b50515b613a3f5760405162461bcd60e51b815260040180806020018281038252602481526020018061494d6024913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613c7e57600080848381518110613a6557fe5b6020026020010151858460010181518110613a7c57fe5b6020026020010151915091506000613a9483836142e5565b5090506000878560010181518110613aa857fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614613ad657826000613ada565b6000835b91509150600060028a51038810613af15788613b32565b613b327f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110613b2557fe5b602002602001015161382a565b9050613b5f7f0000000000000000000000000000000000000000000000000000000000000000888861382a565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613b9c576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613c04578181015183820152602001613bec565b50505050905090810190601f168015613c315780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c5357600080fd5b505af1158015613c67573d6000803e3d6000fd5b505060019099019850613a4a975050505050505050565b50505050565b6060600283511015613cdd576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b825167ffffffffffffffff81118015613cf557600080fd5b50604051908082528060200260200182016040528015613d1f578160200160208202803683370190505b5090508381600183510381518110613d3357fe5b60209081029190910101528251600019015b801561382157600080613d7588876001860381518110613d6157fe5b60200260200101518886815181106137cd57fe5b91509150613d98848481518110613d8857fe5b6020026020010151838388614163565b846001850381518110613da757fe5b6020908102919091010152505060001901613d45565b60005b60018351038110156135fb57600080848381518110613ddb57fe5b6020026020010151858460010181518110613df257fe5b6020026020010151915091506000613e0a83836142e5565b5090506000613e3a7f0000000000000000000000000000000000000000000000000000000000000000858561382a565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613e7b57600080fd5b505afa158015613e8f573d6000803e3d6000fd5b505050506040513d6060811015613ea557600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613edb578284613ede565b83835b91509150613f33828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a5557600080fd5b9550613f948683837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663978bbdb96040518163ffffffff1660e01b815260040160206040518083038186803b158015610e1257600080fd5b945050505050600080856001600160a01b0316886001600160a01b031614613fbe57826000613fc2565b6000835b91509150600060028c51038a10613fd9578a61400d565b61400d7f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110613b2557fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b8381101561409757818101518382015260200161407f565b50505050905090810190601f1680156140c45780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156140e657600080fd5b505af11580156140fa573d6000803e3d6000fd5b50506001909b019a50613dc09950505050505050505050565b808203828111156112b8576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008085116141a35760405162461bcd60e51b815260040180806020018281038252602c8152602001806147ce602c913960400191505060405180910390fd5b6000841180156141b35750600083115b6141ee5760405162461bcd60e51b81526004018080602001828103825260288152602001806148456028913960400191505060405180910390fd5b60006142066103e86142008789614654565b90614654565b9050600061421d6103e8859003614200878a614113565b9050614234600182848161422d57fe5b04906146b7565b979650505050505050565b600080841161427f5760405162461bcd60e51b815260040180806020018281038252602581526020018061486d6025913960400191505060405180910390fd5b60008311801561428f5750600082115b6142ca5760405162461bcd60e51b81526004018080602001828103825260288152602001806148456028913960400191505060405180910390fd5b826142d58584614654565b816142dc57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156143395760405162461bcd60e51b81526004018080602001828103825260258152602001806147fa6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b03161061435957828461435c565b83835b90925090506001600160a01b0382166143bc576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561444f57600080fd5b505afa158015614463573d6000803e3d6000fd5b505050506040513d602081101561447957600080fd5b50516001600160a01b03161415614537577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561450a57600080fd5b505af115801561451e573d6000803e3d6000fd5b505050506040513d602081101561453457600080fd5b50505b6000806145657f00000000000000000000000000000000000000000000000000000000000000008b8b614706565b91509150816000148015614577575080155b1561458757879350869250614647565b600061459489848461423f565b90508781116145e757858110156145dc5760405162461bcd60e51b815260040180806020018281038252602681526020018061481f6026913960400191505060405180910390fd5b889450925082614645565b60006145f489848661423f565b90508981111561460057fe5b8781101561463f5760405162461bcd60e51b81526004018080602001828103825260268152602001806148d96026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600081158061466f5750508082028282828161466c57fe5b04145b6112b8576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b808201828110156112b8576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b600080600061471585856142e5565b50905060008061472688888861382a565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561475e57600080fd5b505afa158015614772573d6000803e3d6000fd5b505050506040513d606081101561478857600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146147bb5780826147be565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e56414c49445f50415448000000556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a2646970667358221220b0995b5dd8a73c3b1f6c6569d9e507f2bf5eb9be3f24f375d0c8957e19e6dc1764736f6c634300060c00330000000000000000000000000419082bb45f47fe5c530ea489e16478819910f30000000000000000000000005545153ccfca01fbd7dd11c0b23ba694d9509a6f

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

0000000000000000000000000419082bb45f47fe5c530ea489e16478819910f30000000000000000000000005545153ccfca01fbd7dd11c0b23ba694d9509a6f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000419082bb45f47fe5c530ea489e16478819910f3
Arg [1] : 0000000000000000000000005545153ccfca01fbd7dd11c0b23ba694d9509a6f


Deployed ByteCode Sourcemap

16588:19023:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17077:10;-1:-1:-1;;;;;17091:4:0;17077:18;;17070:26;;;;16588:19023;;;;;21227:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21227:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34403:300;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34403:300:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28555:888;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28555:888:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28555:888:0;;;;;;;;;;;;-1:-1:-1;28555:888:0;-1:-1:-1;;;;;;28555:888:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35317:291;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35317:291:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35317:291:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35317:291:0;;-1:-1:-1;35317:291:0;;-1:-1:-1;;;;;35317:291:0:i;21906:677::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21906:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25620:666::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25620:666:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25620:666:0;;;;;;;;;;;;-1:-1:-1;25620:666:0;-1:-1:-1;;;;;;25620:666:0;;;;;;;;:::i;27683:866::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27683:866:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27683:866:0;;;;;;;;;;;;-1:-1:-1;27683:866:0;-1:-1:-1;;;;;;27683:866:0;;;;;;;;:::i;24050:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24050:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31709:728::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31709:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31709:728:0;;;;;;;;;;;;-1:-1:-1;31709:728:0;-1:-1:-1;;;;;;31709:728:0;;;;;;;;:::i;33313:850::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33313:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33313:850:0;;;;;;;;;;;;-1:-1:-1;33313:850:0;-1:-1:-1;;;;;;33313:850:0;;;;;;;;:::i;26942:735::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26942:735:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26942:735:0;;;;;;;;;;;;-1:-1:-1;26942:735:0;-1:-1:-1;;;;;;26942:735:0;;;;;;;;:::i;34711:299::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34711:299:0;;;;;;;;;;;;:::i;26292:644::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26292:644:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26292:644:0;;;;;;;;;;;;-1:-1:-1;26292:644:0;-1:-1:-1;;;;;;26292:644:0;;;;;;;;:::i;16731:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;16731:38:0;;;;;;;;;;;;;;34207:188;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34207:188:0;;;;;;;;;;;;:::i;23337:707::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23337:707:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32443:864::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32443:864:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32443:864:0;;;;;;;;;;;;-1:-1:-1;32443:864:0;-1:-1:-1;;;;;;32443:864:0;;;;;;;;:::i;20356:865::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20356:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16683:41::-;;;;;;;;;;;;;:::i;35018:291::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35018:291:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35018:291:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35018:291:0;;-1:-1:-1;35018:291:0;;-1:-1:-1;;;;;35018:291:0:i;22589:669::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22589:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18595:738::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18595:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19339:974;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19339:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29449:848::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29449:848:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29449:848:0;;;;;;;;;;;;-1:-1:-1;29449:848:0;-1:-1:-1;;;;;;29449:848:0;;;;;;;;:::i;21227:673::-;21464:16;21482:14;21445:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;21536:196:::1;21566:5;21586:4;21605:9;21629:14;21658:12;21693:4;21713:8;21536:15;:196::i;:::-;21509:223:::0;;-1:-1:-1;21509:223:0;-1:-1:-1;21743:51:0::1;21771:5:::0;21778:2;21509:223;21743:27:::1;:51::i;:::-;21811:4;-1:-1:-1::0;;;;;21805:20:0::1;;21826:9;21805:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21847:45;21878:2;21882:9;21847:30;:45::i;:::-;21227:673:::0;;;;;;;;;;:::o;34403:300::-;34556:14;34595:100;34625:8;34635:9;34646:10;34676:7;-1:-1:-1;;;;;34658:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34658:36:0;34595:29;:100::i;:::-;34588:107;34403:300;-1:-1:-1;;;;34403:300:0:o;28555:888::-;28769:21;28741:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28841:4:0::1;28816:29;:4:::0;;-1:-1:-1;;28821:15:0;;28816:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28816:21:0::1;-1:-1:-1::0;;;;;28816:29:0::1;;28808:71;;;::::0;;-1:-1:-1;;;28808:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28808:71:0;;;;;;;;;;;;;::::1;;28900:93;28931:7;28940:8;28950:4;;28900:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;28956:36:0::1;::::0;;-1:-1:-1;;;28956:36:0;;;;-1:-1:-1;;;;;28974:7:0::1;28956:34;::::0;-1:-1:-1;28956:34:0::1;::::0;-1:-1:-1;28956:36:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:34;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28956:36:0;28900:30:::1;:93::i;:::-;28890:103;;29043:12;29012:7;29037:1;29020:7;:14;:18;29012:27;;;;;;;;;;;;;;:43;;29004:99;;;;-1:-1:-1::0;;;29004:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29114:141;29160:4;;29165:1;29160:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29160:7:0::1;29169:10;29181:51;29206:7;29215:4;;29220:1;29215:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29215:7:0::1;29224:4;;29229:1;29224:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29224:7:0::1;29181:24;:51::i;:::-;29234:7;29242:1;29234:10;;;;;;;;;;;;;;29114:31;:141::i;:::-;29266:35;29272:7;29281:4;;29266:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29295:4:0::1;::::0;-1:-1:-1;29266:5:0::1;::::0;-1:-1:-1;;29266:35:0:i:1;:::-;29318:4;-1:-1:-1::0;;;;;29312:20:0::1;;29333:7;29358:1;29341:7;:14;:18;29333:27;;;;;;;;;;;;;;29312:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29372:63;29403:2;29407:7;29432:1;29415:7;:14;:18;29407:27;;;;;;;;;;;;;;29372:30;:63::i;:::-;28555:888:::0;;;;;;;;;:::o;35317:291::-;35461:21;35507:93;35537:7;35546:9;35557:4;35581:7;-1:-1:-1;;;;;35563:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35563:36:0;35507:29;:93::i;:::-;35500:100;;35317:291;;;;;:::o;21906:677::-;22212:12;22226;22251;22266:49;22291:7;22300:6;22308;22266:24;:49::i;:::-;22251:64;;22326:10;22339;:33;;22363:9;22339:33;;;-1:-1:-1;;22339:33:0;22383:80;;;-1:-1:-1;;;22383:80:0;;22411:10;22383:80;;;;22431:4;22383:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22326:46;;-1:-1:-1;;;;;;22383:27:0;;;;;:80;;;;;-1:-1:-1;;22383:80:0;;;;;;;;-1:-1:-1;22383:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22495;22511:6;22519;22527:9;22538:10;22550;22562:2;22566:8;22495:15;:80::i;:::-;22474:101;;;;;;;;21906:677;;;;;;;;;;;;;;;;:::o;25620:666::-;25844:21;25825:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;25888:93:::1;25919:7;25928:8;25938:4;;25888:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;25944:36:0::1;::::0;;-1:-1:-1;;;25944:36:0;;;;-1:-1:-1;;;;;25962:7:0::1;25944:34;::::0;-1:-1:-1;25944:34:0::1;::::0;-1:-1:-1;25944:36:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:34;:36;::::1;;::::0;::::1;;;;::::0;::::1;25888:93;25878:103;;26031:12;26000:7;26025:1;26008:7;:14;:18;26000:27;;;;;;;;;;;;;;:43;;25992:99;;;;-1:-1:-1::0;;;25992:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26102:141;26148:4;;26153:1;26148:7;;;;;;26102:141;26254:24;26260:7;26269:4;;26254:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26275:2:0;;-1:-1:-1;26254:5:0::1;::::0;-1:-1:-1;;26254:24:0:i:1;27683:866::-:0;27897:21;27869:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27969:4:0::1;27944:29;:4:::0;;-1:-1:-1;;27949:15:0;;27944:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27944:21:0::1;-1:-1:-1::0;;;;;27944:29:0::1;;27936:71;;;::::0;;-1:-1:-1;;;27936:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27936:71:0;;;;;;;;;;;;;::::1;;28028:93;28058:7;28067:9;28078:4;;28028:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;28084:36:0::1;::::0;;-1:-1:-1;;;28084:36:0;;;;-1:-1:-1;;;;;28102:7:0::1;28084:34;::::0;-1:-1:-1;28084:34:0::1;::::0;-1:-1:-1;28084:36:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:34;:36;::::1;;::::0;::::1;;;;::::0;::::1;28028:93;28018:103;;28154:11;28140:7;28148:1;28140:10;;;;;;;;;;;;;;:25;;28132:77;;;;-1:-1:-1::0;;;28132:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24050:718:::0;24368:14;24395:12;24410:46;24435:7;24444:5;24451:4;24410:24;:46::i;:::-;24395:61;;24467:10;24480;:33;;24504:9;24480:33;;;-1:-1:-1;;24480:33:0;24524:80;;;-1:-1:-1;;;24524:80:0;;24552:10;24524:80;;;;24572:4;24524:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24467:46;;-1:-1:-1;;;;;;24524:27:0;;;;;:80;;;;;-1:-1:-1;;24524:80:0;;;;;;;;-1:-1:-1;24524:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24627:133;24689:5;24696:9;24707:14;24723:12;24737:2;24741:8;24627:47;:133::i;:::-;24615:145;24050:718;-1:-1:-1;;;;;;;;;;;;;24050:718:0:o;31709:728::-;31943:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;31964:139:::1;32010:4;;32015:1;32010:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32010:7:0::1;32019:10;32031:51;32056:7;32065:4;;32070:1;32065:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32065:7:0::1;32074:4;;32079:1;32074:7;;;;;;32031:51;32084:8;31964:31;:139::i;:::-;32114:18;32149:4:::0;;-1:-1:-1;;32154:15:0;;32149:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32149:21:0::1;-1:-1:-1::0;;;;;32135:46:0::1;;32182:2;32135:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32135:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32135:50:0;32196:44:::1;::::0;;32135:50:::1;32196:44:::0;;::::1;::::0;;;;;;;;;;;32135:50;;-1:-1:-1;32196:44:0::1;::::0;;;32231:4;;;;;;32196:44;::::1;::::0;32231:4;;32196:44;32231:4;32196:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32237:2:0;;-1:-1:-1;32196:34:0::1;::::0;-1:-1:-1;;32196:44:0:i:1;:::-;32346:12:::0;32273:69:::1;32328:13:::0;32287:4;;-1:-1:-1;;32292:15:0;;32287:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32287:21:0::1;-1:-1:-1::0;;;;;32273:46:0::1;;32320:2;32273:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32273:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32273:50:0;;:54:::1;:69::i;:::-;:85;;32251:178;;;;-1:-1:-1::0;;;32251:178:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16895:1;31709:728:::0;;;;;;;:::o;33313:850::-;33580:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33639:4:0::1;33614:29;:4:::0;;-1:-1:-1;;33619:15:0;;33614:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33614:21:0::1;-1:-1:-1::0;;;;;33614:29:0::1;;33606:71;;;::::0;;-1:-1:-1;;;33606:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33606:71:0;;;;;;;;;;;;;::::1;;33688:139;33734:4;;33739:1;33734:7;;;;;;33688:139;33838:55;33873:4;;33838:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33887:4:0::1;::::0;-1:-1:-1;33838:34:0::1;::::0;-1:-1:-1;;33838:55:0:i:1;:::-;33904:14;33935:4;-1:-1:-1::0;;;;;33921:29:0::1;;33959:4;33921:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;33921:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33921:44:0;;-1:-1:-1;33984:25:0;;::::1;;33976:81;;;;-1:-1:-1::0;;;33976:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34074:4;-1:-1:-1::0;;;;;34068:20:0::1;;34089:9;34068:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34110:45;34141:2;34145:9;34110:30;:45::i;26942:735::-:0;27158:21;27130:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;27216:4:::1;-1:-1:-1::0;;;;;27205:15:0::1;:4;;27210:1;27205:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27205:7:0::1;-1:-1:-1::0;;;;;27205:15:0::1;;27197:57;;;::::0;;-1:-1:-1;;;27197:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27197:57:0;;;;;;;;;;;;;::::1;;27275:94;27306:7;27315:9;27326:4;;27275:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;27332:36:0::1;::::0;;-1:-1:-1;;;27332:36:0;;;;-1:-1:-1;;;;;27350:7:0::1;27332:34;::::0;-1:-1:-1;27332:34:0::1;::::0;-1:-1:-1;27332:36:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:34;:36;::::1;;::::0;::::1;;;;::::0;::::1;27275:94;27265:104;;27419:12;27388:7;27413:1;27396:7;:14;:18;27388:27;;;;;;;;;;;;;;:43;;27380:99;;;;-1:-1:-1::0;;;27380:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27496:4;-1:-1:-1::0;;;;;27490:19:0::1;;27517:7;27525:1;27517:10;;;;;;;;;;;;;;27490:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;27554:4;-1:-1:-1::0;;;;;27548:20:0::1;;27569:51;27594:7;27603:4;;27608:1;27603:7;;;;;;27569:51;27622:7;27630:1;27622:10;;;;;;;;;;;;;;27548:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;27548:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27548:85:0;27541:93:::1;;;;27645:24;27651:7;27660:4;;27645:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27666:2:0;;-1:-1:-1;27645:5:0::1;::::0;-1:-1:-1;;27645:24:0:i:1;:::-;26942:735:::0;;;;;;;;:::o;34711:299::-;34864:13;34902:100;34931:9;34942;34953:10;34983:7;-1:-1:-1;;;;;34965:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34965:36:0;34902:28;:100::i;26292:644::-;26516:21;26497:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;26560:93:::1;26590:7;26599:9;26610:4;;26560:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;26616:36:0::1;::::0;;-1:-1:-1;;;26616:36:0;;;;-1:-1:-1;;;;;26634:7:0::1;26616:34;::::0;-1:-1:-1;26616:34:0::1;::::0;-1:-1:-1;26616:36:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:34;:36;::::1;;::::0;::::1;;;;::::0;::::1;26560:93;26550:103;;26686:11;26672:7;26680:1;26672:10;;;;;;;;;;;;;;:25;;26664:77;;;;-1:-1:-1::0;;;26664:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16731:38:::0;;;:::o;34207:188::-;34304:12;34336:51;34359:7;34368:8;34378;34336:22;:51::i;23337:707::-;23603:14;23584:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;23646:196:::1;23676:5;23696:4;23715:9;23739:14;23768:12;23803:4;23823:8;23646:15;:196::i;:::-;23630:212;;;;;;23853:85;23881:5;23888:2;23906:5;-1:-1:-1::0;;;;;23892:30:0::1;;23931:4;23892:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;23892:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23892:45:0;23853:27:::1;:85::i;:::-;23955:4;-1:-1:-1::0;;;;;23949:20:0::1;;23970:9;23949:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23991:45;24022:2;24026:9;23991:30;:45::i;32443:864::-:0;32703:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;32748:4:::1;-1:-1:-1::0;;;;;32737:15:0::1;:4;;32742:1;32737:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32737:7:0::1;-1:-1:-1::0;;;;;32737:15:0::1;;32729:57;;;::::0;;-1:-1:-1;;;32729:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32729:57:0;;;;;;;;;;;;;::::1;;32797:13;32813:9;32797:25;;32839:4;-1:-1:-1::0;;;;;32833:19:0::1;;32860:8;32833:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32895:4;-1:-1:-1::0;;;;;32889:20:0::1;;32910:51;32935:7;32944:4;;32949:1;32944:7;;;;;;32910:51;32963:8;32889:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;32889:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32889:83:0;32882:91:::1;;;;32984:18;33019:4:::0;;-1:-1:-1;;33024:15:0;;33019:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33019:21:0::1;-1:-1:-1::0;;;;;33005:46:0::1;;33052:2;33005:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;33005:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33005:50:0;33066:44:::1;::::0;;33005:50:::1;33066:44:::0;;::::1;::::0;;;;;;;;;;;33005:50;;-1:-1:-1;33066:44:0::1;::::0;;;33101:4;;;;;;33066:44;::::1;::::0;33101:4;;33066:44;33101:4;33066:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;33107:2:0;;-1:-1:-1;33066:34:0::1;::::0;-1:-1:-1;;33066:44:0:i:1;:::-;33216:12:::0;33143:69:::1;33198:13:::0;33157:4;;-1:-1:-1;;33162:15:0;;33157:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33157:21:0::1;-1:-1:-1::0;;;;;33143:46:0::1;;33190:2;33143:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;33143:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;20356:865:::0;20610:12;20624;20591:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;20649:12:::1;20664:49;20689:7;20698:6;20706;20664:24;:49::i;:::-;20724:62;::::0;;-1:-1:-1;;;20724:62:0;;20758:10:::1;20724:62;::::0;::::1;::::0;-1:-1:-1;;;;;20724:33:0;::::1;:62:::0;;;;;;;;;;;;;;20649:64;;-1:-1:-1;20724:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20724:33:0;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;20854:29:0::1;::::0;;-1:-1:-1;;;20854:29:0;;-1:-1:-1;;;;;20854:29:0;;::::1;;::::0;::::1;::::0;;;20824:12:::1;::::0;;;20854:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;20824:12;20854:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20854:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20854:29:0;-1:-1:-1;20895:14:0::1;20914:43;20942:6:::0;20950;20914:27:::1;:43::i;:::-;20894:63;;;20999:6;-1:-1:-1::0;;;;;20989:16:0::1;:6;-1:-1:-1::0;;;;;20989:16:0::1;;:58;;21030:7;21039;20989:58;;;21009:7;21018;20989:58;20968:79:::0;;-1:-1:-1;20968:79:0;-1:-1:-1;21066:21:0;;::::1;;21058:72;;;;-1:-1:-1::0;;;21058:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21160:10;21149:7;:21;;21141:72;;;;-1:-1:-1::0;;;21141:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16895:1;;;;20356:865:::0;;;;;;;;;;;:::o;16683:41::-;;;:::o;35018:291::-;35162:21;35208:93;35239:7;35248:8;35258:4;35282:7;-1:-1:-1;;;;;35264:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22589:669;22878:16;22896:14;22923:12;22938:46;22963:7;22972:5;22979:4;22938:24;:46::i;:::-;22923:61;;22995:10;23008;:33;;23032:9;23008:33;;;-1:-1:-1;;23008:33:0;23052:80;;;-1:-1:-1;;;23052:80:0;;23080:10;23052:80;;;;23100:4;23052:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22995:46;;-1:-1:-1;;;;;;23052:27:0;;;;;:80;;;;;-1:-1:-1;;23052:80:0;;;;;;;;-1:-1:-1;23052:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23170;23189:5;23196:9;23207:14;23223:12;23237:2;23241:8;23170:18;:80::i;:::-;23143:107;;;;-1:-1:-1;22589:669:0;-1:-1:-1;;;;;;;;;;;;;22589:669:0:o;18595:738::-;18883:12;18897;18911:14;18864:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;18959:85:::1;18973:6;18981;18989:14;19005;19021:10;19033;18959:13;:85::i;:::-;18938:106:::0;;-1:-1:-1;18938:106:0;-1:-1:-1;19055:12:0::1;19070:49;19095:7;19104:6:::0;19112;19070:24:::1;:49::i;:::-;19055:64;;19130:66;19162:6;19170:10;19182:4;19188:7;19130:31;:66::i;:::-;19207;19239:6;19247:10;19259:4;19265:7;19207:31;:66::i;:::-;19311:4;-1:-1:-1::0;;;;;19296:25:0::1;;19322:2;19296:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;19296:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19296:29:0;18595:738;;;;-1:-1:-1;19296:29:0;;-1:-1:-1;18595:738:0;;-1:-1:-1;;;;;;;;;18595:738:0:o;19339:974::-;19592:16;19610:14;19626;19573:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;19680:176:::1;19708:5;19728:4;19747:18;19780:9;19804:14;19833:12;19680:13;:176::i;:::-;19653:203:::0;;-1:-1:-1;19653:203:0;-1:-1:-1;19867:12:0::1;19882:46;19907:7;19916:5:::0;19923:4:::1;19882:24;:46::i;:::-;19867:61;;19939:69;19971:5;19978:10;19990:4;19996:11;19939:31;:69::i;:::-;20025:4;-1:-1:-1::0;;;;;20019:19:0::1;;20046:9;20019:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;20082:4;-1:-1:-1::0;;;;;20076:20:0::1;;20097:4;20103:9;20076:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;20076:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20076:37:0;20069:45:::1;;;;20152:4;-1:-1:-1::0;;;;;20137:25:0::1;;20163:2;20137:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;20137:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20137:29:0;;-1:-1:-1;20217:9:0::1;:21:::0;-1:-1:-1;20213:92:0::1;;;20240:65;20271:10;20295:9;20283;:21;20240:30;:65::i;:::-;16895:1;19339:974:::0;;;;;;;;;;;:::o;29449:848::-;29662:21;29634:8;16840:15;16828:8;:27;;16820:64;;;;;-1:-1:-1;;;16820:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16820:64:0;;;;;;;;;;;;;;;29720:4:::1;-1:-1:-1::0;;;;;29709:15:0::1;:4;;29714:1;29709:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29709:7:0::1;-1:-1:-1::0;;;;;29709:15:0::1;;29701:57;;;::::0;;-1:-1:-1;;;29701:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29701:57:0;;;;;;;;;;;;;::::1;;29779:93;29809:7;29818:9;29829:4;;29779:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;29835:36:0::1;::::0;;-1:-1:-1;;;29835:36:0;;;;-1:-1:-1;;;;;29853:7:0::1;29835:34;::::0;-1:-1:-1;29835:34:0::1;::::0;-1:-1:-1;29835:36:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:34;:36;::::1;;::::0;::::1;;;;::::0;::::1;29779:93;29769:103;;29905:9;29891:7;29899:1;29891:10;;;;;;;;;;;;;;:23;;29883:75;;;;-1:-1:-1::0;;;29883:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29975:4;-1:-1:-1::0;;;;;29969:19:0::1;;29996:7;30004:1;29996:10;;;;;;;;;;;;;;29969:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;30033:4;-1:-1:-1::0;;;;;30027:20:0::1;;30048:51;30073:7;30082:4;;30087:1;30082:7;;;;;;30048:51;30101:7;30109:1;30101:10;;;;;;;;;;;;;;30027:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;30027:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;30027:85:0;30020:93:::1;;;;30124:24;30130:7;30139:4;;30124:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30145:2:0;;-1:-1:-1;30124:5:0::1;::::0;-1:-1:-1;;30124:24:0:i:1;:::-;30211:7;30219:1;30211:10;;;;;;;;;;;;;;30199:9;:22;30195:94;;;30223:66;30254:10;30278:7;30286:1;30278:10;;;;;;;;;;;;;;30266:9;:22;30223:30;:66::i;9311:361::-:0;9506:45;;;-1:-1:-1;;;;;9506:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9506:45:0;-1:-1:-1;;;9506:45:0;;;9495:57;;;;9460:12;;9474:17;;9495:10;;;;9506:45;9495:57;;;9506:45;9495:57;;9506:45;9495:57;;;;;;;;;;-1:-1:-1;;9495:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9459:93;;;;9571:7;:57;;;;-1:-1:-1;9583:11:0;;:16;;:44;;;9614:4;9603:24;;;;;;;;;;;;;;;-1:-1:-1;9603:24:0;9583:44;9563:101;;;;;-1:-1:-1;;;9563:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9311:361;;;;;:::o;10090:195::-;10198:12;;;10160;10198;;;;;;;;;-1:-1:-1;;;;;10177:7:0;;;10191:5;;10177:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10177:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10159:52;;;10230:7;10222:55;;;;-1:-1:-1;;;10222:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10090:195;;;:::o;6247:542::-;6354:14;6400:1;6389:8;:12;6381:68;;;;-1:-1:-1;;;6381:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6480:1;6468:9;:13;:31;;;;;6498:1;6485:10;:14;6468:31;6460:84;;;;-1:-1:-1;;;6460:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6555:20;6578:28;:8;6591:4;:14;;;6578:12;:28::i;:::-;6555:51;-1:-1:-1;6617:14:0;6634:31;6555:51;6654:10;6634:19;:31::i;:::-;6617:48;-1:-1:-1;6676:16:0;6695:40;6719:15;6695:19;:9;6709:4;6695:13;:19::i;:::-;:23;;:40::i;:::-;6676:59;;6770:11;6758:9;:23;;;;;;;6247:542;-1:-1:-1;;;;;;;;6247:542:0:o;7489:534::-;7604:21;7661:1;7646:4;:11;:16;;7638:59;;;;;-1:-1:-1;;;7638:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7729:4;:11;7718:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7718:23:0;;7708:33;;7765:8;7752:7;7760:1;7752:10;;;;;;;;;;;;;:21;;;;;7789:6;7784:232;7815:1;7801:4;:11;:15;7797:1;:19;7784:232;;;7839:14;7855:15;7874:42;7886:7;7895:4;7900:1;7895:7;;;;;;;;;;;;;;7904:4;7909:1;7913;7909:5;7904:11;;;;;;;;;;;;;;7874;:42::i;:::-;7838:78;;;;7948:56;7961:7;7969:1;7961:10;;;;;;;;;;;;;;7973:9;7984:10;7996:7;7948:12;:56::i;:::-;7931:7;7939:1;7943;7939:5;7931:14;;;;;;;;;;;;;;;;;:73;-1:-1:-1;;7818:3:0;;7784:232;;;;7489:534;;;;;;:::o;4764:478::-;4853:12;4879:14;4895;4913:26;4924:6;4932;4913:10;:26::i;:::-;5077:32;;;-1:-1:-1;;5077:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5067:43;;;;;;-1:-1:-1;;;;;;4980:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4970:262;;;;;;;;;4764:478;-1:-1:-1;;;;;4764:478:0:o;9680:402::-;9905:51;;;-1:-1:-1;;;;;9905:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9905:51:0;-1:-1:-1;;;9905:51:0;;;9894:63;;;;9859:12;;9873:17;;9894:10;;;;9905:51;9894:63;;;9905:51;9894:63;;9905:51;9894:63;;;;;;;;;;-1:-1:-1;;9894:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9858:99;;;;9976:7;:57;;;;-1:-1:-1;9988:11:0;;:16;;:44;;;10019:4;10008:24;;;;;;;;;;;;;;;-1:-1:-1;10008:24:0;9988:44;9968:106;;;;-1:-1:-1;;;9968:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9680:402;;;;;;:::o;24879:735::-;24986:6;24981:626;25012:1;24998:4;:11;:15;24994:1;:19;24981:626;;;25036:13;25051:14;25070:4;25075:1;25070:7;;;;;;;;;;;;;;25079:4;25084:1;25088;25084:5;25079:11;;;;;;;;;;;;;;25035:56;;;;25107:14;25126:42;25154:5;25161:6;25126:27;:42::i;:::-;25106:62;;;25183:14;25200:7;25208:1;25212;25208:5;25200:14;;;;;;;;;;;;;;25183:31;;25230:15;25247;25275:6;-1:-1:-1;;;;;25266:15:0;:5;-1:-1:-1;;;;;25266:15:0;;:61;;25308:9;25324:1;25266:61;;;25290:1;25294:9;25266:61;25229:98;;;;25342:10;25373:1;25359:4;:11;:15;25355:1;:19;:82;;25434:3;25355:82;;;25377:54;25402:7;25411:6;25419:4;25424:1;25428;25424:5;25419:11;;;;;;;;;;;;;;25377:24;:54::i;:::-;25342:95;;25467:48;25492:7;25501:5;25508:6;25467:24;:48::i;:::-;-1:-1:-1;;;;;25452:69:0;;25540:10;25552;25564:2;25578:1;25568:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25568:12:0;;25452:143;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25452:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25015:3:0;;;;;-1:-1:-1;24981:626:0;;-1:-1:-1;;;;;;;;24981:626:0;;;24879:735;;;:::o;8104:555::-;8219:21;8276:1;8261:4;:11;:16;;8253:59;;;;;-1:-1:-1;;;8253:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8344:4;:11;8333:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8333:23:0;;8323:33;;8397:9;8367:7;8392:1;8375:7;:14;:18;8367:27;;;;;;;;;;;;;;;;;:39;8431:11;;-1:-1:-1;;8431:15:0;8417:235;8448:5;;8417:235;;8476:14;8492:15;8511:42;8523:7;8532:4;8541:1;8537;:5;8532:11;;;;;;;;;;;;;;8545:4;8550:1;8545:7;;;;;;;8511:42;8475:78;;;;8585:55;8597:7;8605:1;8597:10;;;;;;;;;;;;;;8609:9;8620:10;8632:7;8585:11;:55::i;:::-;8568:7;8580:1;8576;:5;8568:14;;;;;;;;;;;;;;;;;:72;-1:-1:-1;;;;8455:3:0;8417:235;;30444:1259;30557:6;30552:1144;30583:1;30569:4;:11;:15;30565:1;:19;30552:1144;;;30607:13;30622:14;30641:4;30646:1;30641:7;;;;;;;;;;;;;;30650:4;30655:1;30659;30655:5;30650:11;;;;;;;;;;;;;;30606:56;;;;30678:14;30697:42;30725:5;30732:6;30697:27;:42::i;:::-;30677:62;;;30754:19;30791:48;30816:7;30825:5;30832:6;30791:24;:48::i;:::-;30754:86;;30855:16;30886:17;30974:13;30989;31007:4;-1:-1:-1;;;;;31007:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31007:18:0;;;;;;;-1:-1:-1;;;;;30973:52:0;;;;-1:-1:-1;30973:52:0;;-1:-1:-1;31041:17:0;;-1:-1:-1;;;;;31082:15:0;;;;;;;:61;;31124:8;31134;31082:61;;;31101:8;31111;31082:61;31040:103;;;;31172:63;31222:12;31186:5;-1:-1:-1;;;;;31172:30:0;;31211:4;31172:45;;;;;;;;;;;;;-1:-1:-1;;;;;31172:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;:63;31158:77;;31265:109;31295:11;31308:12;31322:13;31355:7;-1:-1:-1;;;;;31337:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31265:109;31250:124;;30552:1144;;;;31405:15;31422;31450:6;-1:-1:-1;;;;;31441:15:0;:5;-1:-1:-1;;;;;31441:15:0;;:67;;31486:12;31505:1;31441:67;;;31465:1;31469:12;31441:67;31404:104;;;;31523:10;31554:1;31540:4;:11;:15;31536:1;:19;:82;;31615:3;31536:82;;;31558:54;31583:7;31592:6;31600:4;31605:1;31609;31605:5;31600:11;;;;;;;31558:54;31671:12;;;31681:1;31671:12;;;;;;;;;;-1:-1:-1;;;31633:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31633:51:0;;;;;;;;;;;;;;;;;;;;;;31523:95;;-1:-1:-1;31633:9:0;;;;;;31643:10;;31655;;31523:95;;31671:12;;31633:51;;;;;;;;31671:12;;31633:51;;;;31671:12;;31633:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30586:3:0;;;;;-1:-1:-1;30552:1144:0;;-1:-1:-1;;;;;;;;;;30552:1144:0;2969:129;3053:5;;;3048:16;;;;3040:50;;;;;-1:-1:-1;;;3040:50:0;;;;;;;;;;;;-1:-1:-1;;;3040:50:0;;;;;;;;;;;;;;6910:497;7017:13;7063:1;7051:9;:13;7043:70;;;;-1:-1:-1;;;7043:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7144:1;7132:9;:13;:31;;;;;7162:1;7149:10;:14;7132:31;7124:84;;;;-1:-1:-1;;;7124:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7219:14;7236:34;7265:4;7236:24;:9;7250;7236:13;:24::i;:::-;:28;;:34::i;:::-;7219:51;-1:-1:-1;7281:16:0;7300:45;7330:4;:14;;;7300:25;:10;7315:9;7300:14;:25::i;:45::-;7281:64;;7367:32;7397:1;7380:11;7368:9;:23;;;;;;;7367:29;:32::i;:::-;7356:43;6910:497;-1:-1:-1;;;;;;;6910:497:0:o;5804:321::-;5886:12;5929:1;5919:7;:11;5911:61;;;;-1:-1:-1;;;5911:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6002:1;5991:8;:12;:28;;;;;6018:1;6007:8;:12;5991:28;5983:81;;;;-1:-1:-1;;;5983:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6109:8;6085:21;:7;6097:8;6085:11;:21::i;:::-;:32;;;;;;;5804:321;-1:-1:-1;;;;5804:321:0:o;4323:349::-;4398:14;4414;4459:6;-1:-1:-1;;;;;4449:16:0;:6;-1:-1:-1;;;;;4449:16:0;;;4441:66;;;;-1:-1:-1;;;4441:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4546:6;-1:-1:-1;;;;;4537:15:0;:6;-1:-1:-1;;;;;4537:15:0;;:53;;4575:6;4583;4537:53;;;4556:6;4564;4537:53;4518:72;;-1:-1:-1;4518:72:0;-1:-1:-1;;;;;;4609:20:0;;4601:63;;;;;-1:-1:-1;;;4601:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4323:349;;;;;:::o;17199:1390::-;17417:12;17431;17574:1;-1:-1:-1;;;;;17512:64:0;17530:7;-1:-1:-1;;;;;17512:34:0;;17547:6;17555;17512:50;;;;;;;;;;;;;-1:-1:-1;;;;;17512:50:0;;;;;;-1:-1:-1;;;;;17512:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17512:50:0;-1:-1:-1;;;;;17512:64:0;;17508:150;;;17611:7;-1:-1:-1;;;;;17593:37:0;;17631:6;17639;17593:53;;;;;;;;;;;;;-1:-1:-1;;;;;17593:53:0;;;;;;-1:-1:-1;;;;;17593:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17508:150:0;17669:13;17684;17701:53;17730:7;17739:6;17747;17701:28;:53::i;:::-;17668:86;;;;17769:8;17781:1;17769:13;:30;;;;-1:-1:-1;17786:13:0;;17769:30;17765:817;;;17838:14;;-1:-1:-1;17854:14:0;;-1:-1:-1;17765:817:0;;;17902:19;17924:58;17947:14;17963:8;17973;17924:22;:58::i;:::-;17902:80;;18019:14;18001;:32;17997:574;;18080:10;18062:14;:28;;18054:79;;;;-1:-1:-1;;;18054:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18174:14;;-1:-1:-1;18190:14:0;-1:-1:-1;18190:14:0;17997:574;;;18246:19;18268:58;18291:14;18307:8;18317;18268:22;:58::i;:::-;18246:80;;18370:14;18352;:32;;18345:40;;;;18430:10;18412:14;:28;;18404:79;;;;-1:-1:-1;;;18404:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18524:14;-1:-1:-1;18540:14:0;;-1:-1:-1;17997:574:0;17765:817;;17199:1390;;;;;;;;;;;:::o;3106:142::-;3158:6;3185;;;:30;;-1:-1:-1;;3200:5:0;;;3214:1;3209;3200:5;3209:1;3195:15;;;;;:20;3185:30;3177:63;;;;;-1:-1:-1;;;3177:63:0;;;;;;;;;;;;-1:-1:-1;;;3177:63:0;;;;;;;;;;;;;;2833:128;2917:5;;;2912:16;;;;2904:49;;;;;-1:-1:-1;;;2904:49:0;;;;;;;;;;;;-1:-1:-1;;;2904:49:0;;;;;;;;;;;;;;5300:391;5393:13;5408;5435:14;5454:26;5465:6;5473;5454:10;:26::i;:::-;5434:46;;;5492:13;5507;5540:32;5548:7;5557:6;5565;5540:7;:32::i;:::-;-1:-1:-1;;;;;5525:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5525:62:0;;;;;;;-1:-1:-1;;;;;5491:96:0;;;;-1:-1:-1;5491:96:0;;-1:-1:-1;;;;;;5621:16:0;;;;;;;:62;;5664:8;5674;5621:62;;;5641:8;5651;5621:62;5598:85;;;;-1:-1:-1;5300:391:0;-1:-1:-1;;;;;;;5300:391:0:o

Swarm Source

ipfs://b0995b5dd8a73c3b1f6c6569d9e507f2bf5eb9be3f24f375d0c8957e19e6dc17
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading