Contract 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 5

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x592fc7aaead1e827164014ad478d78af09fdb907ed2f3cda3fad06694f3ae01eSwap Exact Token...109974692021-09-17 16:12:2711 secs ago0x0101d2f5b4d64956fedc365b4dfe1541f109bf79 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.00155666
0x69a3915e3ee90d9e202357ea2cbbc4469da8335b211374dff153fde57b3d892eSwap Exact Token...109974662021-09-17 16:12:1820 secs ago0x2e1efacda43c59320da9864d3845733b5ac5c7ff IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001330539
0x197107bc59bbe47720ce155b378bfe32bbc86c4710c0790ffe95af1cbb896de1Add Liquidity ET...109974642021-09-17 16:12:1226 secs ago0x40950af6673f28a6ec31bdd69cfa156a0057b070 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80.606829397699242 BNB0.00089069
0xbddaf483e2de3e3fa8e2ea24050e75b8599745cf5b205d9e94b46310ee32cfbcSwap Exact Token...109974632021-09-17 16:12:0929 secs ago0xc8c963f6098065ad32a8e2904699ff33a93c1efc IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.0014147
0x815e5016d15a84c035496934dd464aeddfc533fddbbf6bd5f9f16dbd7efaf80bSwap Exact Token...109974592021-09-17 16:11:5741 secs ago0x8bd8432880c0c603e9489bc913d376231185016a IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001247295
0x671449f8d8e82076c14a52357db895a221a7a43cd813659b67a5851f365e9998Swap Exact Token...109974572021-09-17 16:11:5147 secs ago0x766af29bc764efa2b0bc07ea4d41c2cefac00669 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.00085965
0x88b0b4c38c47e1c59a1af19bb931f4f61c396b7cacbf09599d0eacdeb60760e5Swap Exact ETH F...109974572021-09-17 16:11:5147 secs ago0x2e1efacda43c59320da9864d3845733b5ac5c7ff IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd89.638344102824094 BNB0.001554672
0x4d523b3221b0c3f25b3baaf578302bd9c818547f243eaad9efc53ffa7d18928dSwap Exact Token...109974562021-09-17 16:11:4850 secs ago0x5fa755cb213de179f217ad17944cf48ddea5927f IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.00132498
0xaeabf04aa14fb969c397d90c0281035c86e101c8a24397fa38bc82509f714809Swap Exact Token...109974552021-09-17 16:11:4553 secs ago0xa6064122ed1f852e5a79dc1ed296c0fe2f846e8f IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001330791
0x306be4c55796b52df0228c1ca75faf42f7bff9c19140309af294dc8efe3623baSwap Exact Token...109974532021-09-17 16:11:3959 secs ago0x61018c601356e1927b17560537e1fcc53bcf43b0 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.000730595
0xbe81cd3c97013d95d1dbd489db38824b2976fa389b2450316cbe7793c62493b5Swap Exact Token...109974522021-09-17 16:11:361 min ago0x45499ee68489c19fad6db71c02c80220048646e4 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.000860295
0xb351fb4b368a543c6d6e1a0a8ca12763186ae1c16913b94ce7eeb386a3f21900Swap Exact Token...109974512021-09-17 16:11:331 min ago0xaf5462112688cde428927e842b2d3efdcf5832c8 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.000949745
0x0ad252a9b5117a81e47b3aac45fc7899aa21f4b8fb3a5b02506ad080cc1e590fSwap Exact Token...109974512021-09-17 16:11:331 min ago0xa650ded93f54d02920e0ec5217dddee2c9e6198c IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001995265
0x16739ad2d26bee9596c019e6c15a954c3dcb2b6763e88b8cedc029849275a8f1Swap Exact Token...109974492021-09-17 16:11:271 min ago0x4f48be8a6d16abf890bed6357a6e02f8f6edfb43 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.000874805
0x16d7c101a36e372de813132a6e3cf0defe73bc313641c60ad8a921a670febc6aSwap Exact ETH F...109974482021-09-17 16:11:241 min ago0x0e0b7e83602b199282189f9002d416e697fa6518 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd85.183743847682844 BNB0.001379245
0x035f8f7c63a7daf0e8e80ca09a4fe8aad8f066c29f26b026029831a5315b01f8Swap Exact Token...109974472021-09-17 16:11:211 min ago0x49dc1c613aea7fa43d7605f426b5ecede6983b02 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001250805
0xe4dd919706be1b099acbaf749f1a1cd2ee6a7001d2912b131b655e1f2fd8c5f3Swap Exact Token...109974472021-09-17 16:11:211 min ago0x4d8620c6729c1737991369991f8f2d6fc0f9741f IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001221901176
0x4239c36043af85d207236c4fbc2605ef9f555801d11be2cce4160a6f88a9cc4bAdd Liquidity109974462021-09-17 16:11:181 min ago0xa1b3890c1e8c820066fd6f27e3a802642760b105 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.00074661
0x46308884736e9ad12e09b1f964ac803001c332d5007d4f134c13b5d7dad619e0Swap Exact Token...109974442021-09-17 16:11:121 min ago0x7b6675e68673816ff159bb73f78296e89da9f8ab IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.00166064
0x6521e3d89779bdee6abc006fb4f3a1a6d888e07d028d4dfec50497d095f57302Swap Exact ETH F...109974432021-09-17 16:11:091 min ago0x430ed82f93d6f6ed687a2c40ea76e2f0d253d091 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd84.308879595297723 BNB0.0014399
0xe0ab1d24d4b2aafe3b6ff594000853d4c6e75d83a101ce2eccd6bc1b10d1ddddSwap Exact Token...109974412021-09-17 16:11:031 min ago0x2e1efacda43c59320da9864d3845733b5ac5c7ff IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.001330623
0x9f929f886a41bc8d0538a01ea8eca9474d9c94479f4d8b584596f5d2f7d42d12Swap Exact Token...109974392021-09-17 16:10:571 min ago0x89f0e877a5ade91843d46ef4920c433d9fdf299b IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.00081275
0x9fe2944adff41d397688596bc07f20a3fc851ff4fcc0516da18e64f941108ddaSwap Exact Token...109974392021-09-17 16:10:571 min ago0x4faf780b9e14fecce41515ef47c5668472dec993 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.00126713
0xf69adb6240304a1ca9e688dc100f1388d85bfcb5e2646404b61cf5e8e476b403Swap Exact Token...109974392021-09-17 16:10:571 min ago0xbce85197840d8dcb052e3d1f5fd5c9648323d2c2 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.000860535
0xc3f9a4ca090d18ee36a4204f971907de041645e957972a622071a656f90dee8bSwap Exact Token...109974392021-09-17 16:10:571 min ago0x4f48be8a6d16abf890bed6357a6e02f8f6edfb43 IN  0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80 BNB0.000875565
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x815e5016d15a84c035496934dd464aeddfc533fddbbf6bd5f9f16dbd7efaf80b109974592021-09-17 16:11:5741 secs ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80x8bd8432880c0c603e9489bc913d376231185016a11.007726642719857618 BNB
0x815e5016d15a84c035496934dd464aeddfc533fddbbf6bd5f9f16dbd7efaf80b109974592021-09-17 16:11:5741 secs ago Binance: WBNB Token 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd811.007726642719857618 BNB
0x88b0b4c38c47e1c59a1af19bb931f4f61c396b7cacbf09599d0eacdeb60760e5109974572021-09-17 16:11:5147 secs ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token9.638344102824094 BNB
0xaeabf04aa14fb969c397d90c0281035c86e101c8a24397fa38bc82509f714809109974552021-09-17 16:11:4553 secs ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80xa6064122ed1f852e5a79dc1ed296c0fe2f846e8f14.599473855825292856 BNB
0xaeabf04aa14fb969c397d90c0281035c86e101c8a24397fa38bc82509f714809109974552021-09-17 16:11:4553 secs ago Binance: WBNB Token 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd814.599473855825292856 BNB
0xb351fb4b368a543c6d6e1a0a8ca12763186ae1c16913b94ce7eeb386a3f21900109974512021-09-17 16:11:331 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80xaf5462112688cde428927e842b2d3efdcf5832c80.025406227103889817 BNB
0xb351fb4b368a543c6d6e1a0a8ca12763186ae1c16913b94ce7eeb386a3f21900109974512021-09-17 16:11:331 min ago Binance: WBNB Token 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80.025406227103889817 BNB
0x16739ad2d26bee9596c019e6c15a954c3dcb2b6763e88b8cedc029849275a8f1109974492021-09-17 16:11:271 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80x4f48be8a6d16abf890bed6357a6e02f8f6edfb430.057542120113732225 BNB
0x16739ad2d26bee9596c019e6c15a954c3dcb2b6763e88b8cedc029849275a8f1109974492021-09-17 16:11:271 min ago Binance: WBNB Token 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80.057542120113732225 BNB
0x16d7c101a36e372de813132a6e3cf0defe73bc313641c60ad8a921a670febc6a109974482021-09-17 16:11:241 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token5.183743847682844 BNB
0x6521e3d89779bdee6abc006fb4f3a1a6d888e07d028d4dfec50497d095f57302109974432021-09-17 16:11:091 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token4.308879595297723 BNB
0xe0ab1d24d4b2aafe3b6ff594000853d4c6e75d83a101ce2eccd6bc1b10d1dddd109974412021-09-17 16:11:031 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80x2e1efacda43c59320da9864d3845733b5ac5c7ff9.614280129633792807 BNB
0xe0ab1d24d4b2aafe3b6ff594000853d4c6e75d83a101ce2eccd6bc1b10d1dddd109974412021-09-17 16:11:031 min ago Binance: WBNB Token 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd89.614280129633792807 BNB
0x9f929f886a41bc8d0538a01ea8eca9474d9c94479f4d8b584596f5d2f7d42d12109974392021-09-17 16:10:571 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80x89f0e877a5ade91843d46ef4920c433d9fdf299b1.027630167687566791 BNB
0x9f929f886a41bc8d0538a01ea8eca9474d9c94479f4d8b584596f5d2f7d42d12109974392021-09-17 16:10:571 min ago Binance: WBNB Token 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd81.027630167687566791 BNB
0xc3f9a4ca090d18ee36a4204f971907de041645e957972a622071a656f90dee8b109974392021-09-17 16:10:571 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80x4f48be8a6d16abf890bed6357a6e02f8f6edfb430.056812831614143271 BNB
0xc3f9a4ca090d18ee36a4204f971907de041645e957972a622071a656f90dee8b109974392021-09-17 16:10:571 min ago Binance: WBNB Token 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80.056812831614143271 BNB
0xc48da1c1364903c68744a52c9a89fa094d4536bdae481426192474b82d208367109974332021-09-17 16:10:391 min ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token11 BNB
0xcf6003e480e9531573327e9c500cca4554f37703085ade341ca5198aa47fb07f109974322021-09-17 16:10:362 mins ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token14.63953662958989 BNB
0x63c4f3d93cebc0b7a21cf5b11cf727a56bb48510773c5334b5e83e0a141d1cea109974312021-09-17 16:10:332 mins ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd80x89f0e877a5ade91843d46ef4920c433d9fdf299b1.001638987936486259 BNB
0x63c4f3d93cebc0b7a21cf5b11cf727a56bb48510773c5334b5e83e0a141d1cea109974312021-09-17 16:10:332 mins ago Binance: WBNB Token 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd81.001638987936486259 BNB
0xcf546f36e628ef222021f4ed0f394adc9dc52d44d6fdd20a15eeb2d17d10f2bb109974302021-09-17 16:10:302 mins ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token9.637227722340949 BNB
0xe7d24e63156bfe917c1a4800a855686176bb31398823fa877b779dc827bbf335109974292021-09-17 16:10:272 mins ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token11 BNB
0xd52aa154bc78f178c4a2ff0afe451b39088d79ca7704ae7e049aead60238b92e109974272021-09-17 16:10:212 mins ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token11.556295308577875 BNB
0xbaa7bc34c41f2e25147226c5101fc896ba6dc111fb1acca0d4c899875b28eb39109974272021-09-17 16:10:212 mins ago 0x3a6d8ca21d1cf76f653a67577fa0d27453350dd8 Binance: WBNB Token9.63123237459544 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BiswapRouter02

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 999999 runs

Other Settings:
istanbul EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-05-24
*/

pragma solidity =0.6.6;

interface IBiswapFactory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint256 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::safeApprove: approve failed'
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 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::safeTransfer: transfer failed'
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 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::transferFrom: transferFrom failed'
        );
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
    }
}
interface IBiswapRouter02 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapFeeReward() 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, uint swapFee) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut, uint swapFee) 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);

    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 IBiswapPair {
    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 swapFee() external view returns (uint32);
    function devFee() external view returns (uint32);

    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;
    function setSwapFee(uint32) external;
    function setDevFee(uint32) external;
}


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 BiswapLibrary {
    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, 'BiswapLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'BiswapLibrary: 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'fea293c909d87cd4153593f077b76bb7e94340200f4ee84211ae8e4f9bd7ffdf' // init code hash
            ))));
    }

    function getSwapFee(address factory, address tokenA, address tokenB) internal view returns (uint swapFee) {
        swapFee = IBiswapPair(pairFor(factory, tokenA, tokenB)).swapFee();
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IBiswapPair(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, 'BiswapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'BiswapLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

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

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut, uint swapFee) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'BiswapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'BiswapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(uint(1000).sub(swapFee));
        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, 'BiswapLibrary: 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, getSwapFee(factory, path[i], path[i + 1]));
        }
    }

    // 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, 'BiswapLibrary: 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, getSwapFee(factory, path[i - 1], path[i]));
        }
    }
    
}

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;
}
library Babylonian {
    // credit for this implementation goes to
    // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687
    function sqrt(uint256 x) internal pure returns (uint256) {
        if (x == 0) return 0;
        // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2);
        // however that code costs significantly more gas
        uint256 xx = x;
        uint256 r = 1;
        if (xx >= 0x100000000000000000000000000000000) {
            xx >>= 128;
            r <<= 64;
        }
        if (xx >= 0x10000000000000000) {
            xx >>= 64;
            r <<= 32;
        }
        if (xx >= 0x100000000) {
            xx >>= 32;
            r <<= 16;
        }
        if (xx >= 0x10000) {
            xx >>= 16;
            r <<= 8;
        }
        if (xx >= 0x100) {
            xx >>= 8;
            r <<= 4;
        }
        if (xx >= 0x10) {
            xx >>= 4;
            r <<= 2;
        }
        if (xx >= 0x8) {
            r <<= 1;
        }
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint256 r1 = x / r;
        return (r < r1 ? r : r1);
    }
}
library FullMath {
    function fullMul(uint256 x, uint256 y) internal pure returns (uint256 l, uint256 h) {
        uint256 mm = mulmod(x, y, uint256(-1));
        l = x * y;
        h = mm - l;
        if (mm < l) h -= 1;
    }

    function fullDiv(
        uint256 l,
        uint256 h,
        uint256 d
    ) private pure returns (uint256) {
        uint256 pow2 = d & -d;
        d /= pow2;
        l /= pow2;
        l += h * ((-pow2) / pow2 + 1);
        uint256 r = 1;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        return l * r;
    }

    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 d
    ) internal pure returns (uint256) {
        (uint256 l, uint256 h) = fullMul(x, y);

        uint256 mm = mulmod(x, y, d);
        if (mm > l) h -= 1;
        l -= mm;

        if (h == 0) return l / d;

        require(h < d, 'FullMath: FULLDIV_OVERFLOW');
        return fullDiv(l, h, d);
    }
}

contract Ownable {
    address private _owner;

    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    function isOwner(address account) public view returns (bool) {
        return account == _owner;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }


    modifier onlyOwner() {
        require(isOwner(msg.sender), "Ownable: caller is not the owner");
        _;
    }

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

interface ISwapFeeReward {
    function swap(address account, address input, address output, uint256 amount) external returns (bool);
}

contract BiswapRouter02 is IBiswapRouter02, Ownable {
    using SafeMath for uint;

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

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'BiswapV2Router: 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
    }

    function setSwapFeeReward(address _swapFeeReward) public onlyOwner {
        swapFeeReward = _swapFeeReward;
    }

    // **** 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 (IBiswapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IBiswapFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = BiswapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = BiswapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'BiswapV2Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = BiswapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'BiswapV2Router: 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 = BiswapLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IBiswapPair(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 = BiswapLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IBiswapPair(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 = BiswapLibrary.pairFor(factory, tokenA, tokenB);
        IBiswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IBiswapPair(pair).burn(to);
        (address token0,) = BiswapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'BiswapV2Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'BiswapV2Router: 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 = BiswapLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IBiswapPair(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 = BiswapLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IBiswapPair(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 = BiswapLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IBiswapPair(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,) = BiswapLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            if (swapFeeReward != address(0)) {
                ISwapFeeReward(swapFeeReward).swap(msg.sender, input, output, amountOut);
            }
            address to = i < path.length - 2 ? BiswapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IBiswapPair(BiswapLibrary.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 = BiswapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BiswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, BiswapLibrary.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 = BiswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'BiswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, BiswapLibrary.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, 'BiswapV2Router: INVALID_PATH');
        amounts = BiswapLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BiswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(BiswapLibrary.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, 'BiswapV2Router: INVALID_PATH');
        amounts = BiswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'BiswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, BiswapLibrary.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, 'BiswapV2Router: INVALID_PATH');
        amounts = BiswapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BiswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, BiswapLibrary.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, 'BiswapV2Router: INVALID_PATH');
        amounts = BiswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'BiswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(BiswapLibrary.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,) = BiswapLibrary.sortTokens(input, output);
            IBiswapPair pair = IBiswapPair(BiswapLibrary.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 = BiswapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput, pair.swapFee());
            }
            if (swapFeeReward != address(0)) {
                ISwapFeeReward(swapFeeReward).swap(msg.sender, input, output, amountOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? BiswapLibrary.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, BiswapLibrary.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,
            'BiswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'BiswapV2Router: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(BiswapLibrary.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,
            'BiswapV2Router: 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, 'BiswapV2Router: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, BiswapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'BiswapV2Router: 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 BiswapLibrary.quote(amountA, reserveA, reserveB);
    }

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"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"},{"internalType":"uint256","name":"swapFee","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"},{"internalType":"uint256","name":"swapFee","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":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapFeeReward","type":"address"}],"name":"setSwapFeeReward","outputs":[],"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":[],"name":"swapFeeReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b5060405162005fd938038062005fd9833981810160405260408110156200003757600080fd5b508051602090910151600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c615e09620001d0600039806101ee5280610fbe5280610ff9528061112152806113e4528061185f5280611a685280612093528061221752806122e752806123ee52806125a15280612636528061291352806129c25280612a975280612b9c5280612c845280612d055280613394528061374a52806137a052806137d452806138555280613a6f5280613c1f5280613cb4525080611213528061131152806114b752806114f052806116bc52806119515280611a465280611c3352806124d4528061267552806128115280612d445280613087528061331952806133425280613372528061354f528061377e5280613b555280613cf352806147fd52806148405280614e30528061516152806155b8528061569952806157195250615e096000f3fe6080604052600436106101d15760003560e01c80638da5cb5b116100f7578063c45a015511610095578063f2fde38b11610064578063f2fde38b14610ddf578063f305d71914610e1f578063fb3bdb4114610e72578063fbbeedf114610f0557610217565b8063c45a015514610c06578063d06ca61f14610c1b578063ded9382a14610cd2578063e8e3370014610d5257610217565b8063ad615dec116100d1578063ad615dec14610a73578063af2979eb14610aa9578063b6f9de9514610b09578063baa2abde14610b9c57610217565b80638da5cb5b14610a0b578063a3ddb30b14610a49578063ad5c464814610a5e57610217565b806352707d8c1161016f578063715018a61161013e578063715018a614610819578063791ac9471461082e5780637ff36ab5146108d35780638803dbee1461096657610217565b806352707d8c1461066a578063571fd012146106b85780635b0d5984146106f45780635c11d7951461077457610217565b80632195995c116101ab5780632195995c146104415780632f54bf6e146104cc57806338ed1739146105205780634a25d94a146105c557610217565b806302751cec1461021c57806318cbafe5146102955780631f00ca741461038a57610217565b36610217573373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461021557fe5b005b600080fd5b34801561022857600080fd5b5061027c600480360360c081101561023f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610f45565b6040805192835260208301919091528051918290030190f35b3480156102a157600080fd5b5061033a600480360360a08110156102b857600080fd5b8135916020810135918101906060810160408201356401000000008111156102df57600080fd5b8201836020820111156102f157600080fd5b8035906020019184602083028401116401000000008311171561031357600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611098565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037657818101518382015260200161035e565b505050509050019250505060405180910390f35b34801561039657600080fd5b5061033a600480360360408110156103ad57600080fd5b813591908101906040810160208201356401000000008111156103cf57600080fd5b8201836020820111156103e157600080fd5b8035906020019184602083028401116401000000008311171561040357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506114b0945050505050565b34801561044d57600080fd5b5061027c600480360361016081101561046557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356114e6565b3480156104d857600080fd5b5061050c600480360360208110156104ef57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611624565b604080519115158252519081900360200190f35b34801561052c57600080fd5b5061033a600480360360a081101561054357600080fd5b81359160208101359181019060608101604082013564010000000081111561056a57600080fd5b82018360208201111561057c57600080fd5b8035906020019184602083028401116401000000008311171561059e57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611645565b3480156105d157600080fd5b5061033a600480360360a08110156105e857600080fd5b81359160208101359181019060608101604082013564010000000081111561060f57600080fd5b82018360208201111561062157600080fd5b8035906020019184602083028401116401000000008311171561064357600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356117d6565b34801561067657600080fd5b506106a66004803603608081101561068d57600080fd5b5080359060208101359060408101359060600135611a19565b60408051918252519081900360200190f35b3480156106c457600080fd5b506106a6600480360360808110156106db57600080fd5b5080359060208101359060408101359060600135611a30565b34801561070057600080fd5b506106a6600480360361014081101561071857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611a3e565b34801561078057600080fd5b50610215600480360360a081101561079757600080fd5b8135916020810135918101906060810160408201356401000000008111156107be57600080fd5b8201836020820111156107d057600080fd5b803590602001918460208302840111640100000000831117156107f257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611b90565b34801561082557600080fd5b50610215611f29565b34801561083a57600080fd5b50610215600480360360a081101561085157600080fd5b81359160208101359181019060608101604082013564010000000081111561087857600080fd5b82018360208201111561088a57600080fd5b803590602001918460208302840111640100000000831117156108ac57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561200c565b61033a600480360360808110156108e957600080fd5b8135919081019060408101602082013564010000000081111561090b57600080fd5b82018360208201111561091d57600080fd5b8035906020019184602083028401116401000000008311171561093f57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561237a565b34801561097257600080fd5b5061033a600480360360a081101561098957600080fd5b8135916020810135918101906060810160408201356401000000008111156109b057600080fd5b8201836020820111156109c257600080fd5b803590602001918460208302840111640100000000831117156109e457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561279a565b348015610a1757600080fd5b50610a206128d9565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b348015610a5557600080fd5b50610a206128f5565b348015610a6a57600080fd5b50610a20612911565b348015610a7f57600080fd5b506106a660048036036060811015610a9657600080fd5b5080359060208101359060400135612935565b348015610ab557600080fd5b506106a6600480360360c0811015610acc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a0013561294a565b61021560048036036080811015610b1f57600080fd5b81359190810190604081016020820135640100000000811115610b4157600080fd5b820183602082011115610b5357600080fd5b80359060200191846020830284011164010000000083111715610b7557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612b2a565b348015610ba857600080fd5b5061027c600480360360e0811015610bbf57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c0013561300d565b348015610c1257600080fd5b50610a20613317565b348015610c2757600080fd5b5061033a60048036036040811015610c3e57600080fd5b81359190810190604081016020820135640100000000811115610c6057600080fd5b820183602082011115610c7257600080fd5b80359060200191846020830284011164010000000083111715610c9457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061333b945050505050565b348015610cde57600080fd5b5061027c6004803603610140811015610cf657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135613368565b348015610d5e57600080fd5b50610dc16004803603610100811015610d7657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356134c0565b60408051938452602084019290925282820152519081900360600190f35b348015610deb57600080fd5b5061021560048036036020811015610e0257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661364f565b610dc1600480360360c0811015610e3557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356136cf565b61033a60048036036080811015610e8857600080fd5b81359190810190604081016020820135640100000000811115610eaa57600080fd5b820183602082011115610ebc57600080fd5b80359060200191846020830284011164010000000083111715610ede57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356139fb565b348015610f1157600080fd5b5061021560048036036020811015610f2857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613e4a565b6000808242811015610fb857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b610fe7897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a61300d565b9093509150610ff7898685613f05565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561106a57600080fd5b505af115801561107e573d6000803e3d6000fd5b5050505061108c85836140cc565b50965096945050505050565b6060814281101561110a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061116f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461120e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4269737761705632526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b61126c7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061420992505050565b9150868260018451038151811061127f57fe5b602002602001015110156112de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615cc0602a913960400191505060405180910390fd5b6113a3868660008181106112ee57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16336113897f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061133d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061136757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166143a3565b8560008151811061139657fe5b602002602001015161448e565b6113e28287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061465e915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551038151811061142e57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561146c57600080fd5b505af1158015611480573d6000803e3d6000fd5b505050506114a5848360018551038151811061149857fe5b60200260200101516140cc565b509695505050505050565b60606114dd7f000000000000000000000000000000000000000000000000000000000000000084846149bb565b90505b92915050565b60008060006115167f00000000000000000000000000000000000000000000000000000000000000008f8f6143a3565b9050600087611525578c611547565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156115e357600080fd5b505af11580156115f7573d6000803e3d6000fd5b5050505061160a8f8f8f8f8f8f8f61300d565b809450819550505050509b509b9950505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161490565b606081428110156116b757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6117157f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061420992505050565b9150868260018451038151811061172857fe5b60200260200101511015611787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615cc0602a913960400191505060405180910390fd5b611797868660008181106112ee57fe5b6114a58287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061465e915050565b6060814281101561184857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106118ad57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461194c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4269737761705632526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b6119aa7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506149bb92505050565b915086826000815181106119ba57fe5b602002602001015111156112de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615bc86026913960400191505060405180910390fd5b6000611a2785858585614b70565b95945050505050565b6000611a2785858585614ca5565b600080611a8c7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006143a3565b9050600086611a9b578b611abd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b158015611b5957600080fd5b505af1158015611b6d573d6000803e3d6000fd5b50505050611b7f8d8d8d8d8d8d61294a565b9d9c50505050505050505050505050565b8042811015611c0057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b611c8f85856000818110611c1057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611c897f000000000000000000000000000000000000000000000000000000000000000089896000818110611c5f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061136757fe5b8a61448e565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611cbf57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611d5857600080fd5b505afa158015611d6c573d6000803e3d6000fd5b505050506040513d6020811015611d8257600080fd5b50516040805160208881028281018201909352888252929350611dc4929091899189918291850190849080828437600092019190915250889250614dd9915050565b86611ec88288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611df757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611e9057600080fd5b505afa158015611ea4573d6000803e3d6000fd5b505050506040513d6020811015611eba57600080fd5b50519063ffffffff6152bc16565b1015611f1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615cc0602a913960400191505060405180910390fd5b5050505050505050565b611f3233611624565b611f9d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b804281101561207c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106120e157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461218057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4269737761705632526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b61219085856000818110611c1057fe5b6121ce858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614dd9915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b15801561225e57600080fd5b505afa158015612272573d6000803e3d6000fd5b505050506040513d602081101561228857600080fd5b50519050868110156122e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615cc0602a913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561235857600080fd5b505af115801561236c573d6000803e3d6000fd5b50505050611f1f84826140cc565b606081428110156123ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061243057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124cf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4269737761705632526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b61252d7f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061420992505050565b9150868260018451038151811061254057fe5b6020026020010151101561259f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615cc0602a913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836000815181106125e857fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561261b57600080fd5b505af115801561262f573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6126a17f000000000000000000000000000000000000000000000000000000000000000089896000818110611c5f57fe5b846000815181106126ae57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561271f57600080fd5b505af1158015612733573d6000803e3d6000fd5b505050506040513d602081101561274957600080fd5b505161275157fe5b6127908287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061465e915050565b5095945050505050565b6060814281101561280c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b61286a7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506149bb92505050565b9150868260008151811061287a57fe5b60200260200101511115611787576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615bc86026913960400191505060405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061294284848461532e565b949350505050565b600081428110156129bc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6129eb887f0000000000000000000000000000000000000000000000000000000000000000898989308961300d565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450612a9592508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b158015612a6457600080fd5b505afa158015612a78573d6000803e3d6000fd5b505050506040513d6020811015612a8e57600080fd5b5051613f05565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612b0857600080fd5b505af1158015612b1c573d6000803e3d6000fd5b505050506114a584836140cc565b8042811015612b9a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1685856000818110612bde57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612c7d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4269737761705632526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612cea57600080fd5b505af1158015612cfe573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612d707f000000000000000000000000000000000000000000000000000000000000000089896000818110611c5f57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612dda57600080fd5b505af1158015612dee573d6000803e3d6000fd5b505050506040513d6020811015612e0457600080fd5b5051612e0c57fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612e3c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ed557600080fd5b505afa158015612ee9573d6000803e3d6000fd5b505050506040513d6020811015612eff57600080fd5b50516040805160208981028281018201909352898252929350612f419290918a918a918291850190849080828437600092019190915250899250614dd9915050565b87611ec88289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612f7457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611e9057600080fd5b600080824281101561308057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b60006130ad7f00000000000000000000000000000000000000000000000000000000000000008c8c6143a3565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561312e57600080fd5b505af1158015613142573d6000803e3d6000fd5b505050506040513d602081101561315857600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156131cb57600080fd5b505af11580156131df573d6000803e3d6000fd5b505050506040513d60408110156131f557600080fd5b5080516020909101519092509050600061320f8e8e61540e565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff161461324c57818361324f565b82825b90975095508a8710156132ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615cea6025913960400191505060405180910390fd5b89861015613306576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615c146025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606114dd7f00000000000000000000000000000000000000000000000000000000000000008484614209565b60008060006133b87f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006143a3565b90506000876133c7578c6133e9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561348557600080fd5b505af1158015613499573d6000803e3d6000fd5b505050506134ab8e8e8e8e8e8e610f45565b909f909e509c50505050505050505050505050565b6000806000834281101561353557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6135438c8c8c8c8c8c615561565b909450925060006135757f00000000000000000000000000000000000000000000000000000000000000008e8e6143a3565b90506135838d33838861448e565b61358f8c33838761448e565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561360e57600080fd5b505af1158015613622573d6000803e3d6000fd5b505050506040513d602081101561363857600080fd5b5051949d939c50939a509198505050505050505050565b61365833611624565b6136c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6136cc81615862565b50565b6000806000834281101561374457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6137728a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c615561565b909450925060006137c47f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006143a3565b90506137d28b33838861448e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561383a57600080fd5b505af115801561384e573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156138fa57600080fd5b505af115801561390e573d6000803e3d6000fd5b505050506040513d602081101561392457600080fd5b505161392c57fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156139ab57600080fd5b505af11580156139bf573d6000803e3d6000fd5b505050506040513d60208110156139d557600080fd5b50519250348410156139ed576139ed338534036140cc565b505096509650969350505050565b60608142811015613a6d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4269737761705632526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686866000818110613ab157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b5057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4269737761705632526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b613bae7f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506149bb92505050565b91503482600081518110613bbe57fe5b60200260200101511115613c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615bc86026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110613c6657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015613c9957600080fd5b505af1158015613cad573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb613d1f7f000000000000000000000000000000000000000000000000000000000000000089896000818110611c5f57fe5b84600081518110613d2c57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613d9d57600080fd5b505af1158015613db1573d6000803e3d6000fd5b505050506040513d6020811015613dc757600080fd5b5051613dcf57fe5b613e0e8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061465e915050565b81600081518110613e1b57fe5b6020026020010151341115612790576127903383600081518110613e3b57fe5b602002602001015134036140cc565b613e5333611624565b613ebe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613fdb57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613f9e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461403d576040519150601f19603f3d011682016040523d82523d6000602084013e614042565b606091505b5091509150818015614070575080511580614070575080806020019051602081101561406d57600080fd5b50515b6140c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615da7602d913960400191505060405180910390fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b6020831061414357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614106565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146141a5576040519150601f19603f3d011682016040523d82523d6000602084013e6141aa565b606091505b5050905080614204576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526034815260200180615c6a6034913960400191505060405180910390fd5b505050565b606060028251101561427c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4269737761704c6962726172793a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561429457600080fd5b506040519080825280602002602001820160405280156142be578160200160208202803683370190505b50905082816000815181106142cf57fe5b60200260200101818152505060005b600183510381101561439b57600080614321878685815181106142fd57fe5b602002602001015187866001018151811061431457fe5b602002602001015161595b565b9150915061437784848151811061433457fe5b602002602001015183836143728b8a898151811061434e57fe5b60200260200101518b8a6001018151811061436557fe5b6020026020010151615a43565b614b70565b84846001018151811061438657fe5b602090810291909101015250506001016142de565b509392505050565b60008060006143b2858561540e565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527ffea293c909d87cd4153593f077b76bb7e94340200f4ee84211ae8e4f9bd7ffdf609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061456c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161452f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146145ce576040519150601f19603f3d011682016040523d82523d6000602084013e6145d3565b606091505b509150915081801561460157508051158061460157508080602001905160208110156145fe57600080fd5b50515b614656576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180615c396031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156149b55760008084838151811061467c57fe5b602002602001015185846001018151811061469357fe5b60200260200101519150915060006146ab838361540e565b50905060008785600101815181106146bf57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146147075782600061470b565b6000835b600154919350915073ffffffffffffffffffffffffffffffffffffffff16156147e557600154604080517fa9678a1800000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018790529151919092169163a9678a189160848083019260209291908290030181600087803b1580156147b857600080fd5b505af11580156147cc573d6000803e3d6000fd5b505050506040513d60208110156147e257600080fd5b50505b600060028a510388106147f85788614839565b6148397f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061482c57fe5b60200260200101516143a3565b90506148667f000000000000000000000000000000000000000000000000000000000000000088886143a3565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156148b0576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561493b578181015183820152602001614923565b50505050905090810190601f1680156149685780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561498a57600080fd5b505af115801561499e573d6000803e3d6000fd5b505060019099019850614661975050505050505050565b50505050565b6060600282511015614a2e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4269737761704c6962726172793a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015614a4657600080fd5b50604051908082528060200260200182016040528015614a70578160200160208202803683370190505b5090508281600183510381518110614a8457fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b801561439b57600080614ae487866001860381518110614ad057fe5b602002602001015187868151811061431457fe5b91509150614b2d848481518110614af757fe5b60200260200101518383614b288b8a60018a0381518110614b1457fe5b60200260200101518b8a8151811061436557fe5b614ca5565b846001850381518110614b3c57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01614ab4565b6000808511614bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615d7f6028913960400191505060405180910390fd5b600084118015614bda5750600083115b614c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615d0f6025913960400191505060405180910390fd5b6000614c53614c466103e88563ffffffff6152bc16565b879063ffffffff615acf16565b90506000614c67828663ffffffff615acf16565b90506000614c8d83614c81896103e863ffffffff615acf16565b9063ffffffff615b5516565b9050808281614c9857fe5b0498975050505050505050565b6000808511614cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180615d346029913960400191505060405180910390fd5b600084118015614d0f5750600083115b614d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615d0f6025913960400191505060405180910390fd5b6000614d886103e8614d7c878963ffffffff615acf16565b9063ffffffff615acf16565b90506000614db1614da16103e88663ffffffff6152bc16565b614d7c878a63ffffffff6152bc16565b9050614dce6001828481614dc157fe5b049063ffffffff615b5516565b979650505050505050565b60005b600183510381101561420457600080848381518110614df757fe5b6020026020010151858460010181518110614e0e57fe5b6020026020010151915091506000614e26838361540e565b5090506000614e567f000000000000000000000000000000000000000000000000000000000000000085856143a3565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015614ea457600080fd5b505afa158015614eb8573d6000803e3d6000fd5b505050506040513d6060811015614ece57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a811690891614614f18578284614f1b565b83835b91509150614fa0828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611e9057600080fd5b95506150258683838a73ffffffffffffffffffffffffffffffffffffffff166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b158015614fee57600080fd5b505afa158015615002573d6000803e3d6000fd5b505050506040513d602081101561501857600080fd5b505163ffffffff16614b70565b60015490955073ffffffffffffffffffffffffffffffffffffffff161593506151039250505057600154604080517fa9678a1800000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff89811660248301528881166044830152606482018590529151919092169163a9678a189160848083019260209291908290030181600087803b1580156150d657600080fd5b505af11580156150ea573d6000803e3d6000fd5b505050506040513d602081101561510057600080fd5b50505b6000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461514157826000615145565b6000835b91509150600060028c51038a1061515c578a615190565b6151907f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061482c57fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015615240578181015183820152602001615228565b50505050905090810190601f16801561526d5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561528f57600080fd5b505af11580156152a3573d6000803e3d6000fd5b50506001909b019a50614ddc9950505050505050505050565b808203828111156114e057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411615388576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615c9e6022913960400191505060405180910390fd5b6000831180156153985750600082115b6153ed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615d0f6025913960400191505060405180910390fd5b826153fe858463ffffffff615acf16565b8161540557fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615496576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615d5d6022913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16106154d05782846154d3565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff821661555a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4269737761704c6962726172793a205a45524f5f414444524553530000000000604482015290519081900360640190fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561560157600080fd5b505afa158015615615573d6000803e3d6000fd5b505050506040513d602081101561562b57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16141561571157604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b1580156156e457600080fd5b505af11580156156f8573d6000803e3d6000fd5b505050506040513d602081101561570e57600080fd5b50505b60008061573f7f00000000000000000000000000000000000000000000000000000000000000008b8b61595b565b91509150816000148015615751575080155b1561576157879350869250615855565b600061576e89848461532e565b90508781116157db57858110156157d0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615c146025913960400191505060405180910390fd5b889450925082615853565b60006157e889848661532e565b9050898111156157f457fe5b8781101561584d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615cea6025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b73ffffffffffffffffffffffffffffffffffffffff81166158ce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615bee6026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080600061596a858561540e565b50905060008061597b8888886143a3565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156159c057600080fd5b505afa1580156159d4573d6000803e3d6000fd5b505050506040513d60608110156159ea57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff87811690841614615a31578082615a34565b81815b90999098509650505050505050565b6000615a508484846143a3565b73ffffffffffffffffffffffffffffffffffffffff166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b158015615a9557600080fd5b505afa158015615aa9573d6000803e3d6000fd5b505050506040513d6020811015615abf57600080fd5b505163ffffffff16949350505050565b6000811580615aea57505080820282828281615ae757fe5b04145b6114e057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b808201828110156114e057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fdfe4269737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e544f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734269737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c65644269737761704c6962726172793a20494e53554646494349454e545f414d4f554e544269737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544269737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e544269737761704c6962726172793a20494e53554646494349454e545f4c49515549444954594269737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544269737761704c6962726172793a204944454e544943414c5f4144445245535345534269737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564a2646970667358221220f423f81b1021c390c07163c4c9533ea8e8210b30f207fd0772f424ce157fa61f64736f6c63430006060033000000000000000000000000858e3312ed3a876947ea49d572a7c42de08af7ee000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

000000000000000000000000858e3312ed3a876947ea49d572a7c42de08af7ee000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Decoded View---------------
Arg [0] : _factory (address): 0x858e3312ed3a876947ea49d572a7c42de08af7ee
Arg [1] : _WETH (address): 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000858e3312ed3a876947ea49d572a7c42de08af7ee
Arg [1] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


Deployed ByteCode Sourcemap

19397:18926:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19925:10;:18;19939:4;19925:18;;19918:26;;;;19397:18926;;12:1:-1;9;2:12;24156:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24156:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;24156:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31419:842;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31419:842:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31419:842:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;31419:842:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31419:842:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31419:842:0;;-1:-1:-1;31419:842:0;-1:-1:-1;31419:842: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;31419:842:0;;;;;;;;;;;;;;;;;38070:250;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38070:250:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;38070:250:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;38070:250:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;38070:250:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38070:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38070:250:0;;-1:-1:-1;38070:250:0;;-1:-1:-1;;;;;38070:250:0:i;24835:671::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24835:671:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;24835:671:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18425:104::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18425:104:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18425:104:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;28666:621;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28666:621:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28666:621:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;28666:621:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28666:621:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28666:621:0;;-1:-1:-1;28666:621:0;-1:-1:-1;28666:621:0;;;;;;;;;:::i;30593:820::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30593:820:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30593:820:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;30593:820:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30593:820:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30593:820:0;;-1:-1:-1;30593:820:0;-1:-1:-1;30593:820:0;;;;;;;;;:::i;37233:282::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37233:282:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;37233:282:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;37523:281;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37523:281:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;37523:281:0;;;;;;;;;;;;;;;;;:::i;26960:712::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26960:712:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;26960:712:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34591:710::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34591:710:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;34591:710:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34591:710:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34591:710:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34591:710:0;;-1:-1:-1;34591:710:0;-1:-1:-1;34591:710:0;;;;;;;;;:::i;18537:140::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18537:140:0;;;:::i;36158:838::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36158:838:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;36158:838:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;36158:838:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36158:838:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36158:838:0;;-1:-1:-1;36158:838:0;-1:-1:-1;36158:838:0;;;;;;;;;:::i;29898:689::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;29898:689:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;29898:689:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;29898:689:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29898:689:0;;-1:-1:-1;29898:689:0;-1:-1:-1;29898:689:0;;;;;;;;;:::i;29293:599::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29293:599:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;29293:599:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;29293:599:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;29293:599:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;29293:599:0;;-1:-1:-1;29293:599:0;-1:-1:-1;29293:599:0;;;;;;;;;:::i;18338:79::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18338:79:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19581:37;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19581:37:0;;;:::i;19536:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19536:38:0;;;:::i;37040:185::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37040:185:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37040:185:0;;;;;;;;;;;;:::i;26254:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26254:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;26254:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35307:845::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35307:845:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;35307:845:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35307:845:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35307:845:0;;-1:-1:-1;35307:845:0;-1:-1:-1;35307:845:0;;;;;;;;;:::i;23299:851::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23299:851:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;23299:851:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19488:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19488:41:0;;;:::i;37812:250::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37812:250:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;37812:250:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;37812:250:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37812:250:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37812:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37812:250:0;;-1:-1:-1;37812:250:0;;-1:-1:-1;;;;;37812:250:0:i;25512:663::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25512:663:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;25512:663:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21550:732::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21550:732:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;21550:732:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;18922:109;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18922:109:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18922:109:0;;;;:::i;22288:968::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;22288:968:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32267:802::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32267:802:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;32267:802:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32267:802:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32267:802:0;;-1:-1:-1;32267:802:0;-1:-1:-1;32267:802:0;;;;;;;;;:::i;20015:116::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20015:116:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20015:116:0;;;;:::i;24156:673::-;24393:16;24411:14;24374:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24465:196:::1;24495:5;24515:4;24534:9;24558:14;24587:12;24622:4;24642:8;24465:15;:196::i;:::-;24438:223:::0;;-1:-1:-1;24438:223:0;-1:-1:-1;24672:51:0::1;24700:5:::0;24707:2;24438:223;24672:27:::1;:51::i;:::-;24740:4;24734:20;;;24755:9;24734:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24734:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24734:31:0;;;;24776:45;24807:2;24811:9;24776:30;:45::i;:::-;24156:673:::0;;;;;;;;;;:::o;31419:842::-;31633:21;31605:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31680:29:::1;31705:4;31680:29;:4:::0;;31685:15;;;31680:21;;::::1;;;;;;;;;;;;;:29;;;31672:70;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31763:52;31791:7;31800:8;31810:4;;31763:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31763:27:0::1;::::0;-1:-1:-1;;;31763:52:0:i:1;:::-;31753:62;;31865:12;31834:7;31859:1;31842:7;:14;:18;31834:27;;;;;;;;;;;;;;:43;;31826:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31935:138;31981:4;;31986:1;31981:7;;;;;;;;;;;;;;;31990:10;32002:48;32024:7;32033:4;;32038:1;32033:7;;;;;;;;;;;;;;;32042:4;;32047:1;32042:7;;;;;;;;;;;;;;;32002:21;:48::i;:::-;32052:7;32060:1;32052:10;;;;;;;;;;;;;;31935:31;:138::i;:::-;32084:35;32090:7;32099:4;;32084:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32113:4:0::1;::::0;-1:-1:-1;32084:5:0::1;::::0;-1:-1:-1;;32084:35:0:i:1;:::-;32136:4;32130:20;;;32151:7;32176:1;32159:7;:14;:18;32151:27;;;;;;;;;;;;;;32130:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32130:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32130:49:0;;;;32190:63;32221:2;32225:7;32250:1;32233:7;:14;:18;32225:27;;;;;;;;;;;;;;32190:30;:63::i;:::-;31419:842:::0;;;;;;;;;:::o;38070:250::-;38214:21;38260:52;38287:7;38296:9;38307:4;38260:26;:52::i;:::-;38253:59;;38070:250;;;;;:::o;24835:671::-;25141:12;25155;25180;25195:46;25217:7;25226:6;25234;25195:21;:46::i;:::-;25180:61;;25252:10;25265;:33;;25289:9;25265:33;;;25283:2;25265:33;25309:77;;;;;;25334:10;25309:77;;;;25354:4;25309:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25252:46;;-1:-1:-1;25309:24:0;;;;;;:77;;;;;-1:-1:-1;;25309:77:0;;;;;;;;-1:-1:-1;25309:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;25309:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25309:77:0;;;;25418:80;25434:6;25442;25450:9;25461:10;25473;25485:2;25489:8;25418:15;:80::i;:::-;25397:101;;;;;;;;24835:671;;;;;;;;;;;;;;;;:::o;18425:104::-;18480:4;18515:6;;;;;18504:17;;;;18425:104::o;28666:621::-;28890:21;28871:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28934:52:::1;28962:7;28971:8;28981:4;;28934:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28934:27:0::1;::::0;-1:-1:-1;;;28934:52:0:i:1;:::-;28924:62;;29036:12;29005:7;29030:1;29013:7;:14;:18;29005:27;;;;;;;;;;;;;;:43;;28997:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29106:138;29152:4;;29157:1;29152:7;;;;;;29106:138;29255:24;29261:7;29270:4;;29255:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29276:2:0;;-1:-1:-1;29255:5:0::1;::::0;-1:-1:-1;;29255:24:0:i:1;30593:820::-:0;30807:21;30779:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30854:29:::1;30879:4;30854:29;:4:::0;;30859:15;;;30854:21;;::::1;;;;;;;;;;;;;:29;;;30846:70;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30937:52;30964:7;30973:9;30984:4;;30937:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30937:26:0::1;::::0;-1:-1:-1;;;30937:52:0:i:1;:::-;30927:62;;31022:11;31008:7;31016:1;31008:10;;;;;;;;;;;;;;:25;;31000:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37233:282:::0;37400:14;37439:68;37466:8;37476:9;37487:10;37499:7;37439:26;:68::i;:::-;37432:75;37233:282;-1:-1:-1;;;;;37233:282:0:o;37523:281::-;37690:13;37728:68;37754:9;37765;37776:10;37788:7;37728:25;:68::i;26960:712::-;27278:14;27305:12;27320:43;27342:7;27351:5;27358:4;27320:21;:43::i;:::-;27305:58;;27374:10;27387;:33;;27411:9;27387:33;;;27405:2;27387:33;27431:77;;;;;;27456:10;27431:77;;;;27476:4;27431:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27374:46;;-1:-1:-1;27431:24:0;;;;;;:77;;;;;-1:-1:-1;;27431:77:0;;;;;;;;-1:-1:-1;27431:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;27431:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27431:77:0;;;;27531:133;27593:5;27600:9;27611:14;27627:12;27641:2;27645:8;27531:47;:133::i;:::-;27519:145;26960:712;-1:-1:-1;;;;;;;;;;;;;26960:712:0:o;34591:710::-;34825:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34846:136:::1;34892:4;;34897:1;34892:7;;;;;;;;;;;;;;;34901:10;34913:48;34935:7;34944:4;;34949:1;34944:7;;;;;;;;;;;;;;;34953:4;;34958:1;34953:7;;;;;;34913:48;34963:8;34846:31;:136::i;:::-;34993:18;35021:4:::0;;35026:15;;;35021:21;;::::1;;;;;;;;;;;;;35014:39;;;35054:2;35014:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35014:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35014:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;35014:43:0;35068:44:::1;::::0;;35014:43:::1;35068:44:::0;;::::1;::::0;;;;;;;;;;;35014:43;;-1:-1:-1;35068:44:0::1;::::0;;;35103:4;;;;;;35068:44;::::1;::::0;35103:4;;35068:44;35103:4;35068:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35109:2:0;;-1:-1:-1;35068:34:0::1;::::0;-1:-1:-1;;35068:44:0:i:1;:::-;35211:12:::0;35145:62:::1;35193:13:::0;35152:4;;35157:15;;;35152:21;;::::1;;;;;;;;;;;;;35145:39;;;35185:2;35145:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35145:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35145:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;35145:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;35123:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19743:1;34591:710:::0;;;;;;;:::o;18537:140::-;19081:19;19089:10;19081:7;:19::i;:::-;19073:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18636:1:::1;18620:6:::0;;18599:40:::1;::::0;::::1;18620:6:::0;;::::1;::::0;18599:40:::1;::::0;18636:1;;18599:40:::1;18667:1;18650:19:::0;;;::::1;::::0;;18537:140::o;36158:838::-;36425:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36459:29:::1;36484:4;36459:29;:4:::0;;36464:15;;;36459:21;;::::1;;;;;;;;;;;;;:29;;;36451:70;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36532:136;36578:4;;36583:1;36578:7;;;;;;36532:136;36679:55;36714:4;;36679:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36728:4:0::1;::::0;-1:-1:-1;36679:34:0::1;::::0;-1:-1:-1;;36679:55:0:i:1;:::-;36762:37;::::0;;;;;36793:4:::1;36762:37;::::0;::::1;::::0;;;36745:14:::1;::::0;36762:22:::1;36769:4;36762:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;36762:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36762:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;36762:37:0;;-1:-1:-1;36818:25:0;;::::1;;36810:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36907:4;36901:20;;;36922:9;36901:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36901:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36901:31:0;;;;36943:45;36974:2;36978:9;36943:30;:45::i;29898:689::-:0;30114:21;30086:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30172:4:::1;30161:15;;:4;;30166:1;30161:7;;;;;;;;;;;;;;;:15;;;30153:56;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30230:53;30258:7;30267:9;30278:4;;30230:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30230:27:0::1;::::0;-1:-1:-1;;;30230:53:0:i:1;:::-;30220:63;;30333:12;30302:7;30327:1;30310:7;:14;:18;30302:27;;;;;;;;;;;;;;:43;;30294:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30409:4;30403:19;;;30430:7;30438:1;30430:10;;;;;;;;;;;;;;30403:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30403:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30403:40:0;;;;;30467:4;30461:20;;;30482:48;30504:7;30513:4;;30518:1;30513:7;;;;;;30482:48;30532:7;30540:1;30532:10;;;;;;;;;;;;;;30461:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30461:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30461:82:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;30461:82:0;30454:90:::1;;;;30555:24;30561:7;30570:4;;30555:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30576:2:0;;-1:-1:-1;30555:5:0::1;::::0;-1:-1:-1;;30555:24:0:i:1;:::-;29898:689:::0;;;;;;;;:::o;29293:599::-;29517:21;29498:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29561:52:::1;29588:7;29597:9;29608:4;;29561:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29561:26:0::1;::::0;-1:-1:-1;;;29561:52:0:i:1;:::-;29551:62;;29646:11;29632:7;29640:1;29632:10;;;;;;;;;;;;;;:25;;29624:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18338:79:::0;18376:7;18403:6;;;18338:79;:::o;19581:37::-;;;;;;:::o;19536:38::-;;;:::o;37040:185::-;37137:12;37169:48;37189:7;37198:8;37208;37169:19;:48::i;:::-;37162:55;37040:185;-1:-1:-1;;;;37040:185:0:o;26254:700::-;26520:14;26501:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26563:196:::1;26593:5;26613:4;26632:9;26656:14;26685:12;26720:4;26740:8;26563:15;:196::i;:::-;26809:38;::::0;;;;;26841:4:::1;26809:38;::::0;::::1;::::0;;;26547:212;;-1:-1:-1;26770:78:0::1;::::0;-1:-1:-1;26798:5:0;;26805:2;;26809:23:::1;::::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;26809:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26809:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26809:38:0;26770:27:::1;:78::i;:::-;26865:4;26859:20;;;26880:9;26859:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26859:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26859:31:0;;;;26901:45;26932:2;26936:9;26901:30;:45::i;35307:845::-:0;35567:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35612:4:::1;35601:15;;:4;;35606:1;35601:7;;;;;;;;;;;;;;;:15;;;35593:56;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;35660:13;35676:9;35660:25;;35702:4;35696:19;;;35723:8;35696:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35696:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35696:38:0;;;;;35758:4;35752:20;;;35773:48;35795:7;35804:4;;35809:1;35804:7;;;;;;35773:48;35823:8;35752:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35752:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35752:80:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;35752:80:0;35745:88:::1;;;;35844:18;35872:4:::0;;35877:15;;;35872:21;;::::1;;;;;;;;;;;;;35865:39;;;35905:2;35865:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35865:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35865:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;35865:43:0;35919:44:::1;::::0;;35865:43:::1;35919:44:::0;;::::1;::::0;;;;;;;;;;;35865:43;;-1:-1:-1;35919:44:0::1;::::0;;;35954:4;;;;;;35919:44;::::1;::::0;35954:4;;35919:44;35954:4;35919:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35960:2:0;;-1:-1:-1;35919:34:0::1;::::0;-1:-1:-1;;35919:44:0:i:1;:::-;36062:12:::0;35996:62:::1;36044:13:::0;36003:4;;36008:15;;;36003:21;;::::1;;;;;;;;;;;;;35996:39;;;36036:2;35996:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;23299:851:0::0;23553:12;23567;23534:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23592:12:::1;23607:46;23629:7;23638:6;23646;23607:21;:46::i;:::-;23664:59;::::0;;;;;23695:10:::1;23664:59;::::0;::::1;::::0;:30:::1;::::0;::::1;:59:::0;;;;;;;;;;;;;;23592:61;;-1:-1:-1;23664:30:0;;::::1;::::0;:59;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;23664:30:0;:59;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23664:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23664:59:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;23791:26:0::1;::::0;;;;;:22:::1;:26:::0;;::::1;;::::0;::::1;::::0;;;23761:12:::1;::::0;;;23791:22;;::::1;::::0;::::1;::::0;:26;;;;;;;;;;;23761:12;23791:22;:26;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23791:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23791:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23791:26:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;23791:26:0;-1:-1:-1;23829:14:0::1;23848:40;23873:6:::0;23881;23848:24:::1;:40::i;:::-;23828:60;;;23930:6;23920:16;;:6;:16;;;:58;;23961:7;23970;23920:58;;;23940:7;23949;23920:58;23899:79:::0;;-1:-1:-1;23899:79:0;-1:-1:-1;23997:21:0;;::::1;;23989:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24090:10;24079:7;:21;;24071:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19743:1;;;;23299:851:::0;;;;;;;;;;;:::o;19488:41::-;;;:::o;37812:250::-;37956:21;38002:52;38030:7;38039:8;38049:4;38002:27;:52::i;25512:663::-;25801:16;25819:14;25846:12;25861:43;25883:7;25892:5;25899:4;25861:21;:43::i;:::-;25846:58;;25915:10;25928;:33;;25952:9;25928:33;;;25946:2;25928:33;25972:77;;;;;;25997:10;25972:77;;;;26017:4;25972:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25915:46;;-1:-1:-1;25972:24:0;;;;;;:77;;;;;-1:-1:-1;;25972:77:0;;;;;;;;-1:-1:-1;25972:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;25972:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25972:77:0;;;;26087:80;26106:5;26113:9;26124:14;26140:12;26154:2;26158:8;26087:18;:80::i;:::-;26060:107;;;;-1:-1:-1;25512:663:0;-1:-1:-1;;;;;;;;;;;;;25512:663:0:o;21550:732::-;21838:12;21852;21866:14;21819:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21914:85:::1;21928:6;21936;21944:14;21960;21976:10;21988;21914:13;:85::i;:::-;21893:106:::0;;-1:-1:-1;21893:106:0;-1:-1:-1;22010:12:0::1;22025:46;22047:7;22056:6:::0;22064;22025:21:::1;:46::i;:::-;22010:61;;22082:66;22114:6;22122:10;22134:4;22140:7;22082:31;:66::i;:::-;22159;22191:6;22199:10;22211:4;22217:7;22159:31;:66::i;:::-;22260:4;22248:22;;;22271:2;22248:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22248:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22248:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;22248:26:0;21550:732;;;;-1:-1:-1;22248:26:0;;-1:-1:-1;21550:732:0;;-1:-1:-1;;;;;;;;;21550:732:0:o;18922:109::-;19081:19;19089:10;19081:7;:19::i;:::-;19073:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18995:28:::1;19014:8;18995:18;:28::i;:::-;18922:109:::0;:::o;22288:968::-;22541:16;22559:14;22575;22522:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22629:176:::1;22657:5;22677:4;22696:18;22729:9;22753:14;22782:12;22629:13;:176::i;:::-;22602:203:::0;;-1:-1:-1;22602:203:0;-1:-1:-1;22816:12:0::1;22831:43;22853:7;22862:5:::0;22869:4:::1;22831:21;:43::i;:::-;22816:58;;22885:69;22917:5;22924:10;22936:4;22942:11;22885:31;:69::i;:::-;22971:4;22965:19;;;22992:9;22965:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;22965:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22965:39:0;;;;;23028:4;23022:20;;;23043:4;23049:9;23022:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23022:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23022:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23022:37:0;23015:45:::1;;;;23095:4;23083:22;;;23106:2;23083:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23083:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23083:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23083:26:0;;-1:-1:-1;23160:9:0::1;:21:::0;-1:-1:-1;23156:92:0::1;;;23183:65;23214:10;23238:9;23226;:21;23183:30;:65::i;:::-;19743:1;22288:968:::0;;;;;;;;;;;:::o;32267:802::-;32480:21;32452:8;19689:15;19677:8;:27;;19669:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32538:4:::1;32527:15;;:4;;32532:1;32527:7;;;;;;;;;;;;;;;:15;;;32519:56;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32596:52;32623:7;32632:9;32643:4;;32596:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32596:26:0::1;::::0;-1:-1:-1;;;32596:52:0:i:1;:::-;32586:62;;32681:9;32667:7;32675:1;32667:10;;;;;;;;;;;;;;:23;;32659:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32750:4;32744:19;;;32771:7;32779:1;32771:10;;;;;;;;;;;;;;32744:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32744:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32744:40:0;;;;;32808:4;32802:20;;;32823:48;32845:7;32854:4;;32859:1;32854:7;;;;;;32823:48;32873:7;32881:1;32873:10;;;;;;;;;;;;;;32802:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32802:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32802:82:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32802:82:0;32795:90:::1;;;;32896:24;32902:7;32911:4;;32896:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32917:2:0;;-1:-1:-1;32896:5:0::1;::::0;-1:-1:-1;;32896:24:0:i:1;:::-;32983:7;32991:1;32983:10;;;;;;;;;;;;;;32971:9;:22;32967:94;;;32995:66;33026:10;33050:7;33058:1;33050:10;;;;;;;;;;;;;;33038:9;:22;32995:30;:66::i;20015:116::-:0;19081:19;19089:10;19081:7;:19::i;:::-;19073:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20093:13:::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;20015:116::o;723:449::-;955:45;;;944:10;955:45;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;955:45:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;955:45:0;179:29:-1;160:49;;944:57:0;;;;909:12;;923:17;;944:10;;;;955:45;944:57;;;25:18:-1;944:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;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;;;944: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;;908:93:0;;;;1034:7;:57;;;;-1:-1:-1;1046:11:0;;:16;;:44;;;1077:4;1066:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1066:24:0;1046:44;1012:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;723:449;;;;;:::o;1686:217::-;1799:12;;;1759;1799;;;;;;;;;1777:7;;;;1792:5;;1777:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;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;;;1777:35: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;;1758:54:0;;;1831:7;1823:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1686:217;;;:::o;13406:551::-;13507:21;13564:1;13549:4;:11;:16;;13541:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13629:4;:11;13618:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13618:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;13618:23:0;;13608:33;;13665:8;13652:7;13660:1;13652:10;;;;;;;;;;;;;:21;;;;;13689:6;13684:266;13715:1;13701:4;:11;:15;13697:1;:19;13684:266;;;13739:14;13755:15;13774:42;13786:7;13795:4;13800:1;13795:7;;;;;;;;;;;;;;13804:4;13809:1;13813;13809:5;13804:11;;;;;;;;;;;;;;13774;:42::i;:::-;13738:78;;;;13848:90;13861:7;13869:1;13861:10;;;;;;;;;;;;;;13873:9;13884:10;13896:41;13907:7;13916:4;13921:1;13916:7;;;;;;;;;;;;;;13925:4;13930:1;13934;13930:5;13925:11;;;;;;;;;;;;;;13896:10;:41::i;:::-;13848:12;:90::i;:::-;13831:7;13839:1;13843;13839:5;13831:14;;;;;;;;;;;;;;;;;:107;-1:-1:-1;;13718:3:0;;13684:266;;;;13406:551;;;;;:::o;10486:478::-;10575:12;10601:14;10617;10635:26;10646:6;10654;10635:10;:26::i;:::-;10799:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;10799:32:0;;;;;10789:43;;;;;;10702:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10702:251:0;;;;;;;10692:262;;;;;;;;;10486:478;-1:-1:-1;;;;;10486:478:0:o;1180:498::-;1451:51;;;1440:10;1451:51;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1451:51:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;1451:51:0;179:29:-1;160:49;;1440:63:0;;;;1405:12;;1419:17;;1440:10;;;;1451:51;1440:63;;;25:18:-1;1440:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;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;;;1440: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;;1404:99:0;;;;1536:7;:57;;;;-1:-1:-1;1548:11:0;;:16;;:44;;;1579:4;1568:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1568:24:0;1548:44;1514:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1180:498;;;;;;:::o;27783:877::-;27890:6;27885:768;27916:1;27902:4;:11;:15;27898:1;:19;27885:768;;;27940:13;27955:14;27974:4;27979:1;27974:7;;;;;;;;;;;;;;27983:4;27988:1;27992;27988:5;27983:11;;;;;;;;;;;;;;27939:56;;;;28011:14;28030:39;28055:5;28062:6;28030:24;:39::i;:::-;28010:59;;;28084:14;28101:7;28109:1;28113;28109:5;28101:14;;;;;;;;;;;;;;28084:31;;28131:15;28148;28176:6;28167:15;;:5;:15;;;:61;;28209:9;28225:1;28167:61;;;28191:1;28195:9;28167:61;28247:13;;28130:98;;-1:-1:-1;28130:98:0;-1:-1:-1;28247:27:0;:13;:27;28243:140;;28310:13;;28295:72;;;;;;28330:10;28295:72;;;;28310:13;28295:72;;;;;;;;;;;;;;;;;;;;;;28310:13;;;;;28295:34;;:72;;;;;;;;;;;;;;28310:13;;28295:72;;;2:2:-1;;;;27:1;24;17:12;2:2;28295:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28295:72:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;28243:140:0;28397:10;28428:1;28414:4;:11;:15;28410:1;:19;:79;;28486:3;28410:79;;;28432:51;28454:7;28463:6;28471:4;28476:1;28480;28476:5;28471:11;;;;;;;;;;;;;;28432:21;:51::i;:::-;28397:92;;28516:45;28538:7;28547:5;28554:6;28516:21;:45::i;:::-;28504:63;;;28586:10;28598;28610:2;28624:1;28614:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;28614:12:0;87:42:-1;143:17;;-1:-1;28614:12:0;;28504:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;28504:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28504:137:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;27919:3:0;;;;;-1:-1:-1;27885:768:0;;-1:-1:-1;;;;;;;;27885:768:0;;;27783:877;;;:::o;14038:572::-;14139:21;14196:1;14181:4;:11;:16;;14173:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14261:4;:11;14250:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14250:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14250:23:0;;14240:33;;14314:9;14284:7;14309:1;14292:7;:14;:18;14284:27;;;;;;;;;;;;;;;;;:39;14348:11;;:15;;14334:269;14365:5;;14334:269;;14393:14;14409:15;14428:42;14440:7;14449:4;14458:1;14454;:5;14449:11;;;;;;;;;;;;;;14462:4;14467:1;14462:7;;;;;;;14428:42;14392:78;;;;14502:89;14514:7;14522:1;14514:10;;;;;;;;;;;;;;14526:9;14537:10;14549:41;14560:7;14569:4;14578:1;14574;:5;14569:11;;;;;;;;;;;;;;14582:4;14587:1;14582:7;;;;;;;14549:41;14502:11;:89::i;:::-;14485:7;14497:1;14493;:5;14485:14;;;;;;;;;;;;;;;;;:106;-1:-1:-1;;14372:3:0;;14334:269;;12158:545;12265:14;12311:1;12300:8;:12;12292:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12388:1;12376:9;:13;:31;;;;;12406:1;12393:10;:14;12376:31;12368:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12460:20;12483:37;12496:23;12501:4;12511:7;12496:23;:14;:23;:::i;:::-;12483:8;;:37;:12;:37;:::i;:::-;12460:60;-1:-1:-1;12531:14:0;12548:31;12460:60;12568:10;12548:31;:19;:31;:::i;:::-;12531:48;-1:-1:-1;12590:16:0;12609:40;12633:15;12609:19;:9;12623:4;12609:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;12590:59;;12684:11;12672:9;:23;;;;;;;12158:545;-1:-1:-1;;;;;;;;12158:545:0:o;12824:500::-;12931:13;12977:1;12965:9;:13;12957:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13055:1;13043:9;:13;:31;;;;;13073:1;13060:10;:14;13043:31;13035:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13127:14;13144:34;13173:4;13144:24;:9;13158;13144:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;13127:51;-1:-1:-1;13189:16:0;13208:54;13238:23;13243:4;13253:7;13238:23;:14;:23;:::i;:::-;13208:25;:10;13223:9;13208:25;:14;:25;:::i;:54::-;13189:73;;13284:32;13314:1;13297:11;13285:9;:23;;;;;;;13284:32;:29;:32;:::i;:::-;13273:43;12824:500;-1:-1:-1;;;;;;;12824:500:0:o;33216:1369::-;33329:6;33324:1254;33355:1;33341:4;:11;:15;33337:1;:19;33324:1254;;;33379:13;33394:14;33413:4;33418:1;33413:7;;;;;;;;;;;;;;33422:4;33427:1;33431;33427:5;33422:11;;;;;;;;;;;;;;33378:56;;;;33450:14;33469:39;33494:5;33501:6;33469:24;:39::i;:::-;33449:59;;;33523:16;33554:45;33576:7;33585:5;33592:6;33554:21;:45::i;:::-;33523:77;;33615:16;33646:17;33734:13;33749;33767:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33767:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33767:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33767:18:0;;;;;;;33733:52;;;;;-1:-1:-1;33733:52:0;;-1:-1:-1;33801:17:0;;33842:15;;;;;;;;:61;;33884:8;33894;33842:61;;;33861:8;33871;33842:61;33800:103;;;;33932:56;33975:12;33939:5;33932:23;;;33964:4;33932:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;33932:56:0;33918:70;;34018:84;34045:11;34058:12;34072:13;34087:4;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34087:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34087:14:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34087:14:0;34018:84;;:26;:84::i;:::-;34136:13;;34003:99;;-1:-1:-1;34136:27:0;:13;:27;;-1:-1:-1;34132:143:0;;-1:-1:-1;;;34132:143:0;34199:13;;34184:75;;;;;;34219:10;34184:75;;;;34199:13;34184:75;;;;;;;;;;;;;;;;;;;;;;34199:13;;;;;34184:34;;:75;;;;;;;;;;;;;;34199:13;;34184:75;;;2:2:-1;;;;27:1;24;17:12;2:2;34184:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34184:75:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;34132:143:0;34290:15;34307;34335:6;34326:15;;:5;:15;;;:67;;34371:12;34390:1;34326:67;;;34350:1;34354:12;34326:67;34289:104;;;;34408:10;34439:1;34425:4;:11;:15;34421:1;:19;:79;;34497:3;34421:79;;;34443:51;34465:7;34474:6;34482:4;34487:1;34491;34487:5;34482:11;;;;;;;34443:51;34553:12;;;34563:1;34553:12;;;;;;;;;;34515:51;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;34408:92;;-1:-1:-1;34515:9:0;;;;;;34525:10;;34537;;34408:92;;34553:12;;34515:51;;;;;;;;34553:12;;34515:51;;;;34553: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;34515:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34515:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;33358:3:0;;;;;-1:-1:-1;33324:1254:0;;-1:-1:-1;;;;;;;;;;33324:1254:0;9603:129;9687:5;;;9682:16;;;;9674:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11721:315;11803:12;11846:1;11836:7;:11;11828:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11916:1;11905:8;:12;:28;;;;;11932:1;11921:8;:12;11905:28;11897:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12020:8;11996:21;:7;12008:8;11996:21;:11;:21;:::i;:::-;:32;;;;;;;11721:315;-1:-1:-1;;;;11721:315:0:o;10051:343::-;10126:14;10142;10187:6;10177:16;;:6;:16;;;;10169:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10271:6;10262:15;;:6;:15;;;:53;;10300:6;10308;10262:53;;;10281:6;10289;10262:53;10243:72;;-1:-1:-1;10243:72:0;-1:-1:-1;10334:20:0;;;10326:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10051:343;;;;;:::o;20171:1373::-;20484:47;;;;;;:61;:47;;;;;;;;;;;;;;;;20389:12;;;;;;20499:7;20484:31;;;;;;:47;;;;;;;;;;;;;;;:31;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;20484:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20484:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20484:47:0;:61;;;20480:144;;;20562:50;;;;;;:34;:50;;;;;;;;;;;;;;;;20577:7;20562:34;;;;;;:50;;;;;;;;;;;;;;;-1:-1:-1;20562:34:0;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;20562:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20562:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;20480:144:0;20635:13;20650;20667:50;20693:7;20702:6;20710;20667:25;:50::i;:::-;20634:83;;;;20732:8;20744:1;20732:13;:30;;;;-1:-1:-1;20749:13:0;;20732:30;20728:809;;;20801:14;;-1:-1:-1;20817:14:0;;-1:-1:-1;20728:809:0;;;20865:19;20887:55;20907:14;20923:8;20933;20887:19;:55::i;:::-;20865:77;;20979:14;20961;:32;20957:569;;21040:10;21022:14;:28;;21014:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21133:14;;-1:-1:-1;21149:14:0;-1:-1:-1;21149:14:0;20957:569;;;21205:19;21227:55;21247:14;21263:8;21273;21227:19;:55::i;:::-;21205:77;;21326:14;21308;:32;;21301:40;;;;21386:10;21368:14;:28;;21360:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21479:14;-1:-1:-1;21495:14:0;;-1:-1:-1;20957:569:0;20728:809;;20171:1373;;;;;;;;;;;:::o;18685:229::-;18759:22;;;18751:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18861:6;;;18840:38;;;;;;;18861:6;;;18840:38;;;18889:6;:17;;;;;;;;;;;;;;;18685:229::o;11220:388::-;11313:13;11328;11355:14;11374:26;11385:6;11393;11374:10;:26::i;:::-;11354:46;;;11412:13;11427;11457:32;11465:7;11474:6;11482;11457:7;:32::i;:::-;11445:57;;;:59;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11445:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11445:59:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11445:59:0;;;;;;;11411:93;;;;;-1:-1:-1;11411:93:0;;-1:-1:-1;11538:16:0;;;;;;;;:62;;11581:8;11591;11538:62;;;11558:8;11568;11538:62;11515:85;;;;-1:-1:-1;11220:388:0;-1:-1:-1;;;;;;;11220:388:0:o;10972:190::-;11064:12;11111:32;11119:7;11128:6;11136;11111:7;:32::i;:::-;11099:53;;;:55;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11099:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11099:55:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11099:55:0;11089:65;;;10972:190;-1:-1:-1;;;;10972:190:0:o;9740:142::-;9792:6;9819;;;:30;;-1:-1:-1;;9834:5:0;;;9848:1;9843;9834:5;9843:1;9829:15;;;;;:20;9819:30;9811:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9467:128;9551:5;;;9546:16;;;;9538:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

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