Contract 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0

 
Ad
Ad
Txn Hash
Block
From
To
Value [Txn Fee]
0x0950f8dd5055992e460ce55d6ebec76a20123f5d2cfd14c74d383107d2a4eebe65939802021-04-15 18:09:2219 secs ago0x237b2cc4a849c9637492abba408cea528ca620e4 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00 BNB0.000273468
0x010a9066563b4f75c63f4429d81619b63be2e4140cd10bddc40cbb911db294f065939662021-04-15 18:08:401 min ago0x96cf0a1e2225162fb8c707e0166f69158364853f IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00 BNB0.008642226
0xdf393ddf99cca66391f945866d371c1e1fb833620f38b91e1153c66b7031f34265939622021-04-15 18:08:281 min ago0x8b0473e5f2871d420b7891c01a45ef84ee2d523d IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00 BNB0.002512335
0x3d6ac96d5daa4b213db7fb47651b5d201af3c9102d2fc09fa7b4c6a66957856b65939562021-04-15 18:08:101 min ago0x237b2cc4a849c9637492abba408cea528ca620e4 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00 BNB0.000273468
0x621e9fac029187748b855f72a35018cef4e820921ee1c1bf8c9548ad11a5fc6365939462021-04-15 18:07:402 mins ago0x0ea1f16a3598d4d5d67d97c9c28077f3d37ba41d IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.009 BNB0.004911935
0x2cf7b171738d5997e9b9d2ee172e7d4d6ae745290cb8e05db4260d657e4466d265939412021-04-15 18:07:252 mins ago0x237b2cc4a849c9637492abba408cea528ca620e4 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00 BNB0.005603124
0xfd8de53d0e517b34878704834fec420c1360eab6a460ea0ef702dd9ef97af5e065938672021-04-15 18:03:435 mins ago0x237b2cc4a849c9637492abba408cea528ca620e4 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.4 BNB0.005861808
0x095adfd945612c19a8affb765559a250c38251898ecf0f37de64cf07e7d056ec65937892021-04-15 17:59:499 mins ago0xafd8cdd3ce3eff84063ddd2cedcd06abe5191abc IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00 BNB0.002556085
0x9df3ad1ae03ea1513d271426532a9e415ae240fd7c686b069a1a8e3685e87d4a65937662021-04-15 17:58:4011 mins ago0xafd8cdd3ce3eff84063ddd2cedcd06abe5191abc IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00 BNB0.00236723
0x433ee3e5cdcc3ec51831260ca59b9a20c861e55a2947a6305e3f78e74fd5ba1265937612021-04-15 17:58:2511 mins ago0x6d71e14d8f0955d13bfcbd3f7e867a58016daf9c IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00 BNB0.00278066
0x3d8475ee81a54fe37483e76eb88c1f9e180f94387b7c5b7ab296802910a057b365937422021-04-15 17:57:2812 mins ago0xd06e8b72f2063f55b17d3ec1397180541a02bb4f IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec01.25 BNB0.00312251
0xb28af2db1b8e4c1433bb4428accb32dd95407fa837b069ba3d0213553b9d509d65936762021-04-15 17:54:1015 mins ago0x0ea1f16a3598d4d5d67d97c9c28077f3d37ba41d IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.012 BNB0.000231875
0x7be9785cdc7a47b010d2629e8ee4df4c16b130e8a125cd329bcdf3af53f9a2ab65936322021-04-15 17:51:5817 mins ago0x0ea1f16a3598d4d5d67d97c9c28077f3d37ba41d IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.011 BNB0.000231935
0xe307fc060e826d731006dc1c48b3d99365d5a12fd4e031f584d2f26f0e2f1bc665936182021-04-15 17:51:1618 mins ago0xef575087f1e7bec54046f98119c8c392a37c51dd IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec012.841264700341948 BNB0.004554016
0x986b24b8a55adc64ce58bd9bfe5d66002538858d053b3271b547d9292413c67e65936182021-04-15 17:51:1618 mins ago0x96cf0a1e2225162fb8c707e0166f69158364853f IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec05 BNB0.0102357888
0xe4833da6762107411e7503ef9ac4d2389498a8998489ea0edb89a7b96cb573d765935892021-04-15 17:49:4919 mins ago0xfcc9561886e5c1bb61b735f8b3b895e4ef1dab61 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00 BNB0.00453334
0xa1b7b53dd5d0e8fdc4012d9a1940cadf146e8e0c5bd27ec3beec73c1e63a1bfe65935662021-04-15 17:48:4021 mins ago0x0ea1f16a3598d4d5d67d97c9c28077f3d37ba41d IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.011 BNB0.000761065
0xb016ea5ffb3b565863c216441c983e52e48509154703c5724a741090d952023c65935332021-04-15 17:47:0122 mins ago0x237b2cc4a849c9637492abba408cea528ca620e4 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.00074276 BNB0.005433702
0xaca4a71ec554b3640dd1cfc56ec5adde07fd9b9f5be9bbde8273c2b3f182bd3265934102021-04-15 17:40:5228 mins ago0x24eebc58ed572dd30623e519022e757206f22e5d IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00 BNB0.002512395
0x5f081ed1524c8e6d77932818ef1afe42b9af39ada66bf97507825bbeedcd390265933772021-04-15 17:39:1330 mins ago0x96cf0a1e2225162fb8c707e0166f69158364853f IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00 BNB0.008642226
0x4b5a58f7230a62905741aa35cd8503f188cc8f400b3fd8ca9f0d99ab9f60581d65932602021-04-15 17:33:2236 mins ago0xf1efc8fa28763d021c8ee9bdaee497d75ddc3c3b IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00 BNB0.00325895
0xa5b776b681332ba310b3e3985d44460d274cff3b7722c6fc4d9de818def25ccd65931772021-04-15 17:29:1340 mins ago0x94d1675393afa9f0db45e33216968335ca3eafb0 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.7 BNB0.003289135
0x9d5bc4dd349e9604d305385046b2d7fed5e4ac7fbdcdfb15201941af02cafba965930622021-04-15 17:23:2846 mins ago0xf5df03c070501434435d6af109cc175629f19cf1 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.26 BNB0.00297558
0x74c7cd812ac009a45c735a97c1b66f3430e95ff9b4ecf315e96e6995eb916dc965930552021-04-15 17:23:0746 mins ago0xf5df03c070501434435d6af109cc175629f19cf1 IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.26 BNB0.00099923
0xdfacad4825c03728d89bb5a8137981465b42100e3a583bc5f9bfc53db6a8a3a965930342021-04-15 17:22:0447 mins ago0x96cf0a1e2225162fb8c707e0166f69158364853f IN  0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec05 BNB0.0102357888
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x010a9066563b4f75c63f4429d81619b63be2e4140cd10bddc40cbb911db294f065939662021-04-15 18:08:401 min ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00x96cf0a1e2225162fb8c707e0166f69158364853f5.038639610727632535 BNB
0x010a9066563b4f75c63f4429d81619b63be2e4140cd10bddc40cbb911db294f065939662021-04-15 18:08:401 min ago Binance: WBNB Token 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec05.038639610727632535 BNB
0xdf393ddf99cca66391f945866d371c1e1fb833620f38b91e1153c66b7031f34265939622021-04-15 18:08:281 min ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00x8b0473e5f2871d420b7891c01a45ef84ee2d523d0.088232622622024901 BNB
0xdf393ddf99cca66391f945866d371c1e1fb833620f38b91e1153c66b7031f34265939622021-04-15 18:08:281 min ago Binance: WBNB Token 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.088232622622024901 BNB
0x621e9fac029187748b855f72a35018cef4e820921ee1c1bf8c9548ad11a5fc6365939462021-04-15 18:07:402 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token0.000027 BNB
0x621e9fac029187748b855f72a35018cef4e820921ee1c1bf8c9548ad11a5fc6365939462021-04-15 18:07:402 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token0.008973 BNB
0xa0bf3ed7add994837cdb253426fec78d3ba41c78ab3a9ed3f399bc834bde4b7965939122021-04-15 18:05:583 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00x999244c218313c320a7d522e4ac4aa98cabcb0970.098825963834028677 BNB
0xa0bf3ed7add994837cdb253426fec78d3ba41c78ab3a9ed3f399bc834bde4b7965939122021-04-15 18:05:583 mins ago Binance: WBNB Token 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.098825963834028677 BNB
0xee64f2858ed2f08c857eb00f8568b4c9a27883a093a00d83f1bf85e3dc83dfdb65938692021-04-15 18:03:495 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00xafd8cdd3ce3eff84063ddd2cedcd06abe5191abc0.01097861048293151 BNB
0xee64f2858ed2f08c857eb00f8568b4c9a27883a093a00d83f1bf85e3dc83dfdb65938692021-04-15 18:03:495 mins ago Binance: WBNB Token 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00.01097861048293151 BNB
0xfd8de53d0e517b34878704834fec420c1360eab6a460ea0ef702dd9ef97af5e065938672021-04-15 18:03:435 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token0.0012 BNB
0xfd8de53d0e517b34878704834fec420c1360eab6a460ea0ef702dd9ef97af5e065938672021-04-15 18:03:435 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token0.3988 BNB
0x3d8475ee81a54fe37483e76eb88c1f9e180f94387b7c5b7ab296802910a057b365937422021-04-15 17:57:2812 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token0.00375 BNB
0x3d8475ee81a54fe37483e76eb88c1f9e180f94387b7c5b7ab296802910a057b365937422021-04-15 17:57:2812 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token1.24625 BNB
0xe307fc060e826d731006dc1c48b3d99365d5a12fd4e031f584d2f26f0e2f1bc665936182021-04-15 17:51:1618 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00xef575087f1e7bec54046f98119c8c392a37c51dd0.030886313987932309 BNB
0xe307fc060e826d731006dc1c48b3d99365d5a12fd4e031f584d2f26f0e2f1bc665936182021-04-15 17:51:1618 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token0.038431135159062048 BNB
0xe307fc060e826d731006dc1c48b3d99365d5a12fd4e031f584d2f26f0e2f1bc665936182021-04-15 17:51:1618 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token12.771947251194954058 BNB
0x986b24b8a55adc64ce58bd9bfe5d66002538858d053b3271b547d9292413c67e65936182021-04-15 17:51:1618 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token0.015 BNB
0x986b24b8a55adc64ce58bd9bfe5d66002538858d053b3271b547d9292413c67e65936182021-04-15 17:51:1618 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token4.985 BNB
0xa1b7b53dd5d0e8fdc4012d9a1940cadf146e8e0c5bd27ec3beec73c1e63a1bfe65935662021-04-15 17:48:4021 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token0.010967 BNB
0xb016ea5ffb3b565863c216441c983e52e48509154703c5724a741090d952023c65935332021-04-15 17:47:0122 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token0.00000222828 BNB
0xb016ea5ffb3b565863c216441c983e52e48509154703c5724a741090d952023c65935332021-04-15 17:47:0122 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec0 Binance: WBNB Token0.00074053172 BNB
0xaca4a71ec554b3640dd1cfc56ec5adde07fd9b9f5be9bbde8273c2b3f182bd3265934102021-04-15 17:40:5228 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00x24eebc58ed572dd30623e519022e757206f22e5d1.969892906547235098 BNB
0xaca4a71ec554b3640dd1cfc56ec5adde07fd9b9f5be9bbde8273c2b3f182bd3265934102021-04-15 17:40:5228 mins ago Binance: WBNB Token 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec01.969892906547235098 BNB
0x5f081ed1524c8e6d77932818ef1afe42b9af39ada66bf97507825bbeedcd390265933772021-04-15 17:39:1330 mins ago 0xbf6527834dbb89cdc97a79fcd62e6c08b19f8ec00x96cf0a1e2225162fb8c707e0166f69158364853f5.050411006112394136 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DemaxPlatform

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Dependency file: contracts/interfaces/IDemaxTransferListener.sol

// pragma solidity >=0.6.6;

interface IDemaxTransferListener {
    function transferNotify(address from, address to, address token, uint amount)  external returns (bool);
    function upgradeProdutivity(address fromPair, address toPair) external;
}
// Dependency file: contracts/modules/Ownable.sol

// pragma solidity >=0.5.16;

contract Ownable {
    address public owner;

    event OwnerChanged(address indexed _oldOwner, address indexed _newOwner);

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, 'Ownable: FORBIDDEN');
        _;
    }

    function changeOwner(address _newOwner) public onlyOwner {
        require(_newOwner != address(0), 'Ownable: INVALID_ADDRESS');
        emit OwnerChanged(owner, _newOwner);
        owner = _newOwner;
    }

}

// Dependency file: contracts/interfaces/IDemaxPool.sol

// pragma solidity >=0.5.0;

interface IDemaxPool {
    function addRewardFromPlatform(address _pair, uint _amount) external;
    function preProductivityChanged(address _pair, address _user) external;
    function postProductivityChanged(address _pair, address _user) external;
}
// Dependency file: contracts/interfaces/IDemaxPair.sol

// pragma solidity >=0.5.0;

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

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

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

    function initialize(address tokenA, address tokenB, address platform, address dgas) external;
    function swapFee(uint amount, address token, address to) external ;
    function queryReward() external view returns (uint rewardAmount, uint blockNumber);
    function mintReward() external returns (uint rewardAmount);
    function getDGASReserve() external view returns (uint);
}

// Dependency file: contracts/interfaces/IDemaxFactory.sol

// pragma solidity >=0.5.0;

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

    function contractCodeHash() external view returns (bytes32);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function isPair(address pair) external view returns (bool);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function playerPairs(address player, uint index) external view returns (address pair);
    function getPlayerPairCount(address player) external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);
    function addPlayerPair(address player, address _pair) external returns (bool);
}

// Dependency file: contracts/interfaces/IERC20.sol

// pragma solidity >=0.5.0;

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

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

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

// Dependency file: contracts/interfaces/IDemaxConfig.sol

// pragma solidity >=0.5.0;

interface IDemaxConfig {
    function governor() external view returns (address);
    function dev() external view returns (address);
    function PERCENT_DENOMINATOR() external view returns (uint);
    function getConfig(bytes32 _name) external view returns (uint minValue, uint maxValue, uint maxSpan, uint value, uint enable);
    function getConfigValue(bytes32 _name) external view returns (uint);
    function changeConfigValue(bytes32 _name, uint _value) external returns (bool);
    function checkToken(address _token) external view returns(bool);
    function checkPair(address tokenA, address tokenB) external view returns (bool);
    function listToken(address _token) external returns (bool);
    function getDefaultListTokens() external returns (address[] memory);
    function platform() external view returns  (address);
    function addToken(address _token) external returns (bool);
}
// Dependency file: contracts/interfaces/IDemaxGovernance.sol

// pragma solidity >=0.5.0;

interface IDemaxGovernance {
    function addPair(address _tokenA, address _tokenB) external returns (bool);
    function addReward(uint _value) external returns (bool);
}


// Dependency file: contracts/interfaces/IWETH.sol

// pragma solidity >=0.5.0;

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

// Dependency file: contracts/libraries/DemaxSwapLibrary.sol

// pragma solidity >=0.5.0;

// import '../interfaces/IDemaxPair.sol';
// import '../interfaces/IDemaxFactory.sol';
// import "./SafeMath.sol";

library DemaxSwapLibrary {
    using SafeMath for uint;

    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'DemaxSwapLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'DemaxSwapLibrary: ZERO_ADDRESS');
    }

     function pairFor(address factory, address tokenA, address tokenB) internal view returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        bytes32 salt = keccak256(abi.encodePacked(token0, token1));
        bytes32 rawAddress = keccak256(
         abi.encodePacked(
            bytes1(0xff),
            factory,
            salt,
            IDemaxFactory(factory).contractCodeHash()
            )
        );
     return address(bytes20(rawAddress << 96));
    }

    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IDemaxPair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }
    
    function quoteEnhance(address factory, address tokenA, address tokenB, uint amountA) internal view returns(uint amountB) {
        (uint reserveA, uint reserveB) = getReserves(factory, tokenA, tokenB);
        return quote(amountA, reserveA, reserveB);
    }

    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'DemaxSwapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'DemaxSwapLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'DemaxSwapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'DemaxSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = amountIn.mul(reserveOut);
        uint denominator = reserveIn.add(amountIn);
        amountOut = numerator / denominator;
    }
    
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'DemaxSwapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'DemaxSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut);
        uint denominator = reserveOut.sub(amountOut);
        amountIn = (numerator / denominator).add(1);
    }

}
// Dependency file: contracts/libraries/TransferHelper.sol

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

// pragma solidity >=0.6.0;

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

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

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

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

// Dependency file: contracts/libraries/SafeMath.sol

// SPDX-License-Identifier: MIT

// pragma solidity ^0.6.0;

/**
 * @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;
    }
}
// Dependency file: contracts/libraries/ConfigNames.sol

// pragma solidity >=0.5.16;

library ConfigNames {
    bytes32 public constant PRODUCE_DGAS_RATE = bytes32('PRODUCE_DGAS_RATE');
    bytes32 public constant SWAP_FEE_PERCENT = bytes32('SWAP_FEE_PERCENT');
    bytes32 public constant LIST_DGAS_AMOUNT = bytes32('LIST_DGAS_AMOUNT');
    bytes32 public constant UNSTAKE_DURATION = bytes32('UNSTAKE_DURATION');
    bytes32 public constant REMOVE_LIQUIDITY_DURATION = bytes32('REMOVE_LIQUIDITY_DURATION');
    bytes32 public constant TOKEN_TO_DGAS_PAIR_MIN_PERCENT = bytes32('TOKEN_TO_DGAS_PAIR_MIN_PERCENT');
    bytes32 public constant LIST_TOKEN_FAILURE_BURN_PRECENT = bytes32('LIST_TOKEN_FAILURE_BURN_PRECENT');
    bytes32 public constant LIST_TOKEN_SUCCESS_BURN_PRECENT = bytes32('LIST_TOKEN_SUCCESS_BURN_PRECENT');
    bytes32 public constant PROPOSAL_DGAS_AMOUNT = bytes32('PROPOSAL_DGAS_AMOUNT');
    bytes32 public constant VOTE_DURATION = bytes32('VOTE_DURATION');
    bytes32 public constant VOTE_REWARD_PERCENT = bytes32('VOTE_REWARD_PERCENT');
    bytes32 public constant TOKEN_PENGDING_SWITCH = bytes32('TOKEN_PENGDING_SWITCH');
    bytes32 public constant TOKEN_PENGDING_TIME = bytes32('TOKEN_PENGDING_TIME');
    bytes32 public constant LIST_TOKEN_SWITCH = bytes32('LIST_TOKEN_SWITCH');
    bytes32 public constant DEV_PRECENT = bytes32('DEV_PRECENT');
    bytes32 public constant FEE_GOVERNANCE_REWARD_PERCENT = bytes32('FEE_GOVERNANCE_REWARD_PERCENT');
    bytes32 public constant FEE_LP_REWARD_PERCENT = bytes32('FEE_LP_REWARD_PERCENT');
}
pragma solidity >=0.6.6;
// import './libraries/ConfigNames.sol';
// import './libraries/SafeMath.sol';
// import './libraries/TransferHelper.sol';
// import './libraries/DemaxSwapLibrary.sol';
// import './interfaces/IWETH.sol';
// import './interfaces/IDemaxGovernance.sol';
// import './interfaces/IDemaxConfig.sol';
// import './interfaces/IERC20.sol';
// import './interfaces/IDemaxFactory.sol';
// import './interfaces/IDemaxPair.sol';
// import './interfaces/IDemaxPool.sol';
// import './modules/Ownable.sol';
// import './interfaces/IDemaxTransferListener.sol';

contract DemaxPlatform is Ownable {
    uint256 public version = 1;
    address public DGAS;
    address public CONFIG;
    address public FACTORY;
    address public WETH;
    address public GOVERNANCE;
    address public TRANSFER_LISTENER;
    address public POOL;
    uint256 public constant PERCENT_DENOMINATOR = 10000;

    bool public isPause;

    event AddLiquidity(
        address indexed player,
        address indexed tokenA,
        address indexed tokenB,
        uint256 amountA,
        uint256 amountB
    );
    event RemoveLiquidity(
        address indexed player,
        address indexed tokenA,
        address indexed tokenB,
        uint256 amountA,
        uint256 amountB
    );
    event SwapToken(
        address indexed receiver,
        address indexed fromToken,
        address indexed toToken,
        uint256 inAmount,
        uint256 outAmount
    );

    receive() external payable {
        assert(msg.sender == WETH);
    }

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

    function initialize(
        address _DGAS,
        address _CONFIG,
        address _FACTORY,
        address _WETH,
        address _GOVERNANCE,
        address _TRANSFER_LISTENER,
        address _POOL
    ) external onlyOwner {
        DGAS = _DGAS;
        CONFIG = _CONFIG;
        FACTORY = _FACTORY;
        WETH = _WETH;
        GOVERNANCE = _GOVERNANCE;
        TRANSFER_LISTENER = _TRANSFER_LISTENER;
        POOL = _POOL;
    }

    function pause() external onlyOwner {
        isPause = true;
    }

    function resume() external onlyOwner {
        isPause = false;
    }

    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal returns (uint256 amountA, uint256 amountB) {
        if (IDemaxFactory(FACTORY).getPair(tokenA, tokenB) == address(0)) {
            IDemaxConfig(CONFIG).addToken(tokenA);
            IDemaxConfig(CONFIG).addToken(tokenB);
            IDemaxFactory(FACTORY).createPair(tokenA, tokenB);
        }
        require(
            IDemaxConfig(CONFIG).checkPair(tokenA, tokenB),
            'DEMAX PLATFORM : ADD LIQUIDITY PAIR CONFIG CHECK FAIL'
        );
        (uint256 reserveA, uint256 reserveB) = DemaxSwapLibrary.getReserves(FACTORY, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal = DemaxSwapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'DEMAX PLATFORM : INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal = DemaxSwapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'DEMAX PLATFORM : INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
        IDemaxFactory(FACTORY).addPlayerPair(msg.sender, IDemaxFactory(FACTORY).getPair(tokenA, tokenB));
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountA,
        uint256 amountB,
        uint256 amountAMin,
        uint256 amountBMin,
        uint256 deadline
    )
        external
        ensure(deadline)
        returns (
            uint256 _amountA,
            uint256 _amountB,
            uint256 _liquidity
        )
    {
        require(!isPause, "DEMAX PAUSED");
        (_amountA, _amountB) = _addLiquidity(tokenA, tokenB, amountA, amountB, amountAMin, amountBMin);
        address pair = DemaxSwapLibrary.pairFor(FACTORY, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, _amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, _amountB);

        // notify pool
        IDemaxPool(POOL).preProductivityChanged(pair, msg.sender);
        _liquidity = IDemaxPair(pair).mint(msg.sender);
        IDemaxPool(POOL).postProductivityChanged(pair, msg.sender);

        _transferNotify(msg.sender, pair, tokenA, _amountA);
        _transferNotify(msg.sender, pair, tokenB, _amountB);
        emit AddLiquidity(msg.sender, tokenA, tokenB, _amountA, _amountB);
    }

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        uint256 deadline
    )
        external
        payable
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        )
    {
        require(!isPause, "DEMAX PAUSED");
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = DemaxSwapLibrary.pairFor(FACTORY, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));

        // notify pool
        IDemaxPool(POOL).preProductivityChanged(pair, msg.sender);
        liquidity = IDemaxPair(pair).mint(msg.sender);
        IDemaxPool(POOL).postProductivityChanged(pair, msg.sender);

        _transferNotify(msg.sender, pair, WETH, amountETH);
        _transferNotify(msg.sender, pair, token, amountToken);
        emit AddLiquidity(msg.sender, token, WETH, amountToken, amountETH);
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) public ensure(deadline) returns (uint256 amountA, uint256 amountB) {
        require(!isPause, "DEMAX PAUSED");
        address pair = DemaxSwapLibrary.pairFor(FACTORY, tokenA, tokenB);
        uint256 _liquidity = liquidity;
        address _tokenA = tokenA;
        address _tokenB = tokenB;

        // notify pool
        IDemaxPool(POOL).preProductivityChanged(pair, msg.sender);
        (uint256 amount0, uint256 amount1) = IDemaxPair(pair).burn(msg.sender, to, _liquidity);
        IDemaxPool(POOL).postProductivityChanged(pair, msg.sender);

        (address token0, ) = DemaxSwapLibrary.sortTokens(_tokenA, _tokenB);
        (amountA, amountB) = _tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        _transferNotify(pair, to, _tokenA, amountA);
        _transferNotify(pair, to, _tokenB, amountB);
        require(amountA >= amountAMin, 'DEMAX PLATFORM : INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'DEMAX PLATFORM : INSUFFICIENT_B_AMOUNT');
        emit RemoveLiquidity(msg.sender, _tokenA, _tokenB, amountA, amountB);
    }

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) public ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {
        require(!isPause, "DEMAX PAUSED");
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
        _transferNotify(address(this), to, token, amountToken);
        _transferNotify(address(this), to, WETH, amountETH);
    }

    function _getAmountsOut(
        uint256 amount,
        address[] memory path,
        uint256 percent
    ) internal view returns (uint256[] memory amountOuts) {
        amountOuts = new uint256[](path.length);
        amountOuts[0] = amount;
        for (uint256 i = 0; i < path.length - 1; i++) {
            address inPath = path[i];
            address outPath = path[i + 1];
            (uint256 reserveA, uint256 reserveB) = DemaxSwapLibrary.getReserves(FACTORY, inPath, outPath);
            uint256 outAmount = SafeMath.mul(amountOuts[i], SafeMath.sub(PERCENT_DENOMINATOR, percent));
            amountOuts[i + 1] = DemaxSwapLibrary.getAmountOut(outAmount / PERCENT_DENOMINATOR, reserveA, reserveB);
        }
    }

    function _getAmountsIn(
        uint256 amount,
        address[] memory path,
        uint256 percent
    ) internal view returns (uint256[] memory amountIn) {
        amountIn = new uint256[](path.length);
        amountIn[path.length - 1] = amount;
        for (uint256 i = path.length - 1; i > 0; i--) {
            address inPath = path[i - 1];
            address outPath = path[i];
            (uint256 reserveA, uint256 reserveB) = DemaxSwapLibrary.getReserves(FACTORY, inPath, outPath);
            uint256 inAmount = DemaxSwapLibrary.getAmountIn(amountIn[i], reserveA, reserveB);
            amountIn[i - 1] = SafeMath.add(
                SafeMath.mul(inAmount, PERCENT_DENOMINATOR) / SafeMath.sub(PERCENT_DENOMINATOR, percent),
                1
            );
        }
        amountIn = _getAmountsOut(amountIn[0], path, percent);
    }

    function swapPrecondition(address token) public view returns (bool) {
        if (token == DGAS || token == WETH) return true;
        uint256 percent = IDemaxConfig(CONFIG).getConfigValue(ConfigNames.TOKEN_TO_DGAS_PAIR_MIN_PERCENT);
        if (!existPair(WETH, DGAS)) return false;
        if (!existPair(DGAS, token)) return false;
        if (!(IDemaxConfig(CONFIG).checkPair(DGAS, token) && IDemaxConfig(CONFIG).checkPair(WETH, token))) return false;
        if (!existPair(WETH, token)) return true;
        if (percent == 0) return true;
        (uint256 reserveDGAS, ) = DemaxSwapLibrary.getReserves(FACTORY, DGAS, token);
        (uint256 reserveWETH, ) = DemaxSwapLibrary.getReserves(FACTORY, WETH, token);
        (uint256 reserveWETH2, uint256 reserveDGAS2) = DemaxSwapLibrary.getReserves(FACTORY, WETH, DGAS);
        uint256 dgasValue = SafeMath.mul(reserveDGAS, reserveWETH2) / reserveDGAS2;
        uint256 limitValue = SafeMath.mul(SafeMath.add(dgasValue, reserveWETH), percent) / PERCENT_DENOMINATOR;
        return dgasValue >= limitValue;
    }

    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) internal {
        require(!isPause, "DEMAX PAUSED");
        require(swapPrecondition(path[path.length - 1]), 'DEMAX PLATFORM : CHECK DGAS/TOKEN TO VALUE FAIL');
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            require(swapPrecondition(input), 'DEMAX PLATFORM : CHECK DGAS/TOKEN VALUE FROM FAIL');
            require(IDemaxConfig(CONFIG).checkPair(input, output), 'DEMAX PLATFORM : SWAP PAIR CONFIG CHECK FAIL');
            (address token0, address token1) = DemaxSwapLibrary.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 ? DemaxSwapLibrary.pairFor(FACTORY, output, path[i + 2]) : _to;
            IDemaxPair(DemaxSwapLibrary.pairFor(FACTORY, input, output)).swap(amount0Out, amount1Out, to, new bytes(0));
            if (amount0Out > 0)
                _transferNotify(DemaxSwapLibrary.pairFor(FACTORY, input, output), to, token0, amount0Out);
            if (amount1Out > 0)
                _transferNotify(DemaxSwapLibrary.pairFor(FACTORY, input, output), to, token1, amount1Out);
        }
        emit SwapToken(_to, path[0], path[path.length - 1], amounts[0], amounts[path.length - 1]);
    }

    function _swapFee(
        uint256[] memory amounts,
        address[] memory path,
        uint256 percent
    ) internal {
        address[] memory feepath = new address[](2);
        feepath[1] = DGAS;
        for (uint256 i = 0; i < path.length - 1; i++) {
            uint256 fee = SafeMath.mul(amounts[i], percent) / PERCENT_DENOMINATOR;
            address input = path[i];
            address output = path[i + 1];
            address currentPair = DemaxSwapLibrary.pairFor(FACTORY, input, output);
            if (input == DGAS) {
                IDemaxPair(currentPair).swapFee(fee, DGAS, POOL);
                _transferNotify(currentPair, POOL, DGAS, fee);
            } else {
                IDemaxPair(currentPair).swapFee(fee, input, DemaxSwapLibrary.pairFor(FACTORY, input, DGAS));
                (uint256 reserveIn, uint256 reserveDGAS) = DemaxSwapLibrary.getReserves(FACTORY, input, DGAS);
                uint256 feeOut = DemaxSwapLibrary.getAmountOut(fee, reserveIn, reserveDGAS);
                IDemaxPair(DemaxSwapLibrary.pairFor(FACTORY, input, DGAS)).swapFee(feeOut, DGAS, POOL);
                _transferNotify(currentPair, DemaxSwapLibrary.pairFor(FACTORY, input, DGAS), input, fee);
                _transferNotify(DemaxSwapLibrary.pairFor(FACTORY, input, DGAS), POOL, DGAS, feeOut);
                fee = feeOut;
            }
            if (fee > 0) IDemaxPool(POOL).addRewardFromPlatform(currentPair, fee);
        }
    }

    function _getSwapFeePercent() internal view returns (uint256) {
        return IDemaxConfig(CONFIG).getConfigValue(ConfigNames.SWAP_FEE_PERCENT);
    }

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

        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsOut(amountIn, path, percent);
        require(amounts[amounts.length - 1] >= amountOutMin, 'DEMAX PLATFORM : INSUFFICIENT_OUTPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amountIn, SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);
        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function _innerTransferFrom(
        address token,
        address from,
        address to,
        uint256 amount
    ) internal {
        TransferHelper.safeTransferFrom(token, from, to, amount);
        _transferNotify(from, to, token, amount);
    }

    function _innerTransferWETH(address to, uint256 amount) internal {
        assert(IWETH(WETH).transfer(to, amount));
        _transferNotify(address(this), to, WETH, amount);
    }

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, 'DEMAX PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsOut(msg.value, path, percent);
        require(amounts[amounts.length - 1] >= amountOutMin, 'DEMAX PLATFORM : INSUFFICIENT_OUTPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        IWETH(WETH).deposit{
            value: SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        }();
        _innerTransferWETH(
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);

        IWETH(WETH).deposit{value: SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR}();
        _innerTransferWETH(pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, 'DEMAX PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsOut(amountIn, path, percent);
        require(amounts[amounts.length - 1] >= amountOutMin, 'DEMAX PLATFORM : INSUFFICIENT_OUTPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amountIn, SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);

        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsIn(amountOut, path, percent);
        require(amounts[0] <= amountInMax, 'DEMAX PLATFORM : EXCESSIVE_INPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);

        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);
        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, 'DEMAX PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsIn(amountOut, path, percent);
        require(amounts[0] <= amountInMax, 'DEMAX PLATFORM : EXCESSIVE_INPUT_AMOUNT');
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);

        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, 'DEMAX PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsIn(amountOut, path, percent);
        require(amounts[0] <= msg.value, 'DEMAX PLATFORM : EXCESSIVE_INPUT_AMOUNT');

        IWETH(WETH).deposit{
            value: SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        }();
        address pair = DemaxSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferWETH(
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);

        IWETH(WETH).deposit{value: SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR}();
        _innerTransferWETH(pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    function _transferNotify(
        address from,
        address to,
        address token,
        uint256 amount
    ) internal {
        IDemaxTransferListener(TRANSFER_LISTENER).transferNotify(from, to, token, amount);
    }

    function existPair(address tokenA, address tokenB) public view returns (bool) {
        return IDemaxFactory(FACTORY).getPair(tokenA, tokenB) != address(0);
    }

    function getReserves(address tokenA, address tokenB) public view returns (uint256, uint256) {
        return DemaxSwapLibrary.getReserves(FACTORY, tokenA, tokenB);
    }

    function pairFor(address tokenA, address tokenB) public view returns (address) {
        return DemaxSwapLibrary.pairFor(FACTORY, tokenA, tokenB);
    }

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) public view returns (uint256 amountOut) {
        uint256 percent = _getSwapFeePercent();
        uint256 amount = SafeMath.mul(amountIn, SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR;
        return DemaxSwapLibrary.getAmountOut(amount, reserveIn, reserveOut);
    }

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) public view returns (uint256 amountIn) {
        uint256 percent = _getSwapFeePercent();
        uint256 amount = DemaxSwapLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
        return SafeMath.mul(amount, PERCENT_DENOMINATOR) / SafeMath.sub(PERCENT_DENOMINATOR, percent);
    }

    function getAmountsOut(uint256 amountIn, address[] memory path) public view returns (uint256[] memory amounts) {
        uint256 percent = _getSwapFeePercent();
        return _getAmountsOut(amountIn, path, percent);
    }

    function getAmountsIn(uint256 amountOut, address[] memory path) public view returns (uint256[] memory amounts) {
        uint256 percent = _getSwapFeePercent();
        return _getAmountsIn(amountOut, path, percent);
    }

    function migrateLiquidity(address pair, address tokenA, address tokenB, address[] calldata users) external onlyOwner {
        if (IDemaxFactory(FACTORY).getPair(tokenA, tokenB) == address(0)) {
            IDemaxFactory(FACTORY).createPair(tokenA, tokenB);
        }
        address newPair = IDemaxFactory(FACTORY).getPair(tokenA, tokenB);
        for(uint i = 0; i < users.length; i++) {
            uint liquidity = IDemaxPair(pair).balanceOf(users[i]);
            if(liquidity > 0) {
                IDemaxPair(pair).burn(users[i], newPair, liquidity);
                IDemaxPair(newPair).mint(users[i]);
                IDemaxFactory(FACTORY).addPlayerPair(users[i], newPair);
            }
        }

        IDemaxTransferListener(TRANSFER_LISTENER).upgradeProdutivity(pair, newPair);
        
    }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"address","name":"tokenA","type":"address"},{"indexed":true,"internalType":"address","name":"tokenB","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountB","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"_newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":true,"internalType":"address","name":"tokenA","type":"address"},{"indexed":true,"internalType":"address","name":"tokenB","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountB","type":"uint256"}],"name":"RemoveLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"fromToken","type":"address"},{"indexed":true,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"inAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"outAmount","type":"uint256"}],"name":"SwapToken","type":"event"},{"inputs":[],"name":"CONFIG","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DGAS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOVERNANCE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_LISTENER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"_amountA","type":"uint256"},{"internalType":"uint256","name":"_amountB","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"existPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"view","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":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_DGAS","type":"address"},{"internalType":"address","name":"_CONFIG","type":"address"},{"internalType":"address","name":"_FACTORY","type":"address"},{"internalType":"address","name":"_WETH","type":"address"},{"internalType":"address","name":"_GOVERNANCE","type":"address"},{"internalType":"address","name":"_TRANSFER_LISTENER","type":"address"},{"internalType":"address","name":"_POOL","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"address[]","name":"users","type":"address[]"}],"name":"migrateLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"pairFor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"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"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"swapPrecondition","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260018055600080546001600160a01b031916331790556152f1806100296000396000f3fe6080604052600436106101fd5760003560e01c806385f8c2591161010d578063baa2abde116100a0578063d92e82e41161006f578063d92e82e414610b6f578063ddd377ac14610b84578063f6f1e30614610bb7578063fb3bdb4114610bf5578063ff0938a714610c7957610218565b8063baa2abde146109d3578063c2ceddfa14610a30578063d06ca61f14610a7f578063d52bb6f414610b3457610218565b806396ed28f9116100dc57806396ed28f91461093b5780639e6c295914610976578063a6f9dae11461098b578063ad5c4648146109be57610218565b806385f8c259146107be5780638803dbee146107f45780638b61ff241461088a5780638da5cb5b1461092657610218565b806338ed1739116101905780637535d2461161015f5780637535d246146106825780637ae06e58146106975780637ff36ab514610710578063822abc7c146107945780638456cb59146107a957610218565b806338ed17391461052c5780634a25d94a146105c257806354fd4d5014610658578063723c2e2d1461066d57610218565b806318cbafe5116101cc57806318cbafe5146103175780631f00ca74146103fd5780632dd31000146104b257806335876476146104c757610218565b806302751cec1461021d578063046f7da214610289578063054d50d41461029e57806314627834146102e657610218565b36610218576005546001600160a01b0316331461021657fe5b005b600080fd5b34801561022957600080fd5b50610270600480360360c081101561024057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c8e565b6040805192835260208301919091528051918290030190f35b34801561029557600080fd5b50610216610df0565b3480156102aa57600080fd5b506102d4600480360360608110156102c157600080fd5b5080359060208101359060400135610e53565b60408051918252519081900360200190f35b3480156102f257600080fd5b506102fb610e99565b604080516001600160a01b039092168252519081900360200190f35b34801561032357600080fd5b506103ad600480360360a081101561033a57600080fd5b813591602081013591810190606081016040820135600160201b81111561036057600080fd5b82018360208201111561037257600080fd5b803590602001918460208302840111600160201b8311171561039357600080fd5b91935091506001600160a01b038135169060200135610ea8565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103e95781810151838201526020016103d1565b505050509050019250505060405180910390f35b34801561040957600080fd5b506103ad6004803603604081101561042057600080fd5b81359190810190604081016020820135600160201b81111561044157600080fd5b82018360208201111561045357600080fd5b803590602001918460208302840111600160201b8311171561047457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611205945050505050565b3480156104be57600080fd5b506102fb611228565b3480156104d357600080fd5b50610216600480360360e08110156104ea57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c09091013516611237565b34801561053857600080fd5b506103ad600480360360a081101561054f57600080fd5b813591602081013591810190606081016040820135600160201b81111561057557600080fd5b82018360208201111561058757600080fd5b803590602001918460208302840111600160201b831117156105a857600080fd5b91935091506001600160a01b038135169060200135611309565b3480156105ce57600080fd5b506103ad600480360360a08110156105e557600080fd5b813591602081013591810190606081016040820135600160201b81111561060b57600080fd5b82018360208201111561061d57600080fd5b803590602001918460208302840111600160201b8311171561063e57600080fd5b91935091506001600160a01b038135169060200135611460565b34801561066457600080fd5b506102d4611623565b34801561067957600080fd5b506102fb611629565b34801561068e57600080fd5b506102fb611638565b3480156106a357600080fd5b506106f2600480360360e08110156106ba57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c00135611647565b60408051938452602084019290925282820152519081900360600190f35b6103ad6004803603608081101561072657600080fd5b81359190810190604081016020820135600160201b81111561074757600080fd5b82018360208201111561075957600080fd5b803590602001918460208302840111600160201b8311171561077a57600080fd5b91935091506001600160a01b0381351690602001356118f7565b3480156107a057600080fd5b506102fb611c41565b3480156107b557600080fd5b50610216611c50565b3480156107ca57600080fd5b506102d4600480360360608110156107e157600080fd5b5080359060208101359060400135611cb9565b34801561080057600080fd5b506103ad600480360360a081101561081757600080fd5b813591602081013591810190606081016040820135600160201b81111561083d57600080fd5b82018360208201111561084f57600080fd5b803590602001918460208302840111600160201b8311171561087057600080fd5b91935091506001600160a01b038135169060200135611cff565b34801561089657600080fd5b50610216600480360360808110156108ad57600080fd5b6001600160a01b0382358116926020810135821692604082013590921691810190608081016060820135600160201b8111156108e857600080fd5b8201836020820111156108fa57600080fd5b803590602001918460208302840111600160201b8311171561091b57600080fd5b509092509050611e14565b34801561093257600080fd5b506102fb61235c565b34801561094757600080fd5b506102fb6004803603604081101561095e57600080fd5b506001600160a01b038135811691602001351661236b565b34801561098257600080fd5b506102d461238c565b34801561099757600080fd5b50610216600480360360208110156109ae57600080fd5b50356001600160a01b0316612392565b3480156109ca57600080fd5b506102fb61249c565b3480156109df57600080fd5b50610270600480360360e08110156109f657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356124ab565b348015610a3c57600080fd5b50610a6b60048036036040811015610a5357600080fd5b506001600160a01b0381358116916020013516612805565b604080519115158252519081900360200190f35b348015610a8b57600080fd5b506103ad60048036036040811015610aa257600080fd5b81359190810190604081016020820135600160201b811115610ac357600080fd5b820183602082011115610ad557600080fd5b803590602001918460208302840111600160201b83111715610af657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061289d945050505050565b348015610b4057600080fd5b5061027060048036036040811015610b5757600080fd5b506001600160a01b03813581169160200135166128b6565b348015610b7b57600080fd5b506102fb6128de565b348015610b9057600080fd5b50610a6b60048036036020811015610ba757600080fd5b50356001600160a01b03166128ed565b6106f2600480360360a0811015610bcd57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135612c1c565b6103ad60048036036080811015610c0b57600080fd5b81359190810190604081016020820135600160201b811115610c2c57600080fd5b820183602082011115610c3e57600080fd5b803590602001918460208302840111600160201b83111715610c5f57600080fd5b91935091506001600160a01b038135169060200135612fd6565b348015610c8557600080fd5b50610a6b613334565b6000808242811015610cd5576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b600854600160a01b900460ff1615610d23576040805162461bcd60e51b815260206004820152600c60248201526b11115350560814105554d15160a21b604482015290519081900360640190fd5b600554610d3f908a906001600160a01b03168a8a8a308a6124ab565b9093509150610d4f898685613344565b60055460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015610d9c57600080fd5b505af1158015610db0573d6000803e3d6000fd5b50505050610dbe85836134ae565b610dca30868b866135a6565b600554610de490309087906001600160a01b0316856135a6565b50965096945050505050565b6000546001600160a01b03163314610e44576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6008805460ff60a01b19169055565b600080610e5e61363e565b90506000612710610e7a87610e75612710866136cd565b61370f565b81610e8157fe5b049050610e8f818686613768565b9695505050505050565b6006546001600160a01b031681565b60608142811015610eee576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b6005546001600160a01b031686866000198101818110610f0a57fe5b905060200201356001600160a01b03166001600160a01b031614610f63576040805162461bcd60e51b815260206004820152601d602482015260008051602061521e833981519152604482015290519081900360640190fd5b6000610f6d61363e565b9050610fae89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250613824915050565b92508783600185510381518110610fc157fe5b602002602001015110156110065760405162461bcd60e51b815260040180806020018281038252602b815260200180615291602b913960400191505060405180910390fd5b600454600090611055906001600160a01b03168989848161102357fe5b905060200201356001600160a01b03168a8a600181811061104057fe5b905060200201356001600160a01b0316613956565b90506110998888600081811061106757fe5b905060200201356001600160a01b0316338361271061108c8f610e756127108a6136cd565b8161109357fe5b04613aa4565b6110d884898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613ac2915050565b60055484516001600160a01b0390911690632e1a7d4d90869060001981019081106110ff57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561113d57600080fd5b505af1158015611151573d6000803e3d6000fd5b50505050611176868560018751038151811061116957fe5b60200260200101516134ae565b6111b98888600081811061118657fe5b905060200201356001600160a01b0316338361271061108c896000815181106111ab57fe5b60200260200101518861370f565b6111f884898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250613f99915050565b5050509695505050505050565b6060600061121161363e565b905061121e84848361438b565b9150505b92915050565b6004546001600160a01b031681565b6000546001600160a01b0316331461128b576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b600280546001600160a01b03199081166001600160a01b03998a1617909155600380548216978916979097179096556004805487169588169590951790945560058054861693871693909317909255600680548516918616919091179055600780548416918516919091179055600880549092169216919091179055565b6060814281101561134f576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b600061135961363e565b905061139a89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250613824915050565b925087836001855103815181106113ad57fe5b602002602001015110156113f25760405162461bcd60e51b815260040180806020018281038252602b815260200180615291602b913960400191505060405180910390fd5b60045460009061140f906001600160a01b03168989848161102357fe5b90506114218888600081811061106757fe5b611176848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250613ac2915050565b606081428110156114a6576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b6005546001600160a01b0316868660001981018181106114c257fe5b905060200201356001600160a01b03166001600160a01b03161461151b576040805162461bcd60e51b815260206004820152601d602482015260008051602061521e833981519152604482015290519081900360640190fd5b600061152561363e565b90506115668988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925061438b915050565b9250878360008151811061157657fe5b602002602001015111156115bb5760405162461bcd60e51b8152600401808060200182810382526027815260200180614fec6027913960400191505060405180910390fd5b6004546000906115d8906001600160a01b03168989848161102357fe5b9050611099888860008181106115ea57fe5b905060200201356001600160a01b0316338361271061108c8960008151811061160f57fe5b6020026020010151610e756127108a6136cd565b60015481565b6002546001600160a01b031681565b6008546001600160a01b031681565b60008060008342811015611690576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b600854600160a01b900460ff16156116de576040805162461bcd60e51b815260206004820152600c60248201526b11115350560814105554d15160a21b604482015290519081900360640190fd5b6116ec8b8b8b8b8b8b6144f5565b600454919550935060009061170b906001600160a01b03168d8d613956565b90506117198c3383886149e0565b6117258b3383876149e0565b6008546040805163555d661160e11b81526001600160a01b0384811660048301523360248301529151919092169163aabacc2291604480830192600092919082900301818387803b15801561177957600080fd5b505af115801561178d573d6000803e3d6000fd5b5050604080516335313c2160e11b815233600482015290516001600160a01b0385169350636a627842925060248083019260209291908290030181600087803b1580156117d957600080fd5b505af11580156117ed573d6000803e3d6000fd5b505050506040513d602081101561180357600080fd5b5051600854604080516368a6560d60e11b81526001600160a01b038581166004830152336024830152915193965091169163d14cac1a9160448082019260009290919082900301818387803b15801561185b57600080fd5b505af115801561186f573d6000803e3d6000fd5b5050505061187f33828e886135a6565b61188b33828d876135a6565b8a6001600160a01b03168c6001600160a01b0316336001600160a01b03167fc33fbc9654f9c0dcfcbd829113bdb10afe95619bc0824bc5959ad82fd6952bd98888604051808381526020018281526020019250505060405180910390a450509750975097945050505050565b6060814281101561193d576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b6005546001600160a01b0316868660008161195457fe5b905060200201356001600160a01b03166001600160a01b0316146119ad576040805162461bcd60e51b815260206004820152601d602482015260008051602061521e833981519152604482015290519081900360640190fd5b60006119b761363e565b90506119f834888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250613824915050565b92508783600185510381518110611a0b57fe5b60200260200101511015611a505760405162461bcd60e51b815260040180806020018281038252602b815260200180615291602b913960400191505060405180910390fd5b600454600090611a6d906001600160a01b03168989848161102357fe5b60055485519192506001600160a01b03169063d0e30db09061271090611aac908890600090611a9857fe5b6020026020010151610e75612710886136cd565b81611ab357fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b158015611adf57600080fd5b505af1158015611af3573d6000803e3d6000fd5b5050505050611b1c81612710611b0f87600081518110611a9857fe5b81611b1657fe5b04614b35565b611b5b848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250613ac2915050565b60055484516001600160a01b039091169063d0e30db09061271090611b93908890600090611b8557fe5b60200260200101518661370f565b81611b9a57fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b158015611bc657600080fd5b505af1158015611bda573d6000803e3d6000fd5b5050505050611bf681612710611b0f87600081518110611b8557fe5b611c3584898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250613f99915050565b50505095945050505050565b6007546001600160a01b031681565b6000546001600160a01b03163314611ca4576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6008805460ff60a01b1916600160a01b179055565b600080611cc461363e565b90506000611cd3868686614bdb565b9050611ce1612710836136cd565b611ced8261271061370f565b81611cf457fe5b049695505050505050565b60608142811015611d45576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b6000611d4f61363e565b9050611d908988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925061438b915050565b92508783600081518110611da057fe5b60200260200101511115611de55760405162461bcd60e51b8152600401808060200182810382526027815260200180614fec6027913960400191505060405180910390fd5b600454600090611e02906001600160a01b03168989848161102357fe5b9050611421888860008181106115ea57fe5b6000546001600160a01b03163314611e68576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b600480546040805163e6a4390560e01b81526001600160a01b0388811694820194909452868416602482015290516000939092169163e6a4390591604480820192602092909190829003018186803b158015611ec357600080fd5b505afa158015611ed7573d6000803e3d6000fd5b505050506040513d6020811015611eed57600080fd5b50516001600160a01b03161415611f865760048054604080516364e329cb60e11b81526001600160a01b038881169482019490945286841660248201529051929091169163c9c65396916044808201926020929091908290030181600087803b158015611f5957600080fd5b505af1158015611f6d573d6000803e3d6000fd5b505050506040513d6020811015611f8357600080fd5b50505b600480546040805163e6a4390560e01b81526001600160a01b0388811694820194909452868416602482015290516000939092169163e6a4390591604480820192602092909190829003018186803b158015611fe157600080fd5b505afa158015611ff5573d6000803e3d6000fd5b505050506040513d602081101561200b57600080fd5b5051905060005b828110156122e5576000876001600160a01b03166370a0823186868581811061203757fe5b905060200201356001600160a01b03166040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561208d57600080fd5b505afa1580156120a1573d6000803e3d6000fd5b505050506040513d60208110156120b757600080fd5b5051905080156122dc57876001600160a01b031663f6b911bc8686858181106120dc57fe5b905060200201356001600160a01b031685846040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b0316815260200182815260200193505050506040805180830381600087803b15801561215557600080fd5b505af1158015612169573d6000803e3d6000fd5b505050506040513d604081101561217f57600080fd5b50506001600160a01b038316636a62784286868581811061219c57fe5b905060200201356001600160a01b03166040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156121f457600080fd5b505af1158015612208573d6000803e3d6000fd5b505050506040513d602081101561221e57600080fd5b50506004546001600160a01b031663c9ead25886868581811061223d57fe5b905060200201356001600160a01b0316856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b0316815260200192505050602060405180830381600087803b1580156122af57600080fd5b505af11580156122c3573d6000803e3d6000fd5b505050506040513d60208110156122d957600080fd5b50505b50600101612012565b5060075460408051636ef9a3e760e01b81526001600160a01b038981166004830152848116602483015291519190921691636ef9a3e791604480830192600092919082900301818387803b15801561233c57600080fd5b505af1158015612350573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031681565b600454600090612385906001600160a01b03168484613956565b9392505050565b61271081565b6000546001600160a01b031633146123e6576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6001600160a01b038116612441576040805162461bcd60e51b815260206004820152601860248201527f4f776e61626c653a20494e56414c49445f414444524553530000000000000000604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b60008082428110156124f2576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b600854600160a01b900460ff1615612540576040805162461bcd60e51b815260206004820152600c60248201526b11115350560814105554d15160a21b604482015290519081900360640190fd5b60045460009061255a906001600160a01b03168c8c613956565b6008546040805163555d661160e11b81526001600160a01b03808516600483015233602483015291519394508c938f938f93169163aabacc2291604480830192600092919082900301818387803b1580156125b457600080fd5b505af11580156125c8573d6000803e3d6000fd5b505060408051633dae446f60e21b81523360048201526001600160a01b038d81166024830152604482018890528251600095508594509089169263f6b911bc926064808201939182900301818787803b15801561262457600080fd5b505af1158015612638573d6000803e3d6000fd5b505050506040513d604081101561264e57600080fd5b508051602090910151600854604080516368a6560d60e11b81526001600160a01b038b811660048301523360248301529151949650929450169163d14cac1a9160448082019260009290919082900301818387803b1580156126af57600080fd5b505af11580156126c3573d6000803e3d6000fd5b5050505060006126d38585614ca9565b509050806001600160a01b0316856001600160a01b0316146126f65781836126f9565b82825b909a50985061270a878d878d6135a6565b612716878d868c6135a6565b8d8a10156127555760405162461bcd60e51b81526004018080602001828103825260268152602001806150fe6026913960400191505060405180910390fd5b8c8910156127945760405162461bcd60e51b81526004018080602001828103825260268152602001806151f86026913960400191505060405180910390fd5b836001600160a01b0316856001600160a01b0316336001600160a01b03167fa8dbaaebbb025c88e9e34c84635cd8238043556e9af43fb161508c898a8e1ef98d8d604051808381526020018281526020019250505060405180910390a4505050505050505097509795505050505050565b600480546040805163e6a4390560e01b81526001600160a01b0386811694820194909452848416602482015290516000938493169163e6a43905916044808301926020929190829003018186803b15801561285f57600080fd5b505afa158015612873573d6000803e3d6000fd5b505050506040513d602081101561288957600080fd5b50516001600160a01b031614159392505050565b606060006128a961363e565b905061121e848483613824565b60045460009081906128d2906001600160a01b03168585614d80565b915091505b9250929050565b6003546001600160a01b031681565b6002546000906001600160a01b038381169116148061291957506005546001600160a01b038381169116145b1561292657506001612c17565b600354604080516360ccef1960e11b81527f544f4b454e5f544f5f444741535f504149525f4d494e5f50455243454e540000600482015290516000926001600160a01b03169163c199de32916024808301926020929190829003018186803b15801561299157600080fd5b505afa1580156129a5573d6000803e3d6000fd5b505050506040513d60208110156129bb57600080fd5b50516005546002549192506129dc916001600160a01b039182169116612805565b6129ea576000915050612c17565b600254612a00906001600160a01b031684612805565b612a0e576000915050612c17565b6003546002546040805163a9ece1b760e01b81526001600160a01b03928316600482015286831660248201529051919092169163a9ece1b7916044808301926020929190829003018186803b158015612a6657600080fd5b505afa158015612a7a573d6000803e3d6000fd5b505050506040513d6020811015612a9057600080fd5b50518015612b1e57506003546005546040805163a9ece1b760e01b81526001600160a01b03928316600482015286831660248201529051919092169163a9ece1b7916044808301926020929190829003018186803b158015612af157600080fd5b505afa158015612b05573d6000803e3d6000fd5b505050506040513d6020811015612b1b57600080fd5b50515b612b2c576000915050612c17565b600554612b42906001600160a01b031684612805565b612b50576001915050612c17565b80612b5f576001915050612c17565b600454600254600091612b7f916001600160a01b03918216911686614d80565b50600454600554919250600091612ba3916001600160a01b03908116911687614d80565b506004546005546002549293506000928392612bcf926001600160a01b03918216929082169116614d80565b91509150600081612be0868561370f565b81612be757fe5b0490506000612710612c02612bfc8488614e4e565b8961370f565b81612c0957fe5b049091101596505050505050505b919050565b60008060008342811015612c65576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b600854600160a01b900460ff1615612cb3576040805162461bcd60e51b815260206004820152600c60248201526b11115350560814105554d15160a21b604482015290519081900360640190fd5b600554612cce908a906001600160a01b03168a348b8b6144f5565b600454600554929650909450600091612cf5916001600160a01b03908116918d9116613956565b9050612d038a3383886149e0565b600560009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612d5357600080fd5b505af1158015612d67573d6000803e3d6000fd5b50506005546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018b9052915191909216945063a9059cbb9350604480830193506020928290030181600087803b158015612dc057600080fd5b505af1158015612dd4573d6000803e3d6000fd5b505050506040513d6020811015612dea57600080fd5b5051612df257fe5b6008546040805163555d661160e11b81526001600160a01b0384811660048301523360248301529151919092169163aabacc2291604480830192600092919082900301818387803b158015612e4657600080fd5b505af1158015612e5a573d6000803e3d6000fd5b5050604080516335313c2160e11b815233600482015290516001600160a01b0385169350636a627842925060248083019260209291908290030181600087803b158015612ea657600080fd5b505af1158015612eba573d6000803e3d6000fd5b505050506040513d6020811015612ed057600080fd5b5051600854604080516368a6560d60e11b81526001600160a01b038581166004830152336024830152915193965091169163d14cac1a9160448082019260009290919082900301818387803b158015612f2857600080fd5b505af1158015612f3c573d6000803e3d6000fd5b5050600554612f5a925033915083906001600160a01b0316876135a6565b612f6633828c886135a6565b600554604080518781526020810187905281516001600160a01b03938416938e169233927fc33fbc9654f9c0dcfcbd829113bdb10afe95619bc0824bc5959ad82fd6952bd9929081900390910190a483341115612fc957612fc9338534036134ae565b5050955095509592505050565b6060814281101561301c576040805162461bcd60e51b81526020600482015260186024820152600080516020615038833981519152604482015290519081900360640190fd5b6005546001600160a01b0316868660008161303357fe5b905060200201356001600160a01b03166001600160a01b03161461308c576040805162461bcd60e51b815260206004820152601d602482015260008051602061521e833981519152604482015290519081900360640190fd5b600061309661363e565b90506130d78888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925061438b915050565b925034836000815181106130e757fe5b6020026020010151111561312c5760405162461bcd60e51b8152600401808060200182810382526027815260200180614fec6027913960400191505060405180910390fd5b60055483516001600160a01b039091169063d0e30db0906127109061316a90879060009061315657fe5b6020026020010151610e75612710876136cd565b8161317157fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561319d57600080fd5b505af11580156131b1573d6000803e3d6000fd5b5050600454600093506131d492506001600160a01b031690508989848161102357fe5b90506131ed81612710611b0f87600081518110611a9857fe5b61322c848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250613ac2915050565b60055484516001600160a01b039091169063d0e30db09061271090613256908890600090611b8557fe5b8161325d57fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561328957600080fd5b505af115801561329d573d6000803e3d6000fd5b50505050506132b981612710611b0f87600081518110611b8557fe5b6132f884898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250613f99915050565b8360008151811061330557fe5b6020026020010151341115611c3557611c35338560008151811061332557fe5b602002602001015134036134ae565b600854600160a01b900460ff1681565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106133c15780518252601f1990920191602091820191016133a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613423576040519150601f19603f3d011682016040523d82523d6000602084013e613428565b606091505b5091509150818015613456575080511580613456575080806020019051602081101561345357600080fd5b50515b6134a7576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106134fa5780518252601f1990920191602091820191016134db565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461355c576040519150601f19603f3d011682016040523d82523d6000602084013e613561565b606091505b50509050806135a15760405162461bcd60e51b81526004018080602001828103825260238152602001806151d56023913960400191505060405180910390fd5b505050565b60075460408051632984b7a960e21b81526001600160a01b03878116600483015286811660248301528581166044830152606482018590529151919092169163a612dea49160848083019260209291908290030181600087803b15801561360c57600080fd5b505af1158015613620573d6000803e3d6000fd5b505050506040513d602081101561363657600080fd5b505050505050565b600354604080516360ccef1960e11b81526f14d5d05417d1915157d4115490d1539560821b600482015290516000926001600160a01b03169163c199de32916024808301926020929190829003018186803b15801561369c57600080fd5b505afa1580156136b0573d6000803e3d6000fd5b505050506040513d60208110156136c657600080fd5b5051905090565b600061238583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614ea8565b60008261371e57506000611222565b8282028284828161372b57fe5b04146123855760405162461bcd60e51b81526004018080602001828103825260218152602001806150b86021913960400191505060405180910390fd5b60008084116137a85760405162461bcd60e51b815260040180806020018281038252602b81526020018061508d602b913960400191505060405180910390fd5b6000831180156137b85750600082115b6137f35760405162461bcd60e51b81526004018080602001828103825260288152602001806151556028913960400191505060405180910390fd5b6000613805858463ffffffff61370f16565b90506000613819858763ffffffff614e4e16565b9050808281611cf457fe5b6060825167ffffffffffffffff8111801561383e57600080fd5b50604051908082528060200260200182016040528015613868578160200160208202803683370190505b509050838160008151811061387957fe5b602090810291909101015260005b600184510381101561394e5760008482815181106138a157fe5b6020026020010151905060008583600101815181106138bc57fe5b602002602001015190506000806138e9600460009054906101000a90046001600160a01b03168585614d80565b9150915060006139128787815181106138fe57fe5b6020026020010151610e756127108b6136cd565b905061392361271082048484613768565b87876001018151811061393257fe5b6020908102919091010152505060019093019250613887915050565b509392505050565b60008060006139658585614ca9565b915091506000828260405160200180836001600160a01b03166001600160a01b031660601b8152601401826001600160a01b03166001600160a01b031660601b815260140192505050604051602081830303815290604052805190602001209050600060ff60f81b88838a6001600160a01b0316637c7f84ee6040518163ffffffff1660e01b815260040160206040518083038186803b158015613a0857600080fd5b505afa158015613a1c573d6000803e3d6000fd5b505050506040513d6020811015613a3257600080fd5b5051604080516001600160f81b03199590951660208087019190915260609490941b6bffffffffffffffffffffffff191660218601526035850192909252605580850191909152815180850390910181526075909301905281519101206001600160a01b031698975050505050505050565b613ab0848484846149e0565b613abc838386846135a6565b50505050565b600854600160a01b900460ff1615613b10576040805162461bcd60e51b815260206004820152600c60248201526b11115350560814105554d15160a21b604482015290519081900360640190fd5b613b3082600184510381518110613b2357fe5b60200260200101516128ed565b613b6b5760405162461bcd60e51b815260040180806020018281038252602f81526020018061523e602f913960400191505060405180910390fd5b60005b6001835103811015613ee057600080848381518110613b8957fe5b6020026020010151858460010181518110613ba057fe5b602002602001015191509150613bb5826128ed565b613bf05760405162461bcd60e51b81526004018080602001828103825260318152602001806151246031913960400191505060405180910390fd5b6003546040805163a9ece1b760e01b81526001600160a01b03858116600483015284811660248301529151919092169163a9ece1b7916044808301926020929190829003018186803b158015613c4557600080fd5b505afa158015613c59573d6000803e3d6000fd5b505050506040513d6020811015613c6f57600080fd5b5051613cac5760405162461bcd60e51b815260040180806020018281038252602c8152602001806151a9602c913960400191505060405180910390fd5b600080613cb98484614ca9565b915091506000888660010181518110613cce57fe5b60200260200101519050600080846001600160a01b0316876001600160a01b031614613cfc57826000613d00565b6000835b91509150600060028b51038910613d175789613d48565b6004548b51613d48916001600160a01b03169089908e9060028e01908110613d3b57fe5b6020026020010151613956565b600454909150613d62906001600160a01b03168989613956565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613d9f576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613e10578181015183820152602001613df8565b50505050905090810190601f168015613e3d5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613e5f57600080fd5b505af1158015613e73573d6000803e3d6000fd5b505050506000831115613ea357600454613ea390613e9b906001600160a01b03168a8a613956565b8288866135a6565b8115613ecc57600454613ecc90613ec4906001600160a01b03168a8a613956565b8287856135a6565b505060019096019550613b6e945050505050565b5081600183510381518110613ef157fe5b60200260200101516001600160a01b031682600081518110613f0f57fe5b60200260200101516001600160a01b0316826001600160a01b03167f3070708cdb5d7d3931be8443f49f7ec529e2bbe770b676e3c0cc40e158c5d03986600081518110613f5857fe5b602002602001015187600188510381518110613f7057fe5b6020026020010151604051808381526020018281526020019250505060405180910390a4505050565b6040805160028082526060808301845292602083019080368337505060025482519293506001600160a01b0316918391506001908110613fd557fe5b6001600160a01b039092166020928302919091019091015260005b60018451038110156134a7576000612710614010878481518110611b8557fe5b8161401757fe5b049050600085838151811061402857fe5b60200260200101519050600086846001018151811061404357fe5b60200260200101519050600061406f600460009054906101000a90046001600160a01b03168484613956565b6002549091506001600160a01b0384811691161415614123576002546008546040805163012d9b4160e71b8152600481018890526001600160a01b039384166024820152918316604483015251918316916396cda0809160648082019260009290919082900301818387803b1580156140e757600080fd5b505af11580156140fb573d6000803e3d6000fd5b505060085460025461411e93508492506001600160a01b039182169116876135a6565b614307565b6004546002546001600160a01b03808416926396cda080928892889261414f9290821691849116613956565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b1580156141b757600080fd5b505af11580156141cb573d6000803e3d6000fd5b5050600454600254600093508392506141f2916001600160a01b0390811691889116614d80565b915091506000614203878484613768565b600454600254919250614224916001600160a01b0391821691899116613956565b6002546008546040805163012d9b4160e71b8152600481018690526001600160a01b03938416602482015291831660448301525192909116916396cda0809160648082019260009290919082900301818387803b15801561428457600080fd5b505af1158015614298573d6000803e3d6000fd5b50506004546002546142c793508792506142c0916001600160a01b03908116918b9116613956565b888a6135a6565b600454600254614302916142e9916001600160a01b03918216918a9116613956565b6008546002546001600160a01b039182169116846135a6565b955050505b831561437b576008546040805163e60a6a0b60e01b81526001600160a01b038481166004830152602482018890529151919092169163e60a6a0b91604480830192600092919082900301818387803b15801561436257600080fd5b505af1158015614376573d6000803e3d6000fd5b505050505b505060019092019150613ff09050565b6060825167ffffffffffffffff811180156143a557600080fd5b506040519080825280602002602001820160405280156143cf578160200160208202803683370190505b50905083816001855103815181106143e357fe5b60209081029190910101528251600019015b80156144cd57600084600183038151811061440c57fe5b60200260200101519050600085838151811061442457fe5b60200260200101519050600080614451600460009054906101000a90046001600160a01b03168585614d80565b91509150600061447587878151811061446657fe5b60200260200101518484614bdb565b90506144a16144866127108a6136cd565b6144928361271061370f565b8161449957fe5b046001614e4e565b8760018803815181106144b057fe5b6020908102919091010152505060001990930192506143f5915050565b506144ed816000815181106144de57fe5b60200260200101518484613824565b949350505050565b600480546040805163e6a4390560e01b81526001600160a01b038a811694820194909452888416602482015290516000938493849391169163e6a4390591604480820192602092909190829003018186803b15801561455357600080fd5b505afa158015614567573d6000803e3d6000fd5b505050506040513d602081101561457d57600080fd5b50516001600160a01b0316141561470c576003546040805163d48bfca760e01b81526001600160a01b038b811660048301529151919092169163d48bfca79160248083019260209291908290030181600087803b1580156145dd57600080fd5b505af11580156145f1573d6000803e3d6000fd5b505050506040513d602081101561460757600080fd5b50506003546040805163d48bfca760e01b81526001600160a01b038a811660048301529151919092169163d48bfca79160248083019260209291908290030181600087803b15801561465857600080fd5b505af115801561466c573d6000803e3d6000fd5b505050506040513d602081101561468257600080fd5b505060048054604080516364e329cb60e11b81526001600160a01b038c8116948201949094528a841660248201529051929091169163c9c65396916044808201926020929091908290030181600087803b1580156146df57600080fd5b505af11580156146f3573d6000803e3d6000fd5b505050506040513d602081101561470957600080fd5b50505b6003546040805163a9ece1b760e01b81526001600160a01b038b811660048301528a811660248301529151919092169163a9ece1b7916044808301926020929190829003018186803b15801561476157600080fd5b505afa158015614775573d6000803e3d6000fd5b505050506040513d602081101561478b57600080fd5b50516147c85760405162461bcd60e51b81526004018080602001828103825260358152602001806150586035913960400191505060405180910390fd5b60045460009081906147e4906001600160a01b03168b8b614d80565b915091508160001480156147f6575080155b15614806578793508692506148c6565b6000614813898484614f3f565b9050878111614866578581101561485b5760405162461bcd60e51b81526004018080602001828103825260268152602001806151f86026913960400191505060405180910390fd5b8894509250826148c4565b6000614873898486614f3f565b90508981111561487f57fe5b878110156148be5760405162461bcd60e51b81526004018080602001828103825260268152602001806150fe6026913960400191505060405180910390fd5b94508793505b505b600480546040805163e6a4390560e01b81526001600160a01b038e8116948201949094528c841660248201529051929091169163c9ead258913391849163e6a43905916044808301926020929190829003018186803b15801561492857600080fd5b505afa15801561493c573d6000803e3d6000fd5b505050506040513d602081101561495257600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b1580156149a457600080fd5b505af11580156149b8573d6000803e3d6000fd5b505050506040513d60208110156149ce57600080fd5b50939a92995091975050505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310614a655780518252601f199092019160209182019101614a46565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614ac7576040519150601f19603f3d011682016040523d82523d6000602084013e614acc565b606091505b5091509150818015614afa575080511580614afa5750808060200190516020811015614af757600080fd5b50515b6136365760405162461bcd60e51b815260040180806020018281038252602481526020018061526d6024913960400191505060405180910390fd5b6005546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015614b8b57600080fd5b505af1158015614b9f573d6000803e3d6000fd5b505050506040513d6020811015614bb557600080fd5b5051614bbd57fe5b600554614bd790309084906001600160a01b0316846135a6565b5050565b6000808411614c1b5760405162461bcd60e51b815260040180806020018281038252602c81526020018061517d602c913960400191505060405180910390fd5b600083118015614c2b5750600082115b614c665760405162461bcd60e51b81526004018080602001828103825260288152602001806151556028913960400191505060405180910390fd5b6000614c78848663ffffffff61370f16565b90506000614c8c848763ffffffff6136cd16565b9050610e8f6001828481614c9c57fe5b049063ffffffff614e4e16565b600080826001600160a01b0316846001600160a01b03161415614cfd5760405162461bcd60e51b81526004018080602001828103825260258152602001806150d96025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610614d1d578284614d20565b83835b90925090506001600160a01b0382166128d7576040805162461bcd60e51b815260206004820152601e60248201527f44656d6178537761704c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b6000806000614d8f8585614ca9565b509050600080614da0888888613956565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015614dd857600080fd5b505afa158015614dec573d6000803e3d6000fd5b505050506040513d6060811015614e0257600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b0387811690841614614e3c578082614e3f565b81815b90999098509650505050505050565b600082820183811015612385576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008184841115614f375760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614efc578181015183820152602001614ee4565b50505050905090810190601f168015614f295780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000808411614f7f5760405162461bcd60e51b81526004018080602001828103825260258152602001806150136025913960400191505060405180910390fd5b600083118015614f8f5750600082115b614fca5760405162461bcd60e51b81526004018080602001828103825260288152602001806151556028913960400191505060405180910390fd5b82614fdb858463ffffffff61370f16565b81614fe257fe5b0494935050505056fe44454d415820504c4154464f524d203a204558434553534956455f494e5055545f414d4f554e5444656d6178537761704c6962726172793a20494e53554646494349454e545f414d4f554e5444454d415820504c4154464f524d203a2045585049524544000000000000000044454d415820504c4154464f524d203a20414444204c4951554944495459205041495220434f4e46494720434845434b204641494c44656d6178537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7744656d6178537761704c6962726172793a204944454e544943414c5f41444452455353455344454d415820504c4154464f524d203a20494e53554646494349454e545f415f414d4f554e5444454d415820504c4154464f524d203a20434845434b20444741532f544f4b454e2056414c55452046524f4d204641494c44656d6178537761704c6962726172793a20494e53554646494349454e545f4c495155494449545944656d6178537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e5444454d415820504c4154464f524d203a2053574150205041495220434f4e46494720434845434b204641494c5472616e7366657248656c7065723a204554485f5452414e534645525f4641494c454444454d415820504c4154464f524d203a20494e53554646494349454e545f425f414d4f554e5444454d415820504c4154464f524d203a20494e56414c49445f5041544800000044454d415820504c4154464f524d203a20434845434b20444741532f544f4b454e20544f2056414c5545204641494c5472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c454444454d415820504c4154464f524d203a20494e53554646494349454e545f4f55545055545f414d4f554e54a264697066735822122053277956602222a84aa1b322bb86cea17c655dbb8fe9ab046dabc5c6bedc9c3664736f6c63430006060033

Deployed ByteCode Sourcemap

18857:24239:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19844:4;;-1:-1:-1;;;;;19844:4:0;19830:10;:18;19823:26;;;;18857:24239;;12:1:-1;9;2:12;26306:845:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26306:845:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;26306:845:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20542:71;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20542:71:0;;;:::i;40980:404::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40980:404:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40980:404:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;19040:25;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19040:25:0;;;:::i;:::-;;;;-1:-1:-1;;;;;19040:25:0;;;;;;;;;;;;;;35682:1172;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35682:1172:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;35682:1172:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;35682:1172:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;35682:1172:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;35682:1172:0;;-1:-1:-1;35682:1172:0;-1:-1:-1;;;;;;35682:1172: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;35682:1172:0;;;;;;;;;;;;;;;;;42036:225;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42036:225:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;42036:225:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;42036:225:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;42036:225:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;42036:225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;42036:225:0;;-1:-1:-1;42036:225:0;;-1:-1:-1;;;;;42036:225:0:i;18985:22::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18985:22:0;;;:::i;20002:455::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20002:455:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20002:455:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33076:948::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33076:948:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;33076:948:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33076:948:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33076:948:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33076:948:0;;-1:-1:-1;33076:948:0;-1:-1:-1;;;;;;33076:948:0;;;;;;;;:::i;37798:1152::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37798:1152:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;37798:1152:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;37798:1152:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37798:1152:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37798:1152:0;;-1:-1:-1;37798:1152:0;-1:-1:-1;;;;;;37798:1152:0;;;;;;;;:::i;18898:26::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18898:26:0;;;:::i;18931:19::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18931:19:0;;;:::i;19111:::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19111:19:0;;;:::i;22352:1199::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22352:1199:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22352:1199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;34494:1180;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;34494:1180:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34494:1180:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34494:1180:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34494:1180:0;;-1:-1:-1;34494:1180:0;-1:-1:-1;;;;;;34494:1180:0;;;;;;;;:::i;19072:32::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19072:32:0;;;:::i;20465:69::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20465:69:0;;;:::i;41392:403::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41392:403:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41392:403:0;;;;;;;;;;;;:::i;36862:928::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36862:928:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;36862:928:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;36862:928:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;36862:928:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36862:928:0;;-1:-1:-1;36862:928:0;-1:-1:-1;;;;;;36862:928:0;;;;;;;;:::i;42269:824::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42269:824:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;42269:824:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;42269:824:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;42269:824:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;42269:824:0;;-1:-1:-1;42269:824:0;-1:-1:-1;42269:824:0;:::i;436:20::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;436:20:0;;;:::i;40818:154::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40818:154:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;40818:154:0;;;;;;;;;;:::i;19137:51::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19137:51:0;;;:::i;722:210::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;722:210:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;722:210:0;-1:-1:-1;;;;;722:210:0;;:::i;19014:19::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19014:19:0;;;:::i;24994:1304::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24994:1304:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;24994:1304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;40467:164::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40467:164:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;40467:164:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41803:225;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41803:225:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;41803:225:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;41803:225:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;41803:225:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;41803:225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41803:225:0;;-1:-1:-1;41803:225:0;;-1:-1:-1;;;;;41803:225:0:i;40639:171::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40639:171:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;40639:171:0;;;;;;;;;;:::i;18957:21::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18957:21:0;;;:::i;28783:1078::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28783:1078:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28783:1078:0;-1:-1:-1;;;;;28783:1078:0;;:::i;23559:1427::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23559:1427:0;;;;;;;;;;;;;;;;;;;;;;;:::i;38958:1259::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;38958:1259:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;38958:1259:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;38958:1259:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38958:1259:0;;-1:-1:-1;38958:1259:0;-1:-1:-1;;;;;;38958:1259:0;;;;;;;;:::i;19197:19::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19197:19:0;;;:::i;26306:845::-;26538:19;26559:17;26519:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;26598:7:::1;::::0;-1:-1:-1;;;26598:7:0;::::1;;;26597:8;26589:33;;;::::0;;-1:-1:-1;;;26589:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26589:33:0;;;;;;;;;;;;;::::1;;26710:4;::::0;26660:196:::1;::::0;26690:5;;-1:-1:-1;;;;;26710:4:0::1;26729:9:::0;26753:14;26782:12;26817:4:::1;26837:8:::0;26660:15:::1;:196::i;:::-;26633:223:::0;;-1:-1:-1;26633:223:0;-1:-1:-1;26867:51:0::1;26895:5:::0;26902:2;26633:223;26867:27:::1;:51::i;:::-;26935:4;::::0;26929:31:::1;::::0;;-1:-1:-1;;;26929:31:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;26935:4:0;;::::1;::::0;26929:20:::1;::::0;:31;;;;;26935:4:::1;::::0;26929:31;;;;;;;;26935:4;;26929:31;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;26929:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26929:31:0;;;;26971:45;27002:2;27006:9;26971:30;:45::i;:::-;27027:54;27051:4;27058:2;27062:5;27069:11;27027:15;:54::i;:::-;27127:4;::::0;27092:51:::1;::::0;27116:4:::1;::::0;27123:2;;-1:-1:-1;;;;;27127:4:0::1;27133:9:::0;27092:15:::1;:51::i;:::-;26306:845:::0;;;;;;;;;;:::o;20542:71::-;666:5;;-1:-1:-1;;;;;666:5:0;652:10;:19;644:50;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;;;;20590:7:::1;:15:::0;;-1:-1:-1;;;;20590:15:0::1;::::0;;20542:71::o;40980:404::-;41114:17;41144:15;41162:20;:18;:20::i;:::-;41144:38;;41193:14;19183:5;41210:66;41223:8;41233:42;19183:5;41267:7;41233:12;:42::i;:::-;41210:12;:66::i;:::-;:88;;;;;;41193:105;;41316:60;41346:6;41354:9;41365:10;41316:29;:60::i;:::-;41309:67;40980:404;-1:-1:-1;;;;;;40980:404:0:o;19040:25::-;;;-1:-1:-1;;;;;19040:25:0;;:::o;35682:1172::-;35895:24;35876:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;35965:4:::1;::::0;-1:-1:-1;;;;;35965:4:0::1;35940::::0;;-1:-1:-1;;35945:15:0;;35940:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;35940:21:0::1;-1:-1:-1::0;;;;;35940:29:0::1;;35932:71;;;::::0;;-1:-1:-1;;;35932:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35932:71:0;;;;;;;;;;;;;::::1;;36014:15;36032:20;:18;:20::i;:::-;36014:38;;36073:39;36088:8;36098:4;;36073:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36104:7:0;;-1:-1:-1;36073:14:0::1;::::0;-1:-1:-1;;36073:39:0:i:1;:::-;36063:49;;36162:12;36131:7;36156:1;36139:7;:14;:18;36131:27;;;;;;;;;;;;;;:43;;36123:99;;;;-1:-1:-1::0;;;36123:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36273:7;::::0;36233:12:::1;::::0;36248:51:::1;::::0;-1:-1:-1;;;;;36273:7:0::1;36282:4:::0;;36233:12;36282:7;::::1;;;;;;;;;;-1:-1:-1::0;;;;;36282:7:0::1;36291:4;;36296:1;36291:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36291:7:0::1;36248:24;:51::i;:::-;36233:66;;36310:198;36343:4;;36348:1;36343:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36343:7:0::1;36365:10;36390:4;19183:5;36409:66;36422:8;36432:42;19183:5;36466:7;36432:12;:42::i;36409:66::-;:88;;;;;;36310:18;:198::i;:::-;36519:35;36525:7;36534:4;;36519:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36548:4:0::1;::::0;-1:-1:-1;36519:5:0::1;::::0;-1:-1:-1;;36519:35:0:i:1;:::-;36571:4;::::0;36594:14;;-1:-1:-1;;;;;36571:4:0;;::::1;::::0;36565:20:::1;::::0;36586:7;;-1:-1:-1;;36594:18:0;;;36586:27;::::1;;;;;;;;;;;36565:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36565:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36565:49:0;;;;36625:63;36656:2;36660:7;36685:1;36668:7;:14;:18;36660:27;;;;;;;;;;;;;;36625:30;:63::i;:::-;36701:102;36720:4;;36725:1;36720:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;36720:7:0::1;36729:10;36741:4;19183:5;36747:33;36760:7;36768:1;36760:10;;;;;;;;;;;;;;36772:7;36747:12;:33::i;36701:102::-;36814:32;36823:7;36832:4;;36814:32;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36838:7:0;;-1:-1:-1;36814:8:0::1;::::0;-1:-1:-1;;36814:32:0:i:1;:::-;19985:1;;35682:1172:::0;;;;;;;;;:::o;42036:225::-;42121:24;42158:15;42176:20;:18;:20::i;:::-;42158:38;;42214:39;42228:9;42239:4;42245:7;42214:13;:39::i;:::-;42207:46;;;42036:225;;;;;:::o;18985:22::-;;;-1:-1:-1;;;;;18985:22:0;;:::o;20002:455::-;666:5;;-1:-1:-1;;;;;666:5:0;652:10;:19;644:50;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;;;;20251:4:::1;:12:::0;;-1:-1:-1;;;;;;20251:12:0;;::::1;-1:-1:-1::0;;;;;20251:12:0;;::::1;;::::0;;;20274:6:::1;:16:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;20301:7:::1;:18:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;20330:4:::1;:12:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;20353:10:::1;:24:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;20388:17:::1;:38:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;20437:4:::1;:12:::0;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;20002:455::o;33076:948::-;33292:24;33273:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;33331:15:::1;33349:20;:18;:20::i;:::-;33331:38;;33390:39;33405:8;33415:4;;33390:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33421:7:0;;-1:-1:-1;33390:14:0::1;::::0;-1:-1:-1;;33390:39:0:i:1;:::-;33380:49;;33479:12;33448:7;33473:1;33456:7;:14;:18;33448:27;;;;;;;;;;;;;;:43;;33440:99;;;;-1:-1:-1::0;;;33440:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33590:7;::::0;33550:12:::1;::::0;33565:51:::1;::::0;-1:-1:-1;;;;;33590:7:0::1;33599:4:::0;;33550:12;33599:7;::::1;;;33565:51;33550:66;;33627:198;33660:4;;33665:1;33660:7;;;;;;33627:198;33836:24;33842:7;33851:4;;33836:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33857:2:0;;-1:-1:-1;33836:5:0::1;::::0;-1:-1:-1;;33836:24:0:i:1;37798:1152::-:0;38011:24;37992:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;38081:4:::1;::::0;-1:-1:-1;;;;;38081:4:0::1;38056::::0;;-1:-1:-1;;38061:15:0;;38056:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;38056:21:0::1;-1:-1:-1::0;;;;;38056:29:0::1;;38048:71;;;::::0;;-1:-1:-1;;;38048:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;38048:71:0;;;;;;;;;;;;;::::1;;38130:15;38148:20;:18;:20::i;:::-;38130:38;;38189:39;38203:9;38214:4;;38189:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;38220:7:0;;-1:-1:-1;38189:13:0::1;::::0;-1:-1:-1;;38189:39:0:i:1;:::-;38179:49;;38261:11;38247:7;38255:1;38247:10;;;;;;;;;;;;;;:25;;38239:77;;;;-1:-1:-1::0;;;38239:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38367:7;::::0;38327:12:::1;::::0;38342:51:::1;::::0;-1:-1:-1;;;;;38367:7:0::1;38376:4:::0;;38327:12;38376:7;::::1;;;38342:51;38327:66;;38404:200;38437:4;;38442:1;38437:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;38437:7:0::1;38459:10;38484:4;19183:5;38503:68;38516:7;38524:1;38516:10;;;;;;;;;;;;;;38528:42;19183:5;38562:7;38528:12;:42::i;18898:26::-:0;;;;:::o;18931:19::-;;;-1:-1:-1;;;;;18931:19:0;;:::o;19111:::-;;;-1:-1:-1;;;;;19111:19:0;;:::o;22352:1199::-;22644:16;22675;22706:18;22602:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;22761:7:::1;::::0;-1:-1:-1;;;22761:7:0;::::1;;;22760:8;22752:33;;;::::0;;-1:-1:-1;;;22752:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22752:33:0;;;;;;;;;;;;;::::1;;22819:71;22833:6;22841;22849:7;22858;22867:10;22879;22819:13;:71::i;:::-;22941:7;::::0;22796:94;;-1:-1:-1;22796:94:0;-1:-1:-1;22901:12:0::1;::::0;22916:49:::1;::::0;-1:-1:-1;;;;;22941:7:0::1;22950:6:::0;22958;22916:24:::1;:49::i;:::-;22901:64;;22976:67;23008:6;23016:10;23028:4;23034:8;22976:31;:67::i;:::-;23054;23086:6;23094:10;23106:4;23112:8;23054:31;:67::i;:::-;23169:4;::::0;23158:57:::1;::::0;;-1:-1:-1;;;23158:57:0;;-1:-1:-1;;;;;23158:57:0;;::::1;;::::0;::::1;::::0;23204:10:::1;23158:57:::0;;;;;;23169:4;;;::::1;::::0;23158:39:::1;::::0;:57;;;;;23169:4:::1;::::0;23158:57;;;;;;;23169:4;;23158:57;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23158:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;23239:33:0::1;::::0;;-1:-1:-1;;;23239:33:0;;23261:10:::1;23239:33;::::0;::::1;::::0;;;-1:-1:-1;;;;;23239:21:0;::::1;::::0;-1:-1:-1;23239:21:0::1;::::0;-1:-1:-1;23239:33:0;;;;;::::1;::::0;;;;;;;;-1:-1:-1;23239:21:0;:33;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23239:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23239:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23239:33:0;23294:4:::1;::::0;23283:58:::1;::::0;;-1:-1:-1;;;23283:58:0;;-1:-1:-1;;;;;23283:58:0;;::::1;;::::0;::::1;::::0;23330:10:::1;23283:58:::0;;;;;;23239:33;;-1:-1:-1;23294:4:0;::::1;::::0;23283:40:::1;::::0;:58;;;;;23294:4:::1;::::0;23283:58;;;;;;;;23294:4;;23283:58;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23283:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23283:58:0;;;;23354:51;23370:10;23382:4;23388:6;23396:8;23354:15;:51::i;:::-;23416;23432:10;23444:4;23450:6;23458:8;23416:15;:51::i;:::-;23516:6;-1:-1:-1::0;;;;;23483:60:0::1;23508:6;-1:-1:-1::0;;;;;23483:60:0::1;23496:10;-1:-1:-1::0;;;;;23483:60:0::1;;23524:8;23534;23483:60;;;;;;;;;;;;;;;;;;;;;;;;19985:1;22352:1199:::0;;;;;;;;;;;;:::o;34494:1180::-;34688:24;34669:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;34744:4:::1;::::0;-1:-1:-1;;;;;34744:4:0::1;34733::::0;;34744::::1;34733:7:::0;::::1;;;;;;;;;;-1:-1:-1::0;;;;;34733:7:0::1;-1:-1:-1::0;;;;;34733:15:0::1;;34725:57;;;::::0;;-1:-1:-1;;;34725:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;34725:57:0;;;;;;;;;;;;;::::1;;34793:15;34811:20;:18;:20::i;:::-;34793:38;;34852:40;34867:9;34878:4;;34852:40;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;34884:7:0;;-1:-1:-1;34852:14:0::1;::::0;-1:-1:-1;;34852:40:0:i:1;:::-;34842:50;;34942:12;34911:7;34936:1;34919:7;:14;:18;34911:27;;;;;;;;;;;;;;:43;;34903:99;;;;-1:-1:-1::0;;;34903:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35053:7;::::0;35013:12:::1;::::0;35028:51:::1;::::0;-1:-1:-1;;;;;35053:7:0::1;35062:4:::0;;35013:12;35062:7;::::1;;;35028:51;35096:4;::::0;35144:10;;35013:66;;-1:-1:-1;;;;;;35096:4:0::1;::::0;35090:19:::1;::::0;19183:5:::1;::::0;35131:68:::1;::::0;35144:7;;35096:4:::1;::::0;35144:10:::1;;;;;;;;;;35156:42;19183:5;35190:7;35156:12;:42::i;35131:68::-;:90;;;;;;35090:144;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35090:144:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35090:144:0;;;;;35245:153;35278:4;19183:5;35297:68;35310:7;35318:1;35310:10;;;;;;;35297:68;:90;;;;;;35245:18;:153::i;:::-;35409:24;35415:7;35424:4;;35409:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35430:2:0;;-1:-1:-1;35409:5:0::1;::::0;-1:-1:-1;;35409:24:0:i:1;:::-;35452:4;::::0;35486:10;;-1:-1:-1;;;;;35452:4:0;;::::1;::::0;35446:19:::1;::::0;19183:5:::1;::::0;35473:33:::1;::::0;35486:7;;35452:4:::1;::::0;35486:10:::1;;;;;;;;;;35498:7;35473:12;:33::i;:::-;:55;;;;;;35446:85;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35446:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35446:85:0;;;;;35542:81;35561:4;19183:5;35567:33;35580:7;35588:1;35580:10;;;;;;;35542:81;35634:32;35643:7;35652:4;;35634:32;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;35658:7:0;;-1:-1:-1;35634:8:0::1;::::0;-1:-1:-1;;35634:32:0:i:1;:::-;19985:1;;34494:1180:::0;;;;;;;;:::o;19072:32::-;;;-1:-1:-1;;;;;19072:32:0;;:::o;20465:69::-;666:5;;-1:-1:-1;;;;;666:5:0;652:10;:19;644:50;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;;;;20512:7:::1;:14:::0;;-1:-1:-1;;;;20512:14:0::1;-1:-1:-1::0;;;20512:14:0::1;::::0;;20465:69::o;41392:403::-;41526:16;41555:15;41573:20;:18;:20::i;:::-;41555:38;;41604:14;41621:62;41650:9;41661;41672:10;41621:28;:62::i;:::-;41604:79;;41745:42;19183:5;41779:7;41745:12;:42::i;:::-;41701:41;41714:6;19183:5;41701:12;:41::i;:::-;:86;;;;;;;41392:403;-1:-1:-1;;;;;;41392:403:0:o;36862:928::-;37078:24;37059:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;37115:15:::1;37133:20;:18;:20::i;:::-;37115:38;;37174:39;37188:9;37199:4;;37174:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;37205:7:0;;-1:-1:-1;37174:13:0::1;::::0;-1:-1:-1;;37174:39:0:i:1;:::-;37164:49;;37246:11;37232:7;37240:1;37232:10;;;;;;;;;;;;;;:25;;37224:77;;;;-1:-1:-1::0;;;37224:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37352:7;::::0;37312:12:::1;::::0;37327:51:::1;::::0;-1:-1:-1;;;;;37352:7:0::1;37361:4:::0;;37312:12;37361:7;::::1;;;37327:51;37312:66;;37391:200;37424:4;;37429:1;37424:7;;;;;;42269:824:::0;666:5;;-1:-1:-1;;;;;666:5:0;652:10;:19;644:50;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;;;;42415:7:::1;::::0;;42401:46:::1;::::0;;-1:-1:-1;;;42401:46:0;;-1:-1:-1;;;;;42401:46:0;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;-1:-1:-1;;42415:7:0;;::::1;::::0;42401:30:::1;::::0;:46;;;;;::::1;::::0;;;;;;;;;42415:7;42401:46;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;42401:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42401:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;42401:46:0;-1:-1:-1;;;;;42401:60:0::1;;42397:142;;;42492:7;::::0;;42478:49:::1;::::0;;-1:-1:-1;;;42478:49:0;;-1:-1:-1;;;;;42478:49:0;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;42492:7;;;::::1;::::0;42478:33:::1;::::0;:49;;;;;::::1;::::0;;;;;;;;;42492:7:::1;::::0;42478:49;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;42478:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42478:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;42397:142:0::1;42581:7;::::0;;42567:46:::1;::::0;;-1:-1:-1;;;42567:46:0;;-1:-1:-1;;;;;42567:46:0;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;42549:15:::1;::::0;42581:7;;::::1;::::0;42567:30:::1;::::0;:46;;;;;::::1;::::0;;;;;;;;;42581:7;42567:46;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;42567:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42567:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;42567:46:0;;-1:-1:-1;42628:6:0::1;42624:364;42640:16:::0;;::::1;42624:364;;;42678:14;42706:4;-1:-1:-1::0;;;;;42695:26:0::1;;42722:5;;42728:1;42722:8;;;;;;;;;;;;;-1:-1:-1::0;;;;;42722:8:0::1;42695:36;;;;;;;;;;;;;-1:-1:-1::0;;;;;42695:36:0::1;-1:-1:-1::0;;;;;42695:36:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42695:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42695:36:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;42695:36:0;;-1:-1:-1;42749:13:0;;42746:231:::1;;42794:4;-1:-1:-1::0;;;;;42783:21:0::1;;42805:5;;42811:1;42805:8;;;;;;;;;;;;;-1:-1:-1::0;;;;;42805:8:0::1;42815:7;42824:9;42783:51;;;;;;;;;;;;;-1:-1:-1::0;;;;;42783:51:0::1;-1:-1:-1::0;;;;;42783:51:0::1;;;;;;-1:-1:-1::0;;;;;42783:51:0::1;-1:-1:-1::0;;;;;42783:51:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42783:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42783:51:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;;;;;;42853:24:0;::::1;;42878:5:::0;;42884:1;42878:8;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;42878:8:0::1;42853:34;;;;;;;;;;;;;-1:-1:-1::0;;;;;42853:34:0::1;-1:-1:-1::0;;;;;42853:34:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42853:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42853:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;42920:7:0::1;::::0;-1:-1:-1;;;;;42920:7:0::1;42906:36;42943:5:::0;;42949:1;42943:8;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;42943:8:0::1;42953:7;42906:55;;;;;;;;;;;;;-1:-1:-1::0;;;;;42906:55:0::1;-1:-1:-1::0;;;;;42906:55:0::1;;;;;;-1:-1:-1::0;;;;;42906:55:0::1;-1:-1:-1::0;;;;;42906:55:0::1;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42906:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42906:55:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;42746:231:0::1;-1:-1:-1::0;42658:3:0::1;;42624:364;;;-1:-1:-1::0;43023:17:0::1;::::0;43000:75:::1;::::0;;-1:-1:-1;;;43000:75:0;;-1:-1:-1;;;;;43000:75:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;43023:17;;;::::1;::::0;43000:60:::1;::::0;:75;;;;;43023:17:::1;::::0;43000:75;;;;;;;43023:17;;43000:75;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;43000:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43000:75:0;;;;705:1;42269:824:::0;;;;;:::o;436:20::-;;;-1:-1:-1;;;;;436:20:0;;:::o;40818:154::-;40940:7;;40888;;40915:49;;-1:-1:-1;;;;;40940:7:0;40949:6;40957;40915:24;:49::i;:::-;40908:56;40818:154;-1:-1:-1;;;40818:154:0:o;19137:51::-;19183:5;19137:51;:::o;722:210::-;666:5;;-1:-1:-1;;;;;666:5:0;652:10;:19;644:50;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;-1:-1:-1;;;644:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;798:23:0;::::1;790:60;;;::::0;;-1:-1:-1;;;790:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;879:5;::::0;;866:30:::1;::::0;-1:-1:-1;;;;;866:30:0;;::::1;::::0;879:5;::::1;::::0;866:30:::1;::::0;::::1;907:5;:17:::0;;-1:-1:-1;;;;;;907:17:0::1;-1:-1:-1::0;;;;;907:17:0;;;::::1;::::0;;;::::1;::::0;;722:210::o;19014:19::-;;;-1:-1:-1;;;;;19014:19:0;;:::o;24994:1304::-;25243:15;25260;25224:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;25297:7:::1;::::0;-1:-1:-1;;;25297:7:0;::::1;;;25296:8;25288:33;;;::::0;;-1:-1:-1;;;25288:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;25288:33:0;;;;;;;;;;;;;::::1;;25372:7;::::0;25332:12:::1;::::0;25347:49:::1;::::0;-1:-1:-1;;;;;25372:7:0::1;25381:6:::0;25389;25347:24:::1;:49::i;:::-;25555:4;::::0;25544:57:::1;::::0;;-1:-1:-1;;;25544:57:0;;-1:-1:-1;;;;;25544:57:0;;::::1;;::::0;::::1;::::0;25590:10:::1;25544:57:::0;;;;;;25332:64;;-1:-1:-1;25428:9:0;;25466:6;;25501;;25555:4:::1;::::0;25544:39:::1;::::0;:57;;;;;25407:18:::1;::::0;25544:57;;;;;;;25407:18;25555:4;25544:57;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;25544:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;25649:49:0::1;::::0;;-1:-1:-1;;;25649:49:0;;25671:10:::1;25649:49;::::0;::::1;::::0;-1:-1:-1;;;;;25649:49:0;;::::1;::::0;;;;;;;;;;;;25613:15:::1;::::0;-1:-1:-1;25613:15:0;;-1:-1:-1;25649:21:0;;::::1;::::0;::::1;::::0;:49;;;;;;;;;;;25613:15;25649:21;:49;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;25649:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25649:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;25649:49:0;;::::1;::::0;;::::1;::::0;25720:4:::1;::::0;25649:49;25709:58;;-1:-1:-1;;;25709:58:0;;-1:-1:-1;;;;;25709:58:0;;::::1;;::::0;::::1;::::0;25756:10:::1;25709:58:::0;;;;;;25649:49;;-1:-1:-1;25649:49:0;;-1:-1:-1;25720:4:0::1;::::0;25709:40:::1;::::0;:58;;;;;25720:4:::1;::::0;25709:58;;;;;;;;25720:4;;25709:58;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;25709:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25709:58:0;;;;25781:14;25801:45;25829:7;25838;25801:27;:45::i;:::-;25780:66;;;25889:6;-1:-1:-1::0;;;;;25878:17:0::1;:7;-1:-1:-1::0;;;;;25878:17:0::1;;:59;;25920:7;25929;25878:59;;;25899:7;25908;25878:59;25857:80:::0;;-1:-1:-1;25857:80:0;-1:-1:-1;25948:43:0::1;25964:4:::0;25970:2;25974:7;25857:80;25948:15:::1;:43::i;:::-;26002;26018:4;26024:2;26028:7;26037;26002:15;:43::i;:::-;26075:10;26064:7;:21;;26056:72;;;;-1:-1:-1::0;;;26056:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26158:10;26147:7;:21;;26139:72;;;;-1:-1:-1::0;;;26139:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26264:7;-1:-1:-1::0;;;;;26227:63:0::1;26255:7;-1:-1:-1::0;;;;;26227:63:0::1;26243:10;-1:-1:-1::0;;;;;26227:63:0::1;;26273:7;26282;26227:63;;;;;;;;;;;;;;;;;;;;;;;;19985:1;;;;;;;24994:1304:::0;;;;;;;;;;;:::o;40467:164::-;40577:7;;;40563:46;;;-1:-1:-1;;;40563:46:0;;-1:-1:-1;;;;;40563:46:0;;;;;;;;;;;;;;;;;;;40539:4;;;;40577:7;;40563:30;;:46;;;;;;;;;;;;;;40577:7;40563:46;;;2:2:-1;;;;27:1;24;17:12;2:2;40563:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40563:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40563:46:0;-1:-1:-1;;;;;40563:60:0;;;;40467:164;-1:-1:-1;;;40467:164:0:o;41803:225::-;41888:24;41925:15;41943:20;:18;:20::i;:::-;41925:38;;41981:39;41996:8;42006:4;42012:7;41981:14;:39::i;40639:171::-;40778:7;;40713;;;;40749:53;;-1:-1:-1;;;;;40778:7:0;40787:6;40795;40749:28;:53::i;:::-;40742:60;;;;40639:171;;;;;;:::o;18957:21::-;;;-1:-1:-1;;;;;18957:21:0;;:::o;28783:1078::-;28875:4;;28845;;-1:-1:-1;;;;;28866:13:0;;;28875:4;;28866:13;;:30;;-1:-1:-1;28892:4:0;;-1:-1:-1;;;;;28883:13:0;;;28892:4;;28883:13;28866:30;28862:47;;;-1:-1:-1;28905:4:0;28898:11;;28862:47;28951:6;;28938:79;;;-1:-1:-1;;;28938:79:0;;17264:41;28938:79;;;;;;28920:15;;-1:-1:-1;;;;;28951:6:0;;28938:35;;:79;;;;;;;;;;;;;;28951:6;28938:79;;;2:2:-1;;;;27:1;24;17:12;2:2;28938:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28938:79:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28938:79:0;29043:4;;29049;;28938:79;;-1:-1:-1;29033:21:0;;-1:-1:-1;;;;;29043:4:0;;;;29049;29033:9;:21::i;:::-;29028:40;;29063:5;29056:12;;;;;29028:40;29094:4;;29084:22;;-1:-1:-1;;;;;29094:4:0;29100:5;29084:9;:22::i;:::-;29079:41;;29115:5;29108:12;;;;;29079:41;29150:6;;29168:4;;29137:43;;;-1:-1:-1;;;29137:43:0;;-1:-1:-1;;;;;29168:4:0;;;29137:43;;;;;;;;;;;;;29150:6;;;;;29137:30;;:43;;;;;;;;;;;;;;29150:6;29137:43;;;2:2:-1;;;;27:1;24;17:12;2:2;29137:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29137:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29137:43:0;:90;;;;-1:-1:-1;29197:6:0;;29215:4;;29184:43;;;-1:-1:-1;;;29184:43:0;;-1:-1:-1;;;;;29215:4:0;;;29184:43;;;;;;;;;;;;;29197:6;;;;;29184:30;;:43;;;;;;;;;;;;;;29197:6;29184:43;;;2:2:-1;;;;27:1;24;17:12;2:2;29184:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29184:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29184:43:0;29137:90;29131:111;;29237:5;29230:12;;;;;29131:111;29268:4;;29258:22;;-1:-1:-1;;;;;29268:4:0;29274:5;29258:9;:22::i;:::-;29253:40;;29289:4;29282:11;;;;;29253:40;29308:12;29304:29;;29329:4;29322:11;;;;;29304:29;29399:7;;29408:4;;29345:19;;29370:50;;-1:-1:-1;;;;;29399:7:0;;;;29408:4;29414:5;29370:28;:50::i;:::-;-1:-1:-1;29486:7:0;;29495:4;;29344:76;;-1:-1:-1;29432:19:0;;29457:50;;-1:-1:-1;;;;;29486:7:0;;;;29495:4;29501:5;29457:28;:50::i;:::-;-1:-1:-1;29594:7:0;;29603:4;;29609;;29431:76;;-1:-1:-1;29519:20:0;;;;29565:49;;-1:-1:-1;;;;;29594:7:0;;;;29603:4;;;;29609;29565:28;:49::i;:::-;29518:96;;;;29625:17;29687:12;29645:39;29658:11;29671:12;29645;:39::i;:::-;:54;;;;;;29625:74;;29710:18;19183:5;29731:59;29744:36;29757:9;29768:11;29744:12;:36::i;:::-;29782:7;29731:12;:59::i;:::-;:81;;;;;;29830:23;;;;;-1:-1:-1;;;;;;;28783:1078:0;;;;:::o;23559:1427::-;23836:19;23870:17;23902;23794:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;23956:7:::1;::::0;-1:-1:-1;;;23956:7:0;::::1;;;23955:8;23947:33;;;::::0;;-1:-1:-1;;;23947:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;23947:33:0;;;;;;;;;;;;;::::1;;24066:4;::::0;24018:176:::1;::::0;24046:5;;-1:-1:-1;;;;;24066:4:0::1;24085:18:::0;24118:9:::1;24142:14:::0;24171:12;24018:13:::1;:176::i;:::-;24245:7;::::0;24261:4:::1;::::0;23991:203;;-1:-1:-1;23991:203:0;;-1:-1:-1;24205:12:0::1;::::0;24220:46:::1;::::0;-1:-1:-1;;;;;24245:7:0;;::::1;::::0;24254:5;;24261:4:::1;24220:24;:46::i;:::-;24205:61;;24277:69;24309:5;24316:10;24328:4;24334:11;24277:31;:69::i;:::-;24363:4;;;;;;;;;-1:-1:-1::0;;;;;24363:4:0::1;-1:-1:-1::0;;;;;24357:19:0::1;;24384:9;24357:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;24357:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;24420:4:0::1;::::0;24414:37:::1;::::0;;-1:-1:-1;;;24414:37:0;;-1:-1:-1;;;;;24414:37:0;;::::1;;::::0;::::1;::::0;;;;;;;;;24420:4;;;::::1;::::0;-1:-1:-1;24414:20:0::1;::::0;-1:-1:-1;24414:37:0;;;;;-1:-1:-1;24414:37:0::1;::::0;;;;;;24420:4:::1;::::0;24414:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24414:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24414:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24414:37:0;24407:45:::1;;;;24500:4;::::0;24489:57:::1;::::0;;-1:-1:-1;;;24489:57:0;;-1:-1:-1;;;;;24489:57:0;;::::1;;::::0;::::1;::::0;24535:10:::1;24489:57:::0;;;;;;24500:4;;;::::1;::::0;24489:39:::1;::::0;:57;;;;;24500:4:::1;::::0;24489:57;;;;;;;24500:4;;24489:57;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24489:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;24569:33:0::1;::::0;;-1:-1:-1;;;24569:33:0;;24591:10:::1;24569:33;::::0;::::1;::::0;;;-1:-1:-1;;;;;24569:21:0;::::1;::::0;-1:-1:-1;24569:21:0::1;::::0;-1:-1:-1;24569:33:0;;;;;::::1;::::0;;;;;;;;-1:-1:-1;24569:21:0;:33;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24569:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;24569:33:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;24569:33:0;24624:4:::1;::::0;24613:58:::1;::::0;;-1:-1:-1;;;24613:58:0;;-1:-1:-1;;;;;24613:58:0;;::::1;;::::0;::::1;::::0;24660:10:::1;24613:58:::0;;;;;;24569:33;;-1:-1:-1;24624:4:0;::::1;::::0;24613:40:::1;::::0;:58;;;;;24624:4:::1;::::0;24613:58;;;;;;;;24624:4;;24613:58;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;24613:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;24718:4:0::1;::::0;24684:50:::1;::::0;-1:-1:-1;24700:10:0::1;::::0;-1:-1:-1;24712:4:0;;-1:-1:-1;;;;;24718:4:0::1;24724:9:::0;24684:15:::1;:50::i;:::-;24745:53;24761:10;24773:4;24779:5;24786:11;24745:15;:53::i;:::-;24846:4;::::0;24814:61:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;24846:4:0;;::::1;::::0;24814:61;::::1;::::0;24827:10:::1;::::0;24814:61:::1;::::0;;;;;;;;;::::1;24902:9;24890;:21;24886:92;;;24913:65;24944:10;24968:9;24956;:21;24913:30;:65::i;:::-;19985:1;23559:1427:::0;;;;;;;;;;:::o;38958:1259::-;39149:24;39130:8;19930:15;19918:8;:27;;19910:64;;;;;-1:-1:-1;;;19910:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19910:64:0;;;;;;;;;;;;;;;39205:4:::1;::::0;-1:-1:-1;;;;;39205:4:0::1;39194::::0;;39205::::1;39194:7:::0;::::1;;;;;;;;;;-1:-1:-1::0;;;;;39194:7:0::1;-1:-1:-1::0;;;;;39194:15:0::1;;39186:57;;;::::0;;-1:-1:-1;;;39186:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;39186:57:0;;;;;;;;;;;;;::::1;;39254:15;39272:20;:18;:20::i;:::-;39254:38;;39313:39;39327:9;39338:4;;39313:39;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;39344:7:0;;-1:-1:-1;39313:13:0::1;::::0;-1:-1:-1;;39313:39:0:i:1;:::-;39303:49;;39385:9;39371:7;39379:1;39371:10;;;;;;;;;;;;;;:23;;39363:75;;;;-1:-1:-1::0;;;39363:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39457:4;::::0;39505:10;;-1:-1:-1;;;;;39457:4:0;;::::1;::::0;39451:19:::1;::::0;19183:5:::1;::::0;39492:68:::1;::::0;39505:7;;39457:4:::1;::::0;39505:10:::1;;;;;;;;;;39517:42;19183:5;39551:7;39517:12;:42::i;39492:68::-;:90;;;;;;39451:144;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;39451:144:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;;39646:7:0::1;::::0;39606:12:::1;::::0;-1:-1:-1;39621:51:0::1;::::0;-1:-1:-1;;;;;;39646:7:0::1;::::0;-1:-1:-1;39655:4:0;;39606:12;39655:7;::::1;;;39621:51;39606:66;;39683:153;39716:4;19183:5;39735:68;39748:7;39756:1;39748:10;;;;;;;39683:153;39847:24;39853:7;39862:4;;39847:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;39868:2:0;;-1:-1:-1;39847:5:0::1;::::0;-1:-1:-1;;39847:24:0:i:1;:::-;39890:4;::::0;39924:10;;-1:-1:-1;;;;;39890:4:0;;::::1;::::0;39884:19:::1;::::0;19183:5:::1;::::0;39911:33:::1;::::0;39924:7;;39890:4:::1;::::0;39924:10:::1;;;39911:33;:55;;;;;;39884:85;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;39884:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39884:85:0;;;;;39980:81;39999:4;19183:5;40005:33;40018:7;40026:1;40018:10;;;;;;;39980:81;40072:32;40081:7;40090:4;;40072:32;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;40096:7:0;;-1:-1:-1;40072:8:0::1;::::0;-1:-1:-1;;40072:32:0:i:1;:::-;40131:7;40139:1;40131:10;;;;;;;;;;;;;;40119:9;:22;40115:94;;;40143:66;40174:10;40198:7;40206:1;40198:10;;;;;;;;;;;;;;40186:9;:22;40143:30;:66::i;19197:19::-:0;;;-1:-1:-1;;;19197:19:0;;;;;:::o;10284:361::-;10479:45;;;-1:-1:-1;;;;;10479:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10479:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;10468:57:0;;;;10433:12;;10447:17;;10468:10;;;;10479:45;10468:57;;;25:18:-1;10468:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10468: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;;10432:93:0;;;;10544:7;:57;;;;-1:-1:-1;10556:11:0;;:16;;:44;;;10587:4;10576:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10576:24:0;10556:44;10536:101;;;;;-1:-1:-1;;;10536:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10284:361;;;;;:::o;11063:195::-;11171:12;;;11133;11171;;;;;;;;;-1:-1:-1;;;;;11150:7:0;;;11164:5;;11150:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;11150:34: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;;11132:52:0;;;11203:7;11195:55;;;;-1:-1:-1;;;11195:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11063:195;;;:::o;40225:234::-;40393:17;;40370:81;;;-1:-1:-1;;;40370:81:0;;-1:-1:-1;;;;;40370:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40393:17;;;;;40370:56;;:81;;;;;;;;;;;;;;40393:17;;40370:81;;;2:2:-1;;;;27:1;24;17:12;2:2;40370:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40370:81:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;40225:234:0:o;32915:153::-;33008:6;;32995:65;;;-1:-1:-1;;;32995:65:0;;-1:-1:-1;;;32995:65:0;;;;;;32968:7;;-1:-1:-1;;;;;33008:6:0;;32995:35;;:65;;;;;;;;;;;;;;33008:6;32995:65;;;2:2:-1;;;;27:1;24;17:12;2:2;32995:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32995:65:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32995:65:0;;-1:-1:-1;32915:153:0;:::o;12690:136::-;12748:7;12775:43;12779:1;12782;12775:43;;;;;;;;;;;;;;;;;:3;:43::i;13580:471::-;13638:7;13883:6;13879:47;;-1:-1:-1;13913:1:0;13906:8;;13879:47;13950:5;;;13954:1;13950;:5;:1;13974:5;;;;;:10;13966:56;;;;-1:-1:-1;;;13966:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8721:442;8814:14;8860:1;8849:8;:12;8841:68;;;;-1:-1:-1;;;8841:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8940:1;8928:9;:13;:31;;;;;8958:1;8945:10;:14;8928:31;8920:84;;;;-1:-1:-1;;;8920:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9015:14;9032:24;:8;9045:10;9032:24;:12;:24;:::i;:::-;9015:41;-1:-1:-1;9067:16:0;9086:23;:9;9100:8;9086:23;:13;:23;:::i;:::-;9067:42;;9144:11;9132:9;:23;;;;27159:739;27296:27;27363:4;:11;27349:26;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27349:26:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;27349:26:0;;27336:39;;27402:6;27386:10;27397:1;27386:13;;;;;;;;;;;;;;;;;:22;27424:9;27419:472;27457:1;27443:4;:11;:15;27439:1;:19;27419:472;;;27480:14;27497:4;27502:1;27497:7;;;;;;;;;;;;;;27480:24;;27519:15;27537:4;27542:1;27546;27542:5;27537:11;;;;;;;;;;;;;;27519:29;;27564:16;27582;27602:54;27631:7;;;;;;;;;-1:-1:-1;;;;;27631:7:0;27640:6;27648:7;27602:28;:54::i;:::-;27563:93;;;;27671:17;27691:71;27704:10;27715:1;27704:13;;;;;;;;;;;;;;27719:42;19183:5;27753:7;27719:12;:42::i;27691:71::-;27671:91;-1:-1:-1;27797:82:0;19183:5;27671:91;27827:31;27860:8;27870;27797:29;:82::i;:::-;27777:10;27788:1;27792;27788:5;27777:17;;;;;;;;;;;;;;;;;:102;-1:-1:-1;;27460:3:0;;;;;-1:-1:-1;27419:472:0;;-1:-1:-1;;27419:472:0;;;27159:739;;;;;:::o;7196:520::-;7285:12;7311:14;7327;7345:26;7356:6;7364;7345:10;:26::i;:::-;7310:61;;;;7382:12;7424:6;7432;7407:32;;;;;;-1:-1:-1;;;;;7407:32:0;-1:-1:-1;;;;;7407:32:0;;;;;;;;-1:-1:-1;;;;;7407:32:0;-1:-1:-1;;;;;7407:32:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;7407:32:0;;;7397:43;;;;;;7382:58;;7451:18;7531:4;7524:12;;7551:7;7573:4;7606:7;-1:-1:-1;;;;;7592:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7592:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7592:41:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7592:41:0;7493:155;;;-1:-1:-1;;;;;;7493:155:0;;;;7592:41;7493:155;;;;;;;;;;;;-1:-1:-1;;7493:155:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;7493:155:0;;;;;;7472:187;;;;;-1:-1:-1;;;;;7674:34:0;;7196:520;-1:-1:-1;;;;;;;;7196:520:0:o;34032:263::-;34180:56;34212:5;34219:4;34225:2;34229:6;34180:31;:56::i;:::-;34247:40;34263:4;34269:2;34273:5;34280:6;34247:15;:40::i;:::-;34032:263;;;;:::o;29869:1548::-;30009:7;;-1:-1:-1;;;30009:7:0;;;;30008:8;30000:33;;;;;-1:-1:-1;;;30000:33:0;;;;;;;;;;;;-1:-1:-1;;;30000:33:0;;;;;;;;;;;;;;;30052:39;30069:4;30088:1;30074:4;:11;:15;30069:21;;;;;;;;;;;;;;30052:16;:39::i;:::-;30044:99;;;;-1:-1:-1;;;30044:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30159:9;30154:1156;30188:1;30174:4;:11;:15;30170:1;:19;30154:1156;;;30212:13;30227:14;30246:4;30251:1;30246:7;;;;;;;;;;;;;;30255:4;30260:1;30264;30260:5;30255:11;;;;;;;;;;;;;;30211:56;;;;30290:23;30307:5;30290:16;:23::i;:::-;30282:85;;;;-1:-1:-1;;;30282:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30403:6;;30390:45;;;-1:-1:-1;;;30390:45:0;;-1:-1:-1;;;;;30390:45:0;;;;;;;;;;;;;;;;30403:6;;;;;30390:30;;:45;;;;;;;;;;;;;;30403:6;30390:45;;;2:2:-1;;;;27:1;24;17:12;2:2;30390:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30390:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30390:45:0;30382:102;;;;-1:-1:-1;;;30382:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30500:14;30516;30534:42;30562:5;30569:6;30534:27;:42::i;:::-;30499:77;;;;30591:17;30611:7;30619:1;30623;30619:5;30611:14;;;;;;;;;;;;;;30591:34;;30641:18;30661;30692:6;-1:-1:-1;;;;;30683:15:0;:5;-1:-1:-1;;;;;30683:15:0;;:101;;30762:9;30781:1;30683:101;;;30727:1;30731:9;30683:101;30640:144;;;;30799:10;30830:1;30816:4;:11;:15;30812:1;:19;:82;;30891:3;30812:82;;;30859:7;;30876:11;;30834:54;;-1:-1:-1;;;;;30859:7:0;;30868:6;;30876:4;;30885:1;30881:5;;;30876:11;;;;;;;;;;;;30834:24;:54::i;:::-;30945:7;;30799:95;;-1:-1:-1;30920:48:0;;-1:-1:-1;;;;;30945:7:0;30954:5;30961:6;30920:24;:48::i;:::-;-1:-1:-1;;;;;30909:65:0;;30975:10;30987;30999:2;31013:1;31003:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;31003:12:0;87:42:-1;143:17;;-1:-1;31003:12:0;;30909:107;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30909:107:0;-1:-1:-1;;;;;30909:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30909:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30909:107:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30909:107:0;;;;31048:1;31035:10;:14;31031:126;;;31109:7;;31068:89;;31084:48;;-1:-1:-1;;;;;31109:7:0;31118:5;31125:6;31084:24;:48::i;:::-;31134:2;31138:6;31146:10;31068:15;:89::i;:::-;31176:14;;31172:126;;31250:7;;31209:89;;31225:48;;-1:-1:-1;;;;;31250:7:0;31259:5;31266:6;31225:24;:48::i;:::-;31275:2;31279:6;31287:10;31209:15;:89::i;:::-;-1:-1:-1;;30191:3:0;;;;;-1:-1:-1;30154:1156:0;;-1:-1:-1;;;;;30154:1156:0;;;31349:4;31368:1;31354:4;:11;:15;31349:21;;;;;;;;;;;;;;-1:-1:-1;;;;;31325:84:0;31340:4;31345:1;31340:7;;;;;;;;;;;;;;-1:-1:-1;;;;;31325:84:0;31335:3;-1:-1:-1;;;;;31325:84:0;;31372:7;31380:1;31372:10;;;;;;;;;;;;;;31384:7;31406:1;31392:4;:11;:15;31384:24;;;;;;;;;;;;;;31325:84;;;;;;;;;;;;;;;;;;;;;;;;29869:1548;;;:::o;31425:1482::-;31590:16;;;31604:1;31590:16;;;31563:24;31590:16;;;;;31563:24;31590:16;;;;;109:14:-1;31590:16:0;88:42:-1;-1:-1;;31630:4:0;;31617:10;;;;-1:-1:-1;;;;;;31630:4:0;;31617:10;;-1:-1:-1;31630:4:0;;31617:10;;;;;;-1:-1:-1;;;;;31617:17:0;;;:10;;;;;;;;;;;:17;31650:9;31645:1255;31683:1;31669:4;:11;:15;31665:1;:19;31645:1255;;;31706:11;19183:5;31720:33;31733:7;31741:1;31733:10;;;;;;;31720:33;:55;;;;;;31706:69;;31790:13;31806:4;31811:1;31806:7;;;;;;;;;;;;;;31790:23;;31828:14;31845:4;31850:1;31854;31850:5;31845:11;;;;;;;;;;;;;;31828:28;;31871:19;31893:48;31918:7;;;;;;;;;-1:-1:-1;;;;;31918:7:0;31927:5;31934:6;31893:24;:48::i;:::-;31969:4;;31871:70;;-1:-1:-1;;;;;;31960:13:0;;;31969:4;;31960:13;31956:849;;;32031:4;;32037;;31994:48;;;-1:-1:-1;;;31994:48:0;;;;;;;;-1:-1:-1;;;;;32031:4:0;;;31994:48;;;;32037:4;;;31994:48;;;;;:31;;;;;;:48;;;;;32031:4;;31994:48;;;;;;;;32031:4;31994:31;:48;;;2:2:-1;;;;27:1;24;17:12;2:2;31994:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;32090:4:0;;32096;;32061:45;;-1:-1:-1;32077:11:0;;-1:-1:-1;;;;;;32090:4:0;;;;32096;32102:3;32061:15;:45::i;:::-;31956:849;;;32216:7;;32232:4;;-1:-1:-1;;;;;32147:31:0;;;;;;32179:3;;32184:5;;32191:46;;32216:7;;;;32184:5;;32232:4;32191:24;:46::i;:::-;32147:91;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32147:91:0;-1:-1:-1;;;;;32147:91:0;;;;;;-1:-1:-1;;;;;32147:91:0;-1:-1:-1;;;;;32147:91:0;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32147:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;32329:7:0;;32345:4;;32258:17;;-1:-1:-1;32258:17:0;;-1:-1:-1;32300:50:0;;-1:-1:-1;;;;;32329:7:0;;;;32338:5;;32345:4;32300:28;:50::i;:::-;32257:93;;;;32369:14;32386:58;32416:3;32421:9;32432:11;32386:29;:58::i;:::-;32499:7;;32515:4;;32369:75;;-1:-1:-1;32474:46:0;;-1:-1:-1;;;;;32499:7:0;;;;32508:5;;32515:4;32474:24;:46::i;:::-;32538:4;;32544;;32463:86;;;-1:-1:-1;;;32463:86:0;;;;;;;;-1:-1:-1;;;;;32538:4:0;;;32463:86;;;;32544:4;;;32463:86;;;;;:66;;;;;;;:86;;;;;32538:4;;32463:86;;;;;;;;32538:4;32463:66;:86;;;2:2:-1;;;;27:1;24;17:12;2:2;32463:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;32622:7:0;;32638:4;;32568:88;;-1:-1:-1;32584:11:0;;-1:-1:-1;32597:46:0;;-1:-1:-1;;;;;32622:7:0;;;;32631:5;;32638:4;32597:24;:46::i;:::-;32645:5;32652:3;32568:15;:88::i;:::-;32716:7;;32732:4;;32675:83;;32691:46;;-1:-1:-1;;;;;32716:7:0;;;;32725:5;;32732:4;32691:24;:46::i;:::-;32739:4;;32745;;-1:-1:-1;;;;;32739:4:0;;;;32745;32751:6;32675:15;:83::i;:::-;32783:6;-1:-1:-1;;;31956:849:0;32823:7;;32819:69;;32843:4;;32832:56;;;-1:-1:-1;;;32832:56:0;;-1:-1:-1;;;;;32832:56:0;;;;;;;;;;;;;;;32843:4;;;;;32832:38;;:56;;;;;32843:4;;32832:56;;;;;;;32843:4;;32832:56;;;2:2:-1;;;;27:1;24;17:12;2:2;32832:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32832:56:0;;;;32819:69;-1:-1:-1;;31686:3:0;;;;;-1:-1:-1;31645:1255:0;;-1:-1:-1;31645:1255:0;27906:869;28042:25;28105:4;:11;28091:26;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28091:26:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;28091:26:0;;28080:37;;28156:6;28128:8;28151:1;28137:4;:11;:15;28128:25;;;;;;;;;;;;;;;;;:34;28190:11;;-1:-1:-1;;28190:15:0;28173:531;28207:5;;28173:531;;28234:14;28251:4;28260:1;28256;:5;28251:11;;;;;;;;;;;;;;28234:28;;28277:15;28295:4;28300:1;28295:7;;;;;;;;;;;;;;28277:25;;28318:16;28336;28356:54;28385:7;;;;;;;;;-1:-1:-1;;;;;28385:7:0;28394:6;28402:7;28356:28;:54::i;:::-;28317:93;;;;28425:16;28444:61;28473:8;28482:1;28473:11;;;;;;;;;;;;;;28486:8;28496;28444:28;:61::i;:::-;28425:80;;28538:154;28615:42;19183:5;28649:7;28615:12;:42::i;:::-;28569:43;28582:8;19183:5;28569:12;:43::i;:::-;:88;;;;;;28676:1;28538:12;:154::i;:::-;28520:8;28533:1;28529;:5;28520:15;;;;;;;;;;;;;;;;;:172;-1:-1:-1;;;;28214:3:0;;;;-1:-1:-1;28173:531:0;;-1:-1:-1;;28173:531:0;;;28725:42;28740:8;28749:1;28740:11;;;;;;;;;;;;;;28753:4;28759:7;28725:14;:42::i;:::-;28714:53;27906:869;-1:-1:-1;;;;27906:869:0:o;20621:1723::-;20906:7;;;20892:46;;;-1:-1:-1;;;20892:46:0;;-1:-1:-1;;;;;20892:46:0;;;;;;;;;;;;;;;;;;;20843:15;;;;;;20906:7;;;20892:30;;:46;;;;;;;;;;;;;;;20906:7;20892:46;;;2:2:-1;;;;27:1;24;17:12;2:2;20892:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20892:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20892:46:0;-1:-1:-1;;;;;20892:60:0;;20888:246;;;20982:6;;20969:37;;;-1:-1:-1;;;20969:37:0;;-1:-1:-1;;;;;20969:37:0;;;;;;;;;20982:6;;;;;20969:29;;:37;;;;;;;;;;;;;;20982:6;;20969:37;;;2:2:-1;;;;27:1;24;17:12;2:2;20969:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20969:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;21034:6:0;;21021:37;;;-1:-1:-1;;;21021:37:0;;-1:-1:-1;;;;;21021:37:0;;;;;;;;;21034:6;;;;;21021:29;;:37;;;;;20969;;21021;;;;;;;21034:6;;21021:37;;;2:2:-1;;;;27:1;24;17:12;2:2;21021:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21021:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;21087:7:0;;;21073:49;;;-1:-1:-1;;;21073:49:0;;-1:-1:-1;;;;;21073:49:0;;;;;;;;;;;;;;;;;;;21087:7;;;;;21073:33;;:49;;;;;21021:37;;21073:49;;;;;;;;21087:7;;21073:49;;;2:2:-1;;;;27:1;24;17:12;2:2;21073:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21073:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;20888:246:0;21179:6;;21166:46;;;-1:-1:-1;;;21166:46:0;;-1:-1:-1;;;;;21166:46:0;;;;;;;;;;;;;;;;21179:6;;;;;21166:30;;:46;;;;;;;;;;;;;;21179:6;21166:46;;;2:2:-1;;;;27:1;24;17:12;2:2;21166:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21166:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21166:46:0;21144:149;;;;-1:-1:-1;;;21144:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21372:7;;21305:16;;;;21343:53;;-1:-1:-1;;;;;21372:7:0;21381:6;21389;21343:28;:53::i;:::-;21304:92;;;;21411:8;21423:1;21411:13;:30;;;;-1:-1:-1;21428:13:0;;21411:30;21407:823;;;21480:14;;-1:-1:-1;21496:14:0;;-1:-1:-1;21407:823:0;;;21544:22;21569:58;21592:14;21608:8;21618;21569:22;:58::i;:::-;21544:83;;21664:14;21646;:32;21642:577;;21725:10;21707:14;:28;;21699:79;;;;-1:-1:-1;;;21699:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21819:14;;-1:-1:-1;21835:14:0;-1:-1:-1;21835:14:0;21642:577;;;21891:22;21916:58;21939:14;21955:8;21965;21916:22;:58::i;:::-;21891:83;;22018:14;22000;:32;;21993:40;;;;22078:10;22060:14;:28;;22052:79;;;;-1:-1:-1;;;22052:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22172:14;-1:-1:-1;22188:14:0;;-1:-1:-1;21642:577:0;21407:823;;22254:7;;;22289:46;;;-1:-1:-1;;;22289:46:0;;-1:-1:-1;;;;;22289:46:0;;;;;;;;;;;;;;;;;;;22254:7;;;;;22240:36;;22277:10;;22254:7;;22289:30;;:46;;;;;;;;;;;;;;22254:7;22289:46;;;2:2:-1;;;;27:1;24;17:12;2:2;22289:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22289:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22289:46:0;22240:96;;;-1:-1:-1;;;;;;22240:96:0;;;;;;;-1:-1:-1;;;;;22240:96:0;;;;;;;;;;;;;;;;;;;;;22289:46;;22240:96;;;;;;;-1:-1:-1;22240:96:0;;;;2:2:-1;;;;27:1;24;17:12;2:2;22240:96:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22240:96:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20621:1723:0;;;;-1:-1:-1;20621:1723:0;;-1:-1:-1;;;;;;;;20621:1723:0:o;10653:402::-;10878:51;;;-1:-1:-1;;;;;10878:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10878:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;10867:63:0;;;;10832:12;;10846:17;;10867:10;;;;10878:51;10867:63;;;25:18:-1;10867:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10867: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;;10831:99:0;;;;10949:7;:57;;;;-1:-1:-1;10961:11:0;;:16;;:44;;;10992:4;10981:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10981:24:0;10961:44;10941:106;;;;-1:-1:-1;;;10941:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34303:183;34392:4;;34386:32;;;-1:-1:-1;;;34386:32:0;;-1:-1:-1;;;;;34386:32:0;;;;;;;;;;;;;;;34392:4;;;;;34386:20;;:32;;;;;;;;;;;;;;34392:4;;34386:32;;;2:2:-1;;;;27:1;24;17:12;2:2;34386:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34386:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34386:32:0;34379:40;;;;34465:4;;34430:48;;34454:4;;34461:2;;-1:-1:-1;;;;;34465:4:0;34471:6;34430:15;:48::i;:::-;34303:183;;:::o;9175:453::-;9268:13;9314:1;9302:9;:13;9294:70;;;;-1:-1:-1;;;9294:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9395:1;9383:9;:13;:31;;;;;9413:1;9400:10;:14;9383:31;9375:84;;;;-1:-1:-1;;;9375:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9470:14;9487:24;:9;9501;9487:24;:13;:24;:::i;:::-;9470:41;-1:-1:-1;9522:16:0;9541:25;:10;9556:9;9541:25;:14;:25;:::i;:::-;9522:44;;9588:32;9618:1;9601:11;9589:9;:23;;;;;;;9588:32;:29;:32;:::i;6838:349::-;6913:14;6929;6974:6;-1:-1:-1;;;;;6964:16:0;:6;-1:-1:-1;;;;;6964:16:0;;;6956:66;;;;-1:-1:-1;;;6956:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7061:6;-1:-1:-1;;;;;7052:15:0;:6;-1:-1:-1;;;;;7052:15:0;;:53;;7090:6;7098;7052:53;;;7071:6;7079;7052:53;7033:72;;-1:-1:-1;7033:72:0;-1:-1:-1;;;;;;7124:20:0;;7116:63;;;;;-1:-1:-1;;;7116:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7724:387;7817:13;7832;7859:14;7878:26;7889:6;7897;7878:10;:26::i;:::-;7858:46;;;7916:13;7931;7960:32;7968:7;7977:6;7985;7960:7;:32::i;:::-;-1:-1:-1;;;;;7949:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7949:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7949:58:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7949:58:0;;;;;;;7915:92;;;;;-1:-1:-1;7915:92:0;;-1:-1:-1;;;;;;8041:16:0;;;;;;;:62;;8084:8;8094;8041:62;;;8061:8;8071;8041:62;8018:85;;;;-1:-1:-1;7724:387:0;-1:-1:-1;;;;;;;7724:387:0:o;12226:181::-;12284:7;12316:5;;;12340:6;;;;12332:46;;;;;-1:-1:-1;;;12332:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13129:192;13215:7;13251:12;13243:6;;;;13235:29;;;;-1:-1:-1;;;13235:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13235:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13287:5:0;;;13129:192::o;8392:321::-;8474:12;8517:1;8507:7;:11;8499:61;;;;-1:-1:-1;;;8499:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8590:1;8579:8;:12;:28;;;;;8606:1;8595:8;:12;8579:28;8571:81;;;;-1:-1:-1;;;8571:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8697:8;8673:21;:7;8685:8;8673:21;:11;:21;:::i;:::-;:32;;;;;;;8392:321;-1:-1:-1;;;;8392:321:0:o

Swarm Source

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