Contract 0x8420672ee90F43c46A13715F714c919d04296F07

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x58de22ac2b61bdfee098d1d4b562336b6f7797efd8bbd35512968446a0461936Swap Exact Token...589679812023-02-08 2:30:504 hrs ago0x5afdd71ec312eda36663f72032f269bd9c950cb4 IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00012515
0x1c6d35d70b2d354ae5b19da73886d7e3004ef9d932853f166d4601bcb46fe951Add Liquidity588896402023-02-07 19:51:2310 hrs 40 mins ago0x46d91b492861b9e4636719c03861fa9631792179 IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00016814
0xe50c257f2f490286b177daaa5a26de8e297587f81c730d138476927e3d2f52ecSwap Exact Token...588895062023-02-07 19:50:3710 hrs 41 mins ago0x46d91b492861b9e4636719c03861fa9631792179 IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00016345
0xdfaff0c404a3be98d36dc39774809bab0fb67fc5df250749f2f5f74589f09e82Swap Exact Token...588746942023-02-07 18:38:3311 hrs 53 mins ago0x4b75beb23ffe0b8414b70c8b64c8f6cda569b3bf IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00014786
0xa64514b3470d075d8da3bf8c420f63878c4eee7627536fd0b25a3817a6cc21a5Swap Exact Token...587963552023-02-07 12:48:4817 hrs 42 mins ago0xfa1f780a446e9cdb4c51b031686bcf8b02f8ed7c IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.0000933
0x3289d9e659a3e7fb81bee26decc9b1443846db122fd6d60fa00e2e381bb89dc5Swap Exact Token...587494682023-02-07 9:23:0821 hrs 8 mins ago0x4234b0af34824ff09acf961cab2c6c8c5d3cb6d7 IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00010197
0xf3e613325f4088cadd8291e32005afc2a32dae7b354d52bc3b93bffef31a63a4Add Liquidity587494222023-02-07 9:22:5621 hrs 8 mins ago0x2f1f95edd2b207e8dc04148f0b827f33c69aabcb IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00009311
0xca4c64717ab108da57c408ede9b4299e711453f812333a9871e791df26928f2dRemove Liquidity...587362622023-02-07 8:26:0822 hrs 5 mins ago0x2f1f95edd2b207e8dc04148f0b827f33c69aabcb IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00010727
0x285a082564ecf156be1eaef631f6546b136734b62788ced9eb7ff45af9b465efAdd Liquidity ET...587356312023-02-07 8:23:2122 hrs 8 mins ago0x2f1f95edd2b207e8dc04148f0b827f33c69aabcb IN  0x8420672ee90f43c46a13715f714c919d04296f070.001416345785009 ETH0.00008054
0x6bc0ae567af8d7c4b5dc4fa1a50090eb14b5aba9ae95578b99b54ba43174e406Swap ETH For Exa...587347302023-02-07 8:19:3022 hrs 12 mins ago0x2f1f95edd2b207e8dc04148f0b827f33c69aabcb IN  0x8420672ee90f43c46a13715f714c919d04296f070.000026602116211 ETH0.00008522
0xa0d6c565e86ca193d2968b925319428dcd9d180b795ea18c990734039a46c4faSwap ETH For Exa...587344112023-02-07 8:18:0222 hrs 13 mins ago0x2f1f95edd2b207e8dc04148f0b827f33c69aabcb IN  0x8420672ee90f43c46a13715f714c919d04296f070.000022683423583 ETH0.00008522
0xa87531845b5e7619090700daf4c5010a449bacca8be2777c0922712a1c71107dSwap Exact ETH F...587340682023-02-07 8:16:3522 hrs 15 mins ago0x2f1f95edd2b207e8dc04148f0b827f33c69aabcb IN  0x8420672ee90f43c46a13715f714c919d04296f070.000009 ETH0.0001254
0x36f5b42ec1c9dc25742df4ed3985fe98e61d5c7736504b2c1ae7e7db31a7da36Swap Exact ETH F...587339272023-02-07 8:15:5722 hrs 15 mins ago0x2f1f95edd2b207e8dc04148f0b827f33c69aabcb IN  0x8420672ee90f43c46a13715f714c919d04296f070.000005 ETH0.0001254
0x54c9e1bfd189e589cee9594d336b9ae6bf0f57f3985c898bd9ada4ba008498ceSwap Exact ETH F...587337622023-02-07 8:15:1022 hrs 16 mins ago0x2f1f95edd2b207e8dc04148f0b827f33c69aabcb IN  0x8420672ee90f43c46a13715f714c919d04296f070.000005 ETH0.00010499
0xa83a79ff59b2c961b7bb14167e97a0b77fc9bec2011c9a113d9fa168d2e5aa36Swap Exact ETH F...587329232023-02-07 8:11:2122 hrs 20 mins ago0x2f1f95edd2b207e8dc04148f0b827f33c69aabcb IN  0x8420672ee90f43c46a13715f714c919d04296f070.000005 ETH0.00010664
0x9e29f3dcc80aeca2b3acf51503dd7f4c25136bd20fedd4b36d37787c66618b86Swap Exact Token...586702552023-02-07 2:53:331 day 3 hrs ago0x4db24e856f34485bd5ae33e3885cd2e78f6ad252 IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00008962
0x9fc3d3157ef52629d6e17032de5f059415d505efed88e67e429f00b1549e58e4Swap Exact Token...586023722023-02-06 20:17:391 day 10 hrs ago0xd46c7f59346ad920944bfe2490a6c820959bb43d IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.000158
0x18d60b8296f2cb2d4760d85ed79bf4fc0dbb6c3a4430613e0f2b62dc208cebdaSwap Exact Token...585581322023-02-06 16:37:131 day 13 hrs ago0x251b81d1fbea289e694029699c2ab6063d2b137e IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00015371
0x0aa954f2d90baf1c1deb7a32d5fe6ba2df1f41a09a4959f31e9e7244e760e55fSwap Exact Token...585580262023-02-06 16:36:431 day 13 hrs ago0xc08538f6e91985b20d35acb4458d03af690bf5f4 IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00015238
0x6280439672c99cea737bb9b400b93541ccd4bdb823911ca858a929e06ef82d34Swap Exact Token...584960612023-02-06 12:02:041 day 18 hrs ago0xfa1f780a446e9cdb4c51b031686bcf8b02f8ed7c IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00007284
0xa7b9f0da453e7c79291ca564c988b580e4a1bd0045aadee6aa740eaa60ba31c8Swap Exact Token...584629122023-02-06 9:25:451 day 21 hrs ago0x4b75beb23ffe0b8414b70c8b64c8f6cda569b3bf IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00006382
0x59c97fb9b7247ddcd1f3b6b3538418057bc5ef65261e578472e9eecdc4ac381fSwap Exact Token...584511822023-02-06 8:35:051 day 21 hrs ago0x58b80ff10946cfda425c81f8619c6c1615a517b5 IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00006043
0x19f66342b827005cf8e48c63bcb925d70b3a6e807e55dae0948c35999cb88018Swap Exact Token...584147982023-02-06 5:38:582 days 52 mins ago0xf572d207af78a35b0c773684c9c98e5c9b9b0ca9 IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00005887
0x8eaa50be9e2225bb9c9c4da666999622bfd3756d5b28efa5b72dfff64c592d30Remove Liquidity...584147092023-02-06 5:38:332 days 53 mins ago0xf572d207af78a35b0c773684c9c98e5c9b9b0ca9 IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00007651
0x882c83491b7d96373384903409844e51de5e2d238e6134f2c7d752b785aab8eaSwap Exact Token...584145022023-02-06 5:37:342 days 54 mins ago0xf572d207af78a35b0c773684c9c98e5c9b9b0ca9 IN  0x8420672ee90f43c46a13715f714c919d04296f070 ETH0.00006066
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f070x2d7655ee943e48c2237e835d2ba638ccd3d56f4b0 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f07 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f07 Tether: USDT Token0 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f070x2d7655ee943e48c2237e835d2ba638ccd3d56f4b0 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f07 0x63fd0a6acbffb128e7bc7753bfa3b8639a233d500 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x95a334e00987e595676ee144b5e4b328cde2ead5 0x8420672ee90f43c46a13715f714c919d04296f070 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f07 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f070x7251d49528c37622d5574ea6c2738072b8b867ce0 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f07 0x4e6482b05d13085f1c4a7e2ef612ba43104f71b90 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f070x7251d49528c37622d5574ea6c2738072b8b867ce0 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f07 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f07 0x4e6482b05d13085f1c4a7e2ef612ba43104f71b90 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x95a334e00987e595676ee144b5e4b328cde2ead5 0x8420672ee90f43c46a13715f714c919d04296f070 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f07 Tether: USDT Token0 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f070x2d7655ee943e48c2237e835d2ba638ccd3d56f4b0 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f07 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f070x2d7655ee943e48c2237e835d2ba638ccd3d56f4b0 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f070x7251d49528c37622d5574ea6c2738072b8b867ce0 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f07 0x4e6482b05d13085f1c4a7e2ef612ba43104f71b90 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f070x7251d49528c37622d5574ea6c2738072b8b867ce0 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f07 Tether: USDT Token0 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f07 0x4e6482b05d13085f1c4a7e2ef612ba43104f71b90 ETH
0xdc598a7c12ae35290a87cde1c5867682f489dfe06c27a276d7d5d3945278e3cf589680702023-02-08 2:31:114 hrs ago 0x95a334e00987e595676ee144b5e4b328cde2ead5 0x8420672ee90f43c46a13715f714c919d04296f070 ETH
0x58de22ac2b61bdfee098d1d4b562336b6f7797efd8bbd35512968446a0461936589679812023-02-08 2:30:504 hrs ago 0x8420672ee90f43c46a13715f714c919d04296f070x5afdd71ec312eda36663f72032f269bd9c950cb40.001575121724314648 ETH
0x58de22ac2b61bdfee098d1d4b562336b6f7797efd8bbd35512968446a0461936589679812023-02-08 2:30:504 hrs ago 0x82af49447d8a07e3bd95bd0d56f35241523fbab1 0x8420672ee90f43c46a13715f714c919d04296f070.001575121724314648 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WaterfallRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2023-01-05
*/

pragma solidity =0.6.6;


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

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

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

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

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

// 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');
    }
}

interface IWaterfallRouter01 {
    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 pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IWaterfallRouter02 is IWaterfallRouter01 {
    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;
}

interface IWaterfallPair {
    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;
}

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
    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');
    }
}

library WaterfallLibrary {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'WaterfallLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'WaterfallLibrary: 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'4b126df5a91fc8cfb7660552eda35d39699c3986df7ad19a5e628d0be89035f1' // 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);
        pairFor(factory, tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IWaterfallPair(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, 'WaterfallLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'WaterfallLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

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

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

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

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'WaterfallLibrary: 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);
        }
    }
}

interface IERC20 {
    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);
}

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

contract WaterfallRouter is IWaterfallRouter02 {
    using SafeMath for uint;

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

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'WaterfallRouter: 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 (IWaterfallFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IWaterfallFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = WaterfallLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = WaterfallLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'WaterfallRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = WaterfallLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'WaterfallRouter: 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 = WaterfallLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IWaterfallPair(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 = WaterfallLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IWaterfallPair(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 = WaterfallLibrary.pairFor(factory, tokenA, tokenB);
        IWaterfallPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IWaterfallPair(pair).burn(to);
        (address token0,) = WaterfallLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'WaterfallRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'WaterfallRouter: 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 = WaterfallLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IWaterfallPair(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 = WaterfallLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IWaterfallPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = WaterfallLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IWaterfallPair(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,) = WaterfallLibrary.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 ? WaterfallLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IWaterfallPair(WaterfallLibrary.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 = WaterfallLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'WaterfallRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, WaterfallLibrary.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 = WaterfallLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'WaterfallRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, WaterfallLibrary.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, 'WaterfallRouter: INVALID_PATH');
        amounts = WaterfallLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'WaterfallRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(WaterfallLibrary.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, 'WaterfallRouter: INVALID_PATH');
        amounts = WaterfallLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'WaterfallRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, WaterfallLibrary.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, 'WaterfallRouter: INVALID_PATH');
        amounts = WaterfallLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'WaterfallRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, WaterfallLibrary.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, 'WaterfallRouter: INVALID_PATH');
        amounts = WaterfallLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'WaterfallRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(WaterfallLibrary.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,) = WaterfallLibrary.sortTokens(input, output);
            IWaterfallPair pair = IWaterfallPair(WaterfallLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = WaterfallLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? WaterfallLibrary.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, WaterfallLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'WaterfallRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'WaterfallRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(WaterfallLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'WaterfallRouter: 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, 'WaterfallRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, WaterfallLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'WaterfallRouter: 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 WaterfallLibrary.quote(amountA, reserveA, reserveB);
    }

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

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

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

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

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":"pure","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":"pure","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"}]

60c060405234801561001057600080fd5b5060405162004774380380620047748339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6145ef620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118eb52806119e55280611a9b5280611b695280611caf5280611d375280611f7c5280611ff752806120a652806121725280612207528061227b528061277952806129ec5280612a425280612a765280612aea5280612c8a5280612dcd5280612e55525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611bfc5280611d695280611ecc52806122ad528061250652806126fe5280612727528061275752806128c45280612a205280612d1d5280612e87528061372e52806137715280613a545280613bd3528061400352806140b1528061413152506145ef6000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b03813516906020013561189d565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b21565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e74565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e81565b34801561088157600080fd5b5061088a611f7a565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f9e565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611fab565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b03813516906020013561212c565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356124b8565b348015610a1c57600080fd5b5061088a6126fc565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612720945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561274d565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612861565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561299d565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612c42565b6000808242811015610cde576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6124b8565b9093509150610d1d898685612fc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da5858361312e565b50965096945050505050565b6000610dbe848484613226565b949350505050565b60608142811015610e0c576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601d6024820152600080516020614443833981519152604482015290519081900360640190fd5b610efd7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061331692505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b815260040180806020018281038252602b815260200180614418602b913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b0316613462565b85600081518110610fe657fe5b6020026020010151613522565b6110328287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061367f915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b602002602001015161312e565b509695505050505050565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846138c5565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f613462565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f6124b8565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b6112c77f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061331692505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b815260040180806020018281038252602b815260200180614418602b913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e88287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061367f915050565b606081428110156113b4576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b815260206004820152601d6024820152600080516020614443833981519152604482015290519081900360640190fd5b6114a57f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138c592505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b81526004018080602001828103825260278152602001806144636027913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613462565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611fab565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a613522565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561173857600080fd5b505afa15801561174c573d6000803e3d6000fd5b505050506040513d602081101561176257600080fd5b505160408051602088810282810182019093528882529293506117a49290918991899182918501908490808284376000920191909152508892506139fd915050565b8661185682888860001981018181106117b957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b505afa158015611832573d6000803e3d6000fd5b505050506040513d602081101561184857600080fd5b50519063ffffffff613d0816565b10156118935760405162461bcd60e51b815260040180806020018281038252602b815260200180614418602b913960400191505060405180910390fd5b5050505050505050565b80428110156118e1576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061191b57fe5b905060200201356001600160a01b03166001600160a01b031614611974576040805162461bcd60e51b815260206004820152601d6024820152600080516020614443833981519152604482015290519081900360640190fd5b6119848585600081811061165c57fe5b6119c28585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506139fd915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611a2c57600080fd5b505afa158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b5051905086811015611a995760405162461bcd60e51b815260040180806020018281038252602b815260200180614418602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aff57600080fd5b505af1158015611b13573d6000803e3d6000fd5b50505050611893848261312e565b60608142811015611b67576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b9e57fe5b905060200201356001600160a01b03166001600160a01b031614611bf7576040805162461bcd60e51b815260206004820152601d6024820152600080516020614443833981519152604482015290519081900360640190fd5b611c557f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061331692505050565b91508682600184510381518110611c6857fe5b60200260200101511015611cad5760405162461bcd60e51b815260040180806020018281038252602b815260200180614418602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611ce957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d1c57600080fd5b505af1158015611d30573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d957f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611da257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b505050506040513d6020811015611e2357600080fd5b5051611e2b57fe5b611e6a8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061367f915050565b5095945050505050565b6000610dbe848484613d58565b60608142811015611ec7576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b611f257f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138c592505050565b91508682600081518110611f3557fe5b6020026020010151111561131f5760405162461bcd60e51b81526004018080602001828103825260278152602001806144636027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613e48565b60008142811015611ff1576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b612020887f000000000000000000000000000000000000000000000000000000000000000089898930896124b8565b604080516370a0823160e01b815230600482015290519194506120a492508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561207357600080fd5b505afa158015612087573d6000803e3d6000fd5b505050506040513d602081101561209d57600080fd5b5051612fc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561210a57600080fd5b505af115801561211e573d6000803e3d6000fd5b505050506110e8848361312e565b8042811015612170576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106121a757fe5b905060200201356001600160a01b03166001600160a01b031614612200576040805162461bcd60e51b815260206004820152601d6024820152600080516020614443833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561226057600080fd5b505af1158015612274573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122d97f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561232957600080fd5b505af115801561233d573d6000803e3d6000fd5b505050506040513d602081101561235357600080fd5b505161235b57fe5b60008686600019810181811061236d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156123d257600080fd5b505afa1580156123e6573d6000803e3d6000fd5b505050506040513d60208110156123fc57600080fd5b5051604080516020898102828101820190935289825292935061243e9290918a918a9182918501908490808284376000920191909152508992506139fd915050565b87611856828989600019810181811061245357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b60008082428110156124ff576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b600061252c7f00000000000000000000000000000000000000000000000000000000000000008c8c613462565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561258757600080fd5b505af115801561259b573d6000803e3d6000fd5b505050506040513d60208110156125b157600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125fe57600080fd5b505af1158015612612573d6000803e3d6000fd5b505050506040513d604081101561262857600080fd5b508051602090910151909250905060006126428e8e613ef4565b509050806001600160a01b03168e6001600160a01b031614612665578183612668565b82825b90975095508a8710156126ac5760405162461bcd60e51b81526004018080602001828103825260268152602001806143f26026913960400191505060405180910390fd5b898610156126eb5760405162461bcd60e51b81526004018080602001828103825260268152602001806143cc6026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f00000000000000000000000000000000000000000000000000000000000000008484613316565b600080600061279d7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613462565b90506000876127ac578c6127b0565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561282657600080fd5b505af115801561283a573d6000803e3d6000fd5b5050505061284c8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b600080600083428110156128aa576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b6128b88c8c8c8c8c8c613fd2565b909450925060006128ea7f00000000000000000000000000000000000000000000000000000000000000008e8e613462565b90506128f88d338388613522565b6129048c338387613522565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561295c57600080fd5b505af1158015612970573d6000803e3d6000fd5b505050506040513d602081101561298657600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129e6576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b612a148a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613fd2565b90945092506000612a667f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613462565b9050612a748b338388613522565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612acf57600080fd5b505af1158015612ae3573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b6857600080fd5b505af1158015612b7c573d6000803e3d6000fd5b505050506040513d6020811015612b9257600080fd5b5051612b9a57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612bf257600080fd5b505af1158015612c06573d6000803e3d6000fd5b505050506040513d6020811015612c1c57600080fd5b5051925034841015612c3457612c343385340361312e565b505096509650969350505050565b60608142811015612c88576040805162461bcd60e51b81526020600482015260186024820152600080516020614553833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612cbf57fe5b905060200201356001600160a01b03166001600160a01b031614612d18576040805162461bcd60e51b815260206004820152601d6024820152600080516020614443833981519152604482015290519081900360640190fd5b612d767f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138c592505050565b91503482600081518110612d8657fe5b60200260200101511115612dcb5760405162461bcd60e51b81526004018080602001828103825260278152602001806144636027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e0757fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e3a57600080fd5b505af1158015612e4e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612eb37f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612ec057fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f1757600080fd5b505af1158015612f2b573d6000803e3d6000fd5b505050506040513d6020811015612f4157600080fd5b5051612f4957fe5b612f888287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061367f915050565b81600081518110612f9557fe5b6020026020010151341115611e6a57611e6a3383600081518110612fb557fe5b6020026020010151340361312e565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130415780518252601f199092019160209182019101613022565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146130a3576040519150601f19603f3d011682016040523d82523d6000602084013e6130a8565b606091505b50915091508180156130d65750805115806130d657508080602001905160208110156130d357600080fd5b50515b613127576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061317a5780518252601f19909201916020918201910161315b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131dc576040519150601f19603f3d011682016040523d82523d6000602084013e6131e1565b606091505b50509050806132215760405162461bcd60e51b81526004018080602001828103825260238152602001806145736023913960400191505060405180910390fd5b505050565b60008084116132665760405162461bcd60e51b815260040180806020018281038252602b8152602001806144b6602b913960400191505060405180910390fd5b6000831180156132765750600082115b6132b15760405162461bcd60e51b815260040180806020018281038252602881526020018061452b6028913960400191505060405180910390fd5b60006132c5856103e363ffffffff61424616565b905060006132d9828563ffffffff61424616565b905060006132ff836132f3886103e863ffffffff61424616565b9063ffffffff6142a916565b905080828161330a57fe5b04979650505050505050565b606060028251101561336f576040805162461bcd60e51b815260206004820152601e60248201527f576174657266616c6c4c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561338757600080fd5b506040519080825280602002602001820160405280156133b1578160200160208202803683370190505b50905082816000815181106133c257fe5b60200260200101818152505060005b600183510381101561345a57600080613414878685815181106133f057fe5b602002602001015187866001018151811061340757fe5b60200260200101516142f8565b9150915061343684848151811061342757fe5b60200260200101518383613226565b84846001018151811061344557fe5b602090810291909101015250506001016133d1565b509392505050565b60008060006134718585613ef4565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f4b126df5a91fc8cfb7660552eda35d39699c3986df7ad19a5e628d0be89035f1609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135a75780518252601f199092019160209182019101613588565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613609576040519150601f19603f3d011682016040523d82523d6000602084013e61360e565b606091505b509150915081801561363c57508051158061363c575080806020019051602081101561363957600080fd5b50515b6136775760405162461bcd60e51b81526004018080602001828103825260248152602001806145966024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138bf5760008084838151811061369d57fe5b60200260200101518584600101815181106136b457fe5b60200260200101519150915060006136cc8383613ef4565b50905060008785600101815181106136e057fe5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461370e57826000613712565b6000835b91509150600060028a51038810613729578861376a565b61376a7f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061375d57fe5b6020026020010151613462565b90506137977f00000000000000000000000000000000000000000000000000000000000000008888613462565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156137d4576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561384557818101518382015260200161382d565b50505050905090810190601f1680156138725780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561389457600080fd5b505af11580156138a8573d6000803e3d6000fd5b505060019099019850613682975050505050505050565b50505050565b606060028251101561391e576040805162461bcd60e51b815260206004820152601e60248201527f576174657266616c6c4c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561393657600080fd5b50604051908082528060200260200182016040528015613960578160200160208202803683370190505b509050828160018351038151811061397457fe5b60209081029190910101528151600019015b801561345a576000806139b6878660018603815181106139a257fe5b602002602001015187868151811061340757fe5b915091506139d88484815181106139c957fe5b60200260200101518383613d58565b8460018503815181106139e757fe5b6020908102919091010152505060001901613986565b60005b600183510381101561322157600080848381518110613a1b57fe5b6020026020010151858460010181518110613a3257fe5b6020026020010151915091506000613a4a8383613ef4565b5090506000613a7a7f00000000000000000000000000000000000000000000000000000000000000008585613462565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613abb57600080fd5b505afa158015613acf573d6000803e3d6000fd5b505050506040513d6060811015613ae557600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613b1b578284613b1e565b83835b91509150613b7c828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b9550613b89868383613226565b945050505050600080856001600160a01b0316886001600160a01b031614613bb357826000613bb7565b6000835b91509150600060028c51038a10613bce578a613c02565b613c027f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061375d57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c8c578181015183820152602001613c74565b50505050905090810190601f168015613cb95780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613cdb57600080fd5b505af1158015613cef573d6000803e3d6000fd5b50506001909b019a50613a009950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613d985760405162461bcd60e51b815260040180806020018281038252602c81526020018061448a602c913960400191505060405180910390fd5b600083118015613da85750600082115b613de35760405162461bcd60e51b815260040180806020018281038252602881526020018061452b6028913960400191505060405180910390fd5b6000613e076103e8613dfb868863ffffffff61424616565b9063ffffffff61424616565b90506000613e216103e3613dfb868963ffffffff613d0816565b9050613e3e6001828481613e3157fe5b049063ffffffff6142a916565b9695505050505050565b6000808411613e885760405162461bcd60e51b81526004018080602001828103825260258152602001806145066025913960400191505060405180910390fd5b600083118015613e985750600082115b613ed35760405162461bcd60e51b815260040180806020018281038252602881526020018061452b6028913960400191505060405180910390fd5b82613ee4858463ffffffff61424616565b81613eeb57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613f485760405162461bcd60e51b81526004018080602001828103825260258152602001806144e16025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613f68578284613f6b565b83835b90925090506001600160a01b038216613fcb576040805162461bcd60e51b815260206004820152601e60248201527f576174657266616c6c4c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561404c57600080fd5b505afa158015614060573d6000803e3d6000fd5b505050506040513d602081101561407657600080fd5b50516001600160a01b0316141561412957604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b1580156140fc57600080fd5b505af1158015614110573d6000803e3d6000fd5b505050506040513d602081101561412657600080fd5b50505b6000806141577f00000000000000000000000000000000000000000000000000000000000000008b8b6142f8565b91509150816000148015614169575080155b1561417957879350869250614239565b6000614186898484613e48565b90508781116141d957858110156141ce5760405162461bcd60e51b81526004018080602001828103825260268152602001806143cc6026913960400191505060405180910390fd5b889450925082614237565b60006141e6898486613e48565b9050898111156141f257fe5b878110156142315760405162461bcd60e51b81526004018080602001828103825260268152602001806143f26026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806142615750508082028282828161425e57fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006143078585613ef4565b509050614315868686613462565b50600080614324888888613462565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561435c57600080fd5b505afa158015614370573d6000803e3d6000fd5b505050506040513d606081101561438657600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146143b95780826143bc565b81815b9099909850965050505050505056fe576174657266616c6c526f757465723a20494e53554646494349454e545f425f414d4f554e54576174657266616c6c526f757465723a20494e53554646494349454e545f415f414d4f554e54576174657266616c6c526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54576174657266616c6c526f757465723a20494e56414c49445f50415448000000576174657266616c6c526f757465723a204558434553534956455f494e5055545f414d4f554e54576174657266616c6c4c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54576174657266616c6c4c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54576174657266616c6c4c6962726172793a204944454e544943414c5f414444524553534553576174657266616c6c4c6962726172793a20494e53554646494349454e545f414d4f554e54576174657266616c6c4c6962726172793a20494e53554646494349454e545f4c4951554944495459576174657266616c6c526f757465723a204558504952454400000000000000005472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a26469706673582212204300e9795b0e6562f608a07dd7fe742924f97608fb91c6627a777998ef71891b64736f6c6343000606003300000000000000000000000063fd0a6acbffb128e7bc7753bfa3b8639a233d5000000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

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

00000000000000000000000063fd0a6acbffb128e7bc7753bfa3b8639a233d5000000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

-----Decoded View---------------
Arg [0] : _factory (address): 0x63fd0a6acbffb128e7bc7753bfa3b8639a233d50
Arg [1] : _WETH (address): 0x82af49447d8a07e3bd95bd0d56f35241523fbab1

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000063fd0a6acbffb128e7bc7753bfa3b8639a233d50
Arg [1] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1


Deployed ByteCode Sourcemap

15479:18547:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15959:10;-1:-1:-1;;;;;15973:4:0;15959:18;;15952:26;;;;15479:18547;;12:1:-1;9;2:12;20109:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20109:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20109:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32970:262;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32970:262:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32970:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27278:850;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27278:850:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27278:850:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;27278:850:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27278:850:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27278:850:0;;-1:-1:-1;27278:850:0;-1:-1:-1;;;;;;27278:850:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27278:850:0;;;;;;;;;;;;;;;;;33770:253;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33770:253:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;33770:253:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33770:253:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33770:253:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33770:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33770:253:0;;-1:-1:-1;33770:253:0;;-1:-1:-1;;;;;33770:253:0:i;20788:677::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20788:677:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20788:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24495:628::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24495:628:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;24495:628:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;24495:628:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;24495:628:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;24495:628:0;;-1:-1:-1;24495:628:0;-1:-1:-1;;;;;;24495:628:0;;;;;;;;:::i;26444:828::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26444:828:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26444:828:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;26444:828:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26444:828:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26444:828:0;;-1:-1:-1;26444:828:0;-1:-1:-1;;;;;;26444:828:0;;;;;;;;:::i;22925:718::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22925:718:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22925:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30311:714::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30311:714:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30311:714:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;30311:714:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30311:714:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30311:714:0;;-1:-1:-1;30311:714:0;-1:-1:-1;;;;;;30311:714:0;;;;;;;;:::i;31887:843::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31887:843:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31887:843:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;31887:843:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31887:843:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31887:843:0;;-1:-1:-1;31887:843:0;-1:-1:-1;;;;;;31887:843:0;;;;;;;;:::i;25741:697::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25741:697:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;25741:697:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25741:697:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25741:697:0;;-1:-1:-1;25741:697:0;-1:-1:-1;;;;;;25741:697:0;;;;;;;;:::i;33240:261::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33240:261:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33240:261:0;;;;;;;;;;;;:::i;25129:606::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25129:606:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25129:606:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;25129:606:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25129:606:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25129:606:0;;-1:-1:-1;25129:606:0;-1:-1:-1;;;;;;25129:606:0;;;;;;;;:::i;15613:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15613:38:0;;;:::i;:::-;;;;-1:-1:-1;;;;;15613:38:0;;;;;;;;;;;;;;32774:188;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32774:188:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32774:188:0;;;;;;;;;;;;:::i;22219:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22219:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22219:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31031:850::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31031:850:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;31031:850:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31031:850:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31031:850:0;;-1:-1:-1;31031:850:0;-1:-1:-1;;;;;;31031:850:0;;;;;;;;:::i;19238:865::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19238:865:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;19238:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15565:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15565:41:0;;;:::i;33509:253::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33509:253:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;33509:253:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33509:253:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33509:253:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33509:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33509:253:0;;-1:-1:-1;33509:253:0;;-1:-1:-1;;;;;33509:253:0:i;21471:669::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21471:669:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21471:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17477:738::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17477:738:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;17477:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;18221:974;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;18221:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28134:810::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28134:810:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;28134:810:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28134:810:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28134:810:0;;-1:-1:-1;28134:810:0;-1:-1:-1;;;;;;28134:810:0;;;;;;;;:::i;20109:673::-;20346:16;20364:14;20327:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;20418:196:::1;20448:5;20468:4;20487:9;20511:14;20540:12;20575:4;20595:8;20418:15;:196::i;:::-;20391:223:::0;;-1:-1:-1;20391:223:0;-1:-1:-1;20625:51:0::1;20653:5:::0;20660:2;20391:223;20625:27:::1;:51::i;:::-;20693:4;-1:-1:-1::0;;;;;20687:20:0::1;;20708:9;20687:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;20687:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20687:31:0;;;;20729:45;20760:2;20764:9;20729:30;:45::i;:::-;20109:673:::0;;;;;;;;;;:::o;32970:262::-;33123:14;33162:62;33192:8;33202:9;33213:10;33162:29;:62::i;:::-;33155:69;32970:262;-1:-1:-1;;;;32970:262:0:o;27278:850::-;27492:21;27464:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27564:4:0::1;27539:29;:4:::0;;-1:-1:-1;;27544:15:0;;27539:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27539:21:0::1;-1:-1:-1::0;;;;;27539:29:0::1;;27531:71;;;::::0;;-1:-1:-1;;;27531:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27531:71:0;;;;;;;;;;;;;::::1;;27623:55;27654:7;27663:8;27673:4;;27623:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27623:30:0::1;::::0;-1:-1:-1;;;27623:55:0:i:1;:::-;27613:65;;27728:12;27697:7;27722:1;27705:7;:14;:18;27697:27;;;;;;;;;;;;;;:43;;27689:99;;;;-1:-1:-1::0;;;27689:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27799:141;27845:4;;27850:1;27845:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27845:7:0::1;27854:10;27866:51;27891:7;27900:4;;27905:1;27900:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27900:7:0::1;27909:4;;27914:1;27909:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27909:7:0::1;27866:24;:51::i;:::-;27919:7;27927:1;27919:10;;;;;;;;;;;;;;27799:31;:141::i;:::-;27951:35;27957:7;27966:4;;27951:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27980:4:0::1;::::0;-1:-1:-1;27951:5:0::1;::::0;-1:-1:-1;;27951:35:0:i:1;:::-;28003:4;-1:-1:-1::0;;;;;27997:20:0::1;;28018:7;28043:1;28026:7;:14;:18;28018:27;;;;;;;;;;;;;;27997:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27997:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27997:49:0;;;;28057:63;28088:2;28092:7;28117:1;28100:7;:14;:18;28092:27;;;;;;;;;;;;;;28057:30;:63::i;:::-;27278:850:::0;;;;;;;;;:::o;33770:253::-;33914:21;33960:55;33990:7;33999:9;34010:4;33960:29;:55::i;:::-;33953:62;;33770:253;;;;;:::o;20788:677::-;21094:12;21108;21133;21148:49;21173:7;21182:6;21190;21148:24;:49::i;:::-;21133:64;;21208:10;21221;:33;;21245:9;21221:33;;;-1:-1:-1;;21221:33:0;21265:80;;;-1:-1:-1;;;21265:80:0;;21293:10;21265:80;;;;21313:4;21265:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21208:46;;-1:-1:-1;;;;;;21265:27:0;;;;;:80;;;;;-1:-1:-1;;21265:80:0;;;;;;;;-1:-1:-1;21265:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;21265:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21265:80:0;;;;21377;21393:6;21401;21409:9;21420:10;21432;21444:2;21448:8;21377:15;:80::i;:::-;21356:101;;;;;;;;20788:677;;;;;;;;;;;;;;;;:::o;24495:628::-;24719:21;24700:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;24763:55:::1;24794:7;24803:8;24813:4;;24763:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;24763:30:0::1;::::0;-1:-1:-1;;;24763:55:0:i:1;:::-;24753:65;;24868:12;24837:7;24862:1;24845:7;:14;:18;24837:27;;;;;;;;;;;;;;:43;;24829:99;;;;-1:-1:-1::0;;;24829:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24939:141;24985:4;;24990:1;24985:7;;;;;;24939:141;25091:24;25097:7;25106:4;;25091:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25112:2:0;;-1:-1:-1;25091:5:0::1;::::0;-1:-1:-1;;25091:24:0:i:1;26444:828::-:0;26658:21;26630:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26730:4:0::1;26705:29;:4:::0;;-1:-1:-1;;26710:15:0;;26705:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;26705:21:0::1;-1:-1:-1::0;;;;;26705:29:0::1;;26697:71;;;::::0;;-1:-1:-1;;;26697:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;26697:71:0;;;;;;;;;;;;;::::1;;26789:55;26819:7;26828:9;26839:4;;26789:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26789:29:0::1;::::0;-1:-1:-1;;;26789:55:0:i:1;:::-;26779:65;;26877:11;26863:7;26871:1;26863:10;;;;;;;;;;;;;;:25;;26855:77;;;;-1:-1:-1::0;;;26855:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22925:718:::0;23243:14;23270:12;23285:46;23310:7;23319:5;23326:4;23285:24;:46::i;:::-;23270:61;;23342:10;23355;:33;;23379:9;23355:33;;;-1:-1:-1;;23355:33:0;23399:80;;;-1:-1:-1;;;23399:80:0;;23427:10;23399:80;;;;23447:4;23399:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23342:46;;-1:-1:-1;;;;;;23399:27:0;;;;;:80;;;;;-1:-1:-1;;23399:80:0;;;;;;;;-1:-1:-1;23399:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;23399:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23399:80:0;;;;23502:133;23564:5;23571:9;23582:14;23598:12;23612:2;23616:8;23502:47;:133::i;:::-;23490:145;22925:718;-1:-1:-1;;;;;;;;;;;;;22925:718:0:o;30311:714::-;30545:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;30566:139:::1;30612:4;;30617:1;30612:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30612:7:0::1;30621:10;30633:51;30658:7;30667:4;;30672:1;30667:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30667:7:0::1;30676:4;;30681:1;30676:7;;;;;;30633:51;30686:8;30566:31;:139::i;:::-;30716:18;30744:4:::0;;-1:-1:-1;;30749:15:0;;30744:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30744:21:0::1;-1:-1:-1::0;;;;;30737:39:0::1;;30777:2;30737:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;30737:43:0::1;-1:-1:-1::0;;;;;30737:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30737:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30737:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;30737:43:0;30791:44:::1;::::0;;30737:43:::1;30791:44:::0;;::::1;::::0;;;;;;;;;;;30737:43;;-1:-1:-1;30791:44:0::1;::::0;;;30826:4;;;;;;30791:44;::::1;::::0;30826:4;;30791:44;30826:4;30791:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30832:2:0;;-1:-1:-1;30791:34:0::1;::::0;-1:-1:-1;;30791:44:0:i:1;:::-;30934:12:::0;30868:62:::1;30916:13:::0;30875:4;;-1:-1:-1;;30880:15:0;;30875:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30875:21:0::1;-1:-1:-1::0;;;;;30868:39:0::1;;30908:2;30868:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;30868:43:0::1;-1:-1:-1::0;;;;;30868:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30868:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30868:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;30868:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;30846:171;;;;-1:-1:-1::0;;;30846:171:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15777:1;30311:714:::0;;;;;;;:::o;31887:843::-;32154:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32213:4:0::1;32188:29;:4:::0;;-1:-1:-1;;32193:15:0;;32188:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32188:21:0::1;-1:-1:-1::0;;;;;32188:29:0::1;;32180:71;;;::::0;;-1:-1:-1;;;32180:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32180:71:0;;;;;;;;;;;;;::::1;;32262:139;32308:4;;32313:1;32308:7;;;;;;32262:139;32412:55;32447:4;;32412:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32461:4:0::1;::::0;-1:-1:-1;32412:34:0::1;::::0;-1:-1:-1;;32412:55:0:i:1;:::-;32495:37;::::0;;-1:-1:-1;;;32495:37:0;;32526:4:::1;32495:37;::::0;::::1;::::0;;;32478:14:::1;::::0;-1:-1:-1;;;;;32502:4:0::1;32495:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;32495:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32495:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32495:37:0;;-1:-1:-1;32551:25:0;;::::1;;32543:81;;;;-1:-1:-1::0;;;32543:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32641:4;-1:-1:-1::0;;;;;32635:20:0::1;;32656:9;32635:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32635:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32635:31:0;;;;32677:45;32708:2;32712:9;32677:30;:45::i;25741:697::-:0;25957:21;25929:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;26015:4:::1;-1:-1:-1::0;;;;;26004:15:0::1;:4;;26009:1;26004:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;26004:7:0::1;-1:-1:-1::0;;;;;26004:15:0::1;;25996:57;;;::::0;;-1:-1:-1;;;25996:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;25996:57:0;;;;;;;;;;;;;::::1;;26074:56;26105:7;26114:9;26125:4;;26074:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26074:30:0::1;::::0;-1:-1:-1;;;26074:56:0:i:1;:::-;26064:66;;26180:12;26149:7;26174:1;26157:7;:14;:18;26149:27;;;;;;;;;;;;;;:43;;26141:99;;;;-1:-1:-1::0;;;26141:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26257:4;-1:-1:-1::0;;;;;26251:19:0::1;;26278:7;26286:1;26278:10;;;;;;;;;;;;;;26251:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26251:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26251:40:0;;;;;26315:4;-1:-1:-1::0;;;;;26309:20:0::1;;26330:51;26355:7;26364:4;;26369:1;26364:7;;;;;;26330:51;26383:7;26391:1;26383:10;;;;;;;;;;;;;;26309:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;26309:85:0::1;-1:-1:-1::0;;;;;26309:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26309:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26309:85:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26309:85:0;26302:93:::1;;;;26406:24;26412:7;26421:4;;26406:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26427:2:0;;-1:-1:-1;26406:5:0::1;::::0;-1:-1:-1;;26406:24:0:i:1;:::-;25741:697:::0;;;;;;;;:::o;33240:261::-;33393:13;33431:62;33460:9;33471;33482:10;33431:28;:62::i;25129:606::-;25353:21;25334:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;25397:55:::1;25427:7;25436:9;25447:4;;25397:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25397:29:0::1;::::0;-1:-1:-1;;;25397:55:0:i:1;:::-;25387:65;;25485:11;25471:7;25479:1;25471:10;;;;;;;;;;;;;;:25;;25463:77;;;;-1:-1:-1::0;;;25463:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15613:38:::0;;;:::o;32774:188::-;32871:12;32903:51;32926:7;32935:8;32945;32903:22;:51::i;22219:700::-;22485:14;22466:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;22528:196:::1;22558:5;22578:4;22597:9;22621:14;22650:12;22685:4;22705:8;22528:15;:196::i;:::-;22774:38;::::0;;-1:-1:-1;;;22774:38:0;;22806:4:::1;22774:38;::::0;::::1;::::0;;;22512:212;;-1:-1:-1;22735:78:0::1;::::0;-1:-1:-1;22763:5:0;;22770:2;;-1:-1:-1;;;;;22774:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22774:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22774:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;22774:38:0;22735:27:::1;:78::i;:::-;22830:4;-1:-1:-1::0;;;;;22824:20:0::1;;22845:9;22824:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22824:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22824:31:0;;;;22866:45;22897:2;22901:9;22866:30;:45::i;31031:850::-:0;31291:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;31336:4:::1;-1:-1:-1::0;;;;;31325:15:0::1;:4;;31330:1;31325:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31325:7:0::1;-1:-1:-1::0;;;;;31325:15:0::1;;31317:57;;;::::0;;-1:-1:-1;;;31317:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;31317:57:0;;;;;;;;;;;;;::::1;;31385:13;31401:9;31385:25;;31427:4;-1:-1:-1::0;;;;;31421:19:0::1;;31448:8;31421:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31421:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31421:38:0;;;;;31483:4;-1:-1:-1::0;;;;;31477:20:0::1;;31498:51;31523:7;31532:4;;31537:1;31532:7;;;;;;31498:51;31551:8;31477:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;31477:83:0::1;-1:-1:-1::0;;;;;31477:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31477:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31477:83:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31477:83:0;31470:91:::1;;;;31572:18;31600:4:::0;;-1:-1:-1;;31605:15:0;;31600:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31600:21:0::1;-1:-1:-1::0;;;;;31593:39:0::1;;31633:2;31593:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31593:43:0::1;-1:-1:-1::0;;;;;31593:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31593:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31593:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31593:43:0;31647:44:::1;::::0;;31593:43:::1;31647:44:::0;;::::1;::::0;;;;;;;;;;;31593:43;;-1:-1:-1;31647:44:0::1;::::0;;;31682:4;;;;;;31647:44;::::1;::::0;31682:4;;31647:44;31682:4;31647:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31688:2:0;;-1:-1:-1;31647:34:0::1;::::0;-1:-1:-1;;31647:44:0:i:1;:::-;31790:12:::0;31724:62:::1;31772:13:::0;31731:4;;-1:-1:-1;;31736:15:0;;31731:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31731:21:0::1;-1:-1:-1::0;;;;;31724:39:0::1;;31764:2;31724:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31724:43:0::1;-1:-1:-1::0;;;;;31724:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;19238:865:0::0;19492:12;19506;19473:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;19531:12:::1;19546:49;19571:7;19580:6;19588;19546:24;:49::i;:::-;19606:62;::::0;;-1:-1:-1;;;19606:62:0;;19640:10:::1;19606:62;::::0;::::1;::::0;-1:-1:-1;;;;;19606:33:0;::::1;:62:::0;;;;;;;;;;;;;;19531:64;;-1:-1:-1;19606:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;19606:33:0;:62;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;19606:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19606:62:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;19736:29:0::1;::::0;;-1:-1:-1;;;19736:29:0;;-1:-1:-1;;;;;19736:29:0;;::::1;;::::0;::::1;::::0;;;19706:12:::1;::::0;;;19736:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;19706:12;19736:25;:29;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;19736:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19736:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19736:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;19736:29:0;-1:-1:-1;19777:14:0::1;19796:43;19824:6:::0;19832;19796:27:::1;:43::i;:::-;19776:63;;;19881:6;-1:-1:-1::0;;;;;19871:16:0::1;:6;-1:-1:-1::0;;;;;19871:16:0::1;;:58;;19912:7;19921;19871:58;;;19891:7;19900;19871:58;19850:79:::0;;-1:-1:-1;19850:79:0;-1:-1:-1;19948:21:0;;::::1;;19940:72;;;;-1:-1:-1::0;;;19940:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20042:10;20031:7;:21;;20023:72;;;;-1:-1:-1::0;;;20023:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15777:1;;;;19238:865:::0;;;;;;;;;;;:::o;15565:41::-;;;:::o;33509:253::-;33653:21;33699:55;33730:7;33739:8;33749:4;33699:30;:55::i;21471:669::-;21760:16;21778:14;21805:12;21820:46;21845:7;21854:5;21861:4;21820:24;:46::i;:::-;21805:61;;21877:10;21890;:33;;21914:9;21890:33;;;-1:-1:-1;;21890:33:0;21934:80;;;-1:-1:-1;;;21934:80:0;;21962:10;21934:80;;;;21982:4;21934:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21877:46;;-1:-1:-1;;;;;;21934:27:0;;;;;:80;;;;;-1:-1:-1;;21934:80:0;;;;;;;;-1:-1:-1;21934:27:0;:80;;;2:2:-1;;;;27:1;24;17:12;2:2;21934:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21934:80:0;;;;22052;22071:5;22078:9;22089:14;22105:12;22119:2;22123:8;22052:18;:80::i;:::-;22025:107;;;;-1:-1:-1;21471:669:0;-1:-1:-1;;;;;;;;;;;;;21471:669:0:o;17477:738::-;17765:12;17779;17793:14;17746:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;17841:85:::1;17855:6;17863;17871:14;17887;17903:10;17915;17841:13;:85::i;:::-;17820:106:::0;;-1:-1:-1;17820:106:0;-1:-1:-1;17937:12:0::1;17952:49;17977:7;17986:6:::0;17994;17952:24:::1;:49::i;:::-;17937:64;;18012:66;18044:6;18052:10;18064:4;18070:7;18012:31;:66::i;:::-;18089;18121:6;18129:10;18141:4;18147:7;18089:31;:66::i;:::-;18193:4;-1:-1:-1::0;;;;;18178:25:0::1;;18204:2;18178:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;18178:29:0::1;-1:-1:-1::0;;;;;18178:29:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18178:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18178:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;18178:29:0;17477:738;;;;-1:-1:-1;18178:29:0;;-1:-1:-1;17477:738:0;;-1:-1:-1;;;;;;;;;17477:738:0:o;18221:974::-;18474:16;18492:14;18508;18455:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;18562:176:::1;18590:5;18610:4;18629:18;18662:9;18686:14;18715:12;18562:13;:176::i;:::-;18535:203:::0;;-1:-1:-1;18535:203:0;-1:-1:-1;18749:12:0::1;18764:46;18789:7;18798:5:::0;18805:4:::1;18764:24;:46::i;:::-;18749:61;;18821:69;18853:5;18860:10;18872:4;18878:11;18821:31;:69::i;:::-;18907:4;-1:-1:-1::0;;;;;18901:19:0::1;;18928:9;18901:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18901:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18901:39:0;;;;;18964:4;-1:-1:-1::0;;;;;18958:20:0::1;;18979:4;18985:9;18958:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;18958:37:0::1;-1:-1:-1::0;;;;;18958:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18958:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18958:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;18958:37:0;18951:45:::1;;;;19034:4;-1:-1:-1::0;;;;;19019:25:0::1;;19045:2;19019:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;19019:29:0::1;-1:-1:-1::0;;;;;19019:29:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19019:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19019:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19019:29:0;;-1:-1:-1;19099:9:0::1;:21:::0;-1:-1:-1;19095:92:0::1;;;19122:65;19153:10;19177:9;19165;:21;19122:30;:65::i;:::-;15777:1;18221:974:::0;;;;;;;;;;;:::o;28134:810::-;28347:21;28319:8;15722:15;15710:8;:27;;15702:64;;;;;-1:-1:-1;;;15702:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15702:64:0;;;;;;;;;;;;;;;28405:4:::1;-1:-1:-1::0;;;;;28394:15:0::1;:4;;28399:1;28394:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28394:7:0::1;-1:-1:-1::0;;;;;28394:15:0::1;;28386:57;;;::::0;;-1:-1:-1;;;28386:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28386:57:0;;;;;;;;;;;;;::::1;;28464:55;28494:7;28503:9;28514:4;;28464:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28464:29:0::1;::::0;-1:-1:-1;;;28464:55:0:i:1;:::-;28454:65;;28552:9;28538:7;28546:1;28538:10;;;;;;;;;;;;;;:23;;28530:75;;;;-1:-1:-1::0;;;28530:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28622:4;-1:-1:-1::0;;;;;28616:19:0::1;;28643:7;28651:1;28643:10;;;;;;;;;;;;;;28616:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28616:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28616:40:0;;;;;28680:4;-1:-1:-1::0;;;;;28674:20:0::1;;28695:51;28720:7;28729:4;;28734:1;28729:7;;;;;;28695:51;28748:7;28756:1;28748:10;;;;;;;;;;;;;;28674:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;28674:85:0::1;-1:-1:-1::0;;;;;28674:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28674:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28674:85:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;28674:85:0;28667:93:::1;;;;28771:24;28777:7;28786:4;;28771:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28792:2:0;;-1:-1:-1;28771:5:0::1;::::0;-1:-1:-1;;28771:24:0:i:1;:::-;28858:7;28866:1;28858:10;;;;;;;;;;;;;;28846:9;:22;28842:94;;;28870:66;28901:10;28925:7;28933:1;28925:10;;;;;;;;;;;;;;28913:9;:22;28870:30;:66::i;1189:361::-:0;1384:45;;;-1:-1:-1;;;;;1384:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1384:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1373:57:0;;;;1338:12;;1352:17;;1373:10;;;;1384:45;1373:57;;;25:18:-1;1373:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1373:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1337:93:0;;;;1449:7;:57;;;;-1:-1:-1;1461:11:0;;:16;;:44;;;1492:4;1481:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1481:24:0;1461:44;1441:101;;;;;-1:-1:-1;;;1441:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1189:361;;;;;:::o;1968:195::-;2076:12;;;2038;2076;;;;;;;;;-1:-1:-1;;;;;2055:7:0;;;2069:5;;2055:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2055:34:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;2037:52:0;;;2108:7;2100:55;;;;-1:-1:-1;;;2100:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1968:195;;;:::o;12165:517::-;12258:14;12304:1;12293:8;:12;12285:68;;;;-1:-1:-1;;;12285:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12384:1;12372:9;:13;:31;;;;;12402:1;12389:10;:14;12372:31;12364:84;;;;-1:-1:-1;;;12364:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12459:20;12482:17;:8;12495:3;12482:17;:12;:17;:::i;:::-;12459:40;-1:-1:-1;12510:14:0;12527:31;12459:40;12547:10;12527:31;:19;:31;:::i;:::-;12510:48;-1:-1:-1;12569:16:0;12588:40;12612:15;12588:19;:9;12602:4;12588:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;12569:59;;12663:11;12651:9;:23;;;;;;;12165:517;-1:-1:-1;;;;;;;12165:517:0:o;13357:511::-;13458:21;13515:1;13500:4;:11;:16;;13492:59;;;;;-1:-1:-1;;;13492:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13583:4;:11;13572:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13572:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;13572:23:0;;13562:33;;13619:8;13606:7;13614:1;13606:10;;;;;;;;;;;;;:21;;;;;13643:6;13638:223;13669:1;13655:4;:11;:15;13651:1;:19;13638:223;;;13693:14;13709:15;13728:42;13740:7;13749:4;13754:1;13749:7;;;;;;;;;;;;;;13758:4;13763:1;13767;13763:5;13758:11;;;;;;;;;;;;;;13728;:42::i;:::-;13692:78;;;;13802:47;13815:7;13823:1;13815:10;;;;;;;;;;;;;;13827:9;13838:10;13802:12;:47::i;:::-;13785:7;13793:1;13797;13793:5;13785:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;13672:3:0;;13638:223;;;;13357:511;;;;;:::o;10639:478::-;10728:12;10754:14;10770;10788:26;10799:6;10807;10788:10;:26::i;:::-;10952:32;;;-1:-1:-1;;10952:32:0;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;10952:32:0;;;;;10942:43;;;;;;-1:-1:-1;;;;;;10855:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10855:251:0;;;;;;;10845:262;;;;;;;;;10639:478;-1:-1:-1;;;;;10639:478:0:o;1558:402::-;1783:51;;;-1:-1:-1;;;;;1783:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1783:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1772:63:0;;;;1737:12;;1751:17;;1772:10;;;;1783:51;1772:63;;;25:18:-1;1772:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1772:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1736:99:0;;;;1854:7;:57;;;;-1:-1:-1;1866:11:0;;:16;;:44;;;1897:4;1886:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1886:24:0;1866:44;1846:106;;;;-1:-1:-1;;;1846:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1558:402;;;;;;:::o;23754:735::-;23861:6;23856:626;23887:1;23873:4;:11;:15;23869:1;:19;23856:626;;;23911:13;23926:14;23945:4;23950:1;23945:7;;;;;;;;;;;;;;23954:4;23959:1;23963;23959:5;23954:11;;;;;;;;;;;;;;23910:56;;;;23982:14;24001:42;24029:5;24036:6;24001:27;:42::i;:::-;23981:62;;;24058:14;24075:7;24083:1;24087;24083:5;24075:14;;;;;;;;;;;;;;24058:31;;24105:15;24122;24150:6;-1:-1:-1;;;;;24141:15:0;:5;-1:-1:-1;;;;;24141:15:0;;:61;;24183:9;24199:1;24141:61;;;24165:1;24169:9;24141:61;24104:98;;;;24217:10;24248:1;24234:4;:11;:15;24230:1;:19;:82;;24309:3;24230:82;;;24252:54;24277:7;24286:6;24294:4;24299:1;24303;24299:5;24294:11;;;;;;;;;;;;;;24252:24;:54::i;:::-;24217:95;;24342:48;24367:7;24376:5;24383:6;24342:24;:48::i;:::-;-1:-1:-1;;;;;24327:69:0;;24415:10;24427;24439:2;24453:1;24443:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;24443:12:0;87:42:-1;143:17;;-1:-1;24443:12:0;;24327:143;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24327:143:0;-1:-1:-1;;;;;24327:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24327:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24327:143:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;23890:3:0;;;;;-1:-1:-1;23856:626:0;;-1:-1:-1;;;;;;;;23856:626:0;;;23754:735;;;:::o;13949:532::-;14050:21;14107:1;14092:4;:11;:16;;14084:59;;;;;-1:-1:-1;;;14084:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14175:4;:11;14164:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14164:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14164:23:0;;14154:33;;14228:9;14198:7;14223:1;14206:7;:14;:18;14198:27;;;;;;;;;;;;;;;;;:39;14262:11;;-1:-1:-1;;14262:15:0;14248:226;14279:5;;14248:226;;14307:14;14323:15;14342:42;14354:7;14363:4;14372:1;14368;:5;14363:11;;;;;;;;;;;;;;14376:4;14381:1;14376:7;;;;;;;14342:42;14306:78;;;;14416:46;14428:7;14436:1;14428:10;;;;;;;;;;;;;;14440:9;14451:10;14416:11;:46::i;:::-;14399:7;14411:1;14407;:5;14399:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;14286:3:0;14248:226;;29091:1214;29204:6;29199:1099;29230:1;29216:4;:11;:15;29212:1;:19;29199:1099;;;29254:13;29269:14;29288:4;29293:1;29288:7;;;;;;;;;;;;;;29297:4;29302:1;29306;29302:5;29297:11;;;;;;;;;;;;;;29253:56;;;;29325:14;29344:42;29372:5;29379:6;29344:27;:42::i;:::-;29324:62;;;29401:19;29438:48;29463:7;29472:5;29479:6;29438:24;:48::i;:::-;29401:86;;29502:16;29533:17;29621:13;29636;29654:4;-1:-1:-1;;;;;29654:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29654:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29654:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29654:18:0;;;;;;;-1:-1:-1;;;;;29620:52:0;;;;-1:-1:-1;29620:52:0;;-1:-1:-1;29688:17:0;;-1:-1:-1;;;;;29729:15:0;;;;;;;:61;;29771:8;29781;29729:61;;;29748:8;29758;29729:61;29687:103;;;;29819:56;29862:12;29826:5;-1:-1:-1;;;;;29819:23:0;;29851:4;29819:38;;;;;;;;;;;;;-1:-1:-1;;;;;29819:38:0;-1:-1:-1;;;;;29819:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;29819:56:0;29805:70;;29905:71;29935:11;29948:12;29962:13;29905:29;:71::i;:::-;29890:86;;29199:1099;;;;30007:15;30024;30052:6;-1:-1:-1;;;;;30043:15:0;:5;-1:-1:-1;;;;;30043:15:0;;:67;;30088:12;30107:1;30043:67;;;30067:1;30071:12;30043:67;30006:104;;;;30125:10;30156:1;30142:4;:11;:15;30138:1;:19;:82;;30217:3;30138:82;;;30160:54;30185:7;30194:6;30202:4;30207:1;30211;30207:5;30202:11;;;;;;;30160:54;30273:12;;;30283:1;30273:12;;;;;;;;;;-1:-1:-1;;;30235:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;30235:51:0;;;;;;;;;;;;;;;;;;;;;;30125:95;;-1:-1:-1;30235:9:0;;;;;;30245:10;;30257;;30125:95;;30273:12;;30235:51;;;;;;;;30273:12;;30235:51;;;;30273:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30235:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30235:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29233:3:0;;;;;-1:-1:-1;29199:1099:0;;-1:-1:-1;;;;;;;;;;29199:1099:0;9747:129;9831:5;;;9826:16;;;;9818:50;;;;;-1:-1:-1;;;9818:50:0;;;;;;;;;;;;-1:-1:-1;;;9818:50:0;;;;;;;;;;;;;;12803:472;12896:13;12942:1;12930:9;:13;12922:70;;;;-1:-1:-1;;;12922:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13023:1;13011:9;:13;:31;;;;;13041:1;13028:10;:14;13011:31;13003:84;;;;-1:-1:-1;;;13003:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13098:14;13115:34;13144:4;13115:24;:9;13129;13115:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;13098:51;-1:-1:-1;13160:16:0;13179:34;13209:3;13179:25;:10;13194:9;13179:25;:14;:25;:::i;:34::-;13160:53;;13235:32;13265:1;13248:11;13236:9;:23;;;;;;;13235:32;:29;:32;:::i;:::-;13224:43;12803:472;-1:-1:-1;;;;;;12803:472:0:o;11722:321::-;11804:12;11847:1;11837:7;:11;11829:61;;;;-1:-1:-1;;;11829:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11920:1;11909:8;:12;:28;;;;;11936:1;11925:8;:12;11909:28;11901:81;;;;-1:-1:-1;;;11901:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12027:8;12003:21;:7;12015:8;12003:21;:11;:21;:::i;:::-;:32;;;;;;;11722:321;-1:-1:-1;;;;11722:321:0:o;10198:349::-;10273:14;10289;10334:6;-1:-1:-1;;;;;10324:16:0;:6;-1:-1:-1;;;;;10324:16:0;;;10316:66;;;;-1:-1:-1;;;10316:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10421:6;-1:-1:-1;;;;;10412:15:0;:6;-1:-1:-1;;;;;10412:15:0;;:53;;10450:6;10458;10412:53;;;10431:6;10439;10412:53;10393:72;;-1:-1:-1;10393:72:0;-1:-1:-1;;;;;;10484:20:0;;10476:63;;;;;-1:-1:-1;;;10476:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10198:349;;;;;:::o;16081:1390::-;16394:50;;;-1:-1:-1;;;16394:50:0;;-1:-1:-1;;;;;16394:50:0;;;;;;;;;;;;;;;;16299:12;;;;;;16412:7;16394:34;;;;;;:50;;;;;;;;;;;;;;;:34;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;16394:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16394:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16394:50:0;-1:-1:-1;;;;;16394:64:0;;16390:150;;;16475:53;;;-1:-1:-1;;;16475:53:0;;-1:-1:-1;;;;;16475:53:0;;;;;;;;;;;;;;;;16493:7;16475:37;;;;;;:53;;;;;;;;;;;;;;;-1:-1:-1;16475:37:0;:53;;;2:2:-1;;;;27:1;24;17:12;2:2;16475:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16475:53:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;16390:150:0;16551:13;16566;16583:53;16612:7;16621:6;16629;16583:28;:53::i;:::-;16550:86;;;;16651:8;16663:1;16651:13;:30;;;;-1:-1:-1;16668:13:0;;16651:30;16647:817;;;16720:14;;-1:-1:-1;16736:14:0;;-1:-1:-1;16647:817:0;;;16784:19;16806:58;16829:14;16845:8;16855;16806:22;:58::i;:::-;16784:80;;16901:14;16883;:32;16879:574;;16962:10;16944:14;:28;;16936:79;;;;-1:-1:-1;;;16936:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17056:14;;-1:-1:-1;17072:14:0;-1:-1:-1;17072:14:0;16879:574;;;17128:19;17150:58;17173:14;17189:8;17199;17150:22;:58::i;:::-;17128:80;;17252:14;17234;:32;;17227:40;;;;17312:10;17294:14;:28;;17286:79;;;;-1:-1:-1;;;17286:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17406:14;-1:-1:-1;17422:14:0;;-1:-1:-1;16879:574:0;16647:817;;16081:1390;;;;;;;;;;;:::o;9884:142::-;9936:6;9963;;;:30;;-1:-1:-1;;9978:5:0;;;9992:1;9987;9978:5;9987:1;9973:15;;;;;:20;9963:30;9955:63;;;;;-1:-1:-1;;;9955:63:0;;;;;;;;;;;;-1:-1:-1;;;9955:63:0;;;;;;;;;;;;;;9611:128;9695:5;;;9690:16;;;;9682:49;;;;;-1:-1:-1;;;9682:49:0;;;;;;;;;;;;-1:-1:-1;;;9682:49:0;;;;;;;;;;;;;;11175:434;11268:13;11283;11310:14;11329:26;11340:6;11348;11329:10;:26::i;:::-;11309:46;;;11366:32;11374:7;11383:6;11391;11366:7;:32::i;:::-;;11410:13;11425;11458:32;11466:7;11475:6;11483;11458:7;:32::i;:::-;-1:-1:-1;;;;;11443:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11443:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11443:62:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11443:62:0;;;;;;;-1:-1:-1;;;;;11409:96:0;;;;-1:-1:-1;11409:96:0;;-1:-1:-1;;;;;;11539:16:0;;;;;;;:62;;11582:8;11592;11539:62;;;11559:8;11569;11539:62;11516:85;;;;-1:-1:-1;11175:434:0;-1:-1:-1;;;;;;;11175:434:0:o

Metadata Hash

4300e9795b0e6562f608a07dd7fe742924f97608fb91c6627a777998ef71891b
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.