Contract 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a 1

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x3caa3822ff05f89e63b6c81647cdc62cced28892cfcc7b7c858df993cd060a09Add Liquidity121465822021-10-27 22:04:351 min ago0x71dfd74bdb8dbef189684141b26d85609cf25ab1 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.000995255
0x29511f4a8f0d19860951fb181196b50a22ed32c2262aa517a10019b5eb50fdffSwap Exact Token...121465042021-10-27 22:00:415 mins ago0x1dbdddb335568a2b76e290fbee287b1bb1f4cf42 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.000707445
0x134451f314945d7bb535c712fdbe8a8637a20d6c7b14458f12bcc45b428e1265Swap Exact Token...121464902021-10-27 21:59:596 mins ago0x1dbdddb335568a2b76e290fbee287b1bb1f4cf42 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.00056464
0x7a8c02bc9509d5d7951c41357b648ddce4496a7757a130ef5f8d36d6d2f92889Remove Liquidity...121464772021-10-27 21:59:206 mins ago0x1dbdddb335568a2b76e290fbee287b1bb1f4cf42 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.000907475
0x27cdad9f25f3edb1f850b99759002e1b85fce9655d06a97196979faecc21649bAdd Liquidity121464452021-10-27 21:57:448 mins ago0x1dc0557ecf65b6caf21142de6bee2fd0fe2600d6 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.00081432
0x879b89d7af5d6a95692c9b8b7c36ae35a72af285442344605f28b16d30717b0bSwap Exact ETH F...121463642021-10-27 21:53:4112 mins ago0x52047025054beafafe9743187babb9e3784e1da2 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0.348124638 BNB0.000621565
0x7c3a57fe4c237027533ce32f6aa743fa2f53cd062204a53158e2088b7ec64988Swap Exact Token...121462732021-10-27 21:49:0817 mins ago0xd5c760f3e3f2df78fd4ff0046e5e92ca0a62291f IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.000549695
0xcb105fc01b62c414b1bb41d24056c9dca5058f36b12fc9727eb75ad9194e7602Remove Liquidity...121462612021-10-27 21:48:3217 mins ago0xde4ca597e649cb6d568c10dc3f97c4e859f52eb2 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.00112808
0xb4cc67d6e1b5dd22985a8200468954f92ab09f2fdcb95fdea9b7f817b096b024Swap Exact Token...121462572021-10-27 21:48:2017 mins ago0xefbd1940dc13e1fd986cbea279e956e1e23369e6 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.000474615
0x141c9cc7f98049df9621260580f2a286e6c4c1a212af87ba5417182c77a6ddd7Swap ETH For Exa...121462232021-10-27 21:46:3819 mins ago0xad9f02e4b77d3e9a6e9a40a0309e357ca2952bc7 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0.559158996230402 BNB0.000662665
0x7566d9cc5988ca228cec3b0e63ae384bc761e415d8de25ee41db1ca7941e4458Add Liquidity121461632021-10-27 21:43:3722 mins ago0x6d2348d8ac3d99a0c826531cdb6276d1f49b976b IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.00092778
0x8e38aedae7a65a9d9dbcfa3fa6a41f5a00b2481b1463e0c8e9e98373f09951c7Swap Exact Token...121461432021-10-27 21:42:3723 mins ago0x6d2348d8ac3d99a0c826531cdb6276d1f49b976b IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.000624615
0x8633f91729daf24332ce9ad18b9990b7cbe2a8ec9dbfa9e0dabf79365024a843Swap Exact Token...121461212021-10-27 21:41:3124 mins ago0xde4ca597e649cb6d568c10dc3f97c4e859f52eb2 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.001023795
0xcaa1d592fec896110749b29d47dd493a09e379aa7c1cd9b4bb8c12c9ca5e5255Add Liquidity121460042021-10-27 21:35:4030 mins ago0x12b6acbb9da36db8ba518b75a793ffc62b589f2d IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.00097456
0xcbccff08cf4e0f76efe8a970f2cc4e3f19ac91cdd8583deb6350f2648b504341Remove Liquidity...121457942021-10-27 21:25:1040 mins ago0x9231a8fa75479d4b8cbf7ea415af027307d6d36c IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.00085603
0x7159b7b0a1190c2c4f69cc4e9699a05f653b66a48ec0010f2d0b189b5c17e6c4Swap Exact Token...121457912021-10-27 21:25:0141 mins ago0xba96d5af1bc3258ad0f3c5f0a7dc86231f293045 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.000549575
0xb3d630d876947bb513b18f475c2b3a69085283968035a56a520c5c521dbb2576Swap Exact Token...121457082021-10-27 21:20:5245 mins ago0xb2128fccc0c230e365c5f4a58e5d137a16046298 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.00126029
0x4fc1613e3f1098533688344951224b9d99638a21bc400ee2259c35e036f605a9Swap Exact Token...121456252021-10-27 21:16:4349 mins ago0xb8eb90d8911f278ebdf953f7dc2f778b1c4a1057 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.000781505
0xdc85f6b165ac59c1302865d564d235d3020f2600d21e7a9b236f574027e04fc8Remove Liquidity...121455922021-10-27 21:15:0451 mins ago0xb8eb90d8911f278ebdf953f7dc2f778b1c4a1057 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.00117312
0x91db277a1a5c9831b2f0d6084b0491813d8242fe0412a935a2fb28911788b9eaSwap ETH For Exa...121455852021-10-27 21:14:4351 mins ago0x37be093523c1c15da55e6aef3716ff23a0dcba09 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0.016968746891912 BNB0.000891305
0x91053bdc8340a191fd0e27869b8239a6662a7ca1a3199e1e6d0a210448bdbd37Swap Exact ETH F...121454912021-10-27 21:10:0156 mins ago0x43cb8c1bbb08175485575a89081c78a40aeb3e84 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0.32 BNB0.000673195
0x9b7d2cb734c90658010754bb260c67706fd8b6941d6fc6895822c395a9c1ccecSwap Exact Token...121454772021-10-27 21:09:1956 mins ago0x28708db9724483cf01e8d07a0375f99d18975eb8 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0 BNB0.000549735
0xa6b16581ac14679c32068db1978dcff3f44e0a98ae0133d56c63d49691383f9cSwap Exact ETH F...121452292021-10-27 20:56:551 hr 9 mins ago0x002e9f823aaef415cce64af523c46b08e0704680 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0.10305222 BNB0.00062271
0x8e9c3023820a1bfc94caa87e021c3291c98274fda5691644fe626b346c1a4319Swap Exact ETH F...121451622021-10-27 20:53:341 hr 12 mins ago0xe4ee11ca6e025bccce0d6d03052ee6ef6f494e07 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0.15 BNB0.00062277
0x6527b874ea57838088be33b06da6af6b2596cfdd05af3998adc6ed3e6b2a422aSwap Exact ETH F...121451102021-10-27 20:50:581 hr 15 mins ago0xcc8b0d940f3c450593b06e92e74c96b7908765f1 IN  0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0.115 BNB0.00054777
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x29511f4a8f0d19860951fb181196b50a22ed32c2262aa517a10019b5eb50fdff121465042021-10-27 22:00:415 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0x1dbdddb335568a2b76e290fbee287b1bb1f4cf420.020986928903164933 BNB
0x29511f4a8f0d19860951fb181196b50a22ed32c2262aa517a10019b5eb50fdff121465042021-10-27 22:00:415 mins ago Binance: WBNB Token 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0.020986928903164933 BNB
0x134451f314945d7bb535c712fdbe8a8637a20d6c7b14458f12bcc45b428e1265121464902021-10-27 21:59:596 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0x1dbdddb335568a2b76e290fbee287b1bb1f4cf420.506181152274057418 BNB
0x134451f314945d7bb535c712fdbe8a8637a20d6c7b14458f12bcc45b428e1265121464902021-10-27 21:59:596 mins ago Binance: WBNB Token 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0.506181152274057418 BNB
0x879b89d7af5d6a95692c9b8b7c36ae35a72af285442344605f28b16d30717b0b121463642021-10-27 21:53:4112 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a Binance: WBNB Token0.348124638 BNB
0x141c9cc7f98049df9621260580f2a286e6c4c1a212af87ba5417182c77a6ddd7121462232021-10-27 21:46:3819 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0xad9f02e4b77d3e9a6e9a40a0309e357ca2952bc70.006630343828819007 BNB
0x141c9cc7f98049df9621260580f2a286e6c4c1a212af87ba5417182c77a6ddd7121462232021-10-27 21:46:3819 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a Binance: WBNB Token0.552528652401583938 BNB
0xcbccff08cf4e0f76efe8a970f2cc4e3f19ac91cdd8583deb6350f2648b504341121457942021-10-27 21:25:1040 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0x9231a8fa75479d4b8cbf7ea415af027307d6d36c11.671278900571880962 BNB
0xcbccff08cf4e0f76efe8a970f2cc4e3f19ac91cdd8583deb6350f2648b504341121457942021-10-27 21:25:1040 mins ago Binance: WBNB Token 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a11.671278900571880962 BNB
0xdc85f6b165ac59c1302865d564d235d3020f2600d21e7a9b236f574027e04fc8121455922021-10-27 21:15:0451 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0xb8eb90d8911f278ebdf953f7dc2f778b1c4a10571.256824911147111056 BNB
0xdc85f6b165ac59c1302865d564d235d3020f2600d21e7a9b236f574027e04fc8121455922021-10-27 21:15:0451 mins ago Binance: WBNB Token 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a1.256824911147111056 BNB
0x91db277a1a5c9831b2f0d6084b0491813d8242fe0412a935a2fb28911788b9ea121455852021-10-27 21:14:4351 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0x37be093523c1c15da55e6aef3716ff23a0dcba090.001554235613799342 BNB
0x91db277a1a5c9831b2f0d6084b0491813d8242fe0412a935a2fb28911788b9ea121455852021-10-27 21:14:4351 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a Binance: WBNB Token0.015414511278113643 BNB
0xe7a1caf0f749671f95aaacfc34238cbde4728256ae6d59a5f1e64129b09a95e9121455762021-10-27 21:14:1651 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a Binance: WBNB Token0.00000000000002677 BNB
0xe7a1caf0f749671f95aaacfc34238cbde4728256ae6d59a5f1e64129b09a95e9121455762021-10-27 21:14:1651 mins ago Ketchup Finance: KETCHUP Token 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0.00000000000002677 BNB
0xe7a1caf0f749671f95aaacfc34238cbde4728256ae6d59a5f1e64129b09a95e9121455762021-10-27 21:14:1651 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a Ketchup Finance: KETCHUP Token0.00000000000002677 BNB
0xe7a1caf0f749671f95aaacfc34238cbde4728256ae6d59a5f1e64129b09a95e9121455762021-10-27 21:14:1651 mins ago Binance: WBNB Token 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0.00000000000002677 BNB
0x91053bdc8340a191fd0e27869b8239a6662a7ca1a3199e1e6d0a210448bdbd37121454912021-10-27 21:10:0156 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a Binance: WBNB Token0.32 BNB
0xa6b16581ac14679c32068db1978dcff3f44e0a98ae0133d56c63d49691383f9c121452292021-10-27 20:56:551 hr 9 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a Binance: WBNB Token0.10305222 BNB
0x8e9c3023820a1bfc94caa87e021c3291c98274fda5691644fe626b346c1a4319121451622021-10-27 20:53:341 hr 12 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a Binance: WBNB Token0.15 BNB
0x6527b874ea57838088be33b06da6af6b2596cfdd05af3998adc6ed3e6b2a422a121451102021-10-27 20:50:581 hr 15 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a Binance: WBNB Token0.115 BNB
0x6450da9f8fa1c2bd84267b2328748566283bebb4a4c56462cac28eb29381db79121451032021-10-27 20:50:371 hr 15 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0x1a62bf6c360bde5bbcc44f113c032cfc20eb5f520.037076313185239763 BNB
0x6450da9f8fa1c2bd84267b2328748566283bebb4a4c56462cac28eb29381db79121451032021-10-27 20:50:371 hr 15 mins ago Binance: WBNB Token 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a0.037076313185239763 BNB
0xfb8f577b0e6cfde84bf9f303124588871a0a74e1931535f93c9cbc4e967fa4d1121450452021-10-27 20:47:431 hr 18 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a Binance: WBNB Token0.157915883947611989 BNB
0x883f43292c80112cd800b0fa34fce20ff980f096bb69f50b62fc42b0eb6e40a4121450132021-10-27 20:46:071 hr 20 mins ago 0x933daea3a5995fb94b14a7696a5f3ffd7b1e385a Binance: WBNB Token0.01 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CafeRouter02

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 999999 runs

Other Settings:
istanbul EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-03-21
*/

// File: contracts/libraries/TransferHelper.sol

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

pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        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');
    }
}

// File: contracts/interfaces/ICafeRouter01.sol

pragma solidity >=0.6.2;

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

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

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

// File: contracts/interfaces/ICafeRouter02.sol

pragma solidity >=0.6.2;


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

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

// File: contracts/interfaces/ICafePair.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// File: contracts/libraries/SafeMath.sol

pragma solidity =0.6.6;

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

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

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

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

// File: contracts/libraries/CafeLibrary.sol

pragma solidity >=0.5.0;



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

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

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

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

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

// File: contracts/interfaces/ICafeFactory.sol

pragma solidity >=0.5.0;

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

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

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

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

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

// File: contracts/interfaces/IERC20.sol

pragma solidity >=0.5.0;

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

// File: contracts/interfaces/IWETH.sol

pragma solidity >=0.5.0;

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

// File: contracts/CafeRouter02.sol

pragma solidity =0.6.6;








contract CafeRouter02 is ICafeRouter02 {
    using SafeMath for uint;

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

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

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

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

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

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

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

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

    function getAmountsIn(uint amountOut, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return CafeLibrary.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"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b506040516200573238038062005732833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6155ab62000187600039806101ac5280610e5d5280610e985280610fd5528061129852806116f252806118d65280611e1e5280611fa252806120725280612179528061232c52806123c15280612673528061271a52806127ef52806128f452806129dc5280612a5d52806130ec5280613422528061347852806134ac528061352d528061374752806138f7528061398c5250806110c752806111c5528061136b52806113a4528061154f52806117e452806118b45280611aa1528061225f528061240052806125a95280612a9c5280612ddf5280613071528061309a52806130ca52806132a75280613456528061382d52806139cb5280614434528061447752806147d752806149b85280614f5f528061504052806150c052506155ab6000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d97565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612105565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b5080359060208101359060400135612525565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612532565b34801561096057600080fd5b50610969612671565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612695565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356126a2565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612882565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612d65565b348015610b3157600080fd5b5061096961306f565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613093945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356130c0565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613218565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356133a7565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356136d3565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612d65565b9093509150610e96898685613b22565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613ce9565b50965096945050505050565b6000610f44848484613e26565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616665526f757465723a20494e56414c49445f504154480000000000000000604482015290519081900360640190fd5b6111207f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f4a92505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153ea6026913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140b0565b8560008151811061124a57fe5b602002602001015161419b565b6112968287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061436b915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613ce9565b509695505050505050565b60606113917f000000000000000000000000000000000000000000000000000000000000000084846145f2565b90505b92915050565b60008060006113ca7f00000000000000000000000000000000000000000000000000000000000000008f8f6140b0565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612d65565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f4a92505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153ea6026913960400191505060405180910390fd5b61162a868660008181106111a257fe5b6113598287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061436b915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616665526f757465723a20494e56414c49445f504154480000000000000000604482015290519081900360640190fd5b61183d7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145f292505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154da6022913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006140b0565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d6126a2565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a61419b565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bc657600080fd5b505afa158015611bda573d6000803e3d6000fd5b505050506040513d6020811015611bf057600080fd5b50516040805160208881028281018201909352888252929350611c32929091899189918291850190849080828437600092019190915250889250614780915050565b86611d368288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c6557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b505afa158015611d12573d6000803e3d6000fd5b505050506040513d6020811015611d2857600080fd5b50519063ffffffff614b1316565b1015611d8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153ea6026913960400191505060405180910390fd5b5050505050505050565b8042811015611e0757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e6c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f0b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616665526f757465723a20494e56414c49445f504154480000000000000000604482015290519081900360640190fd5b611f1b85856000818110611a7e57fe5b611f59858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614780915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611fe957600080fd5b505afa158015611ffd573d6000803e3d6000fd5b505050506040513d602081101561201357600080fd5b5051905086811015612070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153ea6026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b50505050611d8d8482613ce9565b6060814281101561217757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106121bb57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461225a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616665526f757465723a20494e56414c49445f504154480000000000000000604482015290519081900360640190fd5b6122b87f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f4a92505050565b915086826001845103815181106122cb57fe5b6020026020010151101561232a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153ea6026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061237357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123a657600080fd5b505af11580156123ba573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61242c7f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061243957fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156124aa57600080fd5b505af11580156124be573d6000803e3d6000fd5b505050506040513d60208110156124d457600080fd5b50516124dc57fe5b61251b8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061436b915050565b5095945050505050565b6000610f44848484614b85565b606081428110156125a457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b6126027f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145f292505050565b9150868260008151811061261257fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154da6022913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614ca9565b6000814281101561271457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b612743887f00000000000000000000000000000000000000000000000000000000000000008989893089612d65565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290519194506127ed92508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b1580156127bc57600080fd5b505afa1580156127d0573d6000803e3d6000fd5b505050506040513d60208110156127e657600080fd5b5051613b22565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050506113598483613ce9565b80428110156128f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168585600081811061293657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129d557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616665526f757465723a20494e56414c49445f504154480000000000000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a4257600080fd5b505af1158015612a56573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612ac87f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b3257600080fd5b505af1158015612b46573d6000803e3d6000fd5b505050506040513d6020811015612b5c57600080fd5b5051612b6457fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b9457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c2d57600080fd5b505afa158015612c41573d6000803e3d6000fd5b505050506040513d6020811015612c5757600080fd5b50516040805160208981028281018201909352898252929350612c999290918a918a918291850190849080828437600092019190915250899250614780915050565b87611d368289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612ccc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b6000808242811015612dd857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b6000612e057f00000000000000000000000000000000000000000000000000000000000000008c8c6140b0565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612e8657600080fd5b505af1158015612e9a573d6000803e3d6000fd5b505050506040513d6020811015612eb057600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612f2357600080fd5b505af1158015612f37573d6000803e3d6000fd5b505050506040513d6040811015612f4d57600080fd5b50805160209091015190925090506000612f678e8e614d9f565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612fa4578183612fa7565b82825b90975095508a871015613005576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806154756021913960400191505060405180910390fd5b8986101561305e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806154b96021913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484613f4a565b60008060006131107f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006140b0565b905060008761311f578c613141565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156131dd57600080fd5b505af11580156131f1573d6000803e3d6000fd5b505050506132038e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b6000806000834281101561328d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b61329b8c8c8c8c8c8c614f08565b909450925060006132cd7f00000000000000000000000000000000000000000000000000000000000000008e8e6140b0565b90506132db8d33838861419b565b6132e78c33838761419b565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561336657600080fd5b505af115801561337a573d6000803e3d6000fd5b505050506040513d602081101561339057600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561341c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b61344a8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614f08565b9094509250600061349c7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006140b0565b90506134aa8b33838861419b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561351257600080fd5b505af1158015613526573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156135d257600080fd5b505af11580156135e6573d6000803e3d6000fd5b505050506040513d60208110156135fc57600080fd5b505161360457fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561368357600080fd5b505af1158015613697573d6000803e3d6000fd5b505050506040513d60208110156136ad57600080fd5b50519250348410156136c5576136c533853403613ce9565b505096509650969350505050565b6060814281101561374557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f43616665526f757465723a204558504952454400000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061378957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461382857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616665526f757465723a20494e56414c49445f504154480000000000000000604482015290519081900360640190fd5b6138867f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145f292505050565b9150348260008151811061389657fe5b602002602001015111156138f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154da6022913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061393e57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561397157600080fd5b505af1158015613985573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6139f77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b84600081518110613a0457fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613a7557600080fd5b505af1158015613a89573d6000803e3d6000fd5b505050506040513d6020811015613a9f57600080fd5b5051613aa757fe5b613ae68287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061436b915050565b81600081518110613af357fe5b602002602001015134111561251b5761251b3383600081518110613b1357fe5b60200260200101513403613ce9565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613bf857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613bbb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c5a576040519150601f19603f3d011682016040523d82523d6000602084013e613c5f565b606091505b5091509150818015613c8d575080511580613c8d5750808060200190516020811015613c8a57600080fd5b50515b613ce2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180615523602d913960400191505060405180910390fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613d6057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613d23565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613dc2576040519150601f19603f3d011682016040523d82523d6000602084013e613dc7565b606091505b5050905080613e21576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806154416034913960400191505060405180910390fd5b505050565b6000808411613e80576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806155506026913960400191505060405180910390fd5b600083118015613e905750600082115b613ee5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154966023913960400191505060405180910390fd5b6000613ef9856103e663ffffffff61520916565b90506000613f0d828563ffffffff61520916565b90506000613f3383613f27886103e863ffffffff61520916565b9063ffffffff61528f16565b9050808281613f3e57fe5b04979650505050505050565b6060600282511015613fbd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f436166654c6962726172793a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613fd557600080fd5b50604051908082528060200260200182016040528015613fff578160200160208202803683370190505b509050828160008151811061401057fe5b60200260200101818152505060005b60018351038110156140a8576000806140628786858151811061403e57fe5b602002602001015187866001018151811061405557fe5b6020026020010151615301565b9150915061408484848151811061407557fe5b60200260200101518383613e26565b84846001018151811061409357fe5b6020908102919091010152505060010161401f565b509392505050565b60008060006140bf8585614d9f565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f90bcdb5d0bf0e8db3852b0b7d7e05cc8f7c6eb6d511213c5ba02d1d1dbeda8d3609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061427957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161423c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146142db576040519150601f19603f3d011682016040523d82523d6000602084013e6142e0565b606091505b509150915081801561430e57508051158061430e575080806020019051602081101561430b57600080fd5b50515b614363576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806154106031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156145ec5760008084838151811061438957fe5b60200260200101518584600101815181106143a057fe5b60200260200101519150915060006143b88383614d9f565b50905060008785600101815181106143cc57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461441457826000614418565b6000835b91509150600060028a5103881061442f5788614470565b6144707f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061446357fe5b60200260200101516140b0565b905061449d7f000000000000000000000000000000000000000000000000000000000000000088886140b0565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156144e7576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561457257818101518382015260200161455a565b50505050905090810190601f16801561459f5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156145c157600080fd5b505af11580156145d5573d6000803e3d6000fd5b50506001909901985061436e975050505050505050565b50505050565b606060028251101561466557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f436166654c6962726172793a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561467d57600080fd5b506040519080825280602002602001820160405280156146a7578160200160208202803683370190505b50905082816001835103815181106146bb57fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b80156140a85760008061471b8786600186038151811061470757fe5b602002602001015187868151811061405557fe5b9150915061473d84848151811061472e57fe5b60200260200101518383614b85565b84600185038151811061474c57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016146eb565b60005b6001835103811015613e215760008084838151811061479e57fe5b60200260200101518584600101815181106147b557fe5b60200260200101519150915060006147cd8383614d9f565b50905060006147fd7f000000000000000000000000000000000000000000000000000000000000000085856140b0565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561484b57600080fd5b505afa15801561485f573d6000803e3d6000fd5b505050506040513d606081101561487557600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146148bf5782846148c2565b83835b91509150614947828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b9550614954868383613e26565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146149985782600061499c565b6000835b91509150600060028c51038a106149b3578a6149e7565b6149e77f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061446357fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614a97578181015183820152602001614a7f565b50505050905090810190601f168015614ac45780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614ae657600080fd5b505af1158015614afa573d6000803e3d6000fd5b50506001909b019a506147839950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614bdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154fc6027913960400191505060405180910390fd5b600083118015614bef5750600082115b614c44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154966023913960400191505060405180910390fd5b6000614c686103e8614c5c868863ffffffff61520916565b9063ffffffff61520916565b90506000614c826103e6614c5c868963ffffffff614b1316565b9050614c9f6001828481614c9257fe5b049063ffffffff61528f16565b9695505050505050565b6000808411614d1957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f436166654c6962726172793a20494e53554646494349454e545f414d4f554e54604482015290519081900360640190fd5b600083118015614d295750600082115b614d7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154966023913960400191505060405180910390fd5b82614d8f858463ffffffff61520916565b81614d9657fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614e3d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f436166654c6962726172793a204944454e544943414c5f414444524553534553604482015290519081900360640190fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614e77578284614e7a565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614f0157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f436166654c6962726172793a205a45524f5f4144445245535300000000000000604482015290519081900360640190fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b158015614fa857600080fd5b505afa158015614fbc573d6000803e3d6000fd5b505050506040513d6020811015614fd257600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1614156150b857604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561508b57600080fd5b505af115801561509f573d6000803e3d6000fd5b505050506040513d60208110156150b557600080fd5b50505b6000806150e67f00000000000000000000000000000000000000000000000000000000000000008b8b615301565b915091508160001480156150f8575080155b15615108578793508692506151fc565b6000615115898484614ca9565b90508781116151825785811015615177576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806154b96021913960400191505060405180910390fd5b8894509250826151fa565b600061518f898486614ca9565b90508981111561519b57fe5b878110156151f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806154756021913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806152245750508082028282828161522157fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006153108585614d9f565b5090506000806153218888886140b0565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561536657600080fd5b505afa15801561537a573d6000803e3d6000fd5b505050506040513d606081101561539057600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146153d75780826153da565b81815b9099909850965050505050505056fe43616665526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c656443616665526f757465723a20494e53554646494349454e545f415f414d4f554e54436166654c6962726172793a20494e53554646494349454e545f4c495155494449545943616665526f757465723a20494e53554646494349454e545f425f414d4f554e5443616665526f757465723a204558434553534956455f494e5055545f414d4f554e54436166654c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564436166654c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a264697066735822122068c0400691994143e7fc75e67a102b63beabb6997c4d0083f70ddff5ea3cc2fb64736f6c634300060600330000000000000000000000003e708fdbe3ada63fc94f8f61811196f1302137ad000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

0000000000000000000000003e708fdbe3ada63fc94f8f61811196f1302137ad000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000003e708fdbe3ada63fc94f8f61811196f1302137ad
Arg [1] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


Deployed ByteCode Sourcemap

16432:18194:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16899:10;:18;16913:4;16899:18;;16892:26;;;;16432:18194;;12:1:-1;9;2:12;20964:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20964:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;20964:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33590:257;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33590:257:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33590:257:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28013:830;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28013:830:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28013:830:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;28013:830:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28013:830: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;28013:830:0;;-1:-1:-1;28013:830:0;-1:-1:-1;28013:830: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;28013:830:0;;;;;;;;;;;;;;;;;34375:248;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34375:248:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34375:248:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34375:248:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34375:248: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;34375:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34375:248:0;;-1:-1:-1;34375:248:0;;-1:-1:-1;;;;;34375:248:0:i;21643:667::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21643:667:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;21643:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25300:613::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25300:613:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25300:613:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;25300:613:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25300:613: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;25300:613:0;;-1:-1:-1;25300:613:0;-1:-1:-1;25300:613:0;;;;;;;;;:::i;27199:808::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27199:808:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27199:808:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;27199:808:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27199:808: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;27199:808:0;;-1:-1:-1;27199:808:0;-1:-1:-1;27199:808:0;;;;;;;;;:::i;23760:708::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23760:708:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;23760:708:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30976:704::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30976:704:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30976:704:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;30976:704:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30976:704: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;30976:704:0;;-1:-1:-1;30976:704:0;-1:-1:-1;30976:704:0;;;;;;;;;:::i;32527:828::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32527:828:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32527:828:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;32527:828:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32527:828: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;32527:828:0;;-1:-1:-1;32527:828:0;-1:-1:-1;32527:828:0;;;;;;;;;:::i;26516:677::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26516:677:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;26516:677:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26516:677: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;26516:677:0;;-1:-1:-1;26516:677:0;-1:-1:-1;26516:677:0;;;;;;;;;:::i;33855:256::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33855:256:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33855:256:0;;;;;;;;;;;;:::i;25919:591::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25919:591:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25919:591:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;25919:591:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25919:591: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;25919:591:0;;-1:-1:-1;25919:591:0;-1:-1:-1;25919:591:0;;;;;;;;;:::i;16558:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16558:38:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33399:183;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33399:183:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33399:183:0;;;;;;;;;;;;:::i;23054:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23054:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;23054:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31686:835::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31686:835:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;31686:835:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31686:835: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;31686:835:0;;-1:-1:-1;31686:835:0;-1:-1:-1;31686:835:0;;;;;;;;;:::i;20123:::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20123:835:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;20123:835:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16510:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16510:41:0;;;:::i;34119:248::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34119:248:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34119:248:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34119:248:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34119:248: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;34119:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34119:248:0;;-1:-1:-1;34119:248:0;;-1:-1:-1;;;;;34119:248:0:i;22316:659::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22316:659:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;22316:659:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18382:728::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18382:728:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;18382:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19116:964;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;19116:964:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28849:790::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28849:790:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;28849:790:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28849:790: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;28849:790:0;;-1:-1:-1;28849:790:0;-1:-1:-1;28849:790:0;;;;;;;;;:::i;20964:673::-;21201:16;21219:14;21182:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21273:196:::1;21303:5;21323:4;21342:9;21366:14;21395:12;21430:4;21450:8;21273:15;:196::i;:::-;21246:223:::0;;-1:-1:-1;21246:223:0;-1:-1:-1;21480:51:0::1;21508:5:::0;21515:2;21246:223;21480:27:::1;:51::i;:::-;21548:4;21542:20;;;21563:9;21542:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;21542:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21542:31:0;;;;21584:45;21615:2;21619:9;21584:30;:45::i;:::-;20964:673:::0;;;;;;;;;;:::o;33590:257::-;33743:14;33782:57;33807:8;33817:9;33828:10;33782:24;:57::i;:::-;33775:64;33590:257;-1:-1:-1;;;;33590:257:0:o;28013:830::-;28227:21;28199:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28274:29:::1;28299:4;28274:29;:4:::0;;28279:15;;;28274:21;;::::1;;;;;;;;;;;;;:29;;;28266:66;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28353:50;28379:7;28388:8;28398:4;;28353:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28353:25:0::1;::::0;-1:-1:-1;;;28353:50:0:i:1;:::-;28343:60;;28453:12;28422:7;28447:1;28430:7;:14;:18;28422:27;;;;;;;;;;;;;;:43;;28414:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28519:136;28565:4;;28570:1;28565:7;;;;;;;;;;;;;;;28574:10;28586:46;28606:7;28615:4;;28620:1;28615:7;;;;;;;;;;;;;;;28624:4;;28629:1;28624:7;;;;;;;;;;;;;;;28586:19;:46::i;:::-;28634:7;28642:1;28634:10;;;;;;;;;;;;;;28519:31;:136::i;:::-;28666:35;28672:7;28681:4;;28666:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28695:4:0::1;::::0;-1:-1:-1;28666:5:0::1;::::0;-1:-1:-1;;28666:35:0:i:1;:::-;28718:4;28712:20;;;28733:7;28758:1;28741:7;:14;:18;28733:27;;;;;;;;;;;;;;28712:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28712:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28712:49:0;;;;28772:63;28803:2;28807:7;28832:1;28815:7;:14;:18;28807:27;;;;;;;;;;;;;;28772:30;:63::i;:::-;28013:830:::0;;;;;;;;;:::o;34375:248::-;34519:21;34565:50;34590:7;34599:9;34610:4;34565:24;:50::i;:::-;34558:57;;34375:248;;;;;:::o;21643:667::-;21949:12;21963;21988;22003:44;22023:7;22032:6;22040;22003:19;:44::i;:::-;21988:59;;22058:10;22071;:33;;22095:9;22071:33;;;22089:2;22071:33;22115:75;;;;;;22138:10;22115:75;;;;22158:4;22115:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22058:46;;-1:-1:-1;22115:22:0;;;;;;:75;;;;;-1:-1:-1;;22115:75:0;;;;;;;;-1:-1:-1;22115:22:0;:75;;;2:2:-1;;;;27:1;24;17:12;2:2;22115:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22115:75:0;;;;22222:80;22238:6;22246;22254:9;22265:10;22277;22289:2;22293:8;22222:15;:80::i;:::-;22201:101;;;;;;;;21643:667;;;;;;;;;;;;;;;;:::o;25300:613::-;25524:21;25505:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25568:50:::1;25594:7;25603:8;25613:4;;25568:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25568:25:0::1;::::0;-1:-1:-1;;;25568:50:0:i:1;:::-;25558:60;;25668:12;25637:7;25662:1;25645:7;:14;:18;25637:27;;;;;;;;;;;;;;:43;;25629:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25734:136;25780:4;;25785:1;25780:7;;;;;;25734:136;25881:24;25887:7;25896:4;;25881:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25902:2:0;;-1:-1:-1;25881:5:0::1;::::0;-1:-1:-1;;25881:24:0:i:1;27199:808::-:0;27413:21;27385:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27460:29:::1;27485:4;27460:29;:4:::0;;27465:15;;;27460:21;;::::1;;;;;;;;;;;;;:29;;;27452:66;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27539:50;27564:7;27573:9;27584:4;;27539:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27539:24:0::1;::::0;-1:-1:-1;;;27539:50:0:i:1;:::-;27529:60;;27622:11;27608:7;27616:1;27608:10;;;;;;;;;;;;;;:25;;27600:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23760:708:::0;24078:14;24105:12;24120:41;24140:7;24149:5;24156:4;24120:19;:41::i;:::-;24105:56;;24172:10;24185;:33;;24209:9;24185:33;;;24203:2;24185:33;24229:75;;;;;;24252:10;24229:75;;;;24272:4;24229:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24172:46;;-1:-1:-1;24229:22:0;;;;;;:75;;;;;-1:-1:-1;;24229:75:0;;;;;;;;-1:-1:-1;24229:22:0;:75;;;2:2:-1;;;;27:1;24;17:12;2:2;24229:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24229:75:0;;;;24327:133;24389:5;24396:9;24407:14;24423:12;24437:2;24441:8;24327:47;:133::i;:::-;24315:145;23760:708;-1:-1:-1;;;;;;;;;;;;;23760:708:0:o;30976:704::-;31210:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31231:134:::1;31277:4;;31282:1;31277:7;;;;;;;;;;;;;;;31286:10;31298:46;31318:7;31327:4;;31332:1;31327:7;;;;;;;;;;;;;;;31336:4;;31341:1;31336:7;;;;;;31298:46;31346:8;31231:31;:134::i;:::-;31376:18;31404:4:::0;;31409:15;;;31404:21;;::::1;;;;;;;;;;;;;31397:39;;;31437:2;31397:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31397:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31397:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31397:43:0;31451:44:::1;::::0;;31397:43:::1;31451:44:::0;;::::1;::::0;;;;;;;;;;;31397:43;;-1:-1:-1;31451:44:0::1;::::0;;;31486:4;;;;;;31451:44;::::1;::::0;31486:4;;31451:44;31486:4;31451:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31492:2:0;;-1:-1:-1;31451:34:0::1;::::0;-1:-1:-1;;31451:44:0:i:1;:::-;31594:12:::0;31528:62:::1;31576:13:::0;31535:4;;31540:15;;;31535:21;;::::1;;;;;;;;;;;;;31528:39;;;31568:2;31528:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31528:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31528:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31528:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;31506:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16717:1;30976:704:::0;;;;;;;:::o;32527:828::-;32794:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32828:29:::1;32853:4;32828:29;:4:::0;;32833:15;;;32828:21;;::::1;;;;;;;;;;;;;:29;;;32820:66;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32897:134;32943:4;;32948:1;32943:7;;;;;;32897:134;33042:55;33077:4;;33042:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33091:4:0::1;::::0;-1:-1:-1;33042:34:0::1;::::0;-1:-1:-1;;33042:55:0:i:1;:::-;33125:37;::::0;;;;;33156:4:::1;33125:37;::::0;::::1;::::0;;;33108:14:::1;::::0;33125:22:::1;33132:4;33125:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;33125:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33125:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;33125:37:0;;-1:-1:-1;33181:25:0;;::::1;;33173:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33266:4;33260:20;;;33281:9;33260:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33260:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33260:31:0;;;;33302:45;33333:2;33337:9;33302:30;:45::i;26516:677::-:0;26732:21;26704:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26790:4:::1;26779:15;;:4;;26784:1;26779:7;;;;;;;;;;;;;;;:15;;;26771:52;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26844:51;26870:7;26879:9;26890:4;;26844:51;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26844:25:0::1;::::0;-1:-1:-1;;;26844:51:0:i:1;:::-;26834:61;;26945:12;26914:7;26939:1;26922:7;:14;:18;26914:27;;;;;;;;;;;;;;:43;;26906:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27017:4;27011:19;;;27038:7;27046:1;27038:10;;;;;;;;;;;;;;27011:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27011:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27011:40:0;;;;;27075:4;27069:20;;;27090:46;27110:7;27119:4;;27124:1;27119:7;;;;;;27090:46;27138:7;27146:1;27138:10;;;;;;;;;;;;;;27069:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27069:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27069:80:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;27069:80:0;27062:88:::1;;;;27161:24;27167:7;27176:4;;27161:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27182:2:0;;-1:-1:-1;27161:5:0::1;::::0;-1:-1:-1;;27161:24:0:i:1;:::-;26516:677:::0;;;;;;;;:::o;33855:256::-;34008:13;34046:57;34070:9;34081;34092:10;34046:23;:57::i;25919:591::-;26143:21;26124:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26187:50:::1;26212:7;26221:9;26232:4;;26187:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26187:24:0::1;::::0;-1:-1:-1;;;26187:50:0:i:1;:::-;26177:60;;26270:11;26256:7;26264:1;26256:10;;;;;;;;;;;;;;:25;;26248:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16558:38:::0;;;:::o;33399:183::-;33496:12;33528:46;33546:7;33555:8;33565;33528:17;:46::i;23054:700::-;23320:14;23301:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23363:196:::1;23393:5;23413:4;23432:9;23456:14;23485:12;23520:4;23540:8;23363:15;:196::i;:::-;23609:38;::::0;;;;;23641:4:::1;23609:38;::::0;::::1;::::0;;;23347:212;;-1:-1:-1;23570:78:0::1;::::0;-1:-1:-1;23598:5:0;;23605:2;;23609: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;23609:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23609:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23609:38:0;23570:27:::1;:78::i;:::-;23665:4;23659:20;;;23680:9;23659:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23659:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23659:31:0;;;;23701:45;23732:2;23736:9;23701:30;:45::i;31686:835::-:0;31946:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31991:4:::1;31980:15;;:4;;31985:1;31980:7;;;;;;;;;;;;;;;:15;;;31972:52;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32035:13;32051:9;32035:25;;32077:4;32071:19;;;32098:8;32071:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32071:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32071:38:0;;;;;32133:4;32127:20;;;32148:46;32168:7;32177:4;;32182:1;32177:7;;;;;;32148:46;32196:8;32127:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32127:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32127:78:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32127:78:0;32120:86:::1;;;;32217:18;32245:4:::0;;32250:15;;;32245:21;;::::1;;;;;;;;;;;;;32238:39;;;32278:2;32238:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32238:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32238:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32238:43:0;32292:44:::1;::::0;;32238:43:::1;32292:44:::0;;::::1;::::0;;;;;;;;;;;32238:43;;-1:-1:-1;32292:44:0::1;::::0;;;32327:4;;;;;;32292:44;::::1;::::0;32327:4;;32292:44;32327:4;32292:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32333:2:0;;-1:-1:-1;32292:34:0::1;::::0;-1:-1:-1;;32292:44:0:i:1;:::-;32435:12:::0;32369:62:::1;32417:13:::0;32376:4;;32381:15;;;32376:21;;::::1;;;;;;;;;;;;;32369:39;;;32409:2;32369:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;20123:835:0::0;20377:12;20391;20358:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20416:12:::1;20431:44;20451:7;20460:6;20468;20431:19;:44::i;:::-;20486:57;::::0;;;;;20515:10:::1;20486:57;::::0;::::1;::::0;:28:::1;::::0;::::1;:57:::0;;;;;;;;;;;;;;20416:59;;-1:-1:-1;20486:28:0;;::::1;::::0;:57;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20486:28:0;:57;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20486:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20486:57:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;20611:24:0::1;::::0;;;;;:20:::1;:24:::0;;::::1;;::::0;::::1;::::0;;;20581:12:::1;::::0;;;20611:20;;::::1;::::0;::::1;::::0;:24;;;;;;;;;;;20581:12;20611:20;:24;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20611:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20611:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20611:24:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20611:24:0;-1:-1:-1;20647:14:0::1;20666:38;20689:6:::0;20697;20666:22:::1;:38::i;:::-;20646:58;;;20746:6;20736:16;;:6;:16;;;:58;;20777:7;20786;20736:58;;;20756:7;20765;20736:58;20715:79:::0;;-1:-1:-1;20715:79:0;-1:-1:-1;20813:21:0;;::::1;;20805:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20902:10;20891:7;:21;;20883:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16717:1;;;;20123:835:::0;;;;;;;;;;;:::o;16510:41::-;;;:::o;34119:248::-;34263:21;34309:50;34335:7;34344:8;34354:4;34309:25;:50::i;22316:659::-;22605:16;22623:14;22650:12;22665:41;22685:7;22694:5;22701:4;22665:19;:41::i;:::-;22650:56;;22717:10;22730;:33;;22754:9;22730:33;;;22748:2;22730:33;22774:75;;;;;;22797:10;22774:75;;;;22817:4;22774:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22717:46;;-1:-1:-1;22774:22:0;;;;;;:75;;;;;-1:-1:-1;;22774:75:0;;;;;;;;-1:-1:-1;22774:22:0;:75;;;2:2:-1;;;;27:1;24;17:12;2:2;22774:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22774:75:0;;;;22887:80;22906:5;22913:9;22924:14;22940:12;22954:2;22958:8;22887:18;:80::i;:::-;22860:107;;;;-1:-1:-1;22316:659:0;-1:-1:-1;;;;;;;;;;;;;22316:659:0:o;18382:728::-;18670:12;18684;18698:14;18651:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18746:85:::1;18760:6;18768;18776:14;18792;18808:10;18820;18746:13;:85::i;:::-;18725:106:::0;;-1:-1:-1;18725:106:0;-1:-1:-1;18842:12:0::1;18857:44;18877:7;18886:6:::0;18894;18857:19:::1;:44::i;:::-;18842:59;;18912:66;18944:6;18952:10;18964:4;18970:7;18912:31;:66::i;:::-;18989;19021:6;19029:10;19041:4;19047:7;18989:31;:66::i;:::-;19088:4;19078:20;;;19099:2;19078:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19078:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19078:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19078:24:0;18382:728;;;;-1:-1:-1;19078:24:0;;-1:-1:-1;18382:728:0;;-1:-1:-1;;;;;;;;;18382:728:0:o;19116:964::-;19369:16;19387:14;19403;19350:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19457:176:::1;19485:5;19505:4;19524:18;19557:9;19581:14;19610:12;19457:13;:176::i;:::-;19430:203:::0;;-1:-1:-1;19430:203:0;-1:-1:-1;19644:12:0::1;19659:41;19679:7;19688:5:::0;19695:4:::1;19659:19;:41::i;:::-;19644:56;;19711:69;19743:5;19750:10;19762:4;19768:11;19711:31;:69::i;:::-;19797:4;19791:19;;;19818:9;19791:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19791:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19791:39:0;;;;;19854:4;19848:20;;;19869:4;19875:9;19848:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19848:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19848:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19848:37:0;19841:45:::1;;;;19919:4;19909:20;;;19930:2;19909:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19909:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19909:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19909:24:0;;-1:-1:-1;19984:9:0::1;:21:::0;-1:-1:-1;19980:92:0::1;;;20007:65;20038:10;20062:9;20050;:21;20007:30;:65::i;:::-;16717:1;19116:964:::0;;;;;;;;;;;:::o;28849:790::-;29062:21;29034:8;16667:15;16655:8;:27;;16647:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29120:4:::1;29109:15;;:4;;29114:1;29109:7;;;;;;;;;;;;;;;:15;;;29101:52;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29174:50;29199:7;29208:9;29219:4;;29174:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29174:24:0::1;::::0;-1:-1:-1;;;29174:50:0:i:1;:::-;29164:60;;29257:9;29243:7;29251:1;29243:10;;;;;;;;;;;;;;:23;;29235:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29322:4;29316:19;;;29343:7;29351:1;29343:10;;;;;;;;;;;;;;29316:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29316:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29316:40:0;;;;;29380:4;29374:20;;;29395:46;29415:7;29424:4;;29429:1;29424:7;;;;;;29395:46;29443:7;29451:1;29443:10;;;;;;;;;;;;;;29374:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29374:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29374:80:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;29374:80:0;29367:88:::1;;;;29466:24;29472:7;29481:4;;29466:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29487:2:0;;-1:-1:-1;29466:5:0::1;::::0;-1:-1:-1;;29466:24:0:i:1;:::-;29553:7;29561:1;29553:10;;;;;;;;;;;;;;29541:9;:22;29537:94;;;29565:66;29596:10;29620:7;29628:1;29620:10;;;;;;;;;;;;;;29608:9;:22;29565:30;:66::i;722:449::-:0;954:45;;;943:10;954:45;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;954:45:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;954:45:0;179:29:-1;160:49;;943:57:0;;;;908:12;;922:17;;943:10;;;;954:45;943:57;;;25:18:-1;943: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;;;943: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;;907:93:0;;;;1033:7;:57;;;;-1:-1:-1;1045:11:0;;:16;;:44;;;1076:4;1065:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1065:24:0;1045:44;1011:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;722:449;;;;;:::o;1685:217::-;1798:12;;;1758;1798;;;;;;;;;1776:7;;;;1791:5;;1776: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;;;1776: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;;1757:54:0;;;1830:7;1822:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1685:217;;;:::o;12200:507::-;12293:14;12339:1;12328:8;:12;12320:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12414:1;12402:9;:13;:31;;;;;12432:1;12419:10;:14;12402:31;12394:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12484:20;12507:17;:8;12520:3;12507:17;:12;:17;:::i;:::-;12484:40;-1:-1:-1;12535:14:0;12552:31;12484:40;12572:10;12552:31;:19;:31;:::i;:::-;12535:48;-1:-1:-1;12594:16:0;12613:40;12637:15;12613:19;:9;12627:4;12613:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;12594:59;;12688:11;12676:9;:23;;;;;;;12200:507;-1:-1:-1;;;;;;;12200:507:0:o;13372:506::-;13473:21;13530:1;13515:4;:11;:16;;13507:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13593:4;:11;13582:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13582:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;13582:23:0;;13572:33;;13629:8;13616:7;13624:1;13616:10;;;;;;;;;;;;;:21;;;;;13653:6;13648:223;13679:1;13665:4;:11;:15;13661:1;:19;13648:223;;;13703:14;13719:15;13738:42;13750:7;13759:4;13764:1;13759:7;;;;;;;;;;;;;;13768:4;13773:1;13777;13773:5;13768:11;;;;;;;;;;;;;;13738;:42::i;:::-;13702:78;;;;13812:47;13825:7;13833:1;13825:10;;;;;;;;;;;;;;13837:9;13848:10;13812:12;:47::i;:::-;13795:7;13803:1;13807;13803:5;13795:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;13682:3:0;;13648:223;;;;13372:506;;;;;:::o;10732:478::-;10821:12;10847:14;10863;10881:26;10892:6;10900;10881:10;:26::i;:::-;11045:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;11045:32:0;;;;;11035:43;;;;;;10948:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10948:251:0;;;;;;;10938:262;;;;;;;;;10732:478;-1:-1:-1;;;;;10732:478:0:o;1179:498::-;1450:51;;;1439:10;1450:51;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1450:51:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;1450:51:0;179:29:-1;160:49;;1439:63:0;;;;1404:12;;1418:17;;1439:10;;;;1450:51;1439:63;;;25:18:-1;1439: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;;;1439: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;;1403:99:0;;;;1535:7;:57;;;;-1:-1:-1;1547:11:0;;:16;;:44;;;1578:4;1567:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1567:24:0;1547:44;1513:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1179:498;;;;;;:::o;24579:715::-;24686:6;24681:606;24712:1;24698:4;:11;:15;24694:1;:19;24681:606;;;24736:13;24751:14;24770:4;24775:1;24770:7;;;;;;;;;;;;;;24779:4;24784:1;24788;24784:5;24779:11;;;;;;;;;;;;;;24735:56;;;;24807:14;24826:37;24849:5;24856:6;24826:22;:37::i;:::-;24806:57;;;24878:14;24895:7;24903:1;24907;24903:5;24895:14;;;;;;;;;;;;;;24878:31;;24925:15;24942;24970:6;24961:15;;:5;:15;;;:61;;25003:9;25019:1;24961:61;;;24985:1;24989:9;24961:61;24924:98;;;;25037:10;25068:1;25054:4;:11;:15;25050:1;:19;:77;;25124:3;25050:77;;;25072:49;25092:7;25101:6;25109:4;25114:1;25118;25114:5;25109:11;;;;;;;;;;;;;;25072:19;:49::i;:::-;25037:90;;25152:43;25172:7;25181:5;25188:6;25152:19;:43::i;:::-;25142:59;;;25220:10;25232;25244:2;25258:1;25248:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;25248:12:0;87:42:-1;143:17;;-1:-1;25248:12:0;;25142:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;25142:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25142:133:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;24715:3:0;;;;;-1:-1:-1;24681:606:0;;-1:-1:-1;;;;;;;;24681:606:0;;;24579:715;;;:::o;13959:527::-;14060:21;14117:1;14102:4;:11;:16;;14094:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14180:4;:11;14169:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14169:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14169:23:0;;14159:33;;14233:9;14203:7;14228:1;14211:7;:14;:18;14203:27;;;;;;;;;;;;;;;;;:39;14267:11;;:15;;14253:226;14284:5;;14253:226;;14312:14;14328:15;14347:42;14359:7;14368:4;14377:1;14373;:5;14368:11;;;;;;;;;;;;;;14381:4;14386:1;14381:7;;;;;;;14347:42;14311:78;;;;14421:46;14433:7;14441:1;14433:10;;;;;;;;;;;;;;14445:9;14456:10;14421:11;:46::i;:::-;14404:7;14416:1;14412;:5;14404:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;14291:3:0;;14253:226;;29786:1184;29899:6;29894:1069;29925:1;29911:4;:11;:15;29907:1;:19;29894:1069;;;29949:13;29964:14;29983:4;29988:1;29983:7;;;;;;;;;;;;;;29992:4;29997:1;30001;29997:5;29992:11;;;;;;;;;;;;;;29948:56;;;;30020:14;30039:37;30062:5;30069:6;30039:22;:37::i;:::-;30019:57;;;30091:14;30118:43;30138:7;30147:5;30154:6;30118:19;:43::i;:::-;30091:71;;30177:16;30208:17;30296:13;30311;30329:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30329:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30329:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30329:18:0;;;;;;;30295:52;;;;;-1:-1:-1;30295:52:0;;-1:-1:-1;30363:17:0;;30404:15;;;;;;;;:61;;30446:8;30456;30404:61;;;30423:8;30433;30404:61;30362:103;;;;30494:56;30537:12;30501:5;30494:23;;;30526:4;30494:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;30494:56:0;30480:70;;30580:66;30605:11;30618:12;30632:13;30580:24;:66::i;:::-;30565:81;;29894:1069;;;;30677:15;30694;30722:6;30713:15;;:5;:15;;;:67;;30758:12;30777:1;30713:67;;;30737:1;30741:12;30713:67;30676:104;;;;30795:10;30826:1;30812:4;:11;:15;30808:1;:19;:77;;30882:3;30808:77;;;30830:49;30850:7;30859:6;30867:4;30872:1;30876;30872:5;30867:11;;;;;;;30830:49;30938:12;;;30948:1;30938:12;;;;;;;;;;30900:51;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;30795:90;;-1:-1:-1;30900:9:0;;;;;;30910:10;;30922;;30795:90;;30938:12;;30900:51;;;;;;;;30938:12;;30900:51;;;;30938: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;30900:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30900:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29928:3:0;;;;;-1:-1:-1;29894:1069:0;;-1:-1:-1;;;;;;;;;;29894:1069:0;9775:129;9859:5;;;9854:16;;;;9846:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12828:462;12921:13;12967:1;12955:9;:13;12947:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13043:1;13031:9;:13;:31;;;;;13061:1;13048:10;:14;13031:31;13023:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13113:14;13130:34;13159:4;13130:24;:9;13144;13130:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;13113:51;-1:-1:-1;13175:16:0;13194:34;13224:3;13194:25;:10;13209:9;13194:25;:14;:25;:::i;:34::-;13175:53;;13250:32;13280:1;13263:11;13251:9;:23;;;;;;;13250:32;:29;:32;:::i;:::-;13239:43;12828:462;-1:-1:-1;;;;;;12828:462:0:o;11767:311::-;11849:12;11892:1;11882:7;:11;11874:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11960:1;11949:8;:12;:28;;;;;11976:1;11965:8;:12;11949:28;11941:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12062:8;12038:21;:7;12050:8;12038:21;:11;:21;:::i;:::-;:32;;;;;;;11767:311;-1:-1:-1;;;;11767:311:0:o;10301:339::-;10376:14;10392;10437:6;10427:16;;:6;:16;;;;10419:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10519:6;10510:15;;:6;:15;;;:53;;10548:6;10556;10510:53;;;10529:6;10537;10510:53;10491:72;;-1:-1:-1;10491:72:0;-1:-1:-1;10582:20:0;;;10574:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10301:339;;;;;:::o;17021:1355::-;17334:45;;;;;;:59;:45;;;;;;;;;;;;;;;;17239:12;;;;;;17347:7;17334:29;;;;;;:45;;;;;;;;;;;;;;;:29;:45;;;2:2:-1;;;;27:1;24;17:12;2:2;17334:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17334:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17334:45:0;:59;;;17330:140;;;17410:48;;;;;;:32;:48;;;;;;;;;;;;;;;;17423:7;17410:32;;;;;;:48;;;;;;;;;;;;;;;-1:-1:-1;17410:32:0;:48;;;2:2:-1;;;;27:1;24;17:12;2:2;17410:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17410:48:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;17330:140:0;17481:13;17496;17513:48;17537:7;17546:6;17554;17513:23;:48::i;:::-;17480:81;;;;17576:8;17588:1;17576:13;:30;;;;-1:-1:-1;17593:13:0;;17576:30;17572:797;;;17645:14;;-1:-1:-1;17661:14:0;;-1:-1:-1;17572:797:0;;;17709:19;17731:53;17749:14;17765:8;17775;17731:17;:53::i;:::-;17709:75;;17821:14;17803;:32;17799:559;;17882:10;17864:14;:28;;17856:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17971:14;;-1:-1:-1;17987:14:0;-1:-1:-1;17987:14:0;17799:559;;;18043:19;18065:53;18083:14;18099:8;18109;18065:17;:53::i;:::-;18043:75;;18162:14;18144;:32;;18137:40;;;;18222:10;18204:14;:28;;18196:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18311:14;-1:-1:-1;18327:14:0;;-1:-1:-1;17799:559:0;17572:797;;17021:1355;;;;;;;;;;;:::o;9912:142::-;9964:6;9991;;;:30;;-1:-1:-1;;10006:5:0;;;10020:1;10015;10006:5;10015:1;10001:15;;;;;:20;9991:30;9983:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9639:128;9723:5;;;9718:16;;;;9710:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11268:386;11361:13;11376;11403:14;11422:26;11433:6;11441;11422:10;:26::i;:::-;11402:46;;;11460:13;11475;11503:32;11511:7;11520:6;11528;11503:7;:32::i;:::-;11493:55;;;:57;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11493:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11493:57:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11493:57:0;;;;;;;11459:91;;;;;-1:-1:-1;11459:91:0;;-1:-1:-1;11584:16:0;;;;;;;;:62;;11627:8;11637;11584:62;;;11604:8;11614;11584:62;11561:85;;;;-1:-1:-1;11268:386:0;-1:-1:-1;;;;;;;11268:386:0:o

Swarm Source

ipfs://68c0400691994143e7fc75e67a102b63beabb6997c4d0083f70ddff5ea3cc2fb
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.