Contract 0x40b12a3E261416fF0035586ff96e23c2894560f2 3

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x9a771e5c61c364a238cf8f8d0093e4e24a21515f1c7d38350efd4c6991a9cb46Remove Liquidity...200096482021-10-25 1:22:269 mins ago0x1f836a75248ca00c788d20355a8e4b903a918bcb IN  0x40b12a3e261416ff0035586ff96e23c2894560f20 FTM0.041126605976
0xc8ac7e4158a73560fc4124b8f428540726feff780e3dbcddba1b1b7285b0dfa4Swap Exact ETH F...200096012021-10-25 1:21:469 mins ago0xc232c2e1cc36dd4d1982a3a4ba16defb9cabe349 IN  0x40b12a3e261416ff0035586ff96e23c2894560f2100 FTM0.028201450114
0x78f8cf230a33e54df4d80905b4a9915f4f412f33bca040ac15b445f39a483268Add Liquidity ET...200089322021-10-25 1:11:0120 mins ago0x1074e7f0c37e84aa407434862ad4580a01345bb1 IN  0x40b12a3e261416ff0035586ff96e23c2894560f25.039143286197147 FTM0.022197083991
0x1dc294a8532ef5115e7677195e318329aaefc28661a63b0c0aa72520e669a9b9Swap Exact ETH F...200088832021-10-25 1:10:2421 mins ago0x1074e7f0c37e84aa407434862ad4580a01345bb1 IN  0x40b12a3e261416ff0035586ff96e23c2894560f25 FTM0.014881076166
0x08e26da16ba6f269c1342f6f7221eb2768cf3f0ac02d1a5fbf5863ed50a65665Swap Exact ETH F...200072242021-10-25 0:43:2148 mins ago0xf7af362b1fcd4e194549ce3c6fcfbe98c4178aaf IN  0x40b12a3e261416ff0035586ff96e23c2894560f21,000 FTM0.01615176946
0x642ee8449909197969c125aa1abda3b6af431421eed8d0e69b29e14e518b3dd6Swap Exact Token...200070242021-10-25 0:40:2251 mins ago0xf59a51f6d4aed74b73c1b05fdc532e08362814f3 IN  0x40b12a3e261416ff0035586ff96e23c2894560f20 FTM0.016734010566
0x1b69848f5d3979feac5c213b846bd0036f9a371662dd7e39bce0eafefa6c7f3aSwap Exact ETH F...200068712021-10-25 0:37:5053 mins ago0xf7af362b1fcd4e194549ce3c6fcfbe98c4178aaf IN  0x40b12a3e261416ff0035586ff96e23c2894560f21,000 FTM0.016842908717
0x73ac56b806420bc91203667d7e1dc8bad1250dfbd4787acea1020f65abec9eafAdd Liquidity ET...200062502021-10-25 0:27:251 hr 4 mins ago0x815bb20b23f92e4cebf46d381747ba311ec6e5c4 IN  0x40b12a3e261416ff0035586ff96e23c2894560f27.0605141039222 FTM0.022280250931
0x62acea91c63a149c5d548b547c72e0de7a71a191c8716c90b8df7ce02adf54c4Swap Exact ETH F...200039902021-10-24 23:55:281 hr 36 mins ago0xe1e0da672b12f7d0d025f4b52512ab1678b2c7fd IN  0x40b12a3e261416ff0035586ff96e23c2894560f2165 FTM0.02254485182
0x7391f95ca4ec4917635523455e7f3fda731d0ea62fba2761ac2df61d5efe627aSwap Exact ETH F...200032752021-10-24 23:44:581 hr 46 mins ago0xe1e0da672b12f7d0d025f4b52512ab1678b2c7fd IN  0x40b12a3e261416ff0035586ff96e23c2894560f2880 FTM0.023998138618
0x6b338ef9161be5e3ad2cb4c46e89ff0d5d509fd92b2e2e030dda3428aaeb1d9bSwap Exact ETH F...200020282021-10-24 23:25:172 hrs 6 mins ago0x0948e7727fae24bea0f0336508c44676ff122aba IN  0x40b12a3e261416ff0035586ff96e23c2894560f2999 FTM0.019128086232
0x376aad16c79e848cc9d5e54832dd57542a7f89497d9e09dd084d6cfc4635a372Remove Liquidity...200015572021-10-24 23:18:582 hrs 12 mins ago0x3e590fbb993bf1e97f04fe615c64bfa37dd84999 IN  0x40b12a3e261416ff0035586ff96e23c2894560f20 FTM0.020826730729
0x626bc63f91bf7d27b781ff1e4219a461e2d68d7772537d7ecae077dd7b7f5c3fRemove Liquidity...200013952021-10-24 23:16:502 hrs 14 mins ago0x3e590fbb993bf1e97f04fe615c64bfa37dd84999 IN  0x40b12a3e261416ff0035586ff96e23c2894560f20 FTM0.021751244778
0xdf7c4187dcbc69f70f354b087c55e5f9206bad048124ebc95af7991ff08ef731Remove Liquidity...200013132021-10-24 23:15:322 hrs 16 mins ago0x3e590fbb993bf1e97f04fe615c64bfa37dd84999 IN  0x40b12a3e261416ff0035586ff96e23c2894560f20 FTM0.022382832933
0x39d2902e6ec9fd4ad9c095f38f09547b95c1e3b2578aa4d1608af3fdc6b9478bSwap Exact Token...200011252021-10-24 23:13:052 hrs 18 mins ago0xe61910654713485712ead8b58a846c5e7f7c565c IN  0x40b12a3e261416ff0035586ff96e23c2894560f20 FTM0.012832872646
0xc559448f2eb06c56f811500223d91c2ecaa5e5f7ce0d009ddfdf4fac9ae85c0dSwap Exact ETH F...200003642021-10-24 23:03:052 hrs 28 mins ago0x23b610ae191e186b0a86a836632818cafb4afd36 IN  0x40b12a3e261416ff0035586ff96e23c2894560f21 FTM0.063812214085
0x0511983c1fb847bc3416e5f8512fb76fa787dc5cfe9d257c9249f50e776378e1Swap Exact Token...199997452021-10-24 22:54:532 hrs 36 mins ago0x205abacb5c984e760f97b77d09d48c376b06b034 IN  0x40b12a3e261416ff0035586ff96e23c2894560f20 FTM0.01559282814
0xaa2d46a31ddb56dfc18c310b2dccc50944669e8e53d43657df31a40e0a5363e9Add Liquidity ET...199996832021-10-24 22:54:042 hrs 37 mins ago0x3e4e4752d500f05c9952a257458fb4aacd526b96 IN  0x40b12a3e261416ff0035586ff96e23c2894560f215.860178174894678 FTM0.022355818452
0x7194986b6b1e60f8eccd231eb5568441f9ddbe9410bcc4689a5e1d8689f321d8Swap Exact ETH F...199979642021-10-24 22:31:003 hrs ago0xd32f3622e44287550444c3b4cd58a9c581ff051d IN  0x40b12a3e261416ff0035586ff96e23c2894560f2146 FTM0.01717399014
0xeaae86d5c63d93d7d44a43bd499eafa028ba6d4ab88b5da061b62c70f3864b89Swap Exact Token...199978632021-10-24 22:29:303 hrs 2 mins ago0xe6a3830d483e1035108c8ec7fea5b70b0b615a6e IN  0x40b12a3e261416ff0035586ff96e23c2894560f20 FTM0.056289279695
0x0b37eaddd9804fea4b159f8dfda49f0102e8b3c5581fd245088c65303768601eSwap Exact Token...199970472021-10-24 22:18:293 hrs 13 mins ago0xf78fe967ead6007c8f16e07fbb0f2626f88ad0df IN  0x40b12a3e261416ff0035586ff96e23c2894560f20 FTM0.1079624
0x53eaafdaab616c7b4d0f548d6031192a04b0fb827c9cd17eaf86ac71da7f6d3dSwap Exact ETH F...199960172021-10-24 22:03:453 hrs 27 mins ago0xaa1238cd40f9780938a9baccbc12322060eacf9f IN  0x40b12a3e261416ff0035586ff96e23c2894560f23,000 FTM0.016422606102
0x72aebb2532edef06b9e816dcf06d0e48a11b657d29d881947e33bcb2c721d7d0Swap Exact ETH F...199959762021-10-24 22:03:023 hrs 28 mins ago0xd8567aebf9098620f348ae9025570b95ed5c7a74 IN  0x40b12a3e261416ff0035586ff96e23c2894560f22.4 FTM0.018406053433
0xa1b93a24e983aa256469a7881a1b6eb764ce1fe73329f1c7c9bc497b63f1731dSwap Exact ETH F...199959042021-10-24 22:01:283 hrs 30 mins ago0x17155568bd13c07a4693b44477512cab5407b277 IN  0x40b12a3e261416ff0035586ff96e23c2894560f2200 FTM0.015799835319
0xbe26515f13c86af1c1ca1c8420039bab55dad899fd140dc0ba1146abaf0684a0Swap Exact ETH F...199958952021-10-24 22:01:183 hrs 30 mins ago0xaa1238cd40f9780938a9baccbc12322060eacf9f IN  0x40b12a3e261416ff0035586ff96e23c2894560f22,000 FTM0.048230766133
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x9a771e5c61c364a238cf8f8d0093e4e24a21515f1c7d38350efd4c6991a9cb46200096482021-10-25 1:22:269 mins ago 0x40b12a3e261416ff0035586ff96e23c2894560f20x1f836a75248ca00c788d20355a8e4b903a918bcb305.264665178489922833 FTM
0x9a771e5c61c364a238cf8f8d0093e4e24a21515f1c7d38350efd4c6991a9cb46200096482021-10-25 1:22:269 mins ago Fantom Finance: Wrapped Fantom Token 0x40b12a3e261416ff0035586ff96e23c2894560f2305.264665178489922833 FTM
0xc8ac7e4158a73560fc4124b8f428540726feff780e3dbcddba1b1b7285b0dfa4200096012021-10-25 1:21:469 mins ago 0x40b12a3e261416ff0035586ff96e23c2894560f2 Fantom Finance: Wrapped Fantom Token100 FTM
0xc8ac7e4158a73560fc4124b8f428540726feff780e3dbcddba1b1b7285b0dfa4200096012021-10-25 1:21:469 mins ago 0xc232c2e1cc36dd4d1982a3a4ba16defb9cabe349 0x40b12a3e261416ff0035586ff96e23c2894560f2100 FTM
0x78f8cf230a33e54df4d80905b4a9915f4f412f33bca040ac15b445f39a483268200089322021-10-25 1:11:0120 mins ago 0x40b12a3e261416ff0035586ff96e23c2894560f2 Fantom Finance: Wrapped Fantom Token5.039143286197147404 FTM
0x78f8cf230a33e54df4d80905b4a9915f4f412f33bca040ac15b445f39a483268200089322021-10-25 1:11:0120 mins ago 0x1074e7f0c37e84aa407434862ad4580a01345bb1 0x40b12a3e261416ff0035586ff96e23c2894560f25.039143286197147404 FTM
0x1dc294a8532ef5115e7677195e318329aaefc28661a63b0c0aa72520e669a9b9200088832021-10-25 1:10:2421 mins ago 0x40b12a3e261416ff0035586ff96e23c2894560f2 Fantom Finance: Wrapped Fantom Token5 FTM
0x1dc294a8532ef5115e7677195e318329aaefc28661a63b0c0aa72520e669a9b9200088832021-10-25 1:10:2421 mins ago 0x1074e7f0c37e84aa407434862ad4580a01345bb1 0x40b12a3e261416ff0035586ff96e23c2894560f25 FTM
0x08e26da16ba6f269c1342f6f7221eb2768cf3f0ac02d1a5fbf5863ed50a65665200072242021-10-25 0:43:2148 mins ago 0x40b12a3e261416ff0035586ff96e23c2894560f2 Fantom Finance: Wrapped Fantom Token1,000 FTM
0x08e26da16ba6f269c1342f6f7221eb2768cf3f0ac02d1a5fbf5863ed50a65665200072242021-10-25 0:43:2148 mins ago 0xf7af362b1fcd4e194549ce3c6fcfbe98c4178aaf 0x40b12a3e261416ff0035586ff96e23c2894560f21,000 FTM
0x1b69848f5d3979feac5c213b846bd0036f9a371662dd7e39bce0eafefa6c7f3a200068712021-10-25 0:37:5053 mins ago 0x40b12a3e261416ff0035586ff96e23c2894560f2 Fantom Finance: Wrapped Fantom Token1,000 FTM
0x1b69848f5d3979feac5c213b846bd0036f9a371662dd7e39bce0eafefa6c7f3a200068712021-10-25 0:37:5053 mins ago 0xf7af362b1fcd4e194549ce3c6fcfbe98c4178aaf 0x40b12a3e261416ff0035586ff96e23c2894560f21,000 FTM
0x73ac56b806420bc91203667d7e1dc8bad1250dfbd4787acea1020f65abec9eaf200062502021-10-25 0:27:251 hr 4 mins ago 0x40b12a3e261416ff0035586ff96e23c2894560f2 Fantom Finance: Wrapped Fantom Token7.060514103922200387 FTM
0x73ac56b806420bc91203667d7e1dc8bad1250dfbd4787acea1020f65abec9eaf200062502021-10-25 0:27:251 hr 4 mins ago 0x815bb20b23f92e4cebf46d381747ba311ec6e5c4 0x40b12a3e261416ff0035586ff96e23c2894560f27.060514103922200387 FTM
0x62acea91c63a149c5d548b547c72e0de7a71a191c8716c90b8df7ce02adf54c4200039902021-10-24 23:55:281 hr 36 mins ago 0x40b12a3e261416ff0035586ff96e23c2894560f2 Fantom Finance: Wrapped Fantom Token165 FTM
0x62acea91c63a149c5d548b547c72e0de7a71a191c8716c90b8df7ce02adf54c4200039902021-10-24 23:55:281 hr 36 mins ago 0xe1e0da672b12f7d0d025f4b52512ab1678b2c7fd 0x40b12a3e261416ff0035586ff96e23c2894560f2165 FTM
0x7391f95ca4ec4917635523455e7f3fda731d0ea62fba2761ac2df61d5efe627a200032752021-10-24 23:44:581 hr 46 mins ago 0x40b12a3e261416ff0035586ff96e23c2894560f2 Fantom Finance: Wrapped Fantom Token880 FTM
0x7391f95ca4ec4917635523455e7f3fda731d0ea62fba2761ac2df61d5efe627a200032752021-10-24 23:44:581 hr 46 mins ago 0xe1e0da672b12f7d0d025f4b52512ab1678b2c7fd 0x40b12a3e261416ff0035586ff96e23c2894560f2880 FTM
0x6b338ef9161be5e3ad2cb4c46e89ff0d5d509fd92b2e2e030dda3428aaeb1d9b200020282021-10-24 23:25:172 hrs 6 mins ago 0x40b12a3e261416ff0035586ff96e23c2894560f2 Fantom Finance: Wrapped Fantom Token999 FTM
0x6b338ef9161be5e3ad2cb4c46e89ff0d5d509fd92b2e2e030dda3428aaeb1d9b200020282021-10-24 23:25:172 hrs 6 mins ago 0x0948e7727fae24bea0f0336508c44676ff122aba 0x40b12a3e261416ff0035586ff96e23c2894560f2999 FTM
0xc559448f2eb06c56f811500223d91c2ecaa5e5f7ce0d009ddfdf4fac9ae85c0d200003642021-10-24 23:03:052 hrs 28 mins ago 0x40b12a3e261416ff0035586ff96e23c2894560f2 Fantom Finance: Wrapped Fantom Token1 FTM
0xc559448f2eb06c56f811500223d91c2ecaa5e5f7ce0d009ddfdf4fac9ae85c0d200003642021-10-24 23:03:052 hrs 28 mins ago 0x23b610ae191e186b0a86a836632818cafb4afd36 0x40b12a3e261416ff0035586ff96e23c2894560f21 FTM
0x0511983c1fb847bc3416e5f8512fb76fa787dc5cfe9d257c9249f50e776378e1199997452021-10-24 22:54:532 hrs 36 mins ago 0x40b12a3e261416ff0035586ff96e23c2894560f20x205abacb5c984e760f97b77d09d48c376b06b03413.028737946252503482 FTM
0x0511983c1fb847bc3416e5f8512fb76fa787dc5cfe9d257c9249f50e776378e1199997452021-10-24 22:54:532 hrs 36 mins ago Fantom Finance: Wrapped Fantom Token 0x40b12a3e261416ff0035586ff96e23c2894560f213.028737946252503482 FTM
0xaa2d46a31ddb56dfc18c310b2dccc50944669e8e53d43657df31a40e0a5363e9199996832021-10-24 22:54:042 hrs 37 mins ago 0x40b12a3e261416ff0035586ff96e23c2894560f2 Fantom Finance: Wrapped Fantom Token15.860178174894678677 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapV2Router02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2021-06-01
*/

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

pragma solidity =0.6.12;

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

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

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

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

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

pragma solidity >=0.5.0;



library UniswapV2Library {
    using SafeMathUniswap for uint;

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

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

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

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

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

    // 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, 'UniswapV2Library: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

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

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

pragma solidity >=0.6.0;

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

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

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

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

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

pragma solidity >=0.6.2;

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

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

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external 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/uniswapv2/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


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

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

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

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function migrator() 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;
    function setMigrator(address) external;
}

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

pragma solidity >=0.5.0;

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

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

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

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

pragma solidity >=0.5.0;

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

// File: contracts/uniswapv2/UniswapV2Router02.sol

pragma solidity =0.6.12;

contract UniswapV2Router02 is IUniswapV2Router02 {
    using SafeMathUniswap for uint;

    address public immutable override factory;
    address public immutable override WETH;
    
    event SwapToETH(
        address indexed sender, uint amount1, uint amount2, address indexed to, address[] path, address pair
    );

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

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

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

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

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

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount2","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"},{"indexed":false,"internalType":"address","name":"pair","type":"address"}],"name":"SwapToETH","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"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"}]

60c060405234801561001057600080fd5b5060405162004a1038038062004a108339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c61487c620001946000398061015f5280610ce45280610d1f5280610e16528061103952806114d3528061166052806117315280611ae05280611c255280611cff5280611e705280611fb6528061203e528061227a52806122f552806123a95280612475528061250a528061257e5280612a615280612ccb5280612d215280612d555280612dc95280612f57528061309a5280613122525080610ea45280610f5c528061119852806111d1528061130c52806113e35280611561528061170f528061187f5280611b705280611f03528061207052806121ca52806125b052806127ee52806129e65280612a0f5280612a3f5280612bac5280612cff5280612fea528061315452806139da5280613a1d5280613cf75280613e6d528061425e528061431752806143ca525061487c6000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611191945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356111c7565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b0381351690602001356112c1565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b038135169060200135611483565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611707565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611815565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b038135169060200135611a92565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611e28565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135612172565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b03813516906020013561217f565b34801561088157600080fd5b5061088a612278565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b508035906020810135906040013561229c565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356122a9565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b03813516906020013561242f565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356127a0565b348015610a1c57600080fd5b5061088a6129e4565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612a08945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612a35565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612b49565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612c7c565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612f0f565b6000808242811015610cde576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6127a0565b9093509150610d1d898685613288565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da585836133f2565b50965096945050505050565b6000610dbe8484846134ea565b949350505050565b60608142811015610e0c576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601d6024820152600080516020614744833981519152604482015290519081900360640190fd5b610efd7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506135c292505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b815260040180806020018281038252602b8152602001806147ad602b913960400191505060405180910390fd5b6000610fba7f000000000000000000000000000000000000000000000000000000000000000088886000818110610f8857fe5b905060200201356001600160a01b031689896001818110610fa557fe5b905060200201356001600160a01b031661370e565b9050610ff887876000818110610fcc57fe5b905060200201356001600160a01b0316338386600081518110610feb57fe5b60200260200101516137ce565b6110378388888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061392b915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8460018651038151811061107657fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110b457600080fd5b505af11580156110c8573d6000803e3d6000fd5b505050506110ed85846001865103815181106110e057fe5b60200260200101516133f2565b846001600160a01b0316306001600160a01b03167ffb9a9dfda6c390deb0357ae2cfc9bb4f728bc471489aaadb5186c5b1d8a0197c8b8b8b8b876040518086815260200185815260200180602001836001600160a01b031681526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f19169092018290039850909650505050505050a350509695505050505050565b60606111be7f00000000000000000000000000000000000000000000000000000000000000008484613b68565b90505b92915050565b60008060006111f77f00000000000000000000000000000000000000000000000000000000000000008f8f61370e565b9050600087611206578c61120a565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561128057600080fd5b505af1158015611294573d6000803e3d6000fd5b505050506112a78f8f8f8f8f8f8f6127a0565b809450819550505050509b509b9950505050505050505050565b60608142811015611307576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b6113657f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506135c292505050565b9150868260018451038151811061137857fe5b602002602001015110156113bd5760405162461bcd60e51b815260040180806020018281038252602b8152602001806147ad602b913960400191505060405180910390fd5b611439868660008181106113cd57fe5b905060200201356001600160a01b03163361142c7f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061140f57fe5b905060200201356001600160a01b03168b8b6001818110610fa557fe5b85600081518110610feb57fe5b6114788287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061392b915050565b509695505050505050565b606081428110156114c9576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061150357fe5b905060200201356001600160a01b03166001600160a01b03161461155c576040805162461bcd60e51b815260206004820152601d6024820152600080516020614744833981519152604482015290519081900360640190fd5b6115ba7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613b6892505050565b915086826000815181106115ca57fe5b6020026020010151111561160f5760405162461bcd60e51b815260040180806020018281038252602781526020018061471d6027913960400191505060405180910390fd5b61161f868660008181106113cd57fe5b61165e8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061392b915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061169d57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156116db57600080fd5b505af11580156116ef573d6000803e3d6000fd5b5050505061147884836001855103815181106110e057fe5b6000806117557f00000000000000000000000000000000000000000000000000000000000000008d7f000000000000000000000000000000000000000000000000000000000000000061370e565b9050600086611764578b611768565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156117de57600080fd5b505af11580156117f2573d6000803e3d6000fd5b505050506118048d8d8d8d8d8d6122a9565b9d9c50505050505050505050505050565b8042811015611859576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b6118ce8585600081811061186957fe5b905060200201356001600160a01b0316336118c87f0000000000000000000000000000000000000000000000000000000000000000898960008181106118ab57fe5b905060200201356001600160a01b03168a8a6001818110610fa557fe5b8a6137ce565b6000858560001981018181106118e057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561193c57600080fd5b505afa158015611950573d6000803e3d6000fd5b505050506040513d602081101561196657600080fd5b505160408051602088810282810182019093528882529293506119a8929091899189918291850190849080828437600092019190915250889250613ca0915050565b86611a4b82888860001981018181106119bd57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a1957600080fd5b505afa158015611a2d573d6000803e3d6000fd5b505050506040513d6020811015611a4357600080fd5b505190613fa2565b1015611a885760405162461bcd60e51b815260040180806020018281038252602b8152602001806147ad602b913960400191505060405180910390fd5b5050505050505050565b8042811015611ad6576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856000198101818110611b1057fe5b905060200201356001600160a01b03166001600160a01b031614611b69576040805162461bcd60e51b815260206004820152601d6024820152600080516020614744833981519152604482015290519081900360640190fd5b6000611bb97f000000000000000000000000000000000000000000000000000000000000000087876000818110611b9c57fe5b905060200201356001600160a01b031688886001818110610fa557fe5b9050611be386866000818110611bcb57fe5b905060200201356001600160a01b031633838b6137ce565b611c21868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613ca0915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c9057600080fd5b505afa158015611ca4573d6000803e3d6000fd5b505050506040513d6020811015611cba57600080fd5b5051905087811015611cfd5760405162461bcd60e51b815260040180806020018281038252602b8152602001806147ad602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611d6357600080fd5b505af1158015611d77573d6000803e3d6000fd5b50505050611d8585826133f2565b846001600160a01b0316306001600160a01b03167ffb9a9dfda6c390deb0357ae2cfc9bb4f728bc471489aaadb5186c5b1d8a0197c8b8b8b8b886040518086815260200185815260200180602001836001600160a01b031681526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f19169092018290039850909650505050505050a3505050505050505050565b60608142811015611e6e576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611ea557fe5b905060200201356001600160a01b03166001600160a01b031614611efe576040805162461bcd60e51b815260206004820152601d6024820152600080516020614744833981519152604482015290519081900360640190fd5b611f5c7f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506135c292505050565b91508682600184510381518110611f6f57fe5b60200260200101511015611fb45760405162461bcd60e51b815260040180806020018281038252602b8152602001806147ad602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611ff057fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561202357600080fd5b505af1158015612037573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61209c7f0000000000000000000000000000000000000000000000000000000000000000898960008181106118ab57fe5b846000815181106120a957fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156120f757600080fd5b505af115801561210b573d6000803e3d6000fd5b505050506040513d602081101561212157600080fd5b505161212957fe5b6121688287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061392b915050565b5095945050505050565b6000610dbe848484613ff2565b606081428110156121c5576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b6122237f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613b6892505050565b9150868260008151811061223357fe5b602002602001015111156113bd5760405162461bcd60e51b815260040180806020018281038252602781526020018061471d6027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe8484846140ca565b600081428110156122ef576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b61231e887f000000000000000000000000000000000000000000000000000000000000000089898930896127a0565b9050809250506123a788858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561237657600080fd5b505afa15801561238a573d6000803e3d6000fd5b505050506040513d60208110156123a057600080fd5b5051613288565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561240d57600080fd5b505af1158015612421573d6000803e3d6000fd5b5050505061147884836133f2565b8042811015612473576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106124aa57fe5b905060200201356001600160a01b03166001600160a01b031614612503576040805162461bcd60e51b815260206004820152601d6024820152600080516020614744833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561256357600080fd5b505af1158015612577573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6125dc7f0000000000000000000000000000000000000000000000000000000000000000898960008181106118ab57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561262357600080fd5b505af1158015612637573d6000803e3d6000fd5b505050506040513d602081101561264d57600080fd5b505161265557fe5b60008686600019810181811061266757fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156126c357600080fd5b505afa1580156126d7573d6000803e3d6000fd5b505050506040513d60208110156126ed57600080fd5b5051604080516020898102828101820190935289825292935061272f9290918a918a918291850190849080828437600092019190915250899250613ca0915050565b87611a4b828989600019810181811061274457fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a1957600080fd5b60008082428110156127e7576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b60006128147f00000000000000000000000000000000000000000000000000000000000000008c8c61370e565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561286f57600080fd5b505af1158015612883573d6000803e3d6000fd5b505050506040513d602081101561289957600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156128e657600080fd5b505af11580156128fa573d6000803e3d6000fd5b505050506040513d604081101561291057600080fd5b5080516020909101519092509050600061292a8e8e614170565b509050806001600160a01b03168e6001600160a01b03161461294d578183612950565b82825b90975095508a8710156129945760405162461bcd60e51b81526004018080602001828103825260268152602001806147646026913960400191505060405180910390fd5b898610156129d35760405162461bcd60e51b81526004018080602001828103825260268152602001806146aa6026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111be7f000000000000000000000000000000000000000000000000000000000000000084846135c2565b6000806000612a857f00000000000000000000000000000000000000000000000000000000000000008e7f000000000000000000000000000000000000000000000000000000000000000061370e565b9050600087612a94578c612a98565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612b0e57600080fd5b505af1158015612b22573d6000803e3d6000fd5b50505050612b348e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b60008060008342811015612b92576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b612ba08c8c8c8c8c8c61424e565b90945092506000612bd27f00000000000000000000000000000000000000000000000000000000000000008e8e61370e565b9050612be08d3383886137ce565b612bec8c3383876137ce565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612c3b57600080fd5b505af1158015612c4f573d6000803e3d6000fd5b505050506040513d6020811015612c6557600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612cc5576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b612cf38a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c61424e565b90945092506000612d457f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061370e565b9050612d538b3383886137ce565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612dae57600080fd5b505af1158015612dc2573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612e3e57600080fd5b505af1158015612e52573d6000803e3d6000fd5b505050506040513d6020811015612e6857600080fd5b5051612e7057fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612ebf57600080fd5b505af1158015612ed3573d6000803e3d6000fd5b505050506040513d6020811015612ee957600080fd5b5051925034841015612f0157612f01338534036133f2565b505096509650969350505050565b60608142811015612f55576040805162461bcd60e51b81526020600482015260186024820152600080516020614827833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612f8c57fe5b905060200201356001600160a01b03166001600160a01b031614612fe5576040805162461bcd60e51b815260206004820152601d6024820152600080516020614744833981519152604482015290519081900360640190fd5b6130437f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613b6892505050565b9150348260008151811061305357fe5b602002602001015111156130985760405162461bcd60e51b815260040180806020018281038252602781526020018061471d6027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106130d457fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561310757600080fd5b505af115801561311b573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6131807f0000000000000000000000000000000000000000000000000000000000000000898960008181106118ab57fe5b8460008151811061318d57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156131db57600080fd5b505af11580156131ef573d6000803e3d6000fd5b505050506040513d602081101561320557600080fd5b505161320d57fe5b61324c8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061392b915050565b8160008151811061325957fe5b602002602001015134111561216857612168338360008151811061327957fe5b602002602001015134036133f2565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106133055780518252601f1990920191602091820191016132e6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613367576040519150601f19603f3d011682016040523d82523d6000602084013e61336c565b606091505b509150915081801561339a57508051158061339a575080806020019051602081101561339757600080fd5b50515b6133eb576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061343e5780518252601f19909201916020918201910161341f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146134a0576040519150601f19603f3d011682016040523d82523d6000602084013e6134a5565b606091505b50509050806134e55760405162461bcd60e51b815260040180806020018281038252602381526020018061478a6023913960400191505060405180910390fd5b505050565b600080841161352a5760405162461bcd60e51b815260040180806020018281038252602b8152602001806147fc602b913960400191505060405180910390fd5b60008311801561353a5750600082115b6135755760405162461bcd60e51b81526004018080602001828103825260288152602001806146d06028913960400191505060405180910390fd5b6000613583856103e56144df565b9050600061359182856144df565b905060006135ab836135a5886103e86144df565b90614542565b90508082816135b657fe5b04979650505050505050565b606060028251101561361b576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561363357600080fd5b5060405190808252806020026020018201604052801561365d578160200160208202803683370190505b509050828160008151811061366e57fe5b60200260200101818152505060005b6001835103811015613706576000806136c08786858151811061369c57fe5b60200260200101518786600101815181106136b357fe5b6020026020010151614591565b915091506136e28484815181106136d357fe5b602002602001015183836134ea565b8484600101815181106136f157fe5b6020908102919091010152505060010161367d565b509392505050565b600080600061371d8585614170565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f0c8a8a7c2be8c7707980ffe0ad138290adb87b59720c062c427ee0f43dab6233609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106138535780518252601f199092019160209182019101613834565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146138b5576040519150601f19603f3d011682016040523d82523d6000602084013e6138ba565b606091505b50915091508180156138e85750805115806138e857508080602001905160208110156138e557600080fd5b50515b6139235760405162461bcd60e51b81526004018080602001828103825260248152602001806147d86024913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613b625760008084838151811061394957fe5b602002602001015185846001018151811061396057fe5b60200260200101519150915060006139788383614170565b509050600087856001018151811061398c57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146139ba578260006139be565b6000835b91509150600060028a510388106139d55788613a16565b613a167f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110613a0957fe5b602002602001015161370e565b9050613a437f0000000000000000000000000000000000000000000000000000000000000000888861370e565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613a80576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613ae8578181015183820152602001613ad0565b50505050905090810190601f168015613b155780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613b3757600080fd5b505af1158015613b4b573d6000803e3d6000fd5b50506001909901985061392e975050505050505050565b50505050565b6060600282511015613bc1576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613bd957600080fd5b50604051908082528060200260200182016040528015613c03578160200160208202803683370190505b5090508281600183510381518110613c1757fe5b60209081029190910101528151600019015b801561370657600080613c5987866001860381518110613c4557fe5b60200260200101518786815181106136b357fe5b91509150613c7b848481518110613c6c57fe5b60200260200101518383613ff2565b846001850381518110613c8a57fe5b6020908102919091010152505060001901613c29565b60005b60018351038110156134e557600080848381518110613cbe57fe5b6020026020010151858460010181518110613cd557fe5b6020026020010151915091506000613ced8383614170565b5090506000613d1d7f0000000000000000000000000000000000000000000000000000000000000000858561370e565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613d5e57600080fd5b505afa158015613d72573d6000803e3d6000fd5b505050506040513d6060811015613d8857600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613dbe578284613dc1565b83835b91509150613e16828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a1957600080fd5b9550613e238683836134ea565b945050505050600080856001600160a01b0316886001600160a01b031614613e4d57826000613e51565b6000835b91509150600060028c51038a10613e68578a613e9c565b613e9c7f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110613a0957fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613f26578181015183820152602001613f0e565b50505050905090810190601f168015613f535780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613f7557600080fd5b505af1158015613f89573d6000803e3d6000fd5b50506001909b019a50613ca39950505050505050505050565b808203828111156111c1576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008084116140325760405162461bcd60e51b815260040180806020018281038252602c815260200180614659602c913960400191505060405180910390fd5b6000831180156140425750600082115b61407d5760405162461bcd60e51b81526004018080602001828103825260288152602001806146d06028913960400191505060405180910390fd5b60006140956103e861408f86886144df565b906144df565b905060006140a96103e561408f8689613fa2565b90506140c060018284816140b957fe5b0490614542565b9695505050505050565b600080841161410a5760405162461bcd60e51b81526004018080602001828103825260258152602001806146f86025913960400191505060405180910390fd5b60008311801561411a5750600082115b6141555760405162461bcd60e51b81526004018080602001828103825260288152602001806146d06028913960400191505060405180910390fd5b8261416085846144df565b8161416757fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156141c45760405162461bcd60e51b81526004018080602001828103825260258152602001806146856025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106141e45782846141e7565b83835b90925090506001600160a01b038216614247576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156142da57600080fd5b505afa1580156142ee573d6000803e3d6000fd5b505050506040513d602081101561430457600080fd5b50516001600160a01b031614156143c2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561439557600080fd5b505af11580156143a9573d6000803e3d6000fd5b505050506040513d60208110156143bf57600080fd5b50505b6000806143f07f00000000000000000000000000000000000000000000000000000000000000008b8b614591565b91509150816000148015614402575080155b15614412578793508692506144d2565b600061441f8984846140ca565b905087811161447257858110156144675760405162461bcd60e51b81526004018080602001828103825260268152602001806146aa6026913960400191505060405180910390fd5b8894509250826144d0565b600061447f8984866140ca565b90508981111561448b57fe5b878110156144ca5760405162461bcd60e51b81526004018080602001828103825260268152602001806147646026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806144fa575050808202828282816144f757fe5b04145b6111c1576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b808201828110156111c1576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006145a08585614170565b5090506000806145b188888861370e565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156145e957600080fd5b505afa1580156145fd573d6000803e3d6000fd5b505050506040513d606081101561461357600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b0387811690841614614646578082614649565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e56414c49445f50415448000000556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a2646970667358221220b258f1ac25946290cfd5cd53b0dda3e1c7a27d78d18d526ff8b0ea8ed82df7b064736f6c634300060c00330000000000000000000000006178c3b21f7ca1add84c16ad35452c85a85f5df400000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

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

0000000000000000000000006178c3b21f7ca1add84c16ad35452c85a85f5df400000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Decoded View---------------
Arg [0] : _factory (address): 0x6178c3b21f7ca1add84c16ad35452c85a85f5df4
Arg [1] : _WETH (address): 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000006178c3b21f7ca1add84c16ad35452c85a85f5df4
Arg [1] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83


Deployed ByteCode Sourcemap

16404:18986:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17039:10;-1:-1:-1;;;;;17053:4:0;17039:18;;17032:26;;;;16404:18986;;;;;21189:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21189:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34334:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34334:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28365:967;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28365:967:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28365:967:0;;;;;;;;;;;;-1:-1:-1;28365:967:0;-1:-1:-1;;;;;;28365:967:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35134:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35134:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35134:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35134:253:0;;-1:-1:-1;35134:253:0;;-1:-1:-1;;;;;35134:253:0:i;21868:677::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21868:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25582:628::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25582:628:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25582:628:0;;;;;;;;;;;;-1:-1:-1;25582:628:0;-1:-1:-1;;;;;;25582:628:0;;;;;;;;:::i;27531:828::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27531:828:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27531:828:0;;;;;;;;;;;;-1:-1:-1;27531:828:0;-1:-1:-1;;;;;;27531:828:0;;;;;;;;:::i;24012:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24012:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31522:728::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31522:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31522:728:0;;;;;;;;;;;;-1:-1:-1;31522:728:0;-1:-1:-1;;;;;;31522:728:0;;;;;;;;:::i;33126:968::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33126:968:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33126:968:0;;;;;;;;;;;;-1:-1:-1;33126:968:0;-1:-1:-1;;;;;;33126:968:0;;;;;;;;:::i;26828:697::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26828:697:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26828:697:0;;;;;;;;;;;;-1:-1:-1;26828:697:0;-1:-1:-1;;;;;;26828:697:0;;;;;;;;:::i;34604:261::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34604:261:0;;;;;;;;;;;;:::i;26216:606::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26216:606:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26216:606:0;;;;;;;;;;;;-1:-1:-1;26216:606:0;-1:-1:-1;;;;;;26216:606:0;;;;;;;;:::i;16547:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;16547:38:0;;;;;;;;;;;;;;34138:188;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34138:188:0;;;;;;;;;;;;:::i;23299:707::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23299:707:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32256:864::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32256:864:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32256:864:0;;;;;;;;;;;;-1:-1:-1;32256:864:0;-1:-1:-1;;;;;;32256:864:0;;;;;;;;:::i;20318:865::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20318:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16499:41::-;;;;;;;;;;;;;:::i;34873:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34873:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34873:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34873:253:0;;-1:-1:-1;34873:253:0;;-1:-1:-1;;;;;34873:253:0:i;22551:669::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22551:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18557:738::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18557:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19301:974;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19301:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29338:810::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29338:810:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29338:810:0;;;;;;;;;;;;-1:-1:-1;29338:810:0;-1:-1:-1;;;;;;29338:810:0;;;;;;;;:::i;21189:673::-;21426:16;21444:14;21407:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;21498:196:::1;21528:5;21548:4;21567:9;21591:14;21620:12;21655:4;21675:8;21498:15;:196::i;:::-;21471:223:::0;;-1:-1:-1;21471:223:0;-1:-1:-1;21705:51:0::1;21733:5:::0;21740:2;21471:223;21705:27:::1;:51::i;:::-;21773:4;-1:-1:-1::0;;;;;21767:20:0::1;;21788:9;21767:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21809:45;21840:2;21844:9;21809:30;:45::i;:::-;21189:673:::0;;;;;;;;;;:::o;34334:262::-;34487:14;34526:62;34556:8;34566:9;34577:10;34526:29;:62::i;:::-;34519:69;34334:262;-1:-1:-1;;;;34334:262:0:o;28365:967::-;28579:21;28551:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28651:4:0::1;28626:29;:4:::0;;-1:-1:-1;;28631:15:0;;28626:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28626:21:0::1;-1:-1:-1::0;;;;;28626:29:0::1;;28618:71;;;::::0;;-1:-1:-1;;;28618:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28618:71:0;;;;;;;;;;;;;::::1;;28710:55;28741:7;28750:8;28760:4;;28710:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28710:30:0::1;::::0;-1:-1:-1;;;28710:55:0:i:1;:::-;28700:65;;28815:12;28784:7;28809:1;28792:7;:14;:18;28784:27;;;;;;;;;;;;;;:43;;28776:99;;;;-1:-1:-1::0;;;28776:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28886:16;28905:51;28930:7;28939:4;;28944:1;28939:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28939:7:0::1;28948:4;;28953:1;28948:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28948:7:0::1;28905:24;:51::i;:::-;28886:70;;28967:98;29013:4;;29018:1;29013:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29013:7:0::1;29022:10;29034:8;29044:7;29052:1;29044:10;;;;;;;;;;;;;;28967:31;:98::i;:::-;29076:35;29082:7;29091:4;;29076:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29105:4:0::1;::::0;-1:-1:-1;29076:5:0::1;::::0;-1:-1:-1;;29076:35:0:i:1;:::-;29128:4;-1:-1:-1::0;;;;;29122:20:0::1;;29143:7;29168:1;29151:7;:14;:18;29143:27;;;;;;;;;;;;;;29122:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29182:63;29213:2;29217:7;29242:1;29225:7;:14;:18;29217:27;;;;;;;;;;;;;;29182:30;:63::i;:::-;29307:2;-1:-1:-1::0;;;;;29261:63:0::1;29279:4;-1:-1:-1::0;;;;;29261:63:0::1;;29285:8;29294:12;29310:4;;29315:8;29261:63;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;29261:63:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;29261:63:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;29261:63:0;;-1:-1:-1;;;;;;;29261:63:0::1;16857:1;28365:967:::0;;;;;;;;;:::o;35134:253::-;35278:21;35324:55;35354:7;35363:9;35374:4;35324:29;:55::i;:::-;35317:62;;35134:253;;;;;:::o;21868:677::-;22174:12;22188;22213;22228:49;22253:7;22262:6;22270;22228:24;:49::i;:::-;22213:64;;22288:10;22301;:33;;22325:9;22301:33;;;-1:-1:-1;;22301:33:0;22345:80;;;-1:-1:-1;;;22345:80:0;;22373:10;22345:80;;;;22393:4;22345:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22288:46;;-1:-1:-1;;;;;;22345:27:0;;;;;:80;;;;;-1:-1:-1;;22345:80:0;;;;;;;;-1:-1:-1;22345:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22457;22473:6;22481;22489:9;22500:10;22512;22524:2;22528:8;22457:15;:80::i;:::-;22436:101;;;;;;;;21868:677;;;;;;;;;;;;;;;;:::o;25582:628::-;25806:21;25787:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;25850:55:::1;25881:7;25890:8;25900:4;;25850:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25850:30:0::1;::::0;-1:-1:-1;;;25850:55:0:i:1;:::-;25840:65;;25955:12;25924:7;25949:1;25932:7;:14;:18;25924:27;;;;;;;;;;;;;;:43;;25916:99;;;;-1:-1:-1::0;;;25916:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26026:141;26072:4;;26077:1;26072:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;26072:7:0::1;26081:10;26093:51;26118:7;26127:4;;26132:1;26127:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;26127:7:0::1;26136:4;;26141:1;26136:7;;;;;;26093:51;26146:7;26154:1;26146:10;;;;;;;26026:141;26178:24;26184:7;26193:4;;26178:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26199:2:0;;-1:-1:-1;26178:5:0::1;::::0;-1:-1:-1;;26178:24:0:i:1;:::-;25582:628:::0;;;;;;;;;:::o;27531:828::-;27745:21;27717:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27817:4:0::1;27792:29;:4:::0;;-1:-1:-1;;27797:15:0;;27792:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27792:21:0::1;-1:-1:-1::0;;;;;27792:29:0::1;;27784:71;;;::::0;;-1:-1:-1;;;27784:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27784:71:0;;;;;;;;;;;;;::::1;;27876:55;27906:7;27915:9;27926:4;;27876:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27876:29:0::1;::::0;-1:-1:-1;;;27876:55:0:i:1;:::-;27866:65;;27964:11;27950:7;27958:1;27950:10;;;;;;;;;;;;;;:25;;27942:77;;;;-1:-1:-1::0;;;27942:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28030:141;28076:4;;28081:1;28076:7;;;;;;28030:141;28182:35;28188:7;28197:4;;28182:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28211:4:0::1;::::0;-1:-1:-1;28182:5:0::1;::::0;-1:-1:-1;;28182:35:0:i:1;:::-;28234:4;-1:-1:-1::0;;;;;28228:20:0::1;;28249:7;28274:1;28257:7;:14;:18;28249:27;;;;;;;;;;;;;;28228:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28288:63;28319:2;28323:7;28348:1;28331:7;:14;:18;28323:27;;;;;;;24012:718:::0;24330:14;24357:12;24372:46;24397:7;24406:5;24413:4;24372:24;:46::i;:::-;24357:61;;24429:10;24442;:33;;24466:9;24442:33;;;-1:-1:-1;;24442:33:0;24486:80;;;-1:-1:-1;;;24486:80:0;;24514:10;24486:80;;;;24534:4;24486:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24429:46;;-1:-1:-1;;;;;;24486:27:0;;;;;:80;;;;;-1:-1:-1;;24486:80:0;;;;;;;;-1:-1:-1;24486:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24589:133;24651:5;24658:9;24669:14;24685:12;24699:2;24703:8;24589:47;:133::i;:::-;24577:145;24012:718;-1:-1:-1;;;;;;;;;;;;;24012:718:0:o;31522:728::-;31756:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;31777:139:::1;31823:4;;31828:1;31823:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31823:7:0::1;31832:10;31844:51;31869:7;31878:4;;31883:1;31878:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31878:7:0::1;31887:4;;31892:1;31887:7;;;;;;31844:51;31897:8;31777:31;:139::i;:::-;31927:18;31962:4:::0;;-1:-1:-1;;31967:15:0;;31962:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31962:21:0::1;-1:-1:-1::0;;;;;31948:46:0::1;;31995:2;31948:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;31948:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31948:50:0;32009:44:::1;::::0;;31948:50:::1;32009:44:::0;;::::1;::::0;;;;;;;;;;;31948:50;;-1:-1:-1;32009:44:0::1;::::0;;;32044:4;;;;;;32009:44;::::1;::::0;32044:4;;32009:44;32044:4;32009:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32050:2:0;;-1:-1:-1;32009:34:0::1;::::0;-1:-1:-1;;32009:44:0:i:1;:::-;32159:12:::0;32086:69:::1;32141:13:::0;32100:4;;-1:-1:-1;;32105:15:0;;32100:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32100:21:0::1;-1:-1:-1::0;;;;;32086:46:0::1;;32133:2;32086:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32086:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32086:50:0;;:54:::1;:69::i;:::-;:85;;32064:178;;;;-1:-1:-1::0;;;32064:178:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16857:1;31522:728:::0;;;;;;;:::o;33126:968::-;33393:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33452:4:0::1;33427:29;:4:::0;;-1:-1:-1;;33432:15:0;;33427:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33427:21:0::1;-1:-1:-1::0;;;;;33427:29:0::1;;33419:71;;;::::0;;-1:-1:-1;;;33419:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33419:71:0;;;;;;;;;;;;;::::1;;33501:16;33520:51;33545:7;33554:4;;33559:1;33554:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33554:7:0::1;33563:4;;33568:1;33563:7;;;;;;33520:51;33501:70;;33582:96;33628:4;;33633:1;33628:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33628:7:0::1;33637:10;33649:8;33659;33582:31;:96::i;:::-;33689:55;33724:4;;33689:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33738:4:0::1;::::0;-1:-1:-1;33689:34:0::1;::::0;-1:-1:-1;;33689:55:0:i:1;:::-;33755:14;33786:4;-1:-1:-1::0;;;;;33772:29:0::1;;33810:4;33772:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;33772:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33772:44:0;;-1:-1:-1;33835:25:0;;::::1;;33827:81;;;;-1:-1:-1::0;;;33827:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33925:4;-1:-1:-1::0;;;;;33919:20:0::1;;33940:9;33919:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33961:45;33992:2;33996:9;33961:30;:45::i;:::-;34068:2;-1:-1:-1::0;;;;;34022:64:0::1;34040:4;-1:-1:-1::0;;;;;34022:64:0::1;;34046:8;34055:12;34071:4;;34077:8;34022:64;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;34022:64:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;34022:64:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;34022:64:0;;-1:-1:-1;;;;;;;34022:64:0::1;16857:1;;33126:968:::0;;;;;;;:::o;26828:697::-;27044:21;27016:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;27102:4:::1;-1:-1:-1::0;;;;;27091:15:0::1;:4;;27096:1;27091:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27091:7:0::1;-1:-1:-1::0;;;;;27091:15:0::1;;27083:57;;;::::0;;-1:-1:-1;;;27083:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27083:57:0;;;;;;;;;;;;;::::1;;27161:56;27192:7;27201:9;27212:4;;27161:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27161:30:0::1;::::0;-1:-1:-1;;;27161:56:0:i:1;:::-;27151:66;;27267:12;27236:7;27261:1;27244:7;:14;:18;27236:27;;;;;;;;;;;;;;:43;;27228:99;;;;-1:-1:-1::0;;;27228:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27344:4;-1:-1:-1::0;;;;;27338:19:0::1;;27365:7;27373:1;27365:10;;;;;;;;;;;;;;27338:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;27402:4;-1:-1:-1::0;;;;;27396:20:0::1;;27417:51;27442:7;27451:4;;27456:1;27451:7;;;;;;27417:51;27470:7;27478:1;27470:10;;;;;;;;;;;;;;27396:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;27396:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27396:85:0;27389:93:::1;;;;27493:24;27499:7;27508:4;;27493:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27514:2:0;;-1:-1:-1;27493:5:0::1;::::0;-1:-1:-1;;27493:24:0:i:1;:::-;26828:697:::0;;;;;;;;:::o;34604:261::-;34757:13;34795:62;34824:9;34835;34846:10;34795:28;:62::i;26216:606::-;26440:21;26421:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;26484:55:::1;26514:7;26523:9;26534:4;;26484:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26484:29:0::1;::::0;-1:-1:-1;;;26484:55:0:i:1;:::-;26474:65;;26572:11;26558:7;26566:1;26558:10;;;;;;;;;;;;;;:25;;26550:77;;;;-1:-1:-1::0;;;26550:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16547:38:::0;;;:::o;34138:188::-;34235:12;34267:51;34290:7;34299:8;34309;34267:22;:51::i;23299:707::-;23565:14;23546:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;23608:196:::1;23638:5;23658:4;23677:9;23701:14;23730:12;23765:4;23785:8;23608:15;:196::i;:::-;23592:212;;;;;;23815:85;23843:5;23850:2;23868:5;-1:-1:-1::0;;;;;23854:30:0::1;;23893:4;23854:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;23854:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23854:45:0;23815:27:::1;:85::i;:::-;23917:4;-1:-1:-1::0;;;;;23911:20:0::1;;23932:9;23911:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23953:45;23984:2;23988:9;23953:30;:45::i;32256:864::-:0;32516:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;32561:4:::1;-1:-1:-1::0;;;;;32550:15:0::1;:4;;32555:1;32550:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32550:7:0::1;-1:-1:-1::0;;;;;32550:15:0::1;;32542:57;;;::::0;;-1:-1:-1;;;32542:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32542:57:0;;;;;;;;;;;;;::::1;;32610:13;32626:9;32610:25;;32652:4;-1:-1:-1::0;;;;;32646:19:0::1;;32673:8;32646:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32708:4;-1:-1:-1::0;;;;;32702:20:0::1;;32723:51;32748:7;32757:4;;32762:1;32757:7;;;;;;32723:51;32776:8;32702:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;32702:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32702:83:0;32695:91:::1;;;;32797:18;32832:4:::0;;-1:-1:-1;;32837:15:0;;32832:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32832:21:0::1;-1:-1:-1::0;;;;;32818:46:0::1;;32865:2;32818:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32818:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32818:50:0;32879:44:::1;::::0;;32818:50:::1;32879:44:::0;;::::1;::::0;;;;;;;;;;;32818:50;;-1:-1:-1;32879:44:0::1;::::0;;;32914:4;;;;;;32879:44;::::1;::::0;32914:4;;32879:44;32914:4;32879:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32920:2:0;;-1:-1:-1;32879:34:0::1;::::0;-1:-1:-1;;32879:44:0:i:1;:::-;33029:12:::0;32956:69:::1;33011:13:::0;32970:4;;-1:-1:-1;;32975:15:0;;32970:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32970:21:0::1;-1:-1:-1::0;;;;;32956:46:0::1;;33003:2;32956:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32956:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;20318:865:::0;20572:12;20586;20553:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;20611:12:::1;20626:49;20651:7;20660:6;20668;20626:24;:49::i;:::-;20686:62;::::0;;-1:-1:-1;;;20686:62:0;;20720:10:::1;20686:62;::::0;::::1;::::0;-1:-1:-1;;;;;20686:33:0;::::1;:62:::0;;;;;;;;;;;;;;20611:64;;-1:-1:-1;20686:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20686:33:0;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;20816:29:0::1;::::0;;-1:-1:-1;;;20816:29:0;;-1:-1:-1;;;;;20816:29:0;;::::1;;::::0;::::1;::::0;;;20786:12:::1;::::0;;;20816:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;20786:12;20816:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20816:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20816:29:0;-1:-1:-1;20857:14:0::1;20876:43;20904:6:::0;20912;20876:27:::1;:43::i;:::-;20856:63;;;20961:6;-1:-1:-1::0;;;;;20951:16:0::1;:6;-1:-1:-1::0;;;;;20951:16:0::1;;:58;;20992:7;21001;20951:58;;;20971:7;20980;20951:58;20930:79:::0;;-1:-1:-1;20930:79:0;-1:-1:-1;21028:21:0;;::::1;;21020:72;;;;-1:-1:-1::0;;;21020:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21122:10;21111:7;:21;;21103:72;;;;-1:-1:-1::0;;;21103:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16857:1;;;;20318:865:::0;;;;;;;;;;;:::o;16499:41::-;;;:::o;34873:253::-;35017:21;35063:55;35094:7;35103:8;35113:4;35063:30;:55::i;22551:669::-;22840:16;22858:14;22885:12;22900:46;22925:7;22934:5;22941:4;22900:24;:46::i;:::-;22885:61;;22957:10;22970;:33;;22994:9;22970:33;;;-1:-1:-1;;22970:33:0;23014:80;;;-1:-1:-1;;;23014:80:0;;23042:10;23014:80;;;;23062:4;23014:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22957:46;;-1:-1:-1;;;;;;23014:27:0;;;;;:80;;;;;-1:-1:-1;;23014:80:0;;;;;;;;-1:-1:-1;23014:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23132;23151:5;23158:9;23169:14;23185:12;23199:2;23203:8;23132:18;:80::i;:::-;23105:107;;;;-1:-1:-1;22551:669:0;-1:-1:-1;;;;;;;;;;;;;22551:669:0:o;18557:738::-;18845:12;18859;18873:14;18826:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;18921:85:::1;18935:6;18943;18951:14;18967;18983:10;18995;18921:13;:85::i;:::-;18900:106:::0;;-1:-1:-1;18900:106:0;-1:-1:-1;19017:12:0::1;19032:49;19057:7;19066:6:::0;19074;19032:24:::1;:49::i;:::-;19017:64;;19092:66;19124:6;19132:10;19144:4;19150:7;19092:31;:66::i;:::-;19169;19201:6;19209:10;19221:4;19227:7;19169:31;:66::i;:::-;19273:4;-1:-1:-1::0;;;;;19258:25:0::1;;19284:2;19258:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;19258:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19258:29:0;18557:738;;;;-1:-1:-1;19258:29:0;;-1:-1:-1;18557:738:0;;-1:-1:-1;;;;;;;;;18557:738:0:o;19301:974::-;19554:16;19572:14;19588;19535:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;19642:176:::1;19670:5;19690:4;19709:18;19742:9;19766:14;19795:12;19642:13;:176::i;:::-;19615:203:::0;;-1:-1:-1;19615:203:0;-1:-1:-1;19829:12:0::1;19844:46;19869:7;19878:5:::0;19885:4:::1;19844:24;:46::i;:::-;19829:61;;19901:69;19933:5;19940:10;19952:4;19958:11;19901:31;:69::i;:::-;19987:4;-1:-1:-1::0;;;;;19981:19:0::1;;20008:9;19981:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;20044:4;-1:-1:-1::0;;;;;20038:20:0::1;;20059:4;20065:9;20038:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;20038:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20038:37:0;20031:45:::1;;;;20114:4;-1:-1:-1::0;;;;;20099:25:0::1;;20125:2;20099:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;20099:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20099:29:0;;-1:-1:-1;20179:9:0::1;:21:::0;-1:-1:-1;20175:92:0::1;;;20202:65;20233:10;20257:9;20245;:21;20202:30;:65::i;:::-;16857:1;19301:974:::0;;;;;;;;;;;:::o;29338:810::-;29551:21;29523:8;16802:15;16790:8;:27;;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16782:64:0;;;;;;;;;;;;;;;29609:4:::1;-1:-1:-1::0;;;;;29598:15:0::1;:4;;29603:1;29598:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29598:7:0::1;-1:-1:-1::0;;;;;29598:15:0::1;;29590:57;;;::::0;;-1:-1:-1;;;29590:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29590:57:0;;;;;;;;;;;;;::::1;;29668:55;29698:7;29707:9;29718:4;;29668:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29668:29:0::1;::::0;-1:-1:-1;;;29668:55:0:i:1;:::-;29658:65;;29756:9;29742:7;29750:1;29742:10;;;;;;;;;;;;;;:23;;29734:75;;;;-1:-1:-1::0;;;29734:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29826:4;-1:-1:-1::0;;;;;29820:19:0::1;;29847:7;29855:1;29847:10;;;;;;;;;;;;;;29820:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;29884:4;-1:-1:-1::0;;;;;29878:20:0::1;;29899:51;29924:7;29933:4;;29938:1;29933:7;;;;;;29899:51;29952:7;29960:1;29952:10;;;;;;;;;;;;;;29878:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;29878:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29878:85:0;29871:93:::1;;;;29975:24;29981:7;29990:4;;29975:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29996:2:0;;-1:-1:-1;29975:5:0::1;::::0;-1:-1:-1;;29975:24:0:i:1;:::-;30062:7;30070:1;30062:10;;;;;;;;;;;;;;30050:9;:22;30046:94;;;30074:66;30105:10;30129:7;30137:1;30129:10;;;;;;;;;;;;;;30117:9;:22;30074:30;:66::i;8281:361::-:0;8476:45;;;-1:-1:-1;;;;;8476:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8476:45:0;-1:-1:-1;;;8476:45:0;;;8465:57;;;;8430:12;;8444:17;;8465:10;;;;8476:45;8465:57;;;8476:45;8465:57;;8476:45;8465:57;;;;;;;;;;-1:-1:-1;;8465:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8429:93;;;;8541:7;:57;;;;-1:-1:-1;8553:11:0;;:16;;:44;;;8584:4;8573:24;;;;;;;;;;;;;;;-1:-1:-1;8573:24:0;8553:44;8533:101;;;;;-1:-1:-1;;;8533:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8281:361;;;;;:::o;9060:195::-;9168:12;;;9130;9168;;;;;;;;;-1:-1:-1;;;;;9147:7:0;;;9161:5;;9147:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9147:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9129:52;;;9200:7;9192:55;;;;-1:-1:-1;;;9192:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9060:195;;;:::o;5313:517::-;5406:14;5452:1;5441:8;:12;5433:68;;;;-1:-1:-1;;;5433:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5532:1;5520:9;:13;:31;;;;;5550:1;5537:10;:14;5520:31;5512:84;;;;-1:-1:-1;;;5512:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5607:20;5630:17;:8;5643:3;5630:12;:17::i;:::-;5607:40;-1:-1:-1;5658:14:0;5675:31;5607:40;5695:10;5675:19;:31::i;:::-;5658:48;-1:-1:-1;5717:16:0;5736:40;5760:15;5736:19;:9;5750:4;5736:13;:19::i;:::-;:23;;:40::i;:::-;5717:59;;5811:11;5799:9;:23;;;;;;;5313:517;-1:-1:-1;;;;;;;5313:517:0:o;6505:511::-;6606:21;6663:1;6648:4;:11;:16;;6640:59;;;;;-1:-1:-1;;;6640:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6731:4;:11;6720:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6720:23:0;;6710:33;;6767:8;6754:7;6762:1;6754:10;;;;;;;;;;;;;:21;;;;;6791:6;6786:223;6817:1;6803:4;:11;:15;6799:1;:19;6786:223;;;6841:14;6857:15;6876:42;6888:7;6897:4;6902:1;6897:7;;;;;;;;;;;;;;6906:4;6911:1;6915;6911:5;6906:11;;;;;;;;;;;;;;6876;:42::i;:::-;6840:78;;;;6950:47;6963:7;6971:1;6963:10;;;;;;;;;;;;;;6975:9;6986:10;6950:12;:47::i;:::-;6933:7;6941:1;6945;6941:5;6933:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;6820:3:0;;6786:223;;;;6505:511;;;;;:::o;3830:478::-;3919:12;3945:14;3961;3979:26;3990:6;3998;3979:10;:26::i;:::-;4143:32;;;-1:-1:-1;;4143:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4133:43;;;;;;-1:-1:-1;;;;;;4046:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4036:262;;;;;;;;;3830:478;-1:-1:-1;;;;;3830:478:0:o;8650:402::-;8875:51;;;-1:-1:-1;;;;;8875:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8875:51:0;-1:-1:-1;;;8875:51:0;;;8864:63;;;;8829:12;;8843:17;;8864:10;;;;8875:51;8864:63;;;8875:51;8864:63;;8875:51;8864:63;;;;;;;;;;-1:-1:-1;;8864:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8828:99;;;;8946:7;:57;;;;-1:-1:-1;8958:11:0;;:16;;:44;;;8989:4;8978:24;;;;;;;;;;;;;;;-1:-1:-1;8978:24:0;8958:44;8938:106;;;;-1:-1:-1;;;8938:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8650:402;;;;;;:::o;24841:735::-;24948:6;24943:626;24974:1;24960:4;:11;:15;24956:1;:19;24943:626;;;24998:13;25013:14;25032:4;25037:1;25032:7;;;;;;;;;;;;;;25041:4;25046:1;25050;25046:5;25041:11;;;;;;;;;;;;;;24997:56;;;;25069:14;25088:42;25116:5;25123:6;25088:27;:42::i;:::-;25068:62;;;25145:14;25162:7;25170:1;25174;25170:5;25162:14;;;;;;;;;;;;;;25145:31;;25192:15;25209;25237:6;-1:-1:-1;;;;;25228:15:0;:5;-1:-1:-1;;;;;25228:15:0;;:61;;25270:9;25286:1;25228:61;;;25252:1;25256:9;25228:61;25191:98;;;;25304:10;25335:1;25321:4;:11;:15;25317:1;:19;:82;;25396:3;25317:82;;;25339:54;25364:7;25373:6;25381:4;25386:1;25390;25386:5;25381:11;;;;;;;;;;;;;;25339:24;:54::i;:::-;25304:95;;25429:48;25454:7;25463:5;25470:6;25429:24;:48::i;:::-;-1:-1:-1;;;;;25414:69:0;;25502:10;25514;25526:2;25540:1;25530:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25530:12:0;;25414:143;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25414:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24977:3:0;;;;;-1:-1:-1;24943:626:0;;-1:-1:-1;;;;;;;;24943:626:0;;;24841:735;;;:::o;7097:532::-;7198:21;7255:1;7240:4;:11;:16;;7232:59;;;;;-1:-1:-1;;;7232:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7323:4;:11;7312:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7312:23:0;;7302:33;;7376:9;7346:7;7371:1;7354:7;:14;:18;7346:27;;;;;;;;;;;;;;;;;:39;7410:11;;-1:-1:-1;;7410:15:0;7396:226;7427:5;;7396:226;;7455:14;7471:15;7490:42;7502:7;7511:4;7520:1;7516;:5;7511:11;;;;;;;;;;;;;;7524:4;7529:1;7524:7;;;;;;;7490:42;7454:78;;;;7564:46;7576:7;7584:1;7576:10;;;;;;;;;;;;;;7588:9;7599:10;7564:11;:46::i;:::-;7547:7;7559:1;7555;:5;7547:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;7434:3:0;7396:226;;30295:1221;30408:6;30403:1106;30434:1;30420:4;:11;:15;30416:1;:19;30403:1106;;;30458:13;30473:14;30492:4;30497:1;30492:7;;;;;;;;;;;;;;30501:4;30506:1;30510;30506:5;30501:11;;;;;;;;;;;;;;30457:56;;;;30529:14;30548:42;30576:5;30583:6;30548:27;:42::i;:::-;30528:62;;;30605:19;30642:48;30667:7;30676:5;30683:6;30642:24;:48::i;:::-;30605:86;;30706:16;30737:17;30825:13;30840;30858:4;-1:-1:-1;;;;;30858:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30858:18:0;;;;;;;-1:-1:-1;;;;;30824:52:0;;;;-1:-1:-1;30824:52:0;;-1:-1:-1;30892:17:0;;-1:-1:-1;;;;;30933:15:0;;;;;;;:61;;30975:8;30985;30933:61;;;30952:8;30962;30933:61;30891:103;;;;31023:63;31073:12;31037:5;-1:-1:-1;;;;;31023:30:0;;31062:4;31023:45;;;;;;;;;;;;;-1:-1:-1;;;;;31023:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;:63;31009:77;;31116:71;31146:11;31159:12;31173:13;31116:29;:71::i;:::-;31101:86;;30403:1106;;;;31218:15;31235;31263:6;-1:-1:-1;;;;;31254:15:0;:5;-1:-1:-1;;;;;31254:15:0;;:67;;31299:12;31318:1;31254:67;;;31278:1;31282:12;31254:67;31217:104;;;;31336:10;31367:1;31353:4;:11;:15;31349:1;:19;:82;;31428:3;31349:82;;;31371:54;31396:7;31405:6;31413:4;31418:1;31422;31418:5;31413:11;;;;;;;31371:54;31484:12;;;31494:1;31484:12;;;;;;;;;;-1:-1:-1;;;31446:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31446:51:0;;;;;;;;;;;;;;;;;;;;;;31336:95;;-1:-1:-1;31446:9:0;;;;;;31456:10;;31468;;31336:95;;31484:12;;31446:51;;;;;;;;31484:12;;31446:51;;;;31484:12;;31446:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30437:3:0;;;;;-1:-1:-1;30403:1106:0;;-1:-1:-1;;;;;;;;;;30403:1106:0;2836:129;2920:5;;;2915:16;;;;2907:50;;;;;-1:-1:-1;;;2907:50:0;;;;;;;;;;;;-1:-1:-1;;;2907:50:0;;;;;;;;;;;;;;5951:472;6044:13;6090:1;6078:9;:13;6070:70;;;;-1:-1:-1;;;6070:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6171:1;6159:9;:13;:31;;;;;6189:1;6176:10;:14;6159:31;6151:84;;;;-1:-1:-1;;;6151:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6246:14;6263:34;6292:4;6263:24;:9;6277;6263:13;:24::i;:::-;:28;;:34::i;:::-;6246:51;-1:-1:-1;6308:16:0;6327:34;6357:3;6327:25;:10;6342:9;6327:14;:25::i;:34::-;6308:53;;6383:32;6413:1;6396:11;6384:9;:23;;;;;;;6383:29;:32::i;:::-;6372:43;5951:472;-1:-1:-1;;;;;;5951:472:0:o;4870:321::-;4952:12;4995:1;4985:7;:11;4977:61;;;;-1:-1:-1;;;4977:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5068:1;5057:8;:12;:28;;;;;5084:1;5073:8;:12;5057:28;5049:81;;;;-1:-1:-1;;;5049:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5175:8;5151:21;:7;5163:8;5151:11;:21::i;:::-;:32;;;;;;;4870:321;-1:-1:-1;;;;4870:321:0:o;3389:349::-;3464:14;3480;3525:6;-1:-1:-1;;;;;3515:16:0;:6;-1:-1:-1;;;;;3515:16:0;;;3507:66;;;;-1:-1:-1;;;3507:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3612:6;-1:-1:-1;;;;;3603:15:0;:6;-1:-1:-1;;;;;3603:15:0;;:53;;3641:6;3649;3603:53;;;3622:6;3630;3603:53;3584:72;;-1:-1:-1;3584:72:0;-1:-1:-1;;;;;;3675:20:0;;3667:63;;;;;-1:-1:-1;;;3667:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3389:349;;;;;:::o;17161:1390::-;17379:12;17393;17536:1;-1:-1:-1;;;;;17474:64:0;17492:7;-1:-1:-1;;;;;17474:34:0;;17509:6;17517;17474:50;;;;;;;;;;;;;-1:-1:-1;;;;;17474:50:0;;;;;;-1:-1:-1;;;;;17474:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17474:50:0;-1:-1:-1;;;;;17474:64:0;;17470:150;;;17573:7;-1:-1:-1;;;;;17555:37:0;;17593:6;17601;17555:53;;;;;;;;;;;;;-1:-1:-1;;;;;17555:53:0;;;;;;-1:-1:-1;;;;;17555:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17470:150:0;17631:13;17646;17663:53;17692:7;17701:6;17709;17663:28;:53::i;:::-;17630:86;;;;17731:8;17743:1;17731:13;:30;;;;-1:-1:-1;17748:13:0;;17731:30;17727:817;;;17800:14;;-1:-1:-1;17816:14:0;;-1:-1:-1;17727:817:0;;;17864:19;17886:58;17909:14;17925:8;17935;17886:22;:58::i;:::-;17864:80;;17981:14;17963;:32;17959:574;;18042:10;18024:14;:28;;18016:79;;;;-1:-1:-1;;;18016:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18136:14;;-1:-1:-1;18152:14:0;-1:-1:-1;18152:14:0;17959:574;;;18208:19;18230:58;18253:14;18269:8;18279;18230:22;:58::i;:::-;18208:80;;18332:14;18314;:32;;18307:40;;;;18392:10;18374:14;:28;;18366:79;;;;-1:-1:-1;;;18366:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18486:14;-1:-1:-1;18502:14:0;;-1:-1:-1;17959:574:0;17727:817;;17161:1390;;;;;;;;;;;:::o;2973:142::-;3025:6;3052;;;:30;;-1:-1:-1;;3067:5:0;;;3081:1;3076;3067:5;3076:1;3062:15;;;;;:20;3052:30;3044:63;;;;;-1:-1:-1;;;3044:63:0;;;;;;;;;;;;-1:-1:-1;;;3044:63:0;;;;;;;;;;;;;;2700:128;2784:5;;;2779:16;;;;2771:49;;;;;-1:-1:-1;;;2771:49:0;;;;;;;;;;;;-1:-1:-1;;;2771:49:0;;;;;;;;;;;;;;4366:391;4459:13;4474;4501:14;4520:26;4531:6;4539;4520:10;:26::i;:::-;4500:46;;;4558:13;4573;4606:32;4614:7;4623:6;4631;4606:7;:32::i;:::-;-1:-1:-1;;;;;4591:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4591:62:0;;;;;;;-1:-1:-1;;;;;4557:96:0;;;;-1:-1:-1;4557:96:0;;-1:-1:-1;;;;;;4687:16:0;;;;;;;:62;;4730:8;4740;4687:62;;;4707:8;4717;4687:62;4664:85;;;;-1:-1:-1;4366:391:0;-1:-1:-1;;;;;;;4366:391:0:o

Swarm Source

ipfs://b258f1ac25946290cfd5cd53b0dda3e1c7a27d78d18d526ff8b0ea8ed82df7b0
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
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.