Contract 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f

Contract Overview

Balance:
32.310913666 BNB

Token:
Txn Hash
Block
From
To
Value [Txn Fee]
0x7b006b2131486c4cc610108f37344d214fdf23e33f22bdf68963fcc968e5c76287058462021-05-10 0:57:091 hr 31 mins ago0xce8a501bbda64cdcb27969a150c2566cd67270f7 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.00171257
0xf81d9126cd81888440b09cc4a97012e56a817de2e6352c17c2d53124075ec00f87056192021-05-10 0:45:481 hr 42 mins ago0xce8a501bbda64cdcb27969a150c2566cd67270f7 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f1.19535203 BNB0.00123921
0x527e4f459243cbb698266ceba166b6ed32439e93e13e5bdd356c5e8f07477c2987041392021-05-09 23:31:332 hrs 56 mins ago0xce8a501bbda64cdcb27969a150c2566cd67270f7 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.025 BNB0.00128508
0xb346f3df390a0917fb592cc05f19602080fdaf652e32f9a17a486ef70920f36a87033162021-05-09 22:50:243 hrs 37 mins ago0xce8a501bbda64cdcb27969a150c2566cd67270f7 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.5 BNB0.00123907
0x8cb06ce5b5fc3124dc5ee6c762e5e02c0103da952da9ffecfb2274ea4818047687018162021-05-09 21:35:244 hrs 52 mins ago0x3f478cfb11fb50e0b46328257828c6225a49b550 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f1 BNB0.00123907
0x670b4a9434a19c541179e3e31520ae3e419c5afd24d3309f7fced52976b4caba86962142021-05-09 16:55:109 hrs 33 mins ago0x44138b74a3491eef3adfc20e03b85973050dc234 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.00127107
0x96c03ea699ee61b352eb601c3f7c363381a8687c7504d51255f69b43a613e7f886961532021-05-09 16:52:079 hrs 36 mins ago0x63e5c67df1d2dce2376d880d4f5e9160eddc3a29 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.99 BNB0.00123907
0x9cb498047e8604df09c0c529dbf6de2390bc315f7006b56a1b89c10ed69a2c1386960892021-05-09 16:48:559 hrs 39 mins ago0x44138b74a3491eef3adfc20e03b85973050dc234 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.05 BNB0.00123907
0x5a1124ad871ea228ea6cefdbd57ff2166ecd7444333f879644241276f9f7211d86955182021-05-09 16:20:2210 hrs 7 mins ago0xcdeb2830521cdb5232375e649c0160248b918c9c IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f1.2 BNB0.0012852
0xa9fb12c258f21ab861730fc011c346124ecbf68f25835628a96ac504efadcff386950222021-05-09 15:55:3410 hrs 32 mins ago0x6f2debd1cbeced2807a5eaab5e72883bdcc0a6c7 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f67 BNB0.00123919
0xb9e063090a2704481d1dc5c105196acd1e4ab633ef77e2443774fd59afd448a686949492021-05-09 15:51:5510 hrs 36 mins ago0x6f2debd1cbeced2807a5eaab5e72883bdcc0a6c7 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.0020794
0x605fad52a9b66564de6502989777a3fab6c0a91d194d6668c2c56e09781f334c86940272021-05-09 15:05:4911 hrs 22 mins ago0xc5303677dc1cf57e218f183aacc577104231a789 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.00172168
0x65b756cf6df15a813427229d0e50416b1e3caa6b49248c441ebe7e8a5678917786939812021-05-09 15:03:3111 hrs 24 mins ago0xc5303677dc1cf57e218f183aacc577104231a789 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.00113425
0x90ca5ac38bfd9d5f6f1d5b72309b291488614343746301ccd7882e09f02438e886939622021-05-09 15:02:3411 hrs 25 mins ago0xc5303677dc1cf57e218f183aacc577104231a789 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.00113425
0xc8f70d3b47e0fef6f78253e853a0992e1ccc1343f65f1104a5f5e7885264db5986939282021-05-09 15:00:5211 hrs 27 mins ago0x42ce8f66c9dc5c8323c461ee68755a7fdc66882d IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.005790411939284 BNB0.00406595
0x7631ab444fe8c576aa02b292ebb3059abefd9b267fa13747fb45283d55cc5a9886939282021-05-09 15:00:5211 hrs 27 mins ago0xc5303677dc1cf57e218f183aacc577104231a789 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f1 BNB0.00124146
0x142ebd84cce5137cce0e904fab041021b590c38a845a39b51c844dd66d0fa19386939112021-05-09 15:00:0111 hrs 28 mins ago0xc5303677dc1cf57e218f183aacc577104231a789 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f1 BNB0.00124856
0xbe90ec7a1ecd4d6287b5256002b546b5e76376d227dfe173eacdc775b2e5c48086939042021-05-09 14:59:4011 hrs 28 mins ago0xa769ea52e8976ca747fc8a8133d9eb1b041eb651 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.005593222793647 BNB0.00406595
0x90d0223cf2f53e154c52891a0a7c3907a82d16cbec46cd381cca9b6a47a4c6ac86938872021-05-09 14:58:4911 hrs 29 mins ago0x02bef39942ca5a9f484cb1200de32902c4bd8a57 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.005396462550329 BNB0.00408386
0xdcae4f861d974b7463d21871c402bef8d95fc9cc448fc6b99a5fc77c6f84a2ae86938852021-05-09 14:58:4311 hrs 29 mins ago0xc5303677dc1cf57e218f183aacc577104231a789 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.00124955
0xf99240a1e502c4e0016b2f077fb1bc9ac7211511b9aa0618b528756666f2378886938712021-05-09 14:58:0111 hrs 30 mins ago0xc5303677dc1cf57e218f183aacc577104231a789 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.00124967
0x3b18e033e43daf9b19868631decb3e8dfaf27afe490d61d408db7c853a0d11f786938652021-05-09 14:57:4311 hrs 30 mins ago0x110ba6d89224c99d308413e5fc258498c14ed20a IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.005158167071839 BNB0.00410177
0x4e824c627c46720f045ad6250f9c7ca4eeabef9b15e1d5e9f8730da647606f2986938602021-05-09 14:57:2811 hrs 30 mins ago0xc5303677dc1cf57e218f183aacc577104231a789 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0 BNB0.00124979
0x43d708ce804afa8290fd3120e7b4bb69a9abc6497a13393f44da763d0e525c6686938472021-05-09 14:56:4911 hrs 31 mins ago0xab35c92b35530c3ed0ecdb5000e7e06bc553910a IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.005081153862059 BNB0.00406583
0x7e9101e16f574bb7aae32bb7dbaae62d0411eb9b72a313cec27d6ff57522949f86938302021-05-09 14:55:5811 hrs 32 mins ago0x0455e40fa235ae178ce35400552775448639cf25 IN  0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.005000855804304 BNB0.00406583
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x7b006b2131486c4cc610108f37344d214fdf23e33f22bdf68963fcc968e5c76287058462021-05-10 0:57:091 hr 31 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x85ff63a35f2eef4aac114685eef7ff51826189e50 BNB
0x7b006b2131486c4cc610108f37344d214fdf23e33f22bdf68963fcc968e5c76287058462021-05-10 0:57:091 hr 31 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x6f469dae7f333edfc98c6057f12e2a7521a9861c0 BNB
0x7b006b2131486c4cc610108f37344d214fdf23e33f22bdf68963fcc968e5c76287058462021-05-10 0:57:091 hr 31 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0xd66c6b4f0be8ce5b39d52e0fd1344c389929b3780 BNB
0x7b006b2131486c4cc610108f37344d214fdf23e33f22bdf68963fcc968e5c76287058462021-05-10 0:57:091 hr 31 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x85ff63a35f2eef4aac114685eef7ff51826189e50 BNB
0x7b006b2131486c4cc610108f37344d214fdf23e33f22bdf68963fcc968e5c76287058462021-05-10 0:57:091 hr 31 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x6f469dae7f333edfc98c6057f12e2a7521a9861c0 BNB
0xf81d9126cd81888440b09cc4a97012e56a817de2e6352c17c2d53124075ec00f87056192021-05-10 0:45:481 hr 42 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x6f469dae7f333edfc98c6057f12e2a7521a9861c0 BNB
0xf81d9126cd81888440b09cc4a97012e56a817de2e6352c17c2d53124075ec00f87056192021-05-10 0:45:481 hr 42 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x094616f0bdfb0b526bd735bf66eca0ad254ca81f0 BNB
0xf81d9126cd81888440b09cc4a97012e56a817de2e6352c17c2d53124075ec00f87056192021-05-10 0:45:481 hr 42 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x094616f0bdfb0b526bd735bf66eca0ad254ca81f1.19535203 BNB
0xf81d9126cd81888440b09cc4a97012e56a817de2e6352c17c2d53124075ec00f87056192021-05-10 0:45:481 hr 42 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x6f469dae7f333edfc98c6057f12e2a7521a9861c0 BNB
0x527e4f459243cbb698266ceba166b6ed32439e93e13e5bdd356c5e8f07477c2987041392021-05-09 23:31:332 hrs 56 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0xaf5e8aa68dd1b61376ac4f6fa4d06a5a4ab6cafd0 BNB
0x527e4f459243cbb698266ceba166b6ed32439e93e13e5bdd356c5e8f07477c2987041392021-05-09 23:31:332 hrs 56 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x094616f0bdfb0b526bd735bf66eca0ad254ca81f0 BNB
0x527e4f459243cbb698266ceba166b6ed32439e93e13e5bdd356c5e8f07477c2987041392021-05-09 23:31:332 hrs 56 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x094616f0bdfb0b526bd735bf66eca0ad254ca81f0.025 BNB
0x527e4f459243cbb698266ceba166b6ed32439e93e13e5bdd356c5e8f07477c2987041392021-05-09 23:31:332 hrs 56 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0xaf5e8aa68dd1b61376ac4f6fa4d06a5a4ab6cafd0 BNB
0xb346f3df390a0917fb592cc05f19602080fdaf652e32f9a17a486ef70920f36a87033162021-05-09 22:50:243 hrs 37 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x47d34fd4f095767e718f110afef030bb18e8c48f0 BNB
0xb346f3df390a0917fb592cc05f19602080fdaf652e32f9a17a486ef70920f36a87033162021-05-09 22:50:243 hrs 37 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x094616f0bdfb0b526bd735bf66eca0ad254ca81f0 BNB
0xb346f3df390a0917fb592cc05f19602080fdaf652e32f9a17a486ef70920f36a87033162021-05-09 22:50:243 hrs 37 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x094616f0bdfb0b526bd735bf66eca0ad254ca81f0.5 BNB
0xb346f3df390a0917fb592cc05f19602080fdaf652e32f9a17a486ef70920f36a87033162021-05-09 22:50:243 hrs 37 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x47d34fd4f095767e718f110afef030bb18e8c48f0 BNB
0x8cb06ce5b5fc3124dc5ee6c762e5e02c0103da952da9ffecfb2274ea4818047687018162021-05-09 21:35:244 hrs 52 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x47d34fd4f095767e718f110afef030bb18e8c48f0 BNB
0x8cb06ce5b5fc3124dc5ee6c762e5e02c0103da952da9ffecfb2274ea4818047687018162021-05-09 21:35:244 hrs 52 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x094616f0bdfb0b526bd735bf66eca0ad254ca81f0 BNB
0x8cb06ce5b5fc3124dc5ee6c762e5e02c0103da952da9ffecfb2274ea4818047687018162021-05-09 21:35:244 hrs 52 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x094616f0bdfb0b526bd735bf66eca0ad254ca81f1 BNB
0x8cb06ce5b5fc3124dc5ee6c762e5e02c0103da952da9ffecfb2274ea4818047687018162021-05-09 21:35:244 hrs 52 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x47d34fd4f095767e718f110afef030bb18e8c48f0 BNB
0x670b4a9434a19c541179e3e31520ae3e419c5afd24d3309f7fced52976b4caba86962142021-05-09 16:55:109 hrs 33 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0x44138b74a3491eef3adfc20e03b85973050dc2340.049270280954479958 BNB
0x670b4a9434a19c541179e3e31520ae3e419c5afd24d3309f7fced52976b4caba86962142021-05-09 16:55:109 hrs 33 mins ago 0x094616f0bdfb0b526bd735bf66eca0ad254ca81f 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f0.049270280954479958 BNB
0x670b4a9434a19c541179e3e31520ae3e419c5afd24d3309f7fced52976b4caba86962142021-05-09 16:55:109 hrs 33 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x094616f0bdfb0b526bd735bf66eca0ad254ca81f0 BNB
0x670b4a9434a19c541179e3e31520ae3e419c5afd24d3309f7fced52976b4caba86962142021-05-09 16:55:109 hrs 33 mins ago 0xcde540d7eafe93ac5fe6233bee57e1270d3e330f 0x47d34fd4f095767e718f110afef030bb18e8c48f0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BakerySwapRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 999999 runs

Other Settings:
istanbul EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-04-09
*/

/**
 *Submitted for verification at BscScan.com on 2020-09-14
*/

pragma solidity >=0.5.0;

interface IBakerySwapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint256);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// helper methods for interacting with BEP20 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: 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: 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: TRANSFER_FROM_FAILED');
    }

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

interface IBakerySwapRouter {
    function factory() external pure returns (address);

    function WBNB() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityBNB(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountBNB,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityBNB(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountBNB);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityBNBWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountBNB);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactBNBForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactBNB(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForBNB(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapBNBForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function removeLiquidityBNBSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountBNB);

    function removeLiquidityBNBWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountBNB);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactBNBForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForBNBSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);
}

library BakerySwapLibrary {
    using SafeMath for uint256;

    // 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, 'BakerySwapLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'BakerySwapLibrary: 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(
            uint256(
                keccak256(
                    abi.encodePacked(
                        hex'ff',
                        factory,
                        keccak256(abi.encodePacked(token0, token1)),
                        hex'e2e87433120e32c4738a7d8f3271f3d872cbe16241d67537139158d90bac61d3' // init code hash
                    )
                )
            )
        );
    }

    // fetches and sorts the reserves for a pair
    function getReserves(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (uint256 reserveA, uint256 reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1, ) = IBakerySwapPair(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(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) internal pure returns (uint256 amountB) {
        require(amountA > 0, 'BakerySwapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'BakerySwapLibrary: 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(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountOut) {
        require(amountIn > 0, 'BakerySwapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'BakerySwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint256 amountInWithFee = amountIn.mul(997);
        uint256 numerator = amountInWithFee.mul(reserveOut);
        uint256 denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

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

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

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

interface IBakerySwapPair {
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    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 (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to) external returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, 'SafeMath: addition overflow');

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, 'SafeMath: subtraction overflow');
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, 'SafeMath: multiplication overflow');

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, 'SafeMath: division by zero');
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, 'SafeMath: modulo by zero');
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

interface IBEP20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the token decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Returns the token symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the token name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external view returns (address);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address _owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IWBNB {
    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;
}

contract BakerySwapRouter is IBakerySwapRouter {
    using SafeMath for uint256;
    address public immutable override factory;
    address public immutable override WBNB;

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

    constructor(address _factory, address _WBNB) public {
        factory = _factory;
        WBNB = _WBNB;
    }

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal virtual returns (uint256 amountA, uint256 amountB) {
        // create the pair if it doesn't exist yet
        if (IBakerySwapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IBakerySwapFactory(factory).createPair(tokenA, tokenB);
        }
        (uint256 reserveA, uint256 reserveB) = BakerySwapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal = BakerySwapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'BakerySwapRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal = BakerySwapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'BakerySwapRouter: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        )
    {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = BakerySwapLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IBakerySwapPair(pair).mint(to);
    }

    function addLiquidityBNB(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountBNB,
            uint256 liquidity
        )
    {
        (amountToken, amountBNB) = _addLiquidity(
            token,
            WBNB,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountBNBMin
        );
        address pair = BakerySwapLibrary.pairFor(factory, token, WBNB);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWBNB(WBNB).deposit{value: amountBNB}();
        assert(IWBNB(WBNB).transfer(pair, amountBNB));
        liquidity = IBakerySwapPair(pair).mint(to);
        // refund dust bnb, if any
        if (msg.value > amountBNB) TransferHelper.safeTransferBNB(msg.sender, msg.value - amountBNB);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {
        address pair = BakerySwapLibrary.pairFor(factory, tokenA, tokenB);
        IBakerySwapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint256 amount0, uint256 amount1) = IBakerySwapPair(pair).burn(to);
        (address token0, ) = BakerySwapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'BakerySwapRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'BakerySwapRouter: INSUFFICIENT_B_AMOUNT');
    }

    function removeLiquidityBNB(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountBNB) {
        (amountToken, amountBNB) = removeLiquidity(
            token,
            WBNB,
            liquidity,
            amountTokenMin,
            amountBNBMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWBNB(WBNB).withdraw(amountBNB);
        TransferHelper.safeTransferBNB(to, amountBNB);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountA, uint256 amountB) {
        address pair = BakerySwapLibrary.pairFor(factory, tokenA, tokenB);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IBakerySwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }

    function removeLiquidityBNBWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountToken, uint256 amountBNB) {
        address pair = BakerySwapLibrary.pairFor(factory, token, WBNB);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IBakerySwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountBNB) = removeLiquidityBNB(token, liquidity, amountTokenMin, amountBNBMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityBNBSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountBNB) {
        (, amountBNB) = removeLiquidity(token, WBNB, liquidity, amountTokenMin, amountBNBMin, address(this), deadline);
        TransferHelper.safeTransfer(token, to, IBEP20(token).balanceOf(address(this)));
        IWBNB(WBNB).withdraw(amountBNB);
        TransferHelper.safeTransferBNB(to, amountBNB);
    }

    function removeLiquidityBNBWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountBNBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountBNB) {
        address pair = BakerySwapLibrary.pairFor(factory, token, WBNB);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        IBakerySwapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountBNB = removeLiquidityBNBSupportingFeeOnTransferTokens(
            token,
            liquidity,
            amountTokenMin,
            amountBNBMin,
            to,
            deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = BakerySwapLibrary.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOut)
                : (amountOut, uint256(0));
            address to = i < path.length - 2 ? BakerySwapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IBakerySwapPair(BakerySwapLibrary.pairFor(factory, input, output)).swap(amount0Out, amount1Out, to);
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = BakerySwapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BakerySwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            BakerySwapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = BakerySwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'BakerySwapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            BakerySwapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapExactBNBForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WBNB, 'BakerySwapRouter: INVALID_PATH');
        amounts = BakerySwapLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BakerySwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWBNB(WBNB).deposit{value: amounts[0]}();
        assert(IWBNB(WBNB).transfer(BakerySwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }

    function swapTokensForExactBNB(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WBNB, 'BakerySwapRouter: INVALID_PATH');
        amounts = BakerySwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'BakerySwapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            BakerySwapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWBNB(WBNB).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferBNB(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForBNB(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WBNB, 'BakerySwapRouter: INVALID_PATH');
        amounts = BakerySwapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BakerySwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            BakerySwapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWBNB(WBNB).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferBNB(to, amounts[amounts.length - 1]);
    }

    function swapBNBForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WBNB, 'BakerySwapRouter: INVALID_PATH');
        amounts = BakerySwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'BakerySwapRouter: EXCESSIVE_INPUT_AMOUNT');
        IWBNB(WBNB).deposit{value: amounts[0]}();
        assert(IWBNB(WBNB).transfer(BakerySwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust bnb, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferBNB(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 (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = BakerySwapLibrary.sortTokens(input, output);
            IBakerySwapPair pair = IBakerySwapPair(BakerySwapLibrary.pairFor(factory, input, output));
            uint256 amountInput;
            uint256 amountOutput;
            {
                // scope to avoid stack too deep errors
                (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
                (uint256 reserveInput, uint256 reserveOutput) = input == token0
                    ? (reserve0, reserve1)
                    : (reserve1, reserve0);
                amountInput = IBEP20(input).balanceOf(address(pair)).sub(reserveInput);
                amountOutput = BakerySwapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOutput)
                : (amountOutput, uint256(0));
            address to = i < path.length - 2 ? BakerySwapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to);
        }
    }

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            BakerySwapLibrary.pairFor(factory, path[0], path[1]),
            amountIn
        );
        uint256 balanceBefore = IBEP20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IBEP20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'BakerySwapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }

    function swapExactBNBForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override payable ensure(deadline) {
        require(path[0] == WBNB, 'BakerySwapRouter: INVALID_PATH');
        uint256 amountIn = msg.value;
        IWBNB(WBNB).deposit{value: amountIn}();
        assert(IWBNB(WBNB).transfer(BakerySwapLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint256 balanceBefore = IBEP20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IBEP20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'BakerySwapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }

    function swapExactTokensForBNBSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) {
        require(path[path.length - 1] == WBNB, 'BakerySwapRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            BakerySwapLibrary.pairFor(factory, path[0], path[1]),
            amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint256 amountOut = IBEP20(WBNB).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'BakerySwapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWBNB(WBNB).withdraw(amountOut);
        TransferHelper.safeTransferBNB(to, amountOut);
    }

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

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

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

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

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WBNB","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WBNB","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":"amountBNBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityBNB","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountBNB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountBNBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityBNB","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountBNB","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":"amountBNBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityBNBSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountBNB","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":"amountBNBMin","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":"removeLiquidityBNBWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountBNB","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":"amountBNBMin","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":"removeLiquidityBNBWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountBNB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapBNBForExactTokens","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":"swapExactBNBForTokens","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":"swapExactBNBForTokensSupportingFeeOnTransferTokens","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":"swapExactTokensForBNB","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":"swapExactTokensForBNBSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactBNB","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b50604051620056d4380380620056d4833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c61554d62000187600039806101ac5280610f995280611388528061147052806114f15280611c1b5280611e295280611f1452806120b0528061226052806122f552806125e35280612679528061282c52806128c15280612aa05280612b755280612fea528061316e528061323e528061335a528061358d52806135c8528061387152806138c752806138fb528061397c525080610e005280610e395280610f77528061113c528061123a5280611530528061195f5280611d0d5280611ef2528061219652806123345280612519528061275f52806129005280612c825280612f145280612f3d528061344c52806136f652806138a552806142be5280614301528061443d528061461e5280614e155280614ef65280614f76525061554d6000f3fe60806040526004361061018f5760003560e01c80638dd95002116100d6578063d06ca61f1161007f578063e058848811610059578063e058848814610ca4578063e8e3370014610d04578063eaaed44214610d91576101d5565b8063d06ca61f14610aa3578063d46d2f8314610b5a578063d67b571e14610bff576101d5565b8063b7e65949116100b0578063b7e65949146109c4578063baa2abde14610a24578063c45a015514610a8e576101d5565b80638dd95002146108bd5780639cf68911146108fb578063ad615dec1461098e576101d5565b80635c11d795116101385780638332a963116101125780638332a9631461074f57806385f8c259146107e25780638803dbee14610818576101d5565b80635c11d795146105855780635d616c5b1461062a578063685a0a34146106cf576101d5565b806334a0772d1161016957806334a0772d146103cd57806338ed17391461044d57806350e27df3146104f2576101d5565b8063054d50d4146101da5780631f00ca74146102225780632195995c14610329576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b50610210600480360360608110156101fd57600080fd5b5080359060208101359060400135610de4565b60408051918252519081900360200190f35b34801561022e57600080fd5b506102d96004803603604081101561024557600080fd5b8135919081019060408101602082013564010000000081111561026757600080fd5b82018360208201111561027957600080fd5b8035906020019184602083028401116401000000008311171561029b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610df9945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103155781810151838201526020016102fd565b505050509050019250505060405180910390f35b34801561033557600080fd5b506103b4600480360361016081101561034d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135610e2f565b6040805192835260208301919091528051918290030190f35b3480156103d957600080fd5b506103b460048036036101408110156103f157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135610f6d565b34801561045957600080fd5b506102d9600480360360a081101561047057600080fd5b81359160208101359181019060608101604082013564010000000081111561049757600080fd5b8201836020820111156104a957600080fd5b803590602001918460208302840111640100000000831117156104cb57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356110c5565b6101d36004803603608081101561050857600080fd5b8135919081019060408101602082013564010000000081111561052a57600080fd5b82018360208201111561053c57600080fd5b8035906020019184602083028401116401000000008311171561055e57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611316565b34801561059157600080fd5b506101d3600480360360a08110156105a857600080fd5b8135916020810135918101906060810160408201356401000000008111156105cf57600080fd5b8201836020820111156105e157600080fd5b8035906020019184602083028401116401000000008311171561060357600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356118bc565b34801561063657600080fd5b506102d9600480360360a081101561064d57600080fd5b81359160208101359181019060608101604082013564010000000081111561067457600080fd5b82018360208201111561068657600080fd5b803590602001918460208302840111640100000000831117156106a857600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611b92565b3480156106db57600080fd5b5061021060048036036101408110156106f357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611eea565b6102d96004803603608081101561076557600080fd5b8135919081019060408101602082013564010000000081111561078757600080fd5b82018360208201111561079957600080fd5b803590602001918460208302840111640100000000831117156107bb57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561203c565b3480156107ee57600080fd5b506102106004803603606081101561080557600080fd5b5080359060208101359060400135612495565b34801561082457600080fd5b506102d9600480360360a081101561083b57600080fd5b81359160208101359181019060608101604082013564010000000081111561086257600080fd5b82018360208201111561087457600080fd5b8035906020019184602083028401116401000000008311171561089657600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356124a2565b3480156108c957600080fd5b506108d26125e1565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6102d96004803603608081101561091157600080fd5b8135919081019060408101602082013564010000000081111561093357600080fd5b82018360208201111561094557600080fd5b8035906020019184602083028401116401000000008311171561096757600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612605565b34801561099a57600080fd5b50610210600480360360608110156109b157600080fd5b5080359060208101359060400135612a1b565b3480156109d057600080fd5b50610210600480360360c08110156109e757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612a28565b348015610a3057600080fd5b506103b4600480360360e0811015610a4757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612c08565b348015610a9a57600080fd5b506108d2612f12565b348015610aaf57600080fd5b506102d960048036036040811015610ac657600080fd5b81359190810190604081016020820135640100000000811115610ae857600080fd5b820183602082011115610afa57600080fd5b80359060200191846020830284011164010000000083111715610b1c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612f36945050505050565b348015610b6657600080fd5b506101d3600480360360a0811015610b7d57600080fd5b813591602081013591810190606081016040820135640100000000811115610ba457600080fd5b820183602082011115610bb657600080fd5b80359060200191846020830284011164010000000083111715610bd857600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612f63565b348015610c0b57600080fd5b506102d9600480360360a0811015610c2257600080fd5b813591602081013591810190606081016040820135640100000000811115610c4957600080fd5b820183602082011115610c5b57600080fd5b80359060200191846020830284011164010000000083111715610c7d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356132d1565b348015610cb057600080fd5b506103b4600480360360c0811015610cc757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135613514565b348015610d1057600080fd5b50610d736004803603610100811015610d2857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613667565b60408051938452602084019290925282820152519081900360600190f35b610d73600480360360c0811015610da757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356137f6565b6000610df1848484613b22565b949350505050565b6060610e267f00000000000000000000000000000000000000000000000000000000000000008484613c46565b90505b92915050565b6000806000610e5f7f00000000000000000000000000000000000000000000000000000000000000008f8f613de9565b9050600087610e6e578c610e90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b158015610f2c57600080fd5b505af1158015610f40573d6000803e3d6000fd5b50505050610f538f8f8f8f8f8f8f612c08565b809450819550505050509b509b9950505050505050505050565b6000806000610fbd7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613de9565b9050600087610fcc578c610fee565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561108a57600080fd5b505af115801561109e573d6000803e3d6000fd5b505050506110b08e8e8e8e8e8e613514565b909f909e509c50505050505050505050505050565b6060814281101561113757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6111957f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ed492505050565b915086826001845103815181106111a857fe5b60200260200101511015611207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061544f602c913960400191505060405180910390fd5b6112cc8686600081811061121757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16336112b27f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061126657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061129057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613de9565b856000815181106112bf57fe5b6020026020010151614025565b61130b828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506141f5915050565b509695505050505050565b804281101561138657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16858560008181106113ca57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461146957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f42616b65727953776170526f757465723a20494e56414c49445f504154480000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156114d657600080fd5b505af11580156114ea573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6115867f00000000000000000000000000000000000000000000000000000000000000008989600081811061155c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061129057fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156115f057600080fd5b505af1158015611604573d6000803e3d6000fd5b505050506040513d602081101561161a57600080fd5b505161162257fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061165257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156116eb57600080fd5b505afa1580156116ff573d6000803e3d6000fd5b505050506040513d602081101561171557600080fd5b505160408051602089810282810182019093528982529293506117579290918a918a9182918501908490808284376000920191909152508992506143e6915050565b8761185b8289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061178a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561182357600080fd5b505afa158015611837573d6000803e3d6000fd5b505050506040513d602081101561184d57600080fd5b50519063ffffffff61471016565b10156118b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061544f602c913960400191505060405180910390fd5b5050505050505050565b804281101561192c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6119918585600081811061193c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361198b7f00000000000000000000000000000000000000000000000000000000000000008989600081811061155c57fe5b8a614025565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106119c157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a5a57600080fd5b505afa158015611a6e573d6000803e3d6000fd5b505050506040513d6020811015611a8457600080fd5b50516040805160208881028281018201909352888252929350611ac69290918991899182918501908490808284376000920191909152508892506143e6915050565b8661185b8288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611af957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561182357600080fd5b60608142811015611c0457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c6957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d0857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f42616b65727953776170526f757465723a20494e56414c49445f504154480000604482015290519081900360640190fd5b611d667f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ed492505050565b91508682600184510381518110611d7957fe5b60200260200101511015611dd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061544f602c913960400191505060405180910390fd5b611de88686600081811061121757fe5b611e27828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506141f5915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d83600185510381518110611e7357fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611eb157600080fd5b505af1158015611ec5573d6000803e3d6000fd5b5050505061130b8483600185510381518110611edd57fe5b6020026020010151614752565b600080611f387f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613de9565b9050600086611f47578b611f69565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561200557600080fd5b505af1158015612019573d6000803e3d6000fd5b5050505061202b8d8d8d8d8d8d612a28565b9d9c50505050505050505050505050565b606081428110156120ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106120f257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461219157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f42616b65727953776170526f757465723a20494e56414c49445f504154480000604482015290519081900360640190fd5b6121ef7f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613c4692505050565b915034826000815181106121ff57fe5b6020026020010151111561225e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806153406028913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836000815181106122a757fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122da57600080fd5b505af11580156122ee573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123607f00000000000000000000000000000000000000000000000000000000000000008989600081811061155c57fe5b8460008151811061236d57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156123de57600080fd5b505af11580156123f2573d6000803e3d6000fd5b505050506040513d602081101561240857600080fd5b505161241057fe5b61244f828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506141f5915050565b8160008151811061245c57fe5b602002602001015134111561248b5761248b338360008151811061247c57fe5b60200260200101513403614752565b5095945050505050565b6000610df184848461488a565b6060814281101561251457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6125727f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613c4692505050565b9150868260008151811061258257fe5b60200260200101511115611207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806153406028913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6060814281101561267757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106126bb57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461275a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f42616b65727953776170526f757465723a20494e56414c49445f504154480000604482015290519081900360640190fd5b6127b87f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ed492505050565b915086826001845103815181106127cb57fe5b6020026020010151101561282a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061544f602c913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061287357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156128a657600080fd5b505af11580156128ba573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61292c7f00000000000000000000000000000000000000000000000000000000000000008989600081811061155c57fe5b8460008151811061293957fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156129aa57600080fd5b505af11580156129be573d6000803e3d6000fd5b505050506040513d60208110156129d457600080fd5b50516129dc57fe5b61248b828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506141f5915050565b6000610df18484846149ae565b60008142811015612a9a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b612ac9887f00000000000000000000000000000000000000000000000000000000000000008989893089612c08565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450612b7392508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b158015612b4257600080fd5b505afa158015612b56573d6000803e3d6000fd5b505050506040513d6020811015612b6c57600080fd5b5051614a8e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612be657600080fd5b505af1158015612bfa573d6000803e3d6000fd5b5050505061130b8483614752565b6000808242811015612c7b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6000612ca87f00000000000000000000000000000000000000000000000000000000000000008c8c613de9565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612d2957600080fd5b505af1158015612d3d573d6000803e3d6000fd5b505050506040513d6020811015612d5357600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612dc657600080fd5b505af1158015612dda573d6000803e3d6000fd5b505050506040513d6040811015612df057600080fd5b50805160209091015190925090506000612e0a8e8e614c6b565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612e47578183612e4a565b82825b90975095508a871015612ea8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154286027913960400191505060405180910390fd5b89861015612f01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154016027913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610e267f00000000000000000000000000000000000000000000000000000000000000008484613ed4565b8042811015612fd357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061303857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146130d757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f42616b65727953776170526f757465723a20494e56414c49445f504154480000604482015290519081900360640190fd5b6130e78585600081811061193c57fe5b6131258585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506143e6915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b1580156131b557600080fd5b505afa1580156131c9573d6000803e3d6000fd5b505050506040513d60208110156131df57600080fd5b505190508681101561323c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061544f602c913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156132af57600080fd5b505af11580156132c3573d6000803e3d6000fd5b505050506118b28482614752565b6060814281101561334357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106133a857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461344757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f42616b65727953776170526f757465723a20494e56414c49445f504154480000604482015290519081900360640190fd5b6134a57f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613c4692505050565b915086826000815181106134b557fe5b60200260200101511115611dd8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806153406028913960400191505060405180910390fd5b600080824281101561358757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6135b6897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612c08565b90935091506135c6898685614a8e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561363957600080fd5b505af115801561364d573d6000803e3d6000fd5b5050505061365b8583614752565b50965096945050505050565b600080600083428110156136dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6136ea8c8c8c8c8c8c614dbe565b9094509250600061371c7f00000000000000000000000000000000000000000000000000000000000000008e8e613de9565b905061372a8d338388614025565b6137368c338387614025565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156137b557600080fd5b505af11580156137c9573d6000803e3d6000fd5b505050506040513d60208110156137df57600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561386b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42616b65727953776170526f757465723a204558504952454400000000000000604482015290519081900360640190fd5b6138998a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614dbe565b909450925060006138eb7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613de9565b90506138f98b338388614025565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561396157600080fd5b505af1158015613975573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613a2157600080fd5b505af1158015613a35573d6000803e3d6000fd5b505050506040513d6020811015613a4b57600080fd5b5051613a5357fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015613ad257600080fd5b505af1158015613ae6573d6000803e3d6000fd5b505050506040513d6020811015613afc57600080fd5b5051925034841015613b1457613b1433853403614752565b505096509650969350505050565b6000808411613b7c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061538e602c913960400191505060405180910390fd5b600083118015613b8c5750600082115b613be1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806154ef6029913960400191505060405180910390fd5b6000613bf5856103e563ffffffff6150bf16565b90506000613c09828563ffffffff6150bf16565b90506000613c2f83613c23886103e863ffffffff6150bf16565b9063ffffffff61513216565b9050808281613c3a57fe5b04979650505050505050565b6060600282511015613cb957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f42616b657279537761704c6962726172793a20494e56414c49445f5041544800604482015290519081900360640190fd5b815167ffffffffffffffff81118015613cd157600080fd5b50604051908082528060200260200182016040528015613cfb578160200160208202803683370190505b5090508281600183510381518110613d0f57fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015613de157600080613d7c87866001860381518110613d5b57fe5b6020026020010151878681518110613d6f57fe5b60200260200101516151a6565b91509150613d9e848481518110613d8f57fe5b6020026020010151838361488a565b846001850381518110613dad57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613d3f565b509392505050565b6000806000613df88585614c6b565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527fe2e87433120e32c4738a7d8f3271f3d872cbe16241d67537139158d90bac61d3609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6060600282511015613f4757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f42616b657279537761704c6962726172793a20494e56414c49445f5041544800604482015290519081900360640190fd5b815167ffffffffffffffff81118015613f5f57600080fd5b50604051908082528060200260200182016040528015613f89578160200160208202803683370190505b5090508281600081518110613f9a57fe5b60200260200101818152505060005b6001835103811015613de157600080613fdf87868581518110613fc857fe5b6020026020010151878660010181518110613d6f57fe5b91509150614001848481518110613ff257fe5b60200260200101518383613b22565b84846001018151811061401057fe5b60209081029190910101525050600101613fa9565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061410357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016140c6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614165576040519150601f19603f3d011682016040523d82523d6000602084013e61416a565b606091505b5091509150818015614198575080511580614198575080806020019051602081101561419557600080fd5b50515b6141ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806154cb6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156143e05760008084838151811061421357fe5b602002602001015185846001018151811061422a57fe5b60200260200101519150915060006142428383614c6b565b509050600087856001018151811061425657fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461429e578260006142a2565b6000835b91509150600060028a510388106142b957886142fa565b6142fa7f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106142ed57fe5b6020026020010151613de9565b90506143277f00000000000000000000000000000000000000000000000000000000000000008888613de9565b73ffffffffffffffffffffffffffffffffffffffff16636d9a640a8484846040518463ffffffff1660e01b8152600401808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b1580156143b557600080fd5b505af11580156143c9573d6000803e3d6000fd5b5050600190990198506141f8975050505050505050565b50505050565b60005b600183510381101561470b5760008084838151811061440457fe5b602002602001015185846001018151811061441b57fe5b60200260200101519150915060006144338383614c6b565b50905060006144637f00000000000000000000000000000000000000000000000000000000000000008585613de9565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156144b157600080fd5b505afa1580156144c5573d6000803e3d6000fd5b505050506040513d60608110156144db57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a811690891614614525578284614528565b83835b915091506145ad828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561182357600080fd5b95506145ba868383613b22565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146145fe57826000614602565b6000835b91509150600060028c51038a10614619578a61464d565b61464d7f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106142ed57fe5b90508573ffffffffffffffffffffffffffffffffffffffff16636d9a640a8484846040518463ffffffff1660e01b8152600401808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b1580156146de57600080fd5b505af11580156146f2573d6000803e3d6000fd5b50506001909b019a506143e99950505050505050505050565b505050565b6000610e2683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061528e565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b602083106147c957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161478c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461482b576040519150601f19603f3d011682016040523d82523d6000602084013e614830565b606091505b505090508061470b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061547b6023913960400191505060405180910390fd5b60008084116148e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061549e602d913960400191505060405180910390fd5b6000831180156148f45750600082115b614949576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806154ef6029913960400191505060405180910390fd5b600061496d6103e8614961868863ffffffff6150bf16565b9063ffffffff6150bf16565b905060006149876103e5614961868963ffffffff61471016565b90506149a4600182848161499757fe5b049063ffffffff61513216565b9695505050505050565b6000808411614a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153ba6026913960400191505060405180910390fd5b600083118015614a185750600082115b614a6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806154ef6029913960400191505060405180910390fd5b82614a7e858463ffffffff6150bf16565b81614a8557fe5b04949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310614b6457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614b27565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614bc6576040519150601f19603f3d011682016040523d82523d6000602084013e614bcb565b606091505b5091509150818015614bf9575080511580614bf95750808060200190516020811015614bf657600080fd5b50515b614c6457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614cf3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153686026913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614d2d578284614d30565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614db757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f42616b657279537761704c6962726172793a205a45524f5f4144445245535300604482015290519081900360640190fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b158015614e5e57600080fd5b505afa158015614e72573d6000803e3d6000fd5b505050506040513d6020811015614e8857600080fd5b505173ffffffffffffffffffffffffffffffffffffffff161415614f6e57604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b158015614f4157600080fd5b505af1158015614f55573d6000803e3d6000fd5b505050506040513d6020811015614f6b57600080fd5b50505b600080614f9c7f00000000000000000000000000000000000000000000000000000000000000008b8b6151a6565b91509150816000148015614fae575080155b15614fbe578793508692506150b2565b6000614fcb8984846149ae565b9050878111615038578581101561502d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154016027913960400191505060405180910390fd5b8894509250826150b0565b60006150458984866149ae565b90508981111561505157fe5b878110156150aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154286027913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b6000826150ce57506000610e29565b828202828482816150db57fe5b0414610e26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806153e06021913960400191505060405180910390fd5b600082820183811015610e2657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008060006151b58585614c6b565b5090506000806151c6888888613de9565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561520b57600080fd5b505afa15801561521f573d6000803e3d6000fd5b505050506040513d606081101561523557600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff8781169084161461527c57808261527f565b81815b90999098509650505050505050565b60008184841115615337576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156152fc5781810151838201526020016152e4565b50505050905090810190601f1680156153295780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe42616b65727953776170526f757465723a204558434553534956455f494e5055545f414d4f554e5442616b657279537761704c6962726172793a204944454e544943414c5f41444452455353455342616b657279537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e5442616b657279537761704c6962726172793a20494e53554646494349454e545f414d4f554e54536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7742616b65727953776170526f757465723a20494e53554646494349454e545f425f414d4f554e5442616b65727953776170526f757465723a20494e53554646494349454e545f415f414d4f554e5442616b65727953776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a20424e425f5452414e534645525f4641494c454442616b657279537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c454442616b657279537761704c6962726172793a20494e53554646494349454e545f4c4951554944495459a2646970667358221220299e6ec863a05b34facb61387047c1629d5fac978f54568d39a4d31919f46fcb64736f6c6343000606003300000000000000000000000001bf7c66c6bd861915cdaae475042d3c4bae16a7000000000000000000000000094616f0bdfb0b526bd735bf66eca0ad254ca81f

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

00000000000000000000000001bf7c66c6bd861915cdaae475042d3c4bae16a7000000000000000000000000094616f0bdfb0b526bd735bf66eca0ad254ca81f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000001bf7c66c6bd861915cdaae475042d3c4bae16a7
Arg [1] : 000000000000000000000000094616f0bdfb0b526bd735bf66eca0ad254ca81f


Deployed ByteCode Sourcemap

24891:19546:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25376:10;:18;25390:4;25376:18;;25369:26;;;;24891:19546;;12:1:-1;9;2:12;43373:259:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43373:259:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43373:259:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;44174:260;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44174:260:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;44174:260:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;44174:260:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;44174:260:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;44174:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;44174:260:0;;-1:-1:-1;44174:260:0;;-1:-1:-1;;;;;44174:260: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;44174:260:0;;;;;;;;;;;;;;;;;30557:730;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30557:730:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;30557:730:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31295:722;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31295:722:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;31295:722:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34452:682::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34452:682:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;34452:682:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34452:682:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34452:682:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34452:682:0;;-1:-1:-1;34452:682:0;-1:-1:-1;34452:682:0;;;;;;;;;:::i;41407:815::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;41407:815:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;41407:815:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;41407:815:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;41407:815:0;;-1:-1:-1;41407:815:0;-1:-1:-1;41407:815:0;;;;;;;;;:::i;40632:767::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40632:767:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;40632:767:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;40632:767:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;40632:767:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;40632:767:0;;-1:-1:-1;40632:767:0;-1:-1:-1;40632:767:0;;;;;;;;;:::i;37405:907::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37405:907:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;37405:907:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;37405:907:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37405:907:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37405:907:0;;-1:-1:-1;37405:907:0;-1:-1:-1;37405:907:0;;;;;;;;;:::i;32717:833::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32717:833:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;32717:833:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38320:807::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;38320:807:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;38320:807:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;38320:807:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38320:807:0;;-1:-1:-1;38320:807:0;-1:-1:-1;38320:807:0;;;;;;;;;:::i;43640:258::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43640:258:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43640:258:0;;;;;;;;;;;;:::i;35142:660::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35142:660:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35142:660:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;35142:660:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35142:660:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35142:660:0;;-1:-1:-1;35142:660:0;-1:-1:-1;35142:660:0;;;;;;;;;:::i;25026:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25026:38:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35810:694;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35810:694:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;35810:694:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35810:694:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35810:694:0;;-1:-1:-1;35810:694:0;-1:-1:-1;35810:694:0;;;;;;;;;:::i;43130:235::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43130:235:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43130:235:0;;;;;;;;;;;;:::i;32096:613::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32096:613:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;32096:613:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28954:896::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28954:896:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;28954:896:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24978:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24978:41:0;;;:::i;43906:260::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43906:260:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;43906:260:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;43906:260:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;43906:260:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;43906:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;43906:260:0;;-1:-1:-1;43906:260:0;;-1:-1:-1;;;;;43906:260:0:i;42230:856::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42230:856:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;42230:856:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;42230:856:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;42230:856:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;42230:856:0;;-1:-1:-1;42230:856:0;-1:-1:-1;42230:856:0;;;;;;;;;:::i;36512:885::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36512:885:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;36512:885:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;36512:885:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36512:885:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36512:885:0;;-1:-1:-1;36512:885:0;-1:-1:-1;36512:885:0;;;;;;;;;:::i;29858:691::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29858:691:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;29858:691:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26933:864::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26933:864:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;26933:864:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;27805:1106;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;27805:1106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43373:259::-;43524:17;43561:63;43592:8;43602:9;43613:10;43561:30;:63::i;:::-;43554:70;43373:259;-1:-1:-1;;;;43373:259:0:o;44174:260::-;44321:24;44370:56;44401:7;44410:9;44421:4;44370:30;:56::i;:::-;44363:63;;44174:260;;;;;:::o;30557:730::-;30902:15;30919;30947:12;30962:50;30988:7;30997:6;31005;30962:25;:50::i;:::-;30947:65;;31023:13;31039:10;:36;;31066:9;31039:36;;;31060:2;31039:36;31086:81;;;;;;31115:10;31086:81;;;;31135:4;31086:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31023:52;;-1:-1:-1;31086:28:0;;;;;;:81;;;;;-1:-1:-1;;31086:81:0;;;;;;;;-1:-1:-1;31086:28:0;:81;;;2:2:-1;;;;27:1;24;17:12;2:2;31086:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31086:81:0;;;;31199:80;31215:6;31223;31231:9;31242:10;31254;31266:2;31270:8;31199:15;:80::i;:::-;31178:101;;;;;;;;30557:730;;;;;;;;;;;;;;;;:::o;31295:722::-;31623:19;31644:17;31674:12;31689:47;31715:7;31724:5;31731:4;31689:25;:47::i;:::-;31674:62;;31747:13;31763:10;:36;;31790:9;31763:36;;;31784:2;31763:36;31810:81;;;;;;31839:10;31810:81;;;;31859:4;31810:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31747:52;;-1:-1:-1;31810:28:0;;;;;;:81;;;;;-1:-1:-1;;31810:81:0;;;;;;;;-1:-1:-1;31810:28:0;:81;;;2:2:-1;;;;27:1;24;17:12;2:2;31810:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31810:81:0;;;;31929:80;31948:5;31955:9;31966:14;31982:12;31996:2;32000:8;31929:18;:80::i;:::-;31902:107;;;;-1:-1:-1;31295:722:0;-1:-1:-1;;;;;;;;;;;;;31295:722:0:o;34452:682::-;34685:24;34666:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34732:56:::1;34764:7;34773:8;34783:4;;34732:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34732:31:0::1;::::0;-1:-1:-1;;;34732:56:0:i:1;:::-;34722:66;;34838:12;34807:7;34832:1;34815:7;:14;:18;34807:27;;;;;;;;;;;;;;:43;;34799:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34910:181;34956:4;;34961:1;34956:7;;;;;;;;;;;;;;;34978:10;35003:52;35029:7;35038:4;;35043:1;35038:7;;;;;;;;;;;;;;;35047:4;;35052:1;35047:7;;;;;;;;;;;;;;;35003:25;:52::i;:::-;35070:7;35078:1;35070:10;;;;;;;;;;;;;;34910:31;:181::i;:::-;35102:24;35108:7;35117:4;;35102:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35123:2:0;;-1:-1:-1;35102:5:0::1;::::0;-1:-1:-1;;35102:24:0:i:1;:::-;34452:682:::0;;;;;;;;;:::o;41407:815::-;41628:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41668:4:::1;41657:15;;:4;;41662:1;41657:7;;;;;;;;;;;;;;;:15;;;41649:58;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41718:16;41737:9;41718:28;;41763:4;41757:19;;;41784:8;41757:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41757:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41757:38:0;;;;;41819:4;41813:20;;;41834:52;41860:7;41869:4;;41874:1;41869:7;;;;;;;;;;;;;;;41878:4;;41883:1;41878:7;;;;;;41834:52;41888:8;41813:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41813:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41813:84:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;41813:84:0;41806:92:::1;;;;41909:21;41940:4:::0;;41945:15;;;41940:21;;::::1;;;;;;;;;;;;;41933:39;;;41973:2;41933:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41933:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41933:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;41933:43:0;41987:44:::1;::::0;;41933:43:::1;41987:44:::0;;::::1;::::0;;;;;;;;;;;41933:43;;-1:-1:-1;41987:44:0::1;::::0;;;42022:4;;;;;;41987:44;::::1;::::0;42022:4;;41987:44;42022:4;41987:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;42028:2:0;;-1:-1:-1;41987:34:0::1;::::0;-1:-1:-1;;41987:44:0:i:1;:::-;42130:12:::0;42064:62:::1;42112:13:::0;42071:4;;42076:15;;;42071:21;;::::1;;;;;;;;;;;;;42064:39;;;42104:2;42064:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42064:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42064:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;42064:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;42042:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25194:1;;41407:815:::0;;;;;;:::o;40632:767::-;40875:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40896:179:::1;40942:4;;40947:1;40942:7;;;;;;;;;;;;;;;40964:10;40989:52;41015:7;41024:4;;41029:1;41024:7;;;;;;40989:52;41056:8;40896:31;:179::i;:::-;41086:21;41117:4:::0;;41122:15;;;41117:21;;::::1;;;;;;;;;;;;;41110:39;;;41150:2;41110:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41110:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41110:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;41110:43:0;41164:44:::1;::::0;;41110:43:::1;41164:44:::0;;::::1;::::0;;;;;;;;;;;41110:43;;-1:-1:-1;41164:44:0::1;::::0;;;41199:4;;;;;;41164:44;::::1;::::0;41199:4;;41164:44;41199:4;41164:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;41205:2:0;;-1:-1:-1;41164:34:0::1;::::0;-1:-1:-1;;41164:44:0:i:1;:::-;41307:12:::0;41241:62:::1;41289:13:::0;41248:4;;41253:15;;;41248:21;;::::1;;;;;;;;;;;;;41241:39;;;41281:2;41241:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;37405:907:0::0;37635:24;37616:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37680:29:::1;37705:4;37680:29;:4:::0;;37685:15;;;37680:21;;::::1;;;;;;;;;;;;;:29;;;37672:72;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37765:56;37797:7;37806:8;37816:4;;37765:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;37765:31:0::1;::::0;-1:-1:-1;;;37765:56:0:i:1;:::-;37755:66;;37871:12;37840:7;37865:1;37848:7;:14;:18;37840:27;;;;;;;;;;;;;;:43;;37832:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37943:181;37989:4;;37994:1;37989:7;;;;;;37943:181;38135:35;38141:7;38150:4;;38135:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38164:4:0::1;::::0;-1:-1:-1;38135:5:0::1;::::0;-1:-1:-1;;38135:35:0:i:1;:::-;38187:4;38181:20;;;38202:7;38227:1;38210:7;:14;:18;38202:27;;;;;;;;;;;;;;38181:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38181:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38181:49:0;;;;38241:63;38272:2;38276:7;38301:1;38284:7;:14;:18;38276:27;;;;;;;;;;;;;;38241:30;:63::i;32717:833::-:0;33074:17;33104:12;33119:47;33145:7;33154:5;33161:4;33119:25;:47::i;:::-;33104:62;;33177:13;33193:10;:36;;33220:9;33193:36;;;33214:2;33193:36;33240:81;;;;;;33269:10;33240:81;;;;33289:4;33240:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33177:52;;-1:-1:-1;33240:28:0;;;;;;:81;;;;;-1:-1:-1;;33240:81:0;;;;;;;;-1:-1:-1;33240:28:0;:81;;;2:2:-1;;;;27:1;24;17:12;2:2;33240:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33240:81:0;;;;33344:198;33406:5;33426:9;33450:14;33479:12;33506:2;33523:8;33344:47;:198::i;:::-;33332:210;32717:833;-1:-1:-1;;;;;;;;;;;;;32717:833:0:o;38320:807::-;38528:24;38509:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38584:4:::1;38573:15;;:4;;38578:1;38573:7;;;;;;;;;;;;;;;:15;;;38565:58;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;38644:56;38675:7;38684:9;38695:4;;38644:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38644:30:0::1;::::0;-1:-1:-1;;;38644:56:0:i:1;:::-;38634:66;;38733:9;38719:7;38727:1;38719:10;;;;;;;;;;;;;;:23;;38711:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38804:4;38798:19;;;38825:7;38833:1;38825:10;;;;;;;;;;;;;;38798:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38798:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38798:40:0;;;;;38862:4;38856:20;;;38877:52;38903:7;38912:4;;38917:1;38912:7;;;;;;38877:52;38931:7;38939:1;38931:10;;;;;;;;;;;;;;38856:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38856:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38856:86:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;38856:86:0;38849:94:::1;;;;38954:24;38960:7;38969:4;;38954:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38975:2:0;;-1:-1:-1;38954:5:0::1;::::0;-1:-1:-1;;38954:24:0:i:1;:::-;39041:7;39049:1;39041:10;;;;;;;;;;;;;;39029:9;:22;39025:94;;;39053:66;39084:10;39108:7;39116:1;39108:10;;;;;;;;;;;;;;39096:9;:22;39053:30;:66::i;:::-;38320:807:::0;;;;;;;;:::o;43640:258::-;43791:16;43827:63;43857:9;43868;43879:10;43827:29;:63::i;35142:660::-;35375:24;35356:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35422:56:::1;35453:7;35462:9;35473:4;;35422:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35422:30:0::1;::::0;-1:-1:-1;;;35422:56:0:i:1;:::-;35412:66;;35511:11;35497:7;35505:1;35497:10;;;;;;;;;;;;;;:25;;35489:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25026:38:::0;;;:::o;35810:694::-;36021:24;36002:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36077:4:::1;36066:15;;:4;;36071:1;36066:7;;;;;;;;;;;;;;;:15;;;36058:58;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36137:57;36169:7;36178:9;36189:4;;36137:57;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36137:31:0::1;::::0;-1:-1:-1;;;36137:57:0:i:1;:::-;36127:67;;36244:12;36213:7;36238:1;36221:7;:14;:18;36213:27;;;;;;;;;;;;;;:43;;36205:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36322:4;36316:19;;;36343:7;36351:1;36343:10;;;;;;;;;;;;;;36316:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36316:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36316:40:0;;;;;36380:4;36374:20;;;36395:52;36421:7;36430:4;;36435:1;36430:7;;;;;;36395:52;36449:7;36457:1;36449:10;;;;;;;;;;;;;;36374:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36374:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36374:86:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;36374:86:0;36367:94:::1;;;;36472:24;36478:7;36487:4;;36472:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36493:2:0;;-1:-1:-1;36472:5:0::1;::::0;-1:-1:-1;;36472:24:0:i:1;43130:235::-:0;43270:15;43305:52;43329:7;43338:8;43348;43305:23;:52::i;32096:613::-;32374:17;32355:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32420:94:::1;32436:5;32443:4;32449:9;32460:14;32476:12;32498:4;32505:8;32420:15;:94::i;:::-;32564:38;::::0;;;;;32596:4:::1;32564:38;::::0;::::1;::::0;;;32404:110;;-1:-1:-1;32525:78:0::1;::::0;-1:-1:-1;32553:5:0;;32560:2;;32564:23:::1;::::0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;32564:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32564:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32564:38:0;32525:27:::1;:78::i;:::-;32620:4;32614:20;;;32635:9;32614:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32614:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32614:31:0;;;;32656:45;32687:2;32691:9;32656:30;:45::i;28954:896::-:0;29220:15;29237;29201:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29265:12:::1;29280:50;29306:7;29315:6;29323;29280:25;:50::i;:::-;29341:63;::::0;;;;;29376:10:::1;29341:63;::::0;::::1;::::0;:34:::1;::::0;::::1;:63:::0;;;;;;;;;;;;;;29265:65;;-1:-1:-1;29341:34:0;;::::1;::::0;:63;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;29341:34:0;:63;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;29341:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29341:63:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;29478:30:0::1;::::0;;;;;:26:::1;:30:::0;;::::1;;::::0;::::1;::::0;;;29442:15:::1;::::0;;;29478:26;;::::1;::::0;::::1;::::0;:30;;;;;;;;;;;29442:15;29478:26;:30;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;29478:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29478:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;29478:30:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;29478:30:0;-1:-1:-1;29520:14:0::1;29540:44;29569:6:::0;29577;29540:28:::1;:44::i;:::-;29519:65;;;29626:6;29616:16;;:6;:16;;;:58;;29657:7;29666;29616:58;;;29636:7;29645;29616:58;29595:79:::0;;-1:-1:-1;29595:79:0;-1:-1:-1;29693:21:0;;::::1;;29685:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29788:10;29777:7;:21;;29769:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25194:1;;;;28954:896:::0;;;;;;;;;;;:::o;24978:41::-;;;:::o;43906:260::-;44053:24;44102:56;44134:7;44143:8;44153:4;44102:31;:56::i;42230:856::-;42470:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42499:29:::1;42524:4;42499:29;:4:::0;;42504:15;;;42499:21;;::::1;;;;;;;;;;;;;:29;;;42491:72;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;42574:179;42620:4;;42625:1;42620:7;;;;;;42574:179;42764:55;42799:4;;42764:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;42813:4:0::1;::::0;-1:-1:-1;42764:34:0::1;::::0;-1:-1:-1;;42764:55:0:i:1;:::-;42850:37;::::0;;;;;42881:4:::1;42850:37;::::0;::::1;::::0;;;42830:17:::1;::::0;42850:22:::1;42857:4;42850:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;42850:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42850:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;42850:37:0;;-1:-1:-1;42906:25:0;;::::1;;42898:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42997:4;42991:20;;;43012:9;42991:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42991:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42991:31:0;;;;43033:45;43064:2;43068:9;43033:30;:45::i;36512:885::-:0;36742:24;36723:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36787:29:::1;36812:4;36787:29;:4:::0;;36792:15;;;36787:21;;::::1;;;;;;;;;;;;;:29;;;36779:72;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;36872:56;36903:7;36912:9;36923:4;;36872:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36872:30:0::1;::::0;-1:-1:-1;;;36872:56:0:i:1;:::-;36862:66;;36961:11;36947:7;36955:1;36947:10;;;;;;;;;;;;;;:25;;36939:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29858:691:::0;30107:19;30128:17;30088:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30185:196:::1;30215:5;30235:4;30254:9;30278:14;30307:12;30342:4;30362:8;30185:15;:196::i;:::-;30158:223:::0;;-1:-1:-1;30158:223:0;-1:-1:-1;30392:51:0::1;30420:5:::0;30427:2;30158:223;30392:27:::1;:51::i;:::-;30460:4;30454:20;;;30475:9;30454:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;30454:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;30454:31:0;;;;30496:45;30527:2;30531:9;30496:30;:45::i;:::-;29858:691:::0;;;;;;;;;;:::o;26933:864::-;27295:15;27325;27355:17;27253:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27421:85:::1;27435:6;27443;27451:14;27467;27483:10;27495;27421:13;:85::i;:::-;27400:106:::0;;-1:-1:-1;27400:106:0;-1:-1:-1;27517:12:0::1;27532:50;27558:7;27567:6:::0;27575;27532:25:::1;:50::i;:::-;27517:65;;27593:66;27625:6;27633:10;27645:4;27651:7;27593:31;:66::i;:::-;27670;27702:6;27710:10;27722:4;27728:7;27670:31;:66::i;:::-;27775:4;27759:26;;;27786:2;27759:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27759:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27759:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;27759:30:0;26933:864;;;;-1:-1:-1;27759:30:0;;-1:-1:-1;26933:864:0;;-1:-1:-1;;;;;;;;;26933:864:0:o;27805:1106::-;28138:19;28172:17;28204;28096:8;25138:15;25126:8;:27;;25118:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28276:176:::1;28304:5;28324:4;28343:18;28376:9;28400:14;28429:12;28276:13;:176::i;:::-;28249:203:::0;;-1:-1:-1;28249:203:0;-1:-1:-1;28463:12:0::1;28478:47;28504:7;28513:5:::0;28520:4:::1;28478:25;:47::i;:::-;28463:62;;28536:69;28568:5;28575:10;28587:4;28593:11;28536:31;:69::i;:::-;28622:4;28616:19;;;28643:9;28616:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28616:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28616:39:0;;;;;28679:4;28673:20;;;28694:4;28700:9;28673:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28673:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28673:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;28673:37:0;28666:45:::1;;;;28750:4;28734:26;;;28761:2;28734:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28734:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28734:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;28734:30:0;;-1:-1:-1;28815:9:0::1;:21:::0;-1:-1:-1;28811:92:0::1;;;28838:65;28869:10;28893:9;28881;:21;28838:30;:65::i;:::-;25194:1;27805:1106:::0;;;;;;;;;;;:::o;10301:574::-;10437:17;10486:1;10475:8;:12;10467:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10567:1;10555:9;:13;:31;;;;;10585:1;10572:10;:14;10555:31;10547:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10643:23;10669:17;:8;10682:3;10669:17;:12;:17;:::i;:::-;10643:43;-1:-1:-1;10697:17:0;10717:31;10643:43;10737:10;10717:31;:19;:31;:::i;:::-;10697:51;-1:-1:-1;10759:19:0;10781:40;10805:15;10781:19;:9;10795:4;10781:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;10759:62;;10856:11;10844:9;:23;;;;;;;10301:574;-1:-1:-1;;;;;;;10301:574:0:o;12249:585::-;12387:24;12447:1;12432:4;:11;:16;;12424:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12519:4;:11;12505:26;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12505:26:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;12505:26:0;;12495:36;;12572:9;12542:7;12567:1;12550:7;:14;:18;12542:27;;;;;;;;;;;;;;;;;:39;12609:11;;:15;;12592:235;12626:5;;12592:235;;12654:17;12673:18;12695:42;12707:7;12716:4;12725:1;12721;:5;12716:11;;;;;;;;;;;;;;12729:4;12734:1;12729:7;;;;;;;;;;;;;;12695:11;:42::i;:::-;12653:84;;;;12769:46;12781:7;12789:1;12781:10;;;;;;;;;;;;;;12793:9;12804:10;12769:11;:46::i;:::-;12752:7;12764:1;12760;:5;12752:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;12633:3:0;;12592:235;;;;12249:585;;;;;:::o;8548:651::-;8671:12;8697:14;8713;8731:26;8742:6;8750;8731:10;:26::i;:::-;8976:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;8976:32:0;;;;;8966:43;;;;;;8855:291;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;8855:291:0;;;;;;;8823:342;;;;;;;;;8548:651;-1:-1:-1;;;;;8548:651:0:o;11604:564::-;11742:24;11802:1;11787:4;:11;:16;;11779:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11874:4;:11;11860:26;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11860:26:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;11860:26:0;;11850:36;;11910:8;11897:7;11905:1;11897:10;;;;;;;;;;;;;:21;;;;;11934:9;11929:232;11963:1;11949:4;:11;:15;11945:1;:19;11929:232;;;11987:17;12006:18;12028:42;12040:7;12049:4;12054:1;12049:7;;;;;;;;;;;;;;12058:4;12063:1;12067;12063:5;12058:11;;;;;;;12028:42;11986:84;;;;12102:47;12115:7;12123:1;12115:10;;;;;;;;;;;;;;12127:9;12138:10;12102:12;:47::i;:::-;12085:7;12093:1;12097;12093:5;12085:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;11966:3:0;;11929:232;;1719:448;1990:51;;;1979:10;1990:51;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1990:51:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;1990:51:0;179:29:-1;160:49;;1979:63:0;;;;1944:12;;1958:17;;1979:10;;;;1990:51;1979:63;;;25:18:-1;1979:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1979: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;;1943:99:0;;;;2061:7;:57;;;;-1:-1:-1;2073:11:0;;:16;;:44;;;2104:4;2093:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2093:24:0;2073:44;2053:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1719:448;;;;;;:::o;33661:783::-;33805:9;33800:637;33834:1;33820:4;:11;:15;33816:1;:19;33800:637;;;33858:13;33873:14;33892:4;33897:1;33892:7;;;;;;;;;;;;;;33901:4;33906:1;33910;33906:5;33901:11;;;;;;;;;;;;;;33857:56;;;;33929:14;33949:43;33978:5;33985:6;33949:28;:43::i;:::-;33928:64;;;34007:17;34027:7;34035:1;34039;34035:5;34027:14;;;;;;;;;;;;;;34007:34;;34057:18;34077;34108:6;34099:15;;:5;:15;;;:101;;34178:9;34197:1;34099:101;;;34143:1;34147:9;34099:101;34056:144;;;;34215:10;34246:1;34232:4;:11;:15;34228:1;:19;:83;;34308:3;34228:83;;;34250:55;34276:7;34285:6;34293:4;34298:1;34302;34298:5;34293:11;;;;;;;;;;;;;;34250:25;:55::i;:::-;34215:96;;34342:49;34368:7;34377:5;34384:6;34342:25;:49::i;:::-;34326:71;;;34398:10;34410;34422:2;34326:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34326:99:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;33837:3:0;;;;;-1:-1:-1;33800:637:0;;-1:-1:-1;;;;;;;;33800:637:0;;;33661:783;;;:::o;39274:1350::-;39387:9;39382:1235;39416:1;39402:4;:11;:15;39398:1;:19;39382:1235;;;39440:13;39455:14;39474:4;39479:1;39474:7;;;;;;;;;;;;;;39483:4;39488:1;39492;39488:5;39483:11;;;;;;;;;;;;;;39439:56;;;;39511:14;39531:43;39560:5;39567:6;39531:28;:43::i;:::-;39510:64;;;39589:20;39628:49;39654:7;39663:5;39670:6;39628:25;:49::i;:::-;39589:89;;39693:19;39727:20;39839:16;39857;39879:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39879:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39879:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39879:18:0;;;;;;;39838:59;;;;;-1:-1:-1;39838:59:0;;-1:-1:-1;39917:20:0;;39964:15;;;;;;;;:103;;40048:8;40058;39964:103;;;40004:8;40014;39964:103;39916:151;;;;40100:56;40143:12;40107:5;40100:23;;;40132:4;40100:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;40100:56:0;40086:70;;40190:72;40221:11;40234:12;40248:13;40190:30;:72::i;:::-;40175:87;;39382:1235;;;;40293:18;40313;40344:6;40335:15;;:5;:15;;;:107;;40417:12;40439:1;40335:107;;;40379:1;40383:12;40335:107;40292:150;;;;40457:10;40488:1;40474:4;:11;:15;40470:1;:19;:83;;40550:3;40470:83;;;40492:55;40518:7;40527:6;40535:4;40540:1;40544;40540:5;40535:11;;;;;;;40492:55;40457:96;;40568:4;:9;;;40578:10;40590;40602:2;40568:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40568:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;39419:3:0;;;;;-1:-1:-1;39382:1235:0;;-1:-1:-1;;;;;;;;;;39382:1235:0;;;39274:1350;;:::o;16914:136::-;16972:7;16999:43;17003:1;17006;16999:43;;;;;;;;;;;;;;;;;:3;:43::i;2175:200::-;2288:12;;;2248;2288;;;;;;;;;2266:7;;;;2281:5;;2266:35;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2266: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;;2247:54:0;;;2320:7;2312:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10996:526;11132:16;11181:1;11169:9;:13;11161:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11263:1;11251:9;:13;:31;;;;;11281:1;11268:10;:14;11251:31;11243:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11339:17;11359:34;11388:4;11359:24;:9;11373;11359:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;11339:54;-1:-1:-1;11404:19:0;11426:34;11456:3;11426:25;:10;11441:9;11426:25;:14;:25;:::i;:34::-;11404:56;;11482:32;11512:1;11495:11;11483:9;:23;;;;;;;11482:32;:29;:32;:::i;:::-;11471:43;10996:526;-1:-1:-1;;;;;;10996:526:0:o;9810:369::-;9935:15;9981:1;9971:7;:11;9963:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10055:1;10044:8;:12;:28;;;;;10071:1;10060:8;:12;10044:28;10036:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10163:8;10139:21;:7;10151:8;10139:21;:11;:21;:::i;:::-;:32;;;;;;;9810:369;-1:-1:-1;;;;9810:369:0:o;1313:398::-;1545:45;;;1534:10;1545:45;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1545:45:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;1545:45:0;179:29:-1;160:49;;1534:57:0;;;;1499:12;;1513:17;;1534:10;;;;1545:45;1534:57;;;25:18:-1;1534:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1534: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;;1498:93:0;;;;1610:7;:57;;;;-1:-1:-1;1622:11:0;;:16;;:44;;;1653:4;1642:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1642:24:0;1622:44;1602:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1313:398;;;;;:::o;8105:351::-;8180:14;8196;8241:6;8231:16;;:6;:16;;;;8223:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8329:6;8320:15;;:6;:15;;;:53;;8358:6;8366;8320:53;;;8339:6;8347;8320:53;8301:72;;-1:-1:-1;8301:72:0;-1:-1:-1;8392:20:0;;;8384:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8105:351;;;;;:::o;25498:1427::-;25829:51;;;;;;:65;:51;;;;;;;;;;;;;;;;25728:15;;;;;;25848:7;25829:35;;;;;;:51;;;;;;;;;;;;;;;:35;:51;;;2:2:-1;;;;27:1;24;17:12;2:2;25829:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25829:51:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25829:51:0;:65;;;25825:152;;;25911:54;;;;;;:38;:54;;;;;;;;;;;;;;;;25930:7;25911:38;;;;;;:54;;;;;;;;;;;;;;;-1:-1:-1;25911:38:0;:54;;;2:2:-1;;;;27:1;24;17:12;2:2;25911:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25911:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;25825:152:0;25988:16;26006;26026:54;26056:7;26065:6;26073;26026:29;:54::i;:::-;25987:93;;;;26095:8;26107:1;26095:13;:30;;;;-1:-1:-1;26112:13:0;;26095:30;26091:827;;;26164:14;;-1:-1:-1;26180:14:0;;-1:-1:-1;26091:827:0;;;26228:22;26253:59;26277:14;26293:8;26303;26253:23;:59::i;:::-;26228:84;;26349:14;26331;:32;26327:580;;26410:10;26392:14;:28;;26384:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26505:14;;-1:-1:-1;26521:14:0;-1:-1:-1;26521:14:0;26327:580;;;26577:22;26602:59;26626:14;26642:8;26652;26602:23;:59::i;:::-;26577:84;;26705:14;26687;:32;;26680:40;;;;26765:10;26747:14;:28;;26739:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26860:14;-1:-1:-1;26876:14:0;;-1:-1:-1;26327:580:0;26091:827;;25498:1427;;;;;;;;;;;:::o;17838:471::-;17896:7;18141:6;18137:47;;-1:-1:-1;18171:1:0;18164:8;;18137:47;18208:5;;;18212:1;18208;:5;:1;18232:5;;;;;:10;18224:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16450:181;16508:7;16540:5;;;16564:6;;;;16556:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9257:440;9384:16;9402;9432:14;9452:26;9463:6;9471;9452:10;:26::i;:::-;9431:47;;;9490:16;9508;9546:32;9554:7;9563:6;9571;9546:7;:32::i;:::-;9530:61;;;:63;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9530:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9530:63:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9530:63:0;;;;;;;9489:104;;;;;-1:-1:-1;9489:104:0;;-1:-1:-1;9627:16:0;;;;;;;;:62;;9670:8;9680;9627:62;;;9647:8;9657;9627:62;9604:85;;;;-1:-1:-1;9257:440:0;-1:-1:-1;;;;;;;9257:440:0:o;17353:226::-;17473:7;17509:12;17501:6;;;;17493:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;17493:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17545:5:0;;;17353:226::o

Swarm Source

ipfs://299e6ec863a05b34facb61387047c1629d5fac978f54568d39a4d31919f46fcb
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading