Contract 0x145677fc4d9b8f19b5d56d1820c48e0443049a30 6

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xf290eda4e9c0b6d832f3d36da9354335c71ede36eade8d4e164142f8bb33647bSwap Exact Token...47953952022-09-25 10:29:3429 secs ago0x06ee62d4ce8c1b2c169b348b5dc3ec4fec5e1258 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO0.645475 5,000
0x39bf15dd3851ca10dc2919c1ce32e8073090c1b277668f3a492cffa8a8b5c6e3Swap Exact Token...47953942022-09-25 10:29:2835 secs ago0xc1661a049e6b1b93c1d6a8f43a7f3ecda03586d1 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.131880
0x4e5050db0a4cc4a78e5460400911802d03db49b0411264bf57ecc6ef9af3a4c9Remove Liquidity...47953922022-09-25 10:29:1746 secs ago0x06ee62d4ce8c1b2c169b348b5dc3ec4fec5e1258 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.069845 5,000
0x9ec710d806c7496fc1ac8534e2383b014df138663ce7d9cd4f50d416d49a7a60Add Liquidity47953882022-09-25 10:28:551 min ago0x473c539f6baaf1fafc286fa4e586358e5879c68f IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.11165 5,000
0x56365b514892c09c962407a0a4043e7943f2903d9ddd5bb3941f924ddebdd6caSwap Exact Token...47953882022-09-25 10:28:551 min ago0x13d33ae74eb85fb2da79b84e36dd26a34fb37612 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.148310
0x1d1feb9e0e999d15460262bc6cf56cf09c12bd9c9778c607fb4970b0f07c2c2fSwap Exact Token...47953822022-09-25 10:28:201 min ago0x13d33ae74eb85fb2da79b84e36dd26a34fb37612 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.155670
0xc711fbe3853f3e87a74bf0ede452f2b2b504dee9cd735923cc341591359a4051Swap Exact Token...47953802022-09-25 10:28:091 min ago0x3da148a2268b15adb5459b6c6732f97503afe789 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.1440113620240
0x248a404e62604f0ab030dfb5c256622850217d46f5d935c9af15b22bc291493bRemove Liquidity...47953792022-09-25 10:28:041 min ago0x2a05196ee4828d14733b42da5bd7f2156c4d8dd7 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.0781 5,000
0x17dc4a872d4666570a7e4d31ce41894699d7e614e35ced66f045b8db48d5e1f9Add Liquidity ET...47953712022-09-25 10:27:172 mins ago0x08205d6cf3941aa983c7169ce2b0783c8357a8ae IN  Mad Meerkat Finance: Master Meerkat & Router5,050 CRO1.114875 5,000
0x66665bb4e644363752b051bbdc39b5b29c08fed6e197d0e3e6dee601fa090136Add Liquidity ET...47953692022-09-25 10:27:062 mins ago0x497136a58efdf6dfd27ae8a68f4e89c1c87804b9 IN  Mad Meerkat Finance: Master Meerkat & Router774.356052228324719 CRO1.035177282060
0x28985ecdb120979d0415f90cc50d2e3a51902fd29a3c3666c624fb042ea2925eSwap Exact ETH F...47953682022-09-25 10:27:003 mins ago0x7f1574d79c5791f98a57ffc1a46833197ee1e908 IN  Mad Meerkat Finance: Master Meerkat & Router10,600 CRO0.71872 5,000
0xc2bf46acf03d350eca701a2c8cfbd1e640c33c084c9cb6152b374e64e626945cSwap Exact Token...47953682022-09-25 10:27:003 mins ago0x473c539f6baaf1fafc286fa4e586358e5879c68f IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO0.81601 5,000
0x3679d06a3924869611eef3c7cf38479dcdb5e2027bdddd88ac36ae01c8196fd4Swap Exact Token...47953632022-09-25 10:26:323 mins ago0x3b881cf20f66909e93e58c00eaaa126868db849b IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO0.902765 5,000
0x5429ac6e749533a88b6aa95fe89f77f068cbbd463452ee6668a560bafc12c692Swap Exact Token...47953622022-09-25 10:26:263 mins ago0x7f1574d79c5791f98a57ffc1a46833197ee1e908 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.07656 5,000
0x6defce27a4c99cf1ea9279cfb8f97c14a1d12f75b0c90e6ab9ca1a9b215b6c96Swap Exact ETH F...47953602022-09-25 10:26:153 mins ago0x497136a58efdf6dfd27ae8a68f4e89c1c87804b9 IN  Mad Meerkat Finance: Master Meerkat & Router775.647808238488907 CRO0.7598651341130
0x7d92e972dd0b560f8d688dab8fc83d36e26ed62ee13656c524c925f289a08b92Swap Exact Token...47953572022-09-25 10:25:584 mins ago0x7f1574d79c5791f98a57ffc1a46833197ee1e908 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.094415 5,000
0x58422563b419b37b98cc487c09417a05427fcfa9b3cf5e78efbb8e9bbe75e033Swap Exact Token...47953532022-09-25 10:25:344 mins ago0xbdccf06c82b7aec999496a33421a194792f25754 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO0.65414 5,000
0x1403b732780dd5850d03c8b6faa280ecd619c2ece00a09eafb99b32c07b27575Swap Exact Token...47953532022-09-25 10:25:344 mins ago0x7f1574d79c5791f98a57ffc1a46833197ee1e908 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.169295 5,000
0xe6a3203cf9cd0ae1f16be25a47f7906660f7bfcf57a6b9ab0735ec846355e4e7Swap Exact Token...47953502022-09-25 10:25:174 mins ago0x4d6d5b01dfc6bd675ca198972c9c6dee2783cd0a IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO0.728992810829 4,911.291438702
0xa6e039c3a89acea09bfc83aebfc597eda7c6936e3aa5b4be1288fcb1f2ffc2a4Swap Exact Token...47953482022-09-25 10:25:054 mins ago0x610396ffc612582b288adfd2bc0e7e6b54564b94 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.1136402750650
0x2dcabc2e4a38448aebd2eeb09e29a834da90c12da3cbfd50d55efaf5f294debdSwap Tokens For ...47953482022-09-25 10:25:054 mins ago0x8efe9e54d5328226724cb7fb8d9a6a5d6519cf7d IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO0.692447255693 4,911.391435395
0x5bb974b920dbfdaeecadd4b7b6507b8413562b23488d0c0a0def335a2f2c433fSwap Exact Token...47953472022-09-25 10:25:005 mins ago0x7f1574d79c5791f98a57ffc1a46833197ee1e908 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO0.742145 5,000
0x58ef8edfd59640b36c0b86fc2f19bda810b0b20e03c724f0afd73970c838ed98Swap Exact ETH F...47953472022-09-25 10:25:005 mins ago0x473c539f6baaf1fafc286fa4e586358e5879c68f IN  Mad Meerkat Finance: Master Meerkat & Router80 CRO0.69865 5,000
0x80d6051d7acfb63777f21e5ca6c8a71657ca41c7fdda19b49bd987bce0c56673Swap Exact Token...47953452022-09-25 10:24:485 mins ago0x7f1574d79c5791f98a57ffc1a46833197ee1e908 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO1.09426 5,000
0x2d52b16f9f1fc77cd17b4adc08f466228f6660dab841616e1394142147838b9aSwap Exact Token...47953452022-09-25 10:24:485 mins ago0xc55c7f66c7ffd1f639aeb11763a480e705cee617 IN  Mad Meerkat Finance: Master Meerkat & Router0 CRO0.66607 5,000
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x56365b514892c09c962407a0a4043e7943f2903d9ddd5bb3941f924ddebdd6ca47953882022-09-25 10:28:551 min ago Mad Meerkat Finance: Master Meerkat & Router0x13d33ae74eb85fb2da79b84e36dd26a34fb37612481.735545029558925475 CRO
0x56365b514892c09c962407a0a4043e7943f2903d9ddd5bb3941f924ddebdd6ca47953882022-09-25 10:28:551 min ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router481.735545029558925475 CRO
0x1d1feb9e0e999d15460262bc6cf56cf09c12bd9c9778c607fb4970b0f07c2c2f47953822022-09-25 10:28:201 min ago Mad Meerkat Finance: Master Meerkat & Router0x13d33ae74eb85fb2da79b84e36dd26a34fb376122.087312751115573162 CRO
0x1d1feb9e0e999d15460262bc6cf56cf09c12bd9c9778c607fb4970b0f07c2c2f47953822022-09-25 10:28:201 min ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router2.087312751115573162 CRO
0xc711fbe3853f3e87a74bf0ede452f2b2b504dee9cd735923cc341591359a405147953802022-09-25 10:28:091 min ago Mad Meerkat Finance: Master Meerkat & Router0x3da148a2268b15adb5459b6c6732f97503afe7898.197769178565827752 CRO
0xc711fbe3853f3e87a74bf0ede452f2b2b504dee9cd735923cc341591359a405147953802022-09-25 10:28:091 min ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router8.197769178565827752 CRO
0x17dc4a872d4666570a7e4d31ce41894699d7e614e35ced66f045b8db48d5e1f947953712022-09-25 10:27:172 mins ago Mad Meerkat Finance: Master Meerkat & Router0x08205d6cf3941aa983c7169ce2b0783c8357a8ae0.001093925104921979 CRO
0x17dc4a872d4666570a7e4d31ce41894699d7e614e35ced66f045b8db48d5e1f947953712022-09-25 10:27:172 mins ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token5,049.998906074895078021 CRO
0x66665bb4e644363752b051bbdc39b5b29c08fed6e197d0e3e6dee601fa09013647953692022-09-25 10:27:062 mins ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token774.356052228324719048 CRO
0x28985ecdb120979d0415f90cc50d2e3a51902fd29a3c3666c624fb042ea2925e47953682022-09-25 10:27:003 mins ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token10,600 CRO
0x3679d06a3924869611eef3c7cf38479dcdb5e2027bdddd88ac36ae01c8196fd447953632022-09-25 10:26:323 mins ago Mad Meerkat Finance: Master Meerkat & Router0x3b881cf20f66909e93e58c00eaaa126868db849b88.815279822380925544 CRO
0x3679d06a3924869611eef3c7cf38479dcdb5e2027bdddd88ac36ae01c8196fd447953632022-09-25 10:26:323 mins ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router88.815279822380925544 CRO
0x6defce27a4c99cf1ea9279cfb8f97c14a1d12f75b0c90e6ab9ca1a9b215b6c9647953602022-09-25 10:26:153 mins ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token775.647808238488907275 CRO
0x58422563b419b37b98cc487c09417a05427fcfa9b3cf5e78efbb8e9bbe75e03347953532022-09-25 10:25:344 mins ago Mad Meerkat Finance: Master Meerkat & Router0xbdccf06c82b7aec999496a33421a194792f25754213.316383835409744247 CRO
0x58422563b419b37b98cc487c09417a05427fcfa9b3cf5e78efbb8e9bbe75e03347953532022-09-25 10:25:344 mins ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router213.316383835409744247 CRO
0xa6e039c3a89acea09bfc83aebfc597eda7c6936e3aa5b4be1288fcb1f2ffc2a447953482022-09-25 10:25:054 mins ago Mad Meerkat Finance: Master Meerkat & Router0x610396ffc612582b288adfd2bc0e7e6b54564b9477.729856690766689949 CRO
0xa6e039c3a89acea09bfc83aebfc597eda7c6936e3aa5b4be1288fcb1f2ffc2a447953482022-09-25 10:25:054 mins ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router77.729856690766689949 CRO
0x58ef8edfd59640b36c0b86fc2f19bda810b0b20e03c724f0afd73970c838ed9847953472022-09-25 10:25:005 mins ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token80 CRO
0xb69103523650ccc96c0e318a21f9bd5339064593de1312168a45e77c5c644ee447953302022-09-25 10:23:186 mins ago Mad Meerkat Finance: Master Meerkat & Router0x7f1574d79c5791f98a57ffc1a46833197ee1e90810,530.654107747705766804 CRO
0xb69103523650ccc96c0e318a21f9bd5339064593de1312168a45e77c5c644ee447953302022-09-25 10:23:186 mins ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router10,530.654107747705766804 CRO
0x837bd6598b5ecfcc0e9d9fab22afd879e2740e8d15379f5449189c00a788f3e847953102022-09-25 10:21:248 mins ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token3,266.463005395870405842 CRO
0xb036adf45dc17c0839cf2f4c0f71b38a1c6aae2382a1563712b2915926c9c55a47953052022-09-25 10:20:569 mins ago Mad Meerkat Finance: Master Meerkat & Router0xf50d262a10f4904c2620b0c11e9a5cd5708c9179250 CRO
0xb036adf45dc17c0839cf2f4c0f71b38a1c6aae2382a1563712b2915926c9c55a47953052022-09-25 10:20:569 mins ago Cronos: WCRO Token Mad Meerkat Finance: Master Meerkat & Router250 CRO
0xd8297d221ebd850467a295e4b495d6be7188fa38c470301d305b8001a4f0117547953032022-09-25 10:20:449 mins ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token7,000 CRO
0x3fb39257717cb843503dbe971407ab89fed331f2b5828ba3cd866e1fb8b6a02447953012022-09-25 10:20:339 mins ago Mad Meerkat Finance: Master Meerkat & Router Cronos: WCRO Token2.5 CRO
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MeerkatRouter02

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-02-22
*/

// File contracts/libraries/TransferHelper.sol

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

pragma solidity >=0.6.0;

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

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

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

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


// File contracts/interfaces/IMeerkatRouter02.sol

pragma solidity >=0.6.2;
interface IMeerkatRouter02 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapFeeReward() external pure returns (address);

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

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

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

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


// File contracts/interfaces/IMeerkatPair.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
    function setSwapFee(uint32) external;
}


// File contracts/libraries/SafeMath.sol

pragma solidity =0.6.6;

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

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

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

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


// File contracts/libraries/MeerkatLibrary.sol

pragma solidity >=0.5.0;


library MeerkatLibrary {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'MeerkatLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'MeerkatLibrary: 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'7ae6954210575e79ea2402d23bc6a59c4146a6e6296118aa8b99c747afec8acf' // init code hash
            ))));
    }

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

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

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

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

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

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


// File contracts/interfaces/IERC20.sol

pragma solidity >=0.5.0;

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

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

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


// File contracts/interfaces/IWETH.sol

pragma solidity >=0.5.0;

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


// File contracts/libraries/Babylonian.sol

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

pragma solidity >=0.4.0;

// computes square roots using the babylonian method
// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method
library Babylonian {
    // credit for this implementation goes to
    // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687
    function sqrt(uint256 x) internal pure returns (uint256) {
        if (x == 0) return 0;
        // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2);
        // however that code costs significantly more gas
        uint256 xx = x;
        uint256 r = 1;
        if (xx >= 0x100000000000000000000000000000000) {
            xx >>= 128;
            r <<= 64;
        }
        if (xx >= 0x10000000000000000) {
            xx >>= 64;
            r <<= 32;
        }
        if (xx >= 0x100000000) {
            xx >>= 32;
            r <<= 16;
        }
        if (xx >= 0x10000) {
            xx >>= 16;
            r <<= 8;
        }
        if (xx >= 0x100) {
            xx >>= 8;
            r <<= 4;
        }
        if (xx >= 0x10) {
            xx >>= 4;
            r <<= 2;
        }
        if (xx >= 0x8) {
            r <<= 1;
        }
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint256 r1 = x / r;
        return (r < r1 ? r : r1);
    }
}


// File contracts/libraries/FullMath.sol

// SPDX-License-Identifier: CC-BY-4.0
pragma solidity >=0.4.0;

// taken from https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1
// license is CC-BY-4.0
library FullMath {
    function fullMul(uint256 x, uint256 y) internal pure returns (uint256 l, uint256 h) {
        uint256 mm = mulmod(x, y, uint256(-1));
        l = x * y;
        h = mm - l;
        if (mm < l) h -= 1;
    }

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

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

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

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

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


// File contracts/MeerkatRouter02.sol

pragma solidity =0.6.6;

interface IMeerkatFactory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}








contract Ownable {
    address private _owner;

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

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

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

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

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

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


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

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

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

contract MeerkatRouter02 is IMeerkatRouter02, Ownable {
    using SafeMath for uint;

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

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

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

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

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IMeerkatFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IMeerkatFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = MeerkatLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = MeerkatLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'MeerkatV2Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = MeerkatLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'MeerkatV2Router: 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 = MeerkatLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IMeerkatPair(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 = MeerkatLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IMeerkatPair(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 = MeerkatLibrary.pairFor(factory, tokenA, tokenB);
        IMeerkatPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IMeerkatPair(pair).burn(to);
        (address token0,) = MeerkatLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'MeerkatV2Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'MeerkatV2Router: 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 = MeerkatLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IMeerkatPair(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 = MeerkatLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IMeerkatPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

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

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

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

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

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

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

Contract ABI

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

60c060405234801561001057600080fd5b5060405162004e8d38038062004e8d8339818101604052604081101561003557600080fd5b508051602090910151600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614cbf620001ce600039806101e15280610e5e5280610e995280610f7b5280611199528061153752806116c25280611b2d5280611c275280611cdd5280611dab5280611ef15280611f7952806121cf5280612252528061230152806123cd528061246252806124d652806129d45280612cad5280612d035280612d375280612dab5280612f4b528061308e528061311652508061100952806110e0528061125f528061129852806113e752806115c552806116a052806118105280611e3e5280611fab5280612101528061250852806127615280612959528061298252806129b25280612b1f5280612ce15280612fde52806131485280613a3c5280613a7f5280613f8a52806142195280614559528061460752806146875250614cbf6000f3fe6080604052600436106101d15760003560e01c80638da5cb5b116100f7578063c45a015511610095578063f2fde38b11610064578063f2fde38b14610ce1578063f305d71914610d14578063fb3bdb4114610d5a578063fbbeedf114610dde5761020a565b8063c45a015514610b24578063d06ca61f14610b39578063ded9382a14610bee578063e8e3370014610c615761020a565b8063ad615dec116100d1578063ad615dec146109ba578063af2979eb146109f0578063b6f9de9514610a43578063baa2abde14610ac75761020a565b80638da5cb5b1461095f578063a3ddb30b14610990578063ad5c4648146109a55761020a565b806352707d8c1161016f578063715018a61161013e578063715018a61461079a578063791ac947146107af5780637ff36ab5146108455780638803dbee146108c95761020a565b806352707d8c14610607578063571fd012146106555780635b0d5984146106915780635c11d795146107045761020a565b80632195995c116101ab5780632195995c146104165780632f54bf6e1461049457806338ed1739146104db5780634a25d94a146105715761020a565b806302751cec1461020f57806318cbafe51461027b5780631f00ca74146103615761020a565b3661020a57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461020857fe5b005b600080fd5b34801561021b57600080fd5b50610262600480360360c081101561023257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610e11565b6040805192835260208301919091528051918290030190f35b34801561028757600080fd5b50610311600480360360a081101561029e57600080fd5b813591602081013591810190606081016040820135600160201b8111156102c457600080fd5b8201836020820111156102d657600080fd5b803590602001918460208302840111600160201b831117156102f757600080fd5b91935091506001600160a01b038135169060200135610f2b565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561034d578181015183820152602001610335565b505050509050019250505060405180910390f35b34801561036d57600080fd5b506103116004803603604081101561038457600080fd5b81359190810190604081016020820135600160201b8111156103a557600080fd5b8201836020820111156103b757600080fd5b803590602001918460208302840111600160201b831117156103d857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611258945050505050565b34801561042257600080fd5b50610262600480360361016081101561043a57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561128e565b3480156104a057600080fd5b506104c7600480360360208110156104b757600080fd5b50356001600160a01b0316611388565b604080519115158252519081900360200190f35b3480156104e757600080fd5b50610311600480360360a08110156104fe57600080fd5b813591602081013591810190606081016040820135600160201b81111561052457600080fd5b82018360208201111561053657600080fd5b803590602001918460208302840111600160201b8311171561055757600080fd5b91935091506001600160a01b03813516906020013561139c565b34801561057d57600080fd5b50610311600480360360a081101561059457600080fd5b813591602081013591810190606081016040820135600160201b8111156105ba57600080fd5b8201836020820111156105cc57600080fd5b803590602001918460208302840111600160201b831117156105ed57600080fd5b91935091506001600160a01b0381351690602001356114e7565b34801561061357600080fd5b506106436004803603608081101561062a57600080fd5b5080359060208101359060408101359060600135611673565b60408051918252519081900360200190f35b34801561066157600080fd5b506106436004803603608081101561067857600080fd5b508035906020810135906040810135906060013561168a565b34801561069d57600080fd5b5061064360048036036101408110156106b557600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611698565b34801561071057600080fd5b50610208600480360360a081101561072757600080fd5b813591602081013591810190606081016040820135600160201b81111561074d57600080fd5b82018360208201111561075f57600080fd5b803590602001918460208302840111600160201b8311171561078057600080fd5b91935091506001600160a01b0381351690602001356117a6565b3480156107a657600080fd5b50610208611a3b565b3480156107bb57600080fd5b50610208600480360360a08110156107d257600080fd5b813591602081013591810190606081016040820135600160201b8111156107f857600080fd5b82018360208201111561080a57600080fd5b803590602001918460208302840111600160201b8311171561082b57600080fd5b91935091506001600160a01b038135169060200135611adf565b6103116004803603608081101561085b57600080fd5b81359190810190604081016020820135600160201b81111561087c57600080fd5b82018360208201111561088e57600080fd5b803590602001918460208302840111600160201b831117156108af57600080fd5b91935091506001600160a01b038135169060200135611d63565b3480156108d557600080fd5b50610311600480360360a08110156108ec57600080fd5b813591602081013591810190606081016040820135600160201b81111561091257600080fd5b82018360208201111561092457600080fd5b803590602001918460208302840111600160201b8311171561094557600080fd5b91935091506001600160a01b0381351690602001356120b6565b34801561096b57600080fd5b506109746121af565b604080516001600160a01b039092168252519081900360200190f35b34801561099c57600080fd5b506109746121be565b3480156109b157600080fd5b506109746121cd565b3480156109c657600080fd5b50610643600480360360608110156109dd57600080fd5b50803590602081013590604001356121f1565b3480156109fc57600080fd5b50610643600480360360c0811015610a1357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612206565b61020860048036036080811015610a5957600080fd5b81359190810190604081016020820135600160201b811115610a7a57600080fd5b820183602082011115610a8c57600080fd5b803590602001918460208302840111600160201b83111715610aad57600080fd5b91935091506001600160a01b038135169060200135612387565b348015610ad357600080fd5b50610262600480360360e0811015610aea57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612713565b348015610b3057600080fd5b50610974612957565b348015610b4557600080fd5b5061031160048036036040811015610b5c57600080fd5b81359190810190604081016020820135600160201b811115610b7d57600080fd5b820183602082011115610b8f57600080fd5b803590602001918460208302840111600160201b83111715610bb057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061297b945050505050565b348015610bfa57600080fd5b506102626004803603610140811015610c1257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356129a8565b348015610c6d57600080fd5b50610cc36004803603610100811015610c8557600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612abc565b60408051938452602084019290925282820152519081900360600190f35b348015610ced57600080fd5b5061020860048036036020811015610d0457600080fd5b50356001600160a01b0316612bf8565b610cc3600480360360c0811015610d2a57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612c5e565b61031160048036036080811015610d7057600080fd5b81359190810190604081016020820135600160201b811115610d9157600080fd5b820183602082011115610da357600080fd5b803590602001918460208302840111600160201b83111715610dc457600080fd5b91935091506001600160a01b038135169060200135612f03565b348015610dea57600080fd5b5061020860048036036020811015610e0157600080fd5b50356001600160a01b0316613285565b6000808242811015610e58576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b610e87897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612713565b9093509150610e97898685613301565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610efd57600080fd5b505af1158015610f11573d6000803e3d6000fd5b50505050610f1f8583613455565b50965096945050505050565b60608142811015610f71576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610fab57fe5b905060200201356001600160a01b03166001600160a01b031614611004576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ae9833981519152604482015290519081900360640190fd5b6110627f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061354d92505050565b9150868260018451038151811061107557fe5b602002602001015110156110ba5760405162461bcd60e51b815260040180806020018281038252602b815260200180614b09602b913960400191505060405180910390fd5b611158868660008181106110ca57fe5b905060200201356001600160a01b03163361113e7f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061110c57fe5b905060200201356001600160a01b03168b8b600181811061112957fe5b905060200201356001600160a01b03166136cd565b8560008151811061114b57fe5b602002602001015161378d565b611197828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506138ea915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855103815181106111d657fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561121457600080fd5b505af1158015611228573d6000803e3d6000fd5b5050505061124d848360018551038151811061124057fe5b6020026020010151613455565b509695505050505050565b60606112857f00000000000000000000000000000000000000000000000000000000000000008484613bd3565b90505b92915050565b60008060006112be7f00000000000000000000000000000000000000000000000000000000000000008f8f6136cd565b90506000876112cd578c6112d1565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561134757600080fd5b505af115801561135b573d6000803e3d6000fd5b5050505061136e8f8f8f8f8f8f8f612713565b809450819550505050509b509b9950505050505050505050565b6000546001600160a01b0390811691161490565b606081428110156113e2576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b6114407f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061354d92505050565b9150868260018451038151811061145357fe5b602002602001015110156114985760405162461bcd60e51b815260040180806020018281038252602b815260200180614b09602b913960400191505060405180910390fd5b6114a8868660008181106110ca57fe5b61124d828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506138ea915050565b6060814281101561152d576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061156757fe5b905060200201356001600160a01b03166001600160a01b0316146115c0576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ae9833981519152604482015290519081900360640190fd5b61161e7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bd392505050565b9150868260008151811061162e57fe5b602002602001015111156110ba5760405162461bcd60e51b8152600401808060200182810382526027815260200180614bec6027913960400191505060405180910390fd5b600061168185858585613d32565b95945050505050565b600061168185858585613e33565b6000806116e67f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006136cd565b90506000866116f5578b6116f9565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561176f57600080fd5b505af1158015611783573d6000803e3d6000fd5b505050506117958d8d8d8d8d8d612206565b9d9c50505050505050505050505050565b80428110156117ea576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b61185f858560008181106117fa57fe5b905060200201356001600160a01b0316336118597f00000000000000000000000000000000000000000000000000000000000000008989600081811061183c57fe5b905060200201356001600160a01b03168a8a600181811061112957fe5b8a61378d565b60008585600019810181811061187157fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118d657600080fd5b505afa1580156118ea573d6000803e3d6000fd5b505050506040513d602081101561190057600080fd5b50516040805160208881028281018201909352888252929350611942929091899189918291850190849080828437600092019190915250889250613f33915050565b866119f4828888600019810181811061195757fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156119bc57600080fd5b505afa1580156119d0573d6000803e3d6000fd5b505050506040513d60208110156119e657600080fd5b50519063ffffffff61434e16565b1015611a315760405162461bcd60e51b815260040180806020018281038252602b815260200180614b09602b913960400191505060405180910390fd5b5050505050505050565b611a4433611388565b611a95576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b8042811015611b23576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856000198101818110611b5d57fe5b905060200201356001600160a01b03166001600160a01b031614611bb6576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ae9833981519152604482015290519081900360640190fd5b611bc6858560008181106117fa57fe5b611c04858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613f33915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611c6e57600080fd5b505afa158015611c82573d6000803e3d6000fd5b505050506040513d6020811015611c9857600080fd5b5051905086811015611cdb5760405162461bcd60e51b815260040180806020018281038252602b815260200180614b09602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611d4157600080fd5b505af1158015611d55573d6000803e3d6000fd5b50505050611a318482613455565b60608142811015611da9576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611de057fe5b905060200201356001600160a01b03166001600160a01b031614611e39576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ae9833981519152604482015290519081900360640190fd5b611e977f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061354d92505050565b91508682600184510381518110611eaa57fe5b60200260200101511015611eef5760405162461bcd60e51b815260040180806020018281038252602b815260200180614b09602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611f2b57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f5e57600080fd5b505af1158015611f72573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611fd77f00000000000000000000000000000000000000000000000000000000000000008989600081811061183c57fe5b84600081518110611fe457fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561203b57600080fd5b505af115801561204f573d6000803e3d6000fd5b505050506040513d602081101561206557600080fd5b505161206d57fe5b6120ac828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506138ea915050565b5095945050505050565b606081428110156120fc576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b61215a7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bd392505050565b9150868260008151811061216a57fe5b602002602001015111156114985760405162461bcd60e51b8152600401808060200182810382526027815260200180614bec6027913960400191505060405180910390fd5b6000546001600160a01b031690565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006121fe84848461439e565b949350505050565b6000814281101561224c576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b61227b887f00000000000000000000000000000000000000000000000000000000000000008989893089612713565b604080516370a0823160e01b815230600482015290519194506122ff92508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156122ce57600080fd5b505afa1580156122e2573d6000803e3d6000fd5b505050506040513d60208110156122f857600080fd5b5051613301565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561236557600080fd5b505af1158015612379573d6000803e3d6000fd5b5050505061124d8483613455565b80428110156123cb576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061240257fe5b905060200201356001600160a01b03166001600160a01b03161461245b576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ae9833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156124bb57600080fd5b505af11580156124cf573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6125347f00000000000000000000000000000000000000000000000000000000000000008989600081811061183c57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561258457600080fd5b505af1158015612598573d6000803e3d6000fd5b505050506040513d60208110156125ae57600080fd5b50516125b657fe5b6000868660001981018181106125c857fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561262d57600080fd5b505afa158015612641573d6000803e3d6000fd5b505050506040513d602081101561265757600080fd5b505160408051602089810282810182019093528982529293506126999290918a918a918291850190849080828437600092019190915250899250613f33915050565b876119f482898960001981018181106126ae57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156119bc57600080fd5b600080824281101561275a576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b60006127877f00000000000000000000000000000000000000000000000000000000000000008c8c6136cd565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156127e257600080fd5b505af11580156127f6573d6000803e3d6000fd5b505050506040513d602081101561280c57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561285957600080fd5b505af115801561286d573d6000803e3d6000fd5b505050506040513d604081101561288357600080fd5b5080516020909101519092509050600061289d8e8e61444a565b509050806001600160a01b03168e6001600160a01b0316146128c05781836128c3565b82825b90975095508a8710156129075760405162461bcd60e51b8152600401808060200182810382526026815260200180614b346026913960400191505060405180910390fd5b898610156129465760405162461bcd60e51b8152600401808060200182810382526026815260200180614b7d6026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606112857f0000000000000000000000000000000000000000000000000000000000000000848461354d565b60008060006129f87f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006136cd565b9050600087612a07578c612a0b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612a8157600080fd5b505af1158015612a95573d6000803e3d6000fd5b50505050612aa78e8e8e8e8e8e610e11565b909f909e509c50505050505050505050505050565b60008060008342811015612b05576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b612b138c8c8c8c8c8c614528565b90945092506000612b457f00000000000000000000000000000000000000000000000000000000000000008e8e6136cd565b9050612b538d33838861378d565b612b5f8c33838761378d565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612bb757600080fd5b505af1158015612bcb573d6000803e3d6000fd5b505050506040513d6020811015612be157600080fd5b5051949d939c50939a509198505050505050505050565b612c0133611388565b612c52576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b612c5b8161479c565b50565b60008060008342811015612ca7576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b612cd58a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614528565b90945092506000612d277f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006136cd565b9050612d358b33838861378d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612d9057600080fd5b505af1158015612da4573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612e2957600080fd5b505af1158015612e3d573d6000803e3d6000fd5b505050506040513d6020811015612e5357600080fd5b5051612e5b57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612eb357600080fd5b505af1158015612ec7573d6000803e3d6000fd5b505050506040513d6020811015612edd57600080fd5b5051925034841015612ef557612ef533853403613455565b505096509650969350505050565b60608142811015612f49576040805162461bcd60e51b81526020600482015260186024820152600080516020614c6a833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612f8057fe5b905060200201356001600160a01b03166001600160a01b031614612fd9576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ae9833981519152604482015290519081900360640190fd5b6130377f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bd392505050565b9150348260008151811061304757fe5b6020026020010151111561308c5760405162461bcd60e51b8152600401808060200182810382526027815260200180614bec6027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106130c857fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156130fb57600080fd5b505af115801561310f573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6131747f00000000000000000000000000000000000000000000000000000000000000008989600081811061183c57fe5b8460008151811061318157fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156131d857600080fd5b505af11580156131ec573d6000803e3d6000fd5b505050506040513d602081101561320257600080fd5b505161320a57fe5b613249828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506138ea915050565b8160008151811061325657fe5b60200260200101513411156120ac576120ac338360008151811061327657fe5b60200260200101513403613455565b61328e33611388565b6132df576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061337e5780518252601f19909201916020918201910161335f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146133e0576040519150601f19603f3d011682016040523d82523d6000602084013e6133e5565b606091505b5091509150818015613413575080511580613413575080806020019051602081101561341057600080fd5b50515b61344e5760405162461bcd60e51b815260040180806020018281038252602d815260200180614c13602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106134a15780518252601f199092019160209182019101613482565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613503576040519150601f19603f3d011682016040523d82523d6000602084013e613508565b606091505b50509050806135485760405162461bcd60e51b8152600401808060200182810382526034815260200180614ab56034913960400191505060405180910390fd5b505050565b60606002825110156135a6576040805162461bcd60e51b815260206004820152601c60248201527f4d6565726b61744c6962726172793a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b815167ffffffffffffffff811180156135be57600080fd5b506040519080825280602002602001820160405280156135e8578160200160208202803683370190505b50905082816000815181106135f957fe5b60200260200101818152505060005b60018351038110156136c55760008061364b8786858151811061362757fe5b602002602001015187866001018151811061363e57fe5b602002602001015161483c565b915091506136a184848151811061365e57fe5b6020026020010151838361369c8b8a898151811061367857fe5b60200260200101518b8a6001018151811061368f57fe5b6020026020010151614903565b613d32565b8484600101815181106136b057fe5b60209081029190910101525050600101613608565b509392505050565b60008060006136dc858561444a565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f7ae6954210575e79ea2402d23bc6a59c4146a6e6296118aa8b99c747afec8acf609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106138125780518252601f1990920191602091820191016137f3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613874576040519150601f19603f3d011682016040523d82523d6000602084013e613879565b606091505b50915091508180156138a75750805115806138a757508080602001905160208110156138a457600080fd5b50515b6138e25760405162461bcd60e51b8152600401808060200182810382526031815260200180614a846031913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613bcd5760008084838151811061390857fe5b602002602001015185846001018151811061391f57fe5b6020026020010151915091506000613937838361444a565b509050600087856001018151811061394b57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146139795782600061397d565b6000835b60015491935091506001600160a01b031615613a24576001546040805163152cf14360e31b81523360048201526001600160a01b0389811660248301528881166044830152606482018790529151919092169163a9678a189160848083019260209291908290030181600087803b1580156139f757600080fd5b505af1158015613a0b573d6000803e3d6000fd5b505050506040513d6020811015613a2157600080fd5b50505b600060028a51038810613a375788613a78565b613a787f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110613a6b57fe5b60200260200101516136cd565b9050613aa57f000000000000000000000000000000000000000000000000000000000000000088886136cd565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613ae2576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613b53578181015183820152602001613b3b565b50505050905090810190601f168015613b805780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613ba257600080fd5b505af1158015613bb6573d6000803e3d6000fd5b5050600190990198506138ed975050505050505050565b50505050565b6060600282511015613c2c576040805162461bcd60e51b815260206004820152601c60248201527f4d6565726b61744c6962726172793a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613c4457600080fd5b50604051908082528060200260200182016040528015613c6e578160200160208202803683370190505b5090508281600183510381518110613c8257fe5b60209081029190910101528151600019015b80156136c557600080613cc487866001860381518110613cb057fe5b602002602001015187868151811061363e57fe5b91509150613d0d848481518110613cd757fe5b60200260200101518383613d088b8a60018a0381518110613cf457fe5b60200260200101518b8a8151811061368f57fe5b613e33565b846001850381518110613d1c57fe5b6020908102919091010152505060001901613c94565b6000808511613d725760405162461bcd60e51b8152600401808060200182810382526029815260200180614a356029913960400191505060405180910390fd5b600084118015613d825750600083115b613dbd5760405162461bcd60e51b8152600401808060200182810382526026815260200180614ba36026913960400191505060405180910390fd5b6000613de1613dd46127108563ffffffff61434e16565b879063ffffffff61498216565b90506000613df5828663ffffffff61498216565b90506000613e1b83613e0f8961271063ffffffff61498216565b9063ffffffff6149e516565b9050808281613e2657fe5b0498975050505050505050565b6000808511613e735760405162461bcd60e51b815260040180806020018281038252602a815260200180614c40602a913960400191505060405180910390fd5b600084118015613e835750600083115b613ebe5760405162461bcd60e51b8152600401808060200182810382526026815260200180614ba36026913960400191505060405180910390fd5b6000613ee2612710613ed6878963ffffffff61498216565b9063ffffffff61498216565b90506000613f0b613efb6127108663ffffffff61434e16565b613ed6878a63ffffffff61434e16565b9050613f286001828481613f1b57fe5b049063ffffffff6149e516565b979650505050505050565b60005b600183510381101561354857600080848381518110613f5157fe5b6020026020010151858460010181518110613f6857fe5b6020026020010151915091506000613f80838361444a565b5090506000613fb07f000000000000000000000000000000000000000000000000000000000000000085856136cd565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613ff157600080fd5b505afa158015614005573d6000803e3d6000fd5b505050506040513d606081101561401b57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614614051578284614054565b83835b915091506140b2828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156119bc57600080fd5b955061412a8683838a6001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156140f357600080fd5b505afa158015614107573d6000803e3d6000fd5b505050506040513d602081101561411d57600080fd5b505163ffffffff16613d32565b6001549095506001600160a01b03161593506141d592505050576001546040805163152cf14360e31b81523360048201526001600160a01b0389811660248301528881166044830152606482018590529151919092169163a9678a189160848083019260209291908290030181600087803b1580156141a857600080fd5b505af11580156141bc573d6000803e3d6000fd5b505050506040513d60208110156141d257600080fd5b50505b600080856001600160a01b0316886001600160a01b0316146141f9578260006141fd565b6000835b91509150600060028c51038a10614214578a614248565b6142487f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110613a6b57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b838110156142d25781810151838201526020016142ba565b50505050905090810190601f1680156142ff5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561432157600080fd5b505af1158015614335573d6000803e3d6000fd5b50506001909b019a50613f369950505050505050505050565b80820382811115611288576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008084116143de5760405162461bcd60e51b8152600401808060200182810382526023815260200180614b5a6023913960400191505060405180910390fd5b6000831180156143ee5750600082115b6144295760405162461bcd60e51b8152600401808060200182810382526026815260200180614ba36026913960400191505060405180910390fd5b8261443a858463ffffffff61498216565b8161444157fe5b04949350505050565b600080826001600160a01b0316846001600160a01b0316141561449e5760405162461bcd60e51b8152600401808060200182810382526023815260200180614bc96023913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106144be5782846144c1565b83835b90925090506001600160a01b038216614521576040805162461bcd60e51b815260206004820152601c60248201527f4d6565726b61744c6962726172793a205a45524f5f4144445245535300000000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b1580156145a257600080fd5b505afa1580156145b6573d6000803e3d6000fd5b505050506040513d60208110156145cc57600080fd5b50516001600160a01b0316141561467f57604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561465257600080fd5b505af1158015614666573d6000803e3d6000fd5b505050506040513d602081101561467c57600080fd5b50505b6000806146ad7f00000000000000000000000000000000000000000000000000000000000000008b8b61483c565b915091508160001480156146bf575080155b156146cf5787935086925061478f565b60006146dc89848461439e565b905087811161472f57858110156147245760405162461bcd60e51b8152600401808060200182810382526026815260200180614b7d6026913960400191505060405180910390fd5b88945092508261478d565b600061473c89848661439e565b90508981111561474857fe5b878110156147875760405162461bcd60e51b8152600401808060200182810382526026815260200180614b346026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b6001600160a01b0381166147e15760405162461bcd60e51b8152600401808060200182810382526026815260200180614a5e6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080600061484b858561444a565b50905060008061485c8888886136cd565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561489457600080fd5b505afa1580156148a8573d6000803e3d6000fd5b505050506040513d60608110156148be57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146148f15780826148f4565b81815b90999098509650505050505050565b60006149108484846136cd565b6001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561494857600080fd5b505afa15801561495c573d6000803e3d6000fd5b505050506040513d602081101561497257600080fd5b505163ffffffff16949350505050565b600081158061499d5750508082028282828161499a57fe5b04145b611288576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611288576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fdfe4d6565726b61744c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e544f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c65644d6565726b61745632526f757465723a20494e56414c49445f504154480000004d6565726b61745632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544d6565726b61745632526f757465723a20494e53554646494349454e545f415f414d4f554e544d6565726b61744c6962726172793a20494e53554646494349454e545f414d4f554e544d6565726b61745632526f757465723a20494e53554646494349454e545f425f414d4f554e544d6565726b61744c6962726172793a20494e53554646494349454e545f4c49515549444954594d6565726b61744c6962726172793a204944454e544943414c5f4144445245535345534d6565726b61745632526f757465723a204558434553534956455f494e5055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c65644d6565726b61744c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544d6565726b61745632526f757465723a20455850495245440000000000000000a2646970667358221220a77e665997a36c71e166715a9e2a7bb9a1f2feff12650ece608a36d0823d697464736f6c63430006060033000000000000000000000000d590cc180601aecd6eeadd9b7f2b7611519544f40000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

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

000000000000000000000000d590cc180601aecd6eeadd9b7f2b7611519544f40000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Decoded View---------------
Arg [0] : _factory (address): 0xd590cc180601aecd6eeadd9b7f2b7611519544f4
Arg [1] : _WETH (address): 0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d590cc180601aecd6eeadd9b7f2b7611519544f4
Arg [1] : 0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23


Deployed ByteCode Sourcemap

20701:18997:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21232:10;-1:-1:-1;;;;;21246:4:0;21232:18;;21225:26;;;;20701:18997;;12:1:-1;9;2:12;25480:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25480:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;25480:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32767:846;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32767:846:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32767:846:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;32767:846:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32767:846:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32767:846:0;;-1:-1:-1;32767:846:0;-1:-1:-1;;;;;;32767:846:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32767:846:0;;;;;;;;;;;;;;;;;39444:251;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39444:251:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;39444:251:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;39444:251:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;39444:251:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;39444:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39444:251:0;;-1:-1:-1;39444:251:0;;-1:-1:-1;;;;;39444:251:0:i;26159:673::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26159:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;26159:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19729:104::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19729:104:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19729:104:0;-1:-1:-1;;;;;19729:104:0;;:::i;:::-;;;;;;;;;;;;;;;;;;30000:624;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30000:624:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30000:624:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;30000:624:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30000:624:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30000:624:0;;-1:-1:-1;30000:624:0;-1:-1:-1;;;;;;30000:624:0;;;;;;;;:::i;31937:824::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31937:824:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31937:824:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;31937:824:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31937:824:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31937:824:0;;-1:-1:-1;31937:824:0;-1:-1:-1;;;;;;31937:824:0;;;;;;;;:::i;38604:283::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38604:283:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;38604:283:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;38895:282;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38895:282:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;38895:282:0;;;;;;;;;;;;;;;;;:::i;28288:714::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28288:714:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;28288:714:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35953:712::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35953:712:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35953:712:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;35953:712:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35953:712:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35953:712:0;;-1:-1:-1;35953:712:0;-1:-1:-1;;;;;;35953:712:0;;;;;;;;:::i;19841:140::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19841:140:0;;;:::i;37525:841::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37525:841:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;37525:841:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;37525:841:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37525:841:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37525:841:0;;-1:-1:-1;37525:841:0;-1:-1:-1;;;;;;37525:841:0;;;;;;;;:::i;31238:693::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31238:693:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;31238:693:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31238:693:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31238:693:0;;-1:-1:-1;31238:693:0;-1:-1:-1;;;;;;31238:693:0;;;;;;;;:::i;30630:602::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30630:602:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30630:602:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;30630:602:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30630:602:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30630:602:0;;-1:-1:-1;30630:602:0;-1:-1:-1;;;;;;30630:602:0;;;;;;;;:::i;19642:79::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19642:79:0;;;:::i;:::-;;;;-1:-1:-1;;;;;19642:79:0;;;;;;;;;;;;;;20887:37;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20887:37:0;;;:::i;20842:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20842:38:0;;;:::i;38410:186::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38410:186:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38410:186:0;;;;;;;;;;;;:::i;27582:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27582:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;27582:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36671:848::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;36671:848:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;36671:848:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36671:848:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36671:848:0;;-1:-1:-1;36671:848:0;-1:-1:-1;;;;;;36671:848:0;;;;;;;;:::i;24617:857::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24617:857:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24617:857:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20794:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20794:41:0;;;:::i;39185:251::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39185:251:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;39185:251:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;39185:251:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;39185:251:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;39185:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39185:251:0;;-1:-1:-1;39185:251:0;;-1:-1:-1;;;;;39185:251:0:i;26838:665::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26838:665:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;26838:665:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22864:734::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22864:734:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22864:734:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;20226:109;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20226:109:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20226:109:0;-1:-1:-1;;;;;20226:109:0;;:::i;23604:970::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23604:970:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33619:806::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33619:806:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33619:806:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33619:806:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33619:806:0;;-1:-1:-1;33619:806:0;-1:-1:-1;;;;;;33619:806:0;;;;;;;;:::i;21322:116::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21322:116:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21322:116:0;-1:-1:-1;;;;;21322:116:0;;:::i;25480:673::-;25717:16;25735:14;25698:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;25789:196:::1;25819:5;25839:4;25858:9;25882:14;25911:12;25946:4;25966:8;25789:15;:196::i;:::-;25762:223:::0;;-1:-1:-1;25762:223:0;-1:-1:-1;25996:51:0::1;26024:5:::0;26031:2;25762:223;25996:27:::1;:51::i;:::-;26064:4;-1:-1:-1::0;;;;;26058:20:0::1;;26079:9;26058:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26058:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26058:31:0;;;;26100:45;26131:2;26135:9;26100:30;:45::i;:::-;25480:673:::0;;;;;;;;;;:::o;32767:846::-;32981:21;32953:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33053:4:0::1;33028:29;:4:::0;;-1:-1:-1;;33033:15:0;;33028:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33028:21:0::1;-1:-1:-1::0;;;;;33028:29:0::1;;33020:71;;;::::0;;-1:-1:-1;;;33020:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33020:71:0;;;;;;;;;;;;;::::1;;33112:53;33141:7;33150:8;33160:4;;33112:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33112:28:0::1;::::0;-1:-1:-1;;;33112:53:0:i:1;:::-;33102:63;;33215:12;33184:7;33209:1;33192:7;:14;:18;33184:27;;;;;;;;;;;;;;:43;;33176:99;;;;-1:-1:-1::0;;;33176:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33286:139;33332:4;;33337:1;33332:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33332:7:0::1;33341:10;33353:49;33376:7;33385:4;;33390:1;33385:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33385:7:0::1;33394:4;;33399:1;33394:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33394:7:0::1;33353:22;:49::i;:::-;33404:7;33412:1;33404:10;;;;;;;;;;;;;;33286:31;:139::i;:::-;33436:35;33442:7;33451:4;;33436:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33465:4:0::1;::::0;-1:-1:-1;33436:5:0::1;::::0;-1:-1:-1;;33436:35:0:i:1;:::-;33488:4;-1:-1:-1::0;;;;;33482:20:0::1;;33503:7;33528:1;33511:7;:14;:18;33503:27;;;;;;;;;;;;;;33482:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33482:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33482:49:0;;;;33542:63;33573:2;33577:7;33602:1;33585:7;:14;:18;33577:27;;;;;;;;;;;;;;33542:30;:63::i;:::-;32767:846:::0;;;;;;;;;:::o;39444:251::-;39588:21;39634:53;39662:7;39671:9;39682:4;39634:27;:53::i;:::-;39627:60;;39444:251;;;;;:::o;26159:673::-;26465:12;26479;26504;26519:47;26542:7;26551:6;26559;26519:22;:47::i;:::-;26504:62;;26577:10;26590;:33;;26614:9;26590:33;;;-1:-1:-1;;26590:33:0;26634:78;;;-1:-1:-1;;;26634:78:0;;26660:10;26634:78;;;;26680:4;26634:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26577:46;;-1:-1:-1;;;;;;26634:25:0;;;;;:78;;;;;-1:-1:-1;;26634:78:0;;;;;;;;-1:-1:-1;26634:25:0;:78;;;2:2:-1;;;;27:1;24;17:12;2:2;26634:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26634:78:0;;;;26744:80;26760:6;26768;26776:9;26787:10;26799;26811:2;26815:8;26744:15;:80::i;:::-;26723:101;;;;;;;;26159:673;;;;;;;;;;;;;;;;:::o;19729:104::-;19784:4;19819:6;-1:-1:-1;;;;;19819:6:0;;;19808:17;;;;19729:104::o;30000:624::-;30224:21;30205:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;30268:53:::1;30297:7;30306:8;30316:4;;30268:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30268:28:0::1;::::0;-1:-1:-1;;;30268:53:0:i:1;:::-;30258:63;;30371:12;30340:7;30365:1;30348:7;:14;:18;30340:27;;;;;;;;;;;;;;:43;;30332:99;;;;-1:-1:-1::0;;;30332:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30442:139;30488:4;;30493:1;30488:7;;;;;;30442:139;30592:24;30598:7;30607:4;;30592:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30613:2:0;;-1:-1:-1;30592:5:0::1;::::0;-1:-1:-1;;30592:24:0:i:1;31937:824::-:0;32151:21;32123:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32223:4:0::1;32198:29;:4:::0;;-1:-1:-1;;32203:15:0;;32198:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32198:21:0::1;-1:-1:-1::0;;;;;32198:29:0::1;;32190:71;;;::::0;;-1:-1:-1;;;32190:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32190:71:0;;;;;;;;;;;;;::::1;;32282:53;32310:7;32319:9;32330:4;;32282:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32282:27:0::1;::::0;-1:-1:-1;;;32282:53:0:i:1;:::-;32272:63;;32368:11;32354:7;32362:1;32354:10;;;;;;;;;;;;;;:25;;32346:77;;;;-1:-1:-1::0;;;32346:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38604:283:::0;38771:14;38810:69;38838:8;38848:9;38859:10;38871:7;38810:27;:69::i;:::-;38803:76;38604:283;-1:-1:-1;;;;;38604:283:0:o;38895:282::-;39062:13;39100:69;39127:9;39138;39149:10;39161:7;39100:26;:69::i;28288:714::-;28606:14;28633:12;28648:44;28671:7;28680:5;28687:4;28648:22;:44::i;:::-;28633:59;;28703:10;28716;:33;;28740:9;28716:33;;;-1:-1:-1;;28716:33:0;28760:78;;;-1:-1:-1;;;28760:78:0;;28786:10;28760:78;;;;28806:4;28760:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28703:46;;-1:-1:-1;;;;;;28760:25:0;;;;;:78;;;;;-1:-1:-1;;28760:78:0;;;;;;;;-1:-1:-1;28760:25:0;:78;;;2:2:-1;;;;27:1;24;17:12;2:2;28760:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28760:78:0;;;;28861:133;28923:5;28930:9;28941:14;28957:12;28971:2;28975:8;28861:47;:133::i;:::-;28849:145;28288:714;-1:-1:-1;;;;;;;;;;;;;28288:714:0:o;35953:712::-;36187:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;36208:137:::1;36254:4;;36259:1;36254:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36254:7:0::1;36263:10;36275:49;36298:7;36307:4;;36312:1;36307:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36307:7:0::1;36316:4;;36321:1;36316:7;;;;;;36275:49;36326:8;36208:31;:137::i;:::-;36356:18;36384:4:::0;;-1:-1:-1;;36389:15:0;;36384:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;36384:21:0::1;-1:-1:-1::0;;;;;36377:39:0::1;;36417:2;36377:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;36377:43:0::1;-1:-1:-1::0;;;;;36377:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36377:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36377:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;36377:43:0;36431:44:::1;::::0;;36377:43:::1;36431:44:::0;;::::1;::::0;;;;;;;;;;;36377:43;;-1:-1:-1;36431:44:0::1;::::0;;;36466:4;;;;;;36431:44;::::1;::::0;36466:4;;36431:44;36466:4;36431:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36472:2:0;;-1:-1:-1;36431:34:0::1;::::0;-1:-1:-1;;36431:44:0:i:1;:::-;36574:12:::0;36508:62:::1;36556:13:::0;36515:4;;-1:-1:-1;;36520:15:0;;36515:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;36515:21:0::1;-1:-1:-1::0;;;;;36508:39:0::1;;36548:2;36508:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;36508:43:0::1;-1:-1:-1::0;;;;;36508:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36508:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36508:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;36508:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;36486:171;;;;-1:-1:-1::0;;;36486:171:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21050:1;35953:712:::0;;;;;;;:::o;19841:140::-;20385:19;20393:10;20385:7;:19::i;:::-;20377:64;;;;;-1:-1:-1;;;20377:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19940:1:::1;19924:6:::0;;19903:40:::1;::::0;-1:-1:-1;;;;;19924:6:0;;::::1;::::0;19903:40:::1;::::0;19940:1;;19903:40:::1;19971:1;19954:19:::0;;-1:-1:-1;;;;;;19954:19:0::1;::::0;;19841:140::o;37525:841::-;37792:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37851:4:0::1;37826:29;:4:::0;;-1:-1:-1;;37831:15:0;;37826:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;37826:21:0::1;-1:-1:-1::0;;;;;37826:29:0::1;;37818:71;;;::::0;;-1:-1:-1;;;37818:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;37818:71:0;;;;;;;;;;;;;::::1;;37900:137;37946:4;;37951:1;37946:7;;;;;;37900:137;38048:55;38083:4;;38048:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38097:4:0::1;::::0;-1:-1:-1;38048:34:0::1;::::0;-1:-1:-1;;38048:55:0:i:1;:::-;38131:37;::::0;;-1:-1:-1;;;38131:37:0;;38162:4:::1;38131:37;::::0;::::1;::::0;;;38114:14:::1;::::0;-1:-1:-1;;;;;38138:4:0::1;38131:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;38131:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38131:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;38131:37:0;;-1:-1:-1;38187:25:0;;::::1;;38179:81;;;;-1:-1:-1::0;;;38179:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38277:4;-1:-1:-1::0;;;;;38271:20:0::1;;38292:9;38271:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38271:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38271:31:0;;;;38313:45;38344:2;38348:9;38313:30;:45::i;31238:693::-:0;31454:21;31426:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;31512:4:::1;-1:-1:-1::0;;;;;31501:15:0::1;:4;;31506:1;31501:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31501:7:0::1;-1:-1:-1::0;;;;;31501:15:0::1;;31493:57;;;::::0;;-1:-1:-1;;;31493:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;31493:57:0;;;;;;;;;;;;;::::1;;31571:54;31600:7;31609:9;31620:4;;31571:54;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31571:28:0::1;::::0;-1:-1:-1;;;31571:54:0:i:1;:::-;31561:64;;31675:12;31644:7;31669:1;31652:7;:14;:18;31644:27;;;;;;;;;;;;;;:43;;31636:99;;;;-1:-1:-1::0;;;31636:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31752:4;-1:-1:-1::0;;;;;31746:19:0::1;;31773:7;31781:1;31773:10;;;;;;;;;;;;;;31746:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31746:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31746:40:0;;;;;31810:4;-1:-1:-1::0;;;;;31804:20:0::1;;31825:49;31848:7;31857:4;;31862:1;31857:7;;;;;;31825:49;31876:7;31884:1;31876:10;;;;;;;;;;;;;;31804:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;31804:83:0::1;-1:-1:-1::0;;;;;31804:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31804:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31804:83:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31804:83:0;31797:91:::1;;;;31899:24;31905:7;31914:4;;31899:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31920:2:0;;-1:-1:-1;31899:5:0::1;::::0;-1:-1:-1;;31899:24:0:i:1;:::-;31238:693:::0;;;;;;;;:::o;30630:602::-;30854:21;30835:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;30898:53:::1;30926:7;30935:9;30946:4;;30898:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;30898:27:0::1;::::0;-1:-1:-1;;;30898:53:0:i:1;:::-;30888:63;;30984:11;30970:7;30978:1;30970:10;;;;;;;;;;;;;;:25;;30962:77;;;;-1:-1:-1::0;;;30962:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19642:79:::0;19680:7;19707:6;-1:-1:-1;;;;;19707:6:0;19642:79;:::o;20887:37::-;;;-1:-1:-1;;;;;20887:37:0;;:::o;20842:38::-;;;:::o;38410:186::-;38507:12;38539:49;38560:7;38569:8;38579;38539:20;:49::i;:::-;38532:56;38410:186;-1:-1:-1;;;;38410:186:0:o;27582:700::-;27848:14;27829:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;27891:196:::1;27921:5;27941:4;27960:9;27984:14;28013:12;28048:4;28068:8;27891:15;:196::i;:::-;28137:38;::::0;;-1:-1:-1;;;28137:38:0;;28169:4:::1;28137:38;::::0;::::1;::::0;;;27875:212;;-1:-1:-1;28098:78:0::1;::::0;-1:-1:-1;28126:5:0;;28133:2;;-1:-1:-1;;;;;28137:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;28137:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28137:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;28137:38:0;28098:27:::1;:78::i;:::-;28193:4;-1:-1:-1::0;;;;;28187:20:0::1;;28208:9;28187:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28187:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28187:31:0;;;;28229:45;28260:2;28264:9;28229:30;:45::i;36671:848::-:0;36931:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;36976:4:::1;-1:-1:-1::0;;;;;36965:15:0::1;:4;;36970:1;36965:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36965:7:0::1;-1:-1:-1::0;;;;;36965:15:0::1;;36957:57;;;::::0;;-1:-1:-1;;;36957:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;36957:57:0;;;;;;;;;;;;;::::1;;37025:13;37041:9;37025:25;;37067:4;-1:-1:-1::0;;;;;37061:19:0::1;;37088:8;37061:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37061:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37061:38:0;;;;;37123:4;-1:-1:-1::0;;;;;37117:20:0::1;;37138:49;37161:7;37170:4;;37175:1;37170:7;;;;;;37138:49;37189:8;37117:81;;;;;;;;;;;;;-1:-1:-1::0;;;;;37117:81:0::1;-1:-1:-1::0;;;;;37117:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37117:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37117:81:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;37117:81:0;37110:89:::1;;;;37210:18;37238:4:::0;;-1:-1:-1;;37243:15:0;;37238:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;37238:21:0::1;-1:-1:-1::0;;;;;37231:39:0::1;;37271:2;37231:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;37231:43:0::1;-1:-1:-1::0;;;;;37231:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37231:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37231:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;37231:43:0;37285:44:::1;::::0;;37231:43:::1;37285:44:::0;;::::1;::::0;;;;;;;;;;;37231:43;;-1:-1:-1;37285:44:0::1;::::0;;;37320:4;;;;;;37285:44;::::1;::::0;37320:4;;37285:44;37320:4;37285:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;37326:2:0;;-1:-1:-1;37285:34:0::1;::::0;-1:-1:-1;;37285:44:0:i:1;:::-;37428:12:::0;37362:62:::1;37410:13:::0;37369:4;;-1:-1:-1;;37374:15:0;;37369:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;37369:21:0::1;-1:-1:-1::0;;;;;37362:39:0::1;;37402:2;37362:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;37362:43:0::1;-1:-1:-1::0;;;;;37362:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;24617:857:0::0;24871:12;24885;24852:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;24910:12:::1;24925:47;24948:7;24957:6;24965;24925:22;:47::i;:::-;24983:60;::::0;;-1:-1:-1;;;24983:60:0;;25015:10:::1;24983:60;::::0;::::1;::::0;-1:-1:-1;;;;;24983:31:0;::::1;:60:::0;;;;;;;;;;;;;;24910:62;;-1:-1:-1;24983:31:0;;::::1;::::0;:60;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;24983:31:0;:60;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24983:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24983:60:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;25111:27:0::1;::::0;;-1:-1:-1;;;25111:27:0;;-1:-1:-1;;;;;25111:27:0;;::::1;;::::0;::::1;::::0;;;25081:12:::1;::::0;;;25111:23;;::::1;::::0;::::1;::::0;:27;;;;;;;;;;;25081:12;25111:23;:27;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;25111:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25111:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;25111:27:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;25111:27:0;-1:-1:-1;25150:14:0::1;25169:41;25195:6:::0;25203;25169:25:::1;:41::i;:::-;25149:61;;;25252:6;-1:-1:-1::0;;;;;25242:16:0::1;:6;-1:-1:-1::0;;;;;25242:16:0::1;;:58;;25283:7;25292;25242:58;;;25262:7;25271;25242:58;25221:79:::0;;-1:-1:-1;25221:79:0;-1:-1:-1;25319:21:0;;::::1;;25311:72;;;;-1:-1:-1::0;;;25311:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25413:10;25402:7;:21;;25394:72;;;;-1:-1:-1::0;;;25394:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21050:1;;;;24617:857:::0;;;;;;;;;;;:::o;20794:41::-;;;:::o;39185:251::-;39329:21;39375:53;39404:7;39413:8;39423:4;39375:28;:53::i;26838:665::-;27127:16;27145:14;27172:12;27187:44;27210:7;27219:5;27226:4;27187:22;:44::i;:::-;27172:59;;27242:10;27255;:33;;27279:9;27255:33;;;-1:-1:-1;;27255:33:0;27299:78;;;-1:-1:-1;;;27299:78:0;;27325:10;27299:78;;;;27345:4;27299:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27242:46;;-1:-1:-1;;;;;;27299:25:0;;;;;:78;;;;;-1:-1:-1;;27299:78:0;;;;;;;;-1:-1:-1;27299:25:0;:78;;;2:2:-1;;;;27:1;24;17:12;2:2;27299:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27299:78:0;;;;27415:80;27434:5;27441:9;27452:14;27468:12;27482:2;27486:8;27415:18;:80::i;:::-;27388:107;;;;-1:-1:-1;26838:665:0;-1:-1:-1;;;;;;;;;;;;;26838:665:0:o;22864:734::-;23152:12;23166;23180:14;23133:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;23228:85:::1;23242:6;23250;23258:14;23274;23290:10;23302;23228:13;:85::i;:::-;23207:106:::0;;-1:-1:-1;23207:106:0;-1:-1:-1;23324:12:0::1;23339:47;23362:7;23371:6:::0;23379;23339:22:::1;:47::i;:::-;23324:62;;23397:66;23429:6;23437:10;23449:4;23455:7;23397:31;:66::i;:::-;23474;23506:6;23514:10;23526:4;23532:7;23474:31;:66::i;:::-;23576:4;-1:-1:-1::0;;;;;23563:23:0::1;;23587:2;23563:27;;;;;;;;;;;;;-1:-1:-1::0;;;;;23563:27:0::1;-1:-1:-1::0;;;;;23563:27:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23563:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23563:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23563:27:0;22864:734;;;;-1:-1:-1;23563:27:0;;-1:-1:-1;22864:734:0;;-1:-1:-1;;;;;;;;;22864:734:0:o;20226:109::-;20385:19;20393:10;20385:7;:19::i;:::-;20377:64;;;;;-1:-1:-1;;;20377:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20299:28:::1;20318:8;20299:18;:28::i;:::-;20226:109:::0;:::o;23604:970::-;23857:16;23875:14;23891;23838:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;23945:176:::1;23973:5;23993:4;24012:18;24045:9;24069:14;24098:12;23945:13;:176::i;:::-;23918:203:::0;;-1:-1:-1;23918:203:0;-1:-1:-1;24132:12:0::1;24147:44;24170:7;24179:5:::0;24186:4:::1;24147:22;:44::i;:::-;24132:59;;24202:69;24234:5;24241:10;24253:4;24259:11;24202:31;:69::i;:::-;24288:4;-1:-1:-1::0;;;;;24282:19:0::1;;24309:9;24282:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24282:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24282:39:0;;;;;24345:4;-1:-1:-1::0;;;;;24339:20:0::1;;24360:4;24366:9;24339:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;24339:37:0::1;-1:-1:-1::0;;;;;24339:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24339:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24339:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24339:37:0;24332:45:::1;;;;24413:4;-1:-1:-1::0;;;;;24400:23:0::1;;24424:2;24400:27;;;;;;;;;;;;;-1:-1:-1::0;;;;;24400:27:0::1;-1:-1:-1::0;;;;;24400:27:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24400:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24400:27:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24400:27:0;;-1:-1:-1;24478:9:0::1;:21:::0;-1:-1:-1;24474:92:0::1;;;24501:65;24532:10;24556:9;24544;:21;24501:30;:65::i;:::-;21050:1;23604:970:::0;;;;;;;;;;;:::o;33619:806::-;33832:21;33804:8;20995:15;20983:8;:27;;20975:64;;;;;-1:-1:-1;;;20975:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20975:64:0;;;;;;;;;;;;;;;33890:4:::1;-1:-1:-1::0;;;;;33879:15:0::1;:4;;33884:1;33879:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33879:7:0::1;-1:-1:-1::0;;;;;33879:15:0::1;;33871:57;;;::::0;;-1:-1:-1;;;33871:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33871:57:0;;;;;;;;;;;;;::::1;;33949:53;33977:7;33986:9;33997:4;;33949:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33949:27:0::1;::::0;-1:-1:-1;;;33949:53:0:i:1;:::-;33939:63;;34035:9;34021:7;34029:1;34021:10;;;;;;;;;;;;;;:23;;34013:75;;;;-1:-1:-1::0;;;34013:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34105:4;-1:-1:-1::0;;;;;34099:19:0::1;;34126:7;34134:1;34126:10;;;;;;;;;;;;;;34099:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34099:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34099:40:0;;;;;34163:4;-1:-1:-1::0;;;;;34157:20:0::1;;34178:49;34201:7;34210:4;;34215:1;34210:7;;;;;;34178:49;34229:7;34237:1;34229:10;;;;;;;;;;;;;;34157:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;34157:83:0::1;-1:-1:-1::0;;;;;34157:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34157:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34157:83:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;34157:83:0;34150:91:::1;;;;34252:24;34258:7;34267:4;;34252:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34273:2:0;;-1:-1:-1;34252:5:0::1;::::0;-1:-1:-1;;34252:24:0:i:1;:::-;34339:7;34347:1;34339:10;;;;;;;;;;;;;;34327:9;:22;34323:94;;;34351:66;34382:10;34406:7;34414:1;34406:10;;;;;;;;;;;;;;34394:9;:22;34351:30;:66::i;21322:116::-:0;20385:19;20393:10;20385:7;:19::i;:::-;20377:64;;;;;-1:-1:-1;;;20377:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21400:13:::1;:30:::0;;-1:-1:-1;;;;;;21400:30:0::1;-1:-1:-1::0;;;;;21400:30:0;;;::::1;::::0;;;::::1;::::0;;21322:116::o;721:449::-;953:45;;;-1:-1:-1;;;;;953:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;953:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;942:57:0;;;;907:12;;921:17;;942:10;;;;953:45;942:57;;;25:18:-1;942:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;942:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;906:93:0;;;;1032:7;:57;;;;-1:-1:-1;1044:11:0;;:16;;:44;;;1075:4;1064:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1064:24:0;1044:44;1010:152;;;;-1:-1:-1;;;1010:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;721:449;;;;;:::o;1684:217::-;1797:12;;;1757;1797;;;;;;;;;-1:-1:-1;;;;;1775:7:0;;;1790:5;;1775:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1775:35:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1756:54:0;;;1829:7;1821:72;;;;-1:-1:-1;;;1821:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1684:217;;;:::o;13749:552::-;13850:21;13907:1;13892:4;:11;:16;;13884:57;;;;;-1:-1:-1;;;13884:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13973:4;:11;13962:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13962:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;13962:23:0;;13952:33;;14009:8;13996:7;14004:1;13996:10;;;;;;;;;;;;;:21;;;;;14033:6;14028:266;14059:1;14045:4;:11;:15;14041:1;:19;14028:266;;;14083:14;14099:15;14118:42;14130:7;14139:4;14144:1;14139:7;;;;;;;;;;;;;;14148:4;14153:1;14157;14153:5;14148:11;;;;;;;;;;;;;;14118;:42::i;:::-;14082:78;;;;14192:90;14205:7;14213:1;14205:10;;;;;;;;;;;;;;14217:9;14228:10;14240:41;14251:7;14260:4;14265:1;14260:7;;;;;;;;;;;;;;14269:4;14274:1;14278;14274:5;14269:11;;;;;;;;;;;;;;14240:10;:41::i;:::-;14192:12;:90::i;:::-;14175:7;14183:1;14187;14183:5;14175:14;;;;;;;;;;;;;;;;;:107;-1:-1:-1;;14062:3:0;;14028:266;;;;13749:552;;;;;:::o;10817:478::-;10906:12;10932:14;10948;10966:26;10977:6;10985;10966:10;:26::i;:::-;11130:32;;;-1:-1:-1;;11130:32:0;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;11130:32:0;;;;;11120:43;;;;;;-1:-1:-1;;;;;;11033:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11033:251:0;;;;;;;11023:262;;;;;;;;;10817:478;-1:-1:-1;;;;;10817:478:0:o;1178:498::-;1449:51;;;-1:-1:-1;;;;;1449:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1449:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1438:63:0;;;;1403:12;;1417:17;;1438:10;;;;1449:51;1438:63;;;25:18:-1;1438:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1438:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1402:99:0;;;;1534:7;:57;;;;-1:-1:-1;1546:11:0;;:16;;:44;;;1577:4;1566:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1566:24:0;1546:44;1512:156;;;;-1:-1:-1;;;1512:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1178:498;;;;;;:::o;29113:881::-;29220:6;29215:772;29246:1;29232:4;:11;:15;29228:1;:19;29215:772;;;29270:13;29285:14;29304:4;29309:1;29304:7;;;;;;;;;;;;;;29313:4;29318:1;29322;29318:5;29313:11;;;;;;;;;;;;;;29269:56;;;;29341:14;29360:40;29386:5;29393:6;29360:25;:40::i;:::-;29340:60;;;29415:14;29432:7;29440:1;29444;29440:5;29432:14;;;;;;;;;;;;;;29415:31;;29462:15;29479;29507:6;-1:-1:-1;;;;;29498:15:0;:5;-1:-1:-1;;;;;29498:15:0;;:61;;29540:9;29556:1;29498:61;;;29522:1;29526:9;29498:61;29578:13;;29461:98;;-1:-1:-1;29461:98:0;-1:-1:-1;;;;;;29578:13:0;:27;29574:140;;29641:13;;29626:72;;;-1:-1:-1;;;29626:72:0;;29661:10;29626:72;;;;-1:-1:-1;;;;;29626:72:0;;;;;;;;;;;;;;;;;;;;;;29641:13;;;;;29626:34;;:72;;;;;;;;;;;;;;29641:13;;29626:72;;;2:2:-1;;;;27:1;24;17:12;2:2;29626:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29626:72:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;29574:140:0;29728:10;29759:1;29745:4;:11;:15;29741:1;:19;:80;;29818:3;29741:80;;;29763:52;29786:7;29795:6;29803:4;29808:1;29812;29808:5;29803:11;;;;;;;;;;;;;;29763:22;:52::i;:::-;29728:93;;29849:46;29872:7;29881:5;29888:6;29849:22;:46::i;:::-;-1:-1:-1;;;;;29836:65:0;;29920:10;29932;29944:2;29958:1;29948:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;29948:12:0;87:42:-1;143:17;;-1:-1;29948:12:0;;29836:139;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29836:139:0;-1:-1:-1;;;;;29836:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29836:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29836:139:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29249:3:0;;;;;-1:-1:-1;29215:772:0;;-1:-1:-1;;;;;;;;29215:772:0;;;29113:881;;;:::o;14382:573::-;14483:21;14540:1;14525:4;:11;:16;;14517:57;;;;;-1:-1:-1;;;14517:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14606:4;:11;14595:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14595:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14595:23:0;;14585:33;;14659:9;14629:7;14654:1;14637:7;:14;:18;14629:27;;;;;;;;;;;;;;;;;:39;14693:11;;-1:-1:-1;;14693:15:0;14679:269;14710:5;;14679:269;;14738:14;14754:15;14773:42;14785:7;14794:4;14803:1;14799;:5;14794:11;;;;;;;;;;;;;;14807:4;14812:1;14807:7;;;;;;;14773:42;14737:78;;;;14847:89;14859:7;14867:1;14859:10;;;;;;;;;;;;;;14871:9;14882:10;14894:41;14905:7;14914:4;14923:1;14919;:5;14914:11;;;;;;;;;;;;;;14927:4;14932:1;14927:7;;;;;;;14894:41;14847:11;:89::i;:::-;14830:7;14842:1;14838;:5;14830:14;;;;;;;;;;;;;;;;;:106;-1:-1:-1;;;;14717:3:0;14679:269;;12493:549;12600:14;12646:1;12635:8;:12;12627:66;;;;-1:-1:-1;;;12627:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12724:1;12712:9;:13;:31;;;;;12742:1;12729:10;:14;12712:31;12704:82;;;;-1:-1:-1;;;12704:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12797:20;12820:38;12833:24;12838:5;12849:7;12833:24;:15;:24;:::i;:::-;12820:8;;:38;:12;:38;:::i;:::-;12797:61;-1:-1:-1;12869:14:0;12886:31;12797:61;12906:10;12886:31;:19;:31;:::i;:::-;12869:48;-1:-1:-1;12928:16:0;12947:41;12972:15;12947:20;:9;12961:5;12947:20;:13;:20;:::i;:::-;:24;:41;:24;:41;:::i;:::-;12928:60;;13023:11;13011:9;:23;;;;;;;12493:549;-1:-1:-1;;;;;;;;12493:549:0:o;13163:504::-;13270:13;13316:1;13304:9;:13;13296:68;;;;-1:-1:-1;;;13296:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13395:1;13383:9;:13;:31;;;;;13413:1;13400:10;:14;13383:31;13375:82;;;;-1:-1:-1;;;13375:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13468:14;13485:35;13514:5;13485:24;:9;13499;13485:24;:13;:24;:::i;:::-;:28;:35;:28;:35;:::i;:::-;13468:52;-1:-1:-1;13531:16:0;13550:55;13580:24;13585:5;13596:7;13580:24;:15;:24;:::i;:::-;13550:25;:10;13565:9;13550:25;:14;:25;:::i;:55::-;13531:74;;13627:32;13657:1;13640:11;13628:9;:23;;;;;;;13627:32;:29;:32;:::i;:::-;13616:43;13163:504;-1:-1:-1;;;;;;;13163:504:0:o;34572:1375::-;34685:6;34680:1260;34711:1;34697:4;:11;:15;34693:1;:19;34680:1260;;;34735:13;34750:14;34769:4;34774:1;34769:7;;;;;;;;;;;;;;34778:4;34783:1;34787;34783:5;34778:11;;;;;;;;;;;;;;34734:56;;;;34806:14;34825:40;34851:5;34858:6;34825:25;:40::i;:::-;34805:60;;;34880:17;34913:46;34936:7;34945:5;34952:6;34913:22;:46::i;:::-;34880:80;;34975:16;35006:17;35094:13;35109;35127:4;-1:-1:-1;;;;;35127:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35127:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35127:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35127:18:0;;;;;;;-1:-1:-1;;;;;35093:52:0;;;;-1:-1:-1;35093:52:0;;-1:-1:-1;35161:17:0;;-1:-1:-1;;;;;35202:15:0;;;;;;;:61;;35244:8;35254;35202:61;;;35221:8;35231;35202:61;35160:103;;;;35292:56;35335:12;35299:5;-1:-1:-1;;;;;35292:23:0;;35324:4;35292:38;;;;;;;;;;;;;-1:-1:-1;;;;;35292:38:0;-1:-1:-1;;;;;35292:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;35292:56:0;35278:70;;35378:85;35406:11;35419:12;35433:13;35448:4;-1:-1:-1;;;;;35448:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35448:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35448:14:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35448:14:0;35378:85;;:27;:85::i;:::-;35497:13;;35363:100;;-1:-1:-1;;;;;;35497:13:0;:27;;-1:-1:-1;35493:143:0;;-1:-1:-1;;;35493:143:0;35560:13;;35545:75;;;-1:-1:-1;;;35545:75:0;;35580:10;35545:75;;;;-1:-1:-1;;;;;35545:75:0;;;;;;;;;;;;;;;;;;;;;;35560:13;;;;;35545:34;;:75;;;;;;;;;;;;;;35560:13;;35545:75;;;2:2:-1;;;;27:1;24;17:12;2:2;35545:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35545:75:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;35493:143:0;35651:15;35668;35696:6;-1:-1:-1;;;;;35687:15:0;:5;-1:-1:-1;;;;;35687:15:0;;:67;;35732:12;35751:1;35687:67;;;35711:1;35715:12;35687:67;35650:104;;;;35769:10;35800:1;35786:4;:11;:15;35782:1;:19;:80;;35859:3;35782:80;;;35804:52;35827:7;35836:6;35844:4;35849:1;35853;35849:5;35844:11;;;;;;;35804:52;35915:12;;;35925:1;35915:12;;;;;;;;;;-1:-1:-1;;;35877:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;35877:51:0;;;;;;;;;;;;;;;;;;;;;;35769:93;;-1:-1:-1;35877:9:0;;;;;;35887:10;;35899;;35769:93;;35915:12;;35877:51;;;;;;;;35915:12;;35877:51;;;;35915:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;35877:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35877:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;34714:3:0;;;;;-1:-1:-1;34680:1260:0;;-1:-1:-1;;;;;;;;;;34680:1260:0;9849:129;9933:5;;;9928:16;;;;9920:50;;;;;-1:-1:-1;;;9920:50:0;;;;;;;;;;;;-1:-1:-1;;;9920:50:0;;;;;;;;;;;;;;12054:317;12136:12;12179:1;12169:7;:11;12161:59;;;;-1:-1:-1;;;12161:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12250:1;12239:8;:12;:28;;;;;12266:1;12255:8;:12;12239:28;12231:79;;;;-1:-1:-1;;;12231:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12355:8;12331:21;:7;12343:8;12331:21;:11;:21;:::i;:::-;:32;;;;;;;12054:317;-1:-1:-1;;;;12054:317:0:o;10380:345::-;10455:14;10471;10516:6;-1:-1:-1;;;;;10506:16:0;:6;-1:-1:-1;;;;;10506:16:0;;;10498:64;;;;-1:-1:-1;;;10498:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10601:6;-1:-1:-1;;;;;10592:15:0;:6;-1:-1:-1;;;;;10592:15:0;;:53;;10630:6;10638;10592:53;;;10611:6;10619;10592:53;10573:72;;-1:-1:-1;10573:72:0;-1:-1:-1;;;;;;10664:20:0;;10656:61;;;;;-1:-1:-1;;;10656:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10380:345;;;;;:::o;21478:1380::-;21791:48;;;-1:-1:-1;;;21791:48:0;;-1:-1:-1;;;;;21791:48:0;;;;;;;;;;;;;;;;21696:12;;;;;;21807:7;21791:32;;;;;;:48;;;;;;;;;;;;;;;:32;:48;;;2:2:-1;;;;27:1;24;17:12;2:2;21791:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21791:48:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21791:48:0;-1:-1:-1;;;;;21791:62:0;;21787:146;;;21870:51;;;-1:-1:-1;;;21870:51:0;;-1:-1:-1;;;;;21870:51:0;;;;;;;;;;;;;;;;21886:7;21870:35;;;;;;:51;;;;;;;;;;;;;;;-1:-1:-1;21870:35:0;:51;;;2:2:-1;;;;27:1;24;17:12;2:2;21870:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21870:51:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;21787:146:0;21944:13;21959;21976:51;22003:7;22012:6;22020;21976:26;:51::i;:::-;21943:84;;;;22042:8;22054:1;22042:13;:30;;;;-1:-1:-1;22059:13:0;;22042:30;22038:813;;;22111:14;;-1:-1:-1;22127:14:0;;-1:-1:-1;22038:813:0;;;22175:19;22197:56;22218:14;22234:8;22244;22197:20;:56::i;:::-;22175:78;;22290:14;22272;:32;22268:572;;22351:10;22333:14;:28;;22325:79;;;;-1:-1:-1;;;22325:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22445:14;;-1:-1:-1;22461:14:0;-1:-1:-1;22461:14:0;22268:572;;;22517:19;22539:56;22560:14;22576:8;22586;22539:20;:56::i;:::-;22517:78;;22639:14;22621;:32;;22614:40;;;;22699:10;22681:14;:28;;22673:79;;;;-1:-1:-1;;;22673:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22793:14;-1:-1:-1;22809:14:0;;-1:-1:-1;22268:572:0;22038:813;;21478:1380;;;;;;;;;;;:::o;19989:229::-;-1:-1:-1;;;;;20063:22:0;;20055:73;;;;-1:-1:-1;;;20055:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20165:6;;;20144:38;;-1:-1:-1;;;;;20144:38:0;;;;20165:6;;;20144:38;;;20193:6;:17;;-1:-1:-1;;;;;;20193:17:0;-1:-1:-1;;;;;20193:17:0;;;;;;;;;;19989:229::o;11552:389::-;11645:13;11660;11687:14;11706:26;11717:6;11725;11706:10;:26::i;:::-;11686:46;;;11744:13;11759;11790:32;11798:7;11807:6;11815;11790:7;:32::i;:::-;-1:-1:-1;;;;;11777:58:0;;:60;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11777:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11777:60:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11777:60:0;;;;;;;-1:-1:-1;;;;;11743:94:0;;;;-1:-1:-1;11743:94:0;;-1:-1:-1;;;;;;11871:16:0;;;;;;;:62;;11914:8;11924;11871:62;;;11891:8;11901;11871:62;11848:85;;;;-1:-1:-1;11552:389:0;-1:-1:-1;;;;;;;11552:389:0:o;11303:191::-;11395:12;11443:32;11451:7;11460:6;11468;11443:7;:32::i;:::-;-1:-1:-1;;;;;11430:54:0;;:56;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11430:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11430:56:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11430:56:0;11420:66;;;11303:191;-1:-1:-1;;;;11303:191:0:o;9986:142::-;10038:6;10065;;;:30;;-1:-1:-1;;10080:5:0;;;10094:1;10089;10080:5;10089:1;10075:15;;;;;:20;10065:30;10057:63;;;;;-1:-1:-1;;;10057:63:0;;;;;;;;;;;;-1:-1:-1;;;10057:63:0;;;;;;;;;;;;;;9713:128;9797:5;;;9792:16;;;;9784:49;;;;;-1:-1:-1;;;9784:49:0;;;;;;;;;;;;-1:-1:-1;;;9784:49:0;;;;;;;;;;;;;

Swarm Source

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