Contract 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 3

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x35c6d8c4c26815ca59dc14fe0548c47f2ad3d8772faee3fc5411e85ac7abe3efTrade111903452021-09-24 9:49:0425 days 21 hrs ago0x292ba8166ef6264e27f40bbccb914d1ef074c187 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.000305181
0xa67a3c9078821fb5a84b11e441758255d320f750d082506b1a633496cc753fd3Trade95510252021-07-28 15:42:0783 days 16 hrs ago0x53b1ed6cba07e4d213ce2f96fdc03405aca3c5dc IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.004652115
0x78c35b0d9cc7ceaafbc674570fe4d177f7e28177f3fec14b01956df2338f3d99Trade95510252021-07-28 15:42:0783 days 16 hrs ago0x53b1ed6cba07e4d213ce2f96fdc03405aca3c5dc IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.004652115
0xa0f616d980b2622b346e81aabd80f7d0c6af058c66801e20d64844226fd61823Trade95510252021-07-28 15:42:0783 days 16 hrs ago0x53b1ed6cba07e4d213ce2f96fdc03405aca3c5dc IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.0026982267
0x00579e38511df80478b3093518102c80cabbbeb6410b46646ba7edc77badbf0fSplit Trades95510252021-07-28 15:42:0783 days 16 hrs ago0x53b1ed6cba07e4d213ce2f96fdc03405aca3c5dc IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.005535976
0xfd8a10b78e51e0a29a8d5ed657725d7e5229d6087be6881a91038170a984b667Trade95510252021-07-28 15:42:0783 days 16 hrs ago0x53b1ed6cba07e4d213ce2f96fdc03405aca3c5dc IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.003636448
0x294dd8b4b61b569529db8bb6317b798b902fe2687fc9ef8b56b676ec4ffd884cTrade95510252021-07-28 15:42:0783 days 16 hrs ago0x53b1ed6cba07e4d213ce2f96fdc03405aca3c5dc IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.003635928
0x8b17460a7e1bded6115ed3ff637a965ca55b30703e5086a327f376305f634a76Trade93194062021-07-20 10:20:1691 days 21 hrs ago0x596e6f44dda30d1b5822e93cb1603a6220a2a4da IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.04978966 BNB0.00093156
0x85b3d61ec9109b00cbf1ae91174d9d0780d9a49854704cb6acfbf2e046ef729aTrade90307192021-07-10 9:39:39101 days 22 hrs ago0xa56274602448ffdc4f2206bf81418887256204fd IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.000305037
0x3fae15d8c7b3a6cb35b7a0350ca2328e54c3a39aac3ca70ad381456f8451252bTrade85490442021-06-23 14:07:16118 days 17 hrs ago0xf67471d8e5aabcdc8ece1a691cfa267e2f4372d2 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00111346
0xa1e18071bb41045ae3b1e808613c6bb3fe4b4e9b96ecd9b764df7160c398658bTrade85396752021-06-23 6:16:14119 days 1 hr ago0xdcc5a9d273d48dc7953990aa5eb62d3d3ac537f6 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00179089
0x8da4bb2b1261883a4624d9ed592c9bd6c2a7c885f2195a2367887951861ca467Trade85182552021-06-22 12:16:41119 days 19 hrs ago0xf59a98e56cd06bc306474089943cf2c983df37d5 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.000169465
0x5627f0070c2dcd6b813a9ed13310fb3ab414317ff3875fa9589d07b050daa654Trade84084022021-06-18 16:17:39123 days 15 hrs ago0x12174c8bc4a4390c270ae960b4a7fc266e70f373 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.001175165
0xb4643b711c9eda7a42ab0fe18f64125444833a1290ce1a21fac63de2dc5ecc8eTrade83997002021-06-18 8:59:53123 days 22 hrs ago0x34a4d1d1703de5f9fa9c254c05c6ecb280a2ec68 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.000169525
0x17e86cb10214ff4aed0bccb23f4bda26d5796a744055b91e74dabe375460019cTrade83996922021-06-18 8:59:29123 days 22 hrs ago0x34a4d1d1703de5f9fa9c254c05c6ecb280a2ec68 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.000169525
0xe7f97e57c87ae36ebff664c8ff33849cbf6f6b1a12664e24c2a0c0faeca4bd32Trade83914922021-06-18 2:05:27124 days 5 hrs ago0xce8cae356033c068662de07aee57ee7d4628e3af IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00163814
0x4db3963ae744414b0cd74b8374de58d3ec2471b8db211f49e170e1feb14d6debTrade83912102021-06-18 1:51:01124 days 5 hrs ago0xce8cae356033c068662de07aee57ee7d4628e3af IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00116299
0x6ff1d4f7d8c9d9b6727d63ff3788775ca2b3f02f364400c18a2ff758c16a3bffTrade83911952021-06-18 1:50:14124 days 5 hrs ago0xce8cae356033c068662de07aee57ee7d4628e3af IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00210995
0x7b0028dbd50a71354e2c4bf960d78356438c112cf7e9470b42116ba4c78cbc73Trade83907382021-06-18 1:26:46124 days 6 hrs ago0x81008e568fe58bfb3d75a468fbd083b4946a3dea IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00110537
0x3a361d586783cd3bfe940774add789fa56c87cd41ffd395f96dae76b322afa88Trade83895272021-06-18 0:26:13124 days 7 hrs ago0x28fe5b6046f46643409e0cdfe832cf23a186cd42 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.001095525
0xd077fce9c50ec307139a5441f9fc39eb25abdfd05a48702ebb2fcd8aab258622Trade83882682021-06-17 23:21:18124 days 8 hrs ago0x28fe5b6046f46643409e0cdfe832cf23a186cd42 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a3.2 BNB0.001030365
0x0fa8ebe67fa489c8f7f7c8dcf441189296122e197cf22131667bb766cb617ad7Trade83836102021-06-17 19:27:00124 days 12 hrs ago0x52a98ee78d8e3cfaeb7fe3239bcd64e73e6769f9 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.001883125
0xfe7597615738aa1a61ab835cc539f28f43782e539fd04c04ff5496f893cbf02fTrade83819972021-06-17 18:06:06124 days 13 hrs ago0x31738db17a270fc646455f7a27340172b14f0b3f IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.001186985
0x7d5a0683c74da109105800967d612cb4f543ae761187c91566d2d13af80eeb19Trade83819752021-06-17 18:04:54124 days 13 hrs ago0x7bfc6981dc06a2ec5dfa52188791a92f2a40e386 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.001112105
0x5b41b415b704789e33b8c9ef5662b492b3d0e93f716598c2c0feaf9edc20237aTrade83819152021-06-17 18:01:48124 days 13 hrs ago0x7bfc6981dc06a2ec5dfa52188791a92f2a40e386 IN  0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0 BNB0.00118433
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xa67a3c9078821fb5a84b11e441758255d320f750d082506b1a633496cc753fd395510252021-07-28 15:42:0783 days 16 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0xc146a672c85b408a9a7bc00f74ad567b7684134c0.00009107037260467 BNB
0xa67a3c9078821fb5a84b11e441758255d320f750d082506b1a633496cc753fd395510252021-07-28 15:42:0783 days 16 hrs ago 0x71ac17934b60a4610dc58b715b61e45dcbde4054 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.091070372604670203 BNB
0x78c35b0d9cc7ceaafbc674570fe4d177f7e28177f3fec14b01956df2338f3d9995510252021-07-28 15:42:0783 days 16 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0xc146a672c85b408a9a7bc00f74ad567b7684134c0.00009107037260467 BNB
0x78c35b0d9cc7ceaafbc674570fe4d177f7e28177f3fec14b01956df2338f3d9995510252021-07-28 15:42:0783 days 16 hrs ago 0x71ac17934b60a4610dc58b715b61e45dcbde4054 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.091070372604670203 BNB
0xa0f616d980b2622b346e81aabd80f7d0c6af058c66801e20d64844226fd6182395510252021-07-28 15:42:0783 days 16 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0xc146a672c85b408a9a7bc00f74ad567b7684134c0.00009107037260467 BNB
0xa0f616d980b2622b346e81aabd80f7d0c6af058c66801e20d64844226fd6182395510252021-07-28 15:42:0783 days 16 hrs ago 0x71ac17934b60a4610dc58b715b61e45dcbde4054 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.091070372604670203 BNB
0x00579e38511df80478b3093518102c80cabbbeb6410b46646ba7edc77badbf0f95510252021-07-28 15:42:0783 days 16 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0xc146a672c85b408a9a7bc00f74ad567b7684134c0.000090944587587254 BNB
0x00579e38511df80478b3093518102c80cabbbeb6410b46646ba7edc77badbf0f95510252021-07-28 15:42:0783 days 16 hrs ago PancakeSwap: Router 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.081837513350640603 BNB
0x00579e38511df80478b3093518102c80cabbbeb6410b46646ba7edc77badbf0f95510252021-07-28 15:42:0783 days 16 hrs ago 0x71ac17934b60a4610dc58b715b61e45dcbde4054 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.009107074236614003 BNB
0xfd8a10b78e51e0a29a8d5ed657725d7e5229d6087be6881a91038170a984b66795510252021-07-28 15:42:0783 days 16 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0xc146a672c85b408a9a7bc00f74ad567b7684134c0.000090949150990312 BNB
0xfd8a10b78e51e0a29a8d5ed657725d7e5229d6087be6881a91038170a984b66795510252021-07-28 15:42:0783 days 16 hrs ago 0xc0788a3ad43d79aa53b09c2eacc313a787d1d607 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.090949150990312655 BNB
0x294dd8b4b61b569529db8bb6317b798b902fe2687fc9ef8b56b676ec4ffd884c95510252021-07-28 15:42:0783 days 16 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0xc146a672c85b408a9a7bc00f74ad567b7684134c0.000090930391211434 BNB
0x294dd8b4b61b569529db8bb6317b798b902fe2687fc9ef8b56b676ec4ffd884c95510252021-07-28 15:42:0783 days 16 hrs ago PancakeSwap: Router 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.090930391211434086 BNB
0x8b17460a7e1bded6115ed3ff637a965ca55b30703e5086a327f376305f634a7693194062021-07-20 10:20:1691 days 21 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0bdc24946818c0fe045a1d84d2fe630e6e59b77d0.04978966 BNB
0x5627f0070c2dcd6b813a9ed13310fb3ab414317ff3875fa9589d07b050daa65484084022021-06-18 16:17:39123 days 15 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0x12174c8bc4a4390c270ae960b4a7fc266e70f3730.048640115108788094 BNB
0x5627f0070c2dcd6b813a9ed13310fb3ab414317ff3875fa9589d07b050daa65484084022021-06-18 16:17:39123 days 15 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0xc146a672c85b408a9a7bc00f74ad567b7684134c0.0000486888039127 BNB
0x5627f0070c2dcd6b813a9ed13310fb3ab414317ff3875fa9589d07b050daa65484084022021-06-18 16:17:39123 days 15 hrs ago PantherSwap: Router 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.048688803912700794 BNB
0x3a361d586783cd3bfe940774add789fa56c87cd41ffd395f96dae76b322afa8883895272021-06-18 0:26:13124 days 7 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0x28fe5b6046f46643409e0cdfe832cf23a186cd423.288887145821170421 BNB
0x3a361d586783cd3bfe940774add789fa56c87cd41ffd395f96dae76b322afa8883895272021-06-18 0:26:13124 days 7 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0xc146a672c85b408a9a7bc00f74ad567b7684134c0.003292179325146316 BNB
0x3a361d586783cd3bfe940774add789fa56c87cd41ffd395f96dae76b322afa8883895272021-06-18 0:26:13124 days 7 hrs ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a3.292179325146316737 BNB
0xd077fce9c50ec307139a5441f9fc39eb25abdfd05a48702ebb2fcd8aab25862283882682021-06-17 23:21:18124 days 8 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x4430ad4295ff976f88760919c258fc3bf342eca63.2 BNB
0x9f7a6c72ca58cd4301a39f0f61f08bd2fe8ff3e11643f1fc87a60a90de4a084483599682021-06-16 23:34:28125 days 8 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0bdc24946818c0fe045a1d84d2fe630e6e59b77d5 BNB
0xfba7441c147f205b8ff381b36f592497b3ebf289e2ab2a64e55f1451f36c468083599162021-06-16 23:31:52125 days 8 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a 0x0bdc24946818c0fe045a1d84d2fe630e6e59b77d3 BNB
0x3d7018933c4363503c3114bb53d2be233d36ea69389add2e6ea926d68e73030383521962021-06-16 17:04:02125 days 14 hrs ago 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0x1f12ab4b7a625cf5ed34b2c3bad54c62507671b60.051226940748707898 BNB
0x3d7018933c4363503c3114bb53d2be233d36ea69389add2e6ea926d68e73030383521962021-06-16 17:04:02125 days 14 hrs ago 0x6b011d0d53b0da6ace2a3f436fd197a4e35f47ef 0xb75fa2a799fc7935f37500ba9780cbe10aa6610a0.051226940748707898 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xc660a974b70889e53d64df199adfb4a258b33194

Contract Name:
WardenSwap

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// ((/*,                                                                    ,*((/,.
// &&@@&&%#/*.                                                        .*(#&&@@@@%. 
// &&@@@@@@@&%(.                                                    ,#%&@@@@@@@@%. 
// &&@@@@@@@@@&&(,                                                ,#&@@@@@@@@@@@%. 
// &&@@@@@@@@@@@&&/.                                            .(&&@@@@@@@@@@@@%. 
// %&@@@@@@@@@@@@@&(,                                          *#&@@@@@@@@@@@@@@%. 
// #&@@@@@@@@@@@@@@&#*                                       .*#@@@@@@@@@@@@@@@&#. 
// #&@@@@@@@@@@@@@@@@#.                                      ,%&@@@@@@@@@@@@@@@&#. 
// #&@@@@@@@@@@@@@@@@%(,                                    ,(&@@@@@@@@@@@@@@@@&#. 
// #&@@@@@@@@@@@@@@@@&&/                                   .(%&@@@@@@@@@@@@@@@@&#. 
// #%@@@@@@@@@@@@@@@@@@(.               ,(/,.              .#&@@@@@@@@@@@@@@@@@&#. 
// (%@@@@@@@@@@@@@@@@@@#*.            ./%&&&/.            .*%@@@@@@@@@@@@@@@@@@%(. 
// (%@@@@@@@@@@@@@@@@@@#*.           *#&@@@@&%*.          .*%@@@@@@@@@@@@@@@@@@%(. 
// (%@@@@@@@@@@@@@@@@@@#/.         ./#@@@@@@@@%(.         ./%@@@@@@@@@@@@@@@@@@%(. 
// (%@@@@@@@@@@@@@@@@@@#/.        ./&@@@@@@@@@@&(*        ,/%@@@@@@@@@@@@@@@@@@%(. 
// (%@@@@@@@@@@@@@@@@@@%/.       ,#&@@@@@@@@@@@@&#,.      ,/%@@@@@@@@@@@@@@@@@@%(. 
// /%@@@@@@@@@@@@@@@@@@#/.      *(&@@@@@@@@@@@@@@&&*      ./%@@@@@@@@@@@@@@@@@&%(. 
// /%@@@@@@@@@@@@@@@@@@#/.     .(&@@@@@@@@@@@@@@@@@#*.    ,/%@@@@@@@@@@@@@@@@@&#/. 
// ,#@@@@@@@@@@@@@@@@@@#/.    ./%@@@@@@@@@@@@@@@@@@&#,    ,/%@@@@@@@@@@@@@@@@@&(,  
//  /%&@@@@@@@@@@@@@@@@#/.    *#&@@@@@@@@@@@@@@@@@@@&*    ,/%@@@@@@@@@@@@@@@@&%*   
//  .*#&@@@@@@@@@@@@@@@#/.    /&&@@@@@@@@@@@@@@@@@@@&/.   ,/%@@@@@@@@@@@@@@@@#*.   
//    ,(&@@@@@@@@@@@@@@#/.    /@@@@@@@@@@@@@@@@@@@@@&(,   ,/%@@@@@@@@@@@@@@%(,     
//     .*(&&@@@@@@@@@@@#/.    /&&@@@@@@@@@@@@@@@@@@@&/,   ,/%@@@@@@@@@@@&%/,       
//        ./%&@@@@@@@@@#/.    *#&@@@@@@@@@@@@@@@@@@@%*    ,/%@@@@@@@@@&%*          
//           ,/#%&&@@@@#/.     ,#&@@@@@@@@@@@@@@@@@#/.    ,/%@@@@&&%(/,            
//               ./#&@@%/.      ,/&@@@@@@@@@@@@@@%(,      ,/%@@%#*.                
//                   .,,,         ,/%&@@@@@@@@&%(*        .,,,.                    
//                                   ,/%&@@@%(*.                                   
//  .,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,**((/*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
//                                                                                                                                                                                                                                                                                                            
//                                                                                             

// Sources flattened with hardhat v2.0.11 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.5.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 *
 * _Since v2.5.0:_ this module is now much more gas efficient, given net gas
 * metering changes introduced in the Istanbul hardfork.
 */
contract ReentrancyGuard {
    bool private _notEntered;

    constructor () internal {
        // Storing an initial non-zero value makes deployment a bit more
        // expensive, but in exchange the refund on every call to nonReentrant
        // will be lower in amount. Since refunds are capped to a percetange of
        // the total transaction's gas, it is best to keep them low in cases
        // like this one, to increase the likelihood of the full refund coming
        // into effect.
        _notEntered = true;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_notEntered, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _notEntered = false;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _notEntered = true;
    }
}


// File @openzeppelin/contracts/math/[email protected]

pragma solidity ^0.5.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.
     *
     * _Available since v2.4.0._
     */
    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.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        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.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.5.5;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following 
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]

pragma solidity ^0.5.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File @openzeppelin/contracts/GSN/[email protected]

pragma solidity ^0.5.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File @openzeppelin/contracts/ownership/[email protected]

pragma solidity ^0.5.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File contracts/interfaces/IWardenTradingRoute.sol

pragma solidity 0.5.17;

/**
 * @title Warden Trading Route
 * @dev The Warden trading route interface has an standard functions and event
 * for other smart contract to implement to join Warden Swap as Market Maker.
 */
interface IWardenTradingRoute {
    /**
    * @dev when new trade occure (and success), this event will be boardcast.
    * @param _src Source token
    * @param _srcAmount amount of source tokens
    * @param _dest   Destination token
    * @return _destAmount: amount of actual destination tokens
    */
    event Trade(
        IERC20 indexed _src,
        uint256 _srcAmount,
        IERC20 indexed _dest,
        uint256 _destAmount
    );

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev makes a trade between src and dest token
    * @param _src Source token
    * @param _dest   Destination token
    * @param _srcAmount amount of source tokens
    * @return _destAmount: amount of actual destination tokens
    */
    function trade(
        IERC20 _src,
        IERC20 _dest,
        uint256 _srcAmount
    )
        external
        payable
        returns(uint256 _destAmount);

    /**
    * @dev provide destinationm token amount for given source amount
    * @param _src Source token
    * @param _dest Destination token
    * @param _srcAmount Amount of source tokens
    * @return _destAmount: amount of expected destination tokens
    */
    function getDestinationReturnAmount(
        IERC20 _src,
        IERC20 _dest,
        uint256 _srcAmount
    )
        external
        view
        returns(uint256 _destAmount);

    /**
    * @dev provide source token amount for given destination amount
    * @param _src Source token
    * @param _dest Destination token
    * @param _destAmount Amount of destination tokens
    * @return _srcAmount: amount of expected source tokens
    */
    // function getSourceReturnAmount(
    //     IERC20 _src,
    //     IERC20 _dest,
    //     uint256 _destAmount
    // )
    //     external
    //     view
    //     returns(uint256 _srcAmount);
}


// File contracts/RoutingManagement.sol

pragma solidity 0.5.17;


contract RoutingManagement is Ownable {
    /**
    * @dev Struct of trading route
    * @param name Name of trading route.
    * @param enable The flag of trading route to check is trading route enable.
    * @param route The address of trading route.
    */
    struct Route {
      string name;
      bool enable;
      IWardenTradingRoute route;
    }

    event AddedTradingRoute(
        address indexed addedBy,
        string name,
        IWardenTradingRoute indexed routingAddress,
        uint256 indexed index
    );

    event EnabledTradingRoute(
        address indexed enabledBy,
        string name,
        IWardenTradingRoute indexed routingAddress,
        uint256 indexed index
    );

    event DisabledTradingRoute(
        address indexed disabledBy,
        string name,
        IWardenTradingRoute indexed routingAddress,
        uint256 indexed index
    );

    Route[] public tradingRoutes; // list of trading routes

    modifier onlyTradingRouteEnabled(uint _index) {
        require(tradingRoutes[_index].enable == true, "This trading route is disabled");
        _;
    }

    modifier onlyTradingRouteDisabled(uint _index) {
        require(tradingRoutes[_index].enable == false, "This trading route is enabled");
        _;
    }

    /**
    * @dev Function for adding new trading route
    * @param _name Name of trading route.
    * @param _routingAddress The address of trading route.
    * @return length of trading routes.
    */
    function addTradingRoute(
        string memory _name,
        IWardenTradingRoute _routingAddress
    )
      public
      onlyOwner
    {
        tradingRoutes.push(Route({
            name: _name,
            enable: true,
            route: _routingAddress
        }));
        emit AddedTradingRoute(msg.sender, _name, _routingAddress, tradingRoutes.length - 1);
    }

    /**
    * @dev Function for disable trading route by index
    * @param _index The uint256 of trading route index.
    * @return length of trading routes.
    */
    function disableTradingRoute(
        uint256 _index
    )
        public
        onlyOwner
        onlyTradingRouteEnabled(_index)
    {
        tradingRoutes[_index].enable = false;
        emit DisabledTradingRoute(msg.sender, tradingRoutes[_index].name, tradingRoutes[_index].route, _index);
    }

    /**
    * @dev Function for enale trading route by index
    * @param _index The uint256 of trading route index.
    * @return length of trading routes.
    */
    function enableTradingRoute(
        uint256 _index
    )
        public
        onlyOwner
        onlyTradingRouteDisabled(_index)
    {
        tradingRoutes[_index].enable = true;
        emit EnabledTradingRoute(msg.sender, tradingRoutes[_index].name, tradingRoutes[_index].route, _index);
    }

    /**
    * @dev Function for get amount of trading route
    * @return Amount of trading routes.
    */
    function allRoutesLength() public view returns (uint256) {
        return tradingRoutes.length;
    }

    /**
    * @dev Function for get enable status of trading route
    * @param _index The uint256 of trading route index.
    * @return enable status of trading route.
    */
    function isTradingRouteEnabled(uint256 _index) public view returns (bool) {
        return tradingRoutes[_index].enable;
    }
}


// File contracts/Partnership.sol

pragma solidity 0.5.17;



/*
* Fee collection by partner reference
*/
contract Partnership is RoutingManagement {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    /**
    * @dev Platform Fee collection
    * @param partnerIndex Partner or Wallet provider that integrate to Warden
    * @param token Token address
    * @param wallet Partner or Wallet provider wallet
    * @param amount Fee amount
    */
    event CollectFee(
      uint256 indexed partnerIndex,
      IERC20   indexed token,
      address indexed wallet,
      uint256         amount
    );

    /**
    * @dev Updating partner info
    * @param index Partner index
    * @param wallet Partner wallet
    * @param fee Fee in bps
    * @param name partner name
    */
    event UpdatePartner(
      uint256 indexed index,
      address indexed wallet,
      uint16 fee,
      bytes16 name
    );

    struct Partner {
      address wallet;       // To receive fee on the Warden Swap network
      uint16 fee;           // fee in bps
      bytes16 name;         // Partner reference
    }

    IERC20 public constant etherERC20 = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);

    mapping(uint256 => Partner) public partners;

    constructor() public {
        Partner memory partner = Partner(msg.sender, 10, "WARDEN"); // 0.1%
        partners[0] = partner;
        emit UpdatePartner(0, msg.sender, 10, "WARDEN");
    }

    function updatePartner(uint256 index, address wallet, uint16 fee, bytes16 name)
        external
        onlyOwner
    {
        require(fee <= 100, "fee: no more than 1%");
        Partner memory partner = Partner(wallet, fee, name);
        partners[index] = partner;
        emit UpdatePartner(index, wallet, fee, name);
    }

    function _amountWithFee(uint256 amount, uint256 partnerIndex)
        internal
        view
        returns(uint256 remainingAmount)
    {
        Partner storage partner = partners[partnerIndex];
        if (partner.wallet == 0x0000000000000000000000000000000000000000) {
          partner = partners[0];
        }
        if (partner.fee == 0) {
            return amount;
        }
        uint256 fee = amount.mul(partner.fee).div(10000);
        return amount.sub(fee);
    }

    function _collectFee(uint256 partnerIndex, uint256 amount, IERC20 token)
        internal
        returns(uint256 remainingAmount)
    {
        Partner storage partner = partners[partnerIndex];
        if (partner.wallet == 0x0000000000000000000000000000000000000000) {
            partnerIndex = 0;
            partner = partners[0];
        }
        if (partner.fee == 0) {
            return amount;
        }
        uint256 fee = amount.mul(partner.fee).div(10000);
        require(fee < amount, "fee exceeds return amount!");
        if (etherERC20 == token) {
            (bool success, ) = partner.wallet.call.value(fee)(""); // Send back ether to sender
            require(success, "Transfer fee of ether failed.");
        } else {
            token.safeTransfer(partner.wallet, fee);
        }
        emit CollectFee(partnerIndex, token, partner.wallet, fee);

        return amount.sub(fee);
    }
}


// File contracts/WardenSwap.sol

pragma solidity 0.5.17;

contract WardenTokenPriviledge is Partnership {
    uint256 public eligibleAmount = 10 ether; // 10 WAD
    IERC20 public wardenToken;

    event UpdateWardenToken(IERC20 indexed token);
    event UpdateEligibleAmount(uint256 amount);

    function updateWardenToken(
        IERC20  token
    )
        public
        onlyOwner
    {
        wardenToken = token;
        emit UpdateWardenToken(token);
    }

    function updateEligibleAmount(
        uint256  amount
    )
        public
        onlyOwner
    {
        eligibleAmount = amount;
        emit UpdateEligibleAmount(amount);
    }

    function isEligibleForFreeTrade(address user)
        public
        view
        returns (bool)
    {
        if (address(wardenToken) == 0x0000000000000000000000000000000000000000) {
            return false;
        }
        return wardenToken.balanceOf(user) >= eligibleAmount;
    }
}

contract WardenSwap is WardenTokenPriviledge, ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    /**
    * @dev when new trade occure (and success), this event will be boardcast.
    * @param srcAsset Source token
    * @param srcAmount amount of source token
    * @param destAsset Destination token
    * @param destAmount amount of destination token
    * @param trader user address
    */
    event Trade(
        address indexed srcAsset, // Source
        uint256         srcAmount,
        address indexed destAsset, // Destination
        uint256         destAmount,
        address indexed trader // User
    );

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev makes a trade between Ether to token by tradingRouteIndex
    * @param tradingRouteIndex index of trading route
    * @param srcAmount amount of source tokens
    * @param dest Destination token
    * @return amount of actual destination tokens
    */
    function _tradeEtherToToken(
        uint256 tradingRouteIndex,
        uint256 srcAmount,
        IERC20 dest
    )
        private
        returns(uint256)
    {
        // Load trading route
        IWardenTradingRoute tradingRoute = tradingRoutes[tradingRouteIndex].route;
        // Trade to route
        uint256 destAmount = tradingRoute.trade.value(srcAmount)(
            etherERC20,
            dest,
            srcAmount
        );
        return destAmount;
    }

    // Receive ETH in case of trade Token -> ETH, will get ETH back from trading route
    function () external payable {}

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev makes a trade between token to Ether by tradingRouteIndex
    * @param tradingRouteIndex index of trading route
    * @param src Source token
    * @param srcAmount amount of source tokens
    * @return amount of actual destination tokens
    */
    function _tradeTokenToEther(
        uint256 tradingRouteIndex,
        IERC20 src,
        uint256 srcAmount
    )
        private
        returns(uint256)
    {
        // Load trading route
        IWardenTradingRoute tradingRoute = tradingRoutes[tradingRouteIndex].route;
        // Approve to TradingRoute
        src.safeApprove(address(tradingRoute), srcAmount);
        // Trande to route
        uint256 destAmount = tradingRoute.trade(
            src,
            etherERC20,
            srcAmount
        );
        return destAmount;
    }

    /**
    * @dev makes a trade between token to token by tradingRouteIndex
    * @param tradingRouteIndex index of trading route
    * @param src Source token
    * @param srcAmount amount of source tokens
    * @param dest Destination token
    * @return amount of actual destination tokens
    */
    function _tradeTokenToToken(
        uint256 tradingRouteIndex,
        IERC20 src,
        uint256 srcAmount,
        IERC20 dest
    )
        private
        returns(uint256)
    {
        // Load trading route
        IWardenTradingRoute tradingRoute = tradingRoutes[tradingRouteIndex].route;
        // Approve to TradingRoute
        src.safeApprove(address(tradingRoute), srcAmount);
        // Trande to route
        uint256 destAmount = tradingRoute.trade(
            src,
            dest,
            srcAmount
        );
        return destAmount;
    }

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev makes a trade between src and dest token by tradingRouteIndex
    * Ex1: trade 0.5 ETH -> DAI
    * 0, "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "500000000000000000", "0xd3c64BbA75859Eb808ACE6F2A6048ecdb2d70817", "21003850000000000000"
    * Ex2: trade 30 DAI -> ETH
    * 0, "0xd3c64BbA75859Eb808ACE6F2A6048ecdb2d70817", "30000000000000000000", "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "740825000000000000"
    * @param _tradingRouteIndex index of trading route
    * @param _src Source token
    * @param _srcAmount amount of source tokens
    * @param _dest Destination token
    * @return amount of actual destination tokens
    */
    function _trade(
        uint256             _tradingRouteIndex,
        IERC20              _src,
        uint256             _srcAmount,
        IERC20              _dest
    )
        private
        onlyTradingRouteEnabled(_tradingRouteIndex)
        returns(uint256)
    {
        // Destination amount
        uint256 destAmount;
        // Record src/dest asset for later consistency check.
        uint256 srcAmountBefore;
        uint256 destAmountBefore;

        if (etherERC20 == _src) { // Source
            srcAmountBefore = address(this).balance;
        } else {
            srcAmountBefore = _src.balanceOf(address(this));
        }
        if (etherERC20 == _dest) { // Dest
            destAmountBefore = address(this).balance;
        } else {
            destAmountBefore = _dest.balanceOf(address(this));
        }
        if (etherERC20 == _src) { // Trade ETH -> Token
            destAmount = _tradeEtherToToken(_tradingRouteIndex, _srcAmount, _dest);
        } else if (etherERC20 == _dest) { // Trade Token -> ETH
            destAmount = _tradeTokenToEther(_tradingRouteIndex, _src, _srcAmount);
        } else { // Trade Token -> Token
            destAmount = _tradeTokenToToken(_tradingRouteIndex, _src, _srcAmount, _dest);
        }

        // Recheck if src/dest amount correct
        if (etherERC20 == _src) { // Source
            require(address(this).balance == srcAmountBefore.sub(_srcAmount), "source amount mismatch after trade");
        } else {
            require(_src.balanceOf(address(this)) == srcAmountBefore.sub(_srcAmount), "source amount mismatch after trade");
        }
        if (etherERC20 == _dest) { // Dest
            require(address(this).balance == destAmountBefore.add(destAmount), "destination amount mismatch after trade");
        } else {
            require(_dest.balanceOf(address(this)) == destAmountBefore.add(destAmount), "destination amount mismatch after trade");
        }
        return destAmount;
    }

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev makes a trade between src and dest token by tradingRouteIndex
    * Ex1: trade 0.5 ETH -> DAI
    * 0, "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "500000000000000000", "0xd3c64BbA75859Eb808ACE6F2A6048ecdb2d70817", "21003850000000000000"
    * Ex2: trade 30 DAI -> ETH
    * 0, "0xd3c64BbA75859Eb808ACE6F2A6048ecdb2d70817", "30000000000000000000", "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "740825000000000000"
    * @param tradingRouteIndex index of trading route
    * @param src Source token
    * @param srcAmount amount of source tokens
    * @param dest Destination token
    * @param minDestAmount minimun destination amount
    * @param partnerIndex index of partnership for revenue sharing
    * @return amount of actual destination tokens
    */
    function trade(
        uint256   tradingRouteIndex,
        IERC20    src,
        uint256   srcAmount,
        IERC20    dest,
        uint256   minDestAmount,
        uint256   partnerIndex
    )
        external
        payable
        nonReentrant
        returns(uint256)
    {
        uint256 destAmount;
        // Prepare source's asset
        if (etherERC20 != src) {
            src.safeTransferFrom(msg.sender, address(this), srcAmount); // Transfer token to this address
        }
        // Trade to route
        destAmount = _trade(tradingRouteIndex, src, srcAmount, dest);
        if (!isEligibleForFreeTrade(msg.sender)) {
            destAmount = _collectFee(partnerIndex, destAmount, dest);
        }

        // Throw exception if destination amount doesn't meet user requirement.
        require(destAmount >= minDestAmount, "destination amount is too low.");
        if (etherERC20 == dest) {
            (bool success, ) = msg.sender.call.value(destAmount)(""); // Send back ether to sender
            require(success, "Transfer ether back to caller failed.");
        } else { // Send back token to sender
            dest.safeTransfer(msg.sender, destAmount);
        }

        emit Trade(address(src), srcAmount, address(dest), destAmount, msg.sender);
        return destAmount;
    }

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev makes a trade with split volumes to multiple-routes ex. UNI -> ETH (5%, 15% and 80%)
    * @param routes Trading paths
    * @param src Source token
    * @param srcAmounts amount of source tokens
    * @param dest Destination token
    * @param minDestAmount minimun destination amount
    * @param partnerIndex index of partnership for revenue sharing
    * @return amount of actual destination tokens
    */
    function splitTrades(
        uint256[] calldata routes,
        IERC20    src,
        uint256   totalSrcAmount,
        uint256[] calldata srcAmounts,
        IERC20    dest,
        uint256   minDestAmount,
        uint256   partnerIndex
    )
        external
        payable
        nonReentrant
        returns(uint256)
    {
        require(routes.length > 0, "routes can not be empty");
        require(routes.length == srcAmounts.length, "routes and srcAmounts lengths mismatch");
        uint256 destAmount = 0;
        // Prepare source's asset
        if (etherERC20 != src) {
            src.safeTransferFrom(msg.sender, address(this), totalSrcAmount); // Transfer token to this address
        }
        // Trade with routes
        for (uint i = 0; i < routes.length; i++) {
            uint256 tradingRouteIndex = routes[i];
            uint256 amount = srcAmounts[i];
            destAmount = destAmount.add(_trade(tradingRouteIndex, src, amount, dest));
        }

        // Collect fee
        if (!isEligibleForFreeTrade(msg.sender)) {
            destAmount = _collectFee(partnerIndex, destAmount, dest);
        }

        // Throw exception if destination amount doesn't meet user requirement.
        require(destAmount >= minDestAmount, "destination amount is too low.");
        if (etherERC20 == dest) {
            (bool success, ) = msg.sender.call.value(destAmount)(""); // Send back ether to sender
            require(success, "Transfer ether back to caller failed.");
        } else { // Send back token to sender
            dest.safeTransfer(msg.sender, destAmount);
        }

        emit Trade(address(src), totalSrcAmount, address(dest), destAmount, msg.sender);
        return destAmount;
    }

    /**
    * @notice use token address 0xeee...eee for ether
    * @dev get amount of destination token for given source token amount
    * @param tradingRouteIndex index of trading route
    * @param src Source token
    * @param dest Destination token
    * @param srcAmount amount of source tokens
    * @return amount of actual destination tokens
    */
    function getDestinationReturnAmount(
        uint256 tradingRouteIndex,
        IERC20  src,
        IERC20  dest,
        uint256 srcAmount,
        uint256 partnerIndex
    )
        external
        view
        returns(uint256)
    {
        // Load trading route
        IWardenTradingRoute tradingRoute = tradingRoutes[tradingRouteIndex].route;
        uint256 destAmount = tradingRoute.getDestinationReturnAmount(src, dest, srcAmount);
        return _amountWithFee(destAmount, partnerIndex);
    }

    function getDestinationReturnAmountForSplitTrades(
        uint256[] calldata routes,
        IERC20    src,
        uint256[] calldata srcAmounts,
        IERC20    dest,
        uint256   partnerIndex
    )
        external
        view
        returns(uint256)
    {
        require(routes.length > 0, "routes can not be empty");
        require(routes.length == srcAmounts.length, "routes and srcAmounts lengths mismatch");
        uint256 destAmount = 0;
        
        for (uint i = 0; i < routes.length; i++) {
            uint256 tradingRouteIndex = routes[i];
            uint256 amount = srcAmounts[i];
            // Load trading route
            IWardenTradingRoute tradingRoute = tradingRoutes[tradingRouteIndex].route;
            destAmount = destAmount.add(tradingRoute.getDestinationReturnAmount(src, dest, amount));
        }
        return _amountWithFee(destAmount, partnerIndex);
    }

    // In case of expected and unexpected event that have some token amounts remain in this contract, owner can call to collect them.
    function collectRemainingToken(
        IERC20  token,
        uint256 amount
    )
      public
      onlyOwner
    {
        token.safeTransfer(msg.sender, amount);
    }

    // In case of expected and unexpected event that have some ether amounts remain in this contract, owner can call to collect them.
    function collectRemainingEther(
        uint256 amount
    )
      public
      onlyOwner
    {
        (bool success, ) = msg.sender.call.value(amount)(""); // Send back ether to sender
        require(success, "Transfer ether back to caller failed.");
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addedBy","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"contract IWardenTradingRoute","name":"routingAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"}],"name":"AddedTradingRoute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"partnerIndex","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CollectFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"disabledBy","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"contract IWardenTradingRoute","name":"routingAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"}],"name":"DisabledTradingRoute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"enabledBy","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"contract IWardenTradingRoute","name":"routingAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"}],"name":"EnabledTradingRoute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"srcAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"srcAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"destAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"destAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdateEligibleAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint16","name":"fee","type":"uint16"},{"indexed":false,"internalType":"bytes16","name":"name","type":"bytes16"}],"name":"UpdatePartner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"}],"name":"UpdateWardenToken","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"contract IWardenTradingRoute","name":"_routingAddress","type":"address"}],"name":"addTradingRoute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"allRoutesLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"collectRemainingEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"collectRemainingToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"disableTradingRoute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"eligibleAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"enableTradingRoute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"etherERC20","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tradingRouteIndex","type":"uint256"},{"internalType":"contract IERC20","name":"src","type":"address"},{"internalType":"contract IERC20","name":"dest","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"partnerIndex","type":"uint256"}],"name":"getDestinationReturnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[]","name":"routes","type":"uint256[]"},{"internalType":"contract IERC20","name":"src","type":"address"},{"internalType":"uint256[]","name":"srcAmounts","type":"uint256[]"},{"internalType":"contract IERC20","name":"dest","type":"address"},{"internalType":"uint256","name":"partnerIndex","type":"uint256"}],"name":"getDestinationReturnAmountForSplitTrades","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isEligibleForFreeTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"isTradingRouteEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"partners","outputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint16","name":"fee","type":"uint16"},{"internalType":"bytes16","name":"name","type":"bytes16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[]","name":"routes","type":"uint256[]"},{"internalType":"contract IERC20","name":"src","type":"address"},{"internalType":"uint256","name":"totalSrcAmount","type":"uint256"},{"internalType":"uint256[]","name":"srcAmounts","type":"uint256[]"},{"internalType":"contract IERC20","name":"dest","type":"address"},{"internalType":"uint256","name":"minDestAmount","type":"uint256"},{"internalType":"uint256","name":"partnerIndex","type":"uint256"}],"name":"splitTrades","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tradingRouteIndex","type":"uint256"},{"internalType":"contract IERC20","name":"src","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"dest","type":"address"},{"internalType":"uint256","name":"minDestAmount","type":"uint256"},{"internalType":"uint256","name":"partnerIndex","type":"uint256"}],"name":"trade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tradingRoutes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"enable","type":"bool"},{"internalType":"contract IWardenTradingRoute","name":"route","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateEligibleAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint16","name":"fee","type":"uint16"},{"internalType":"bytes16","name":"name","type":"bytes16"}],"name":"updatePartner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"updateWardenToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wardenToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]

6080604052678ac7230489e800006003556000620000256001600160e01b036200019b16565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000796200019f565b506040805160608101825233808252600a6020808401828152652ba0a92222a760d11b85870181815260008080526002855287517fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b805495516001600160a01b03199096166001600160a01b039092169190911761ffff60a01b1916600160a01b61ffff9096169590950294909417909355517fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077c80546001600160801b03191660809290921c91909117905586519384529183019190915284519394929390927f5c403d036e1c349774b6d02e8239a8ead8b2cc6cce35e81b098361da1ded89a2928290030190a3506004805460ff60a01b1916600160a01b179055620001bf565b3390565b604080516060810182526000808252602082018190529181019190915290565b613cc780620001cf6000396000f3fe60806040526004361061018b5760003560e01c80638f64d73a116100d6578063dd9460301161007f578063e9fc3d1411610059578063e9fc3d1414610929578063f2fde38b1461093e578063f4de0d4f1461097e5761018b565b8063dd946030146107df578063e254a4f31461081f578063e405a406146108ff5761018b565b8063b6c91499116100b0578063b6c9149914610641578063b81f750514610746578063c3b49d041461075b5761018b565b80638f64d73a146104e75780639bd5318614610511578063b0cf0721146106175761018b565b8063629e1c69116101385780638da5cb5b116101125780638da5cb5b146104a85780638ec523b3146104bd5780638f32d59b146104d25761018b565b8063629e1c6914610402578063715018a614610455578063851131561461046a5761018b565b80634912dd14116101695780634912dd141461029d5780635a831ac4146102e35780635a9b50e0146103375761018b565b8063421457721461018d57806344500a44146101fb578063459b018414610225575b005b34801561019957600080fd5b506101e9600480360360a08110156101b057600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135811691604081013590911690606081013590608001356109a8565b60408051918252519081900360200190f35b34801561020757600080fd5b5061018b6004803603602081101561021e57600080fd5b5035610a95565b34801561023157600080fd5b5061018b6004803603608081101561024857600080fd5b50803590602081013573ffffffffffffffffffffffffffffffffffffffff1690604081013561ffff1690606001357fffffffffffffffffffffffffffffffff0000000000000000000000000000000016610b43565b3480156102a957600080fd5b5061018b600480360360408110156102c057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610d6c565b3480156102ef57600080fd5b506103236004803603602081101561030657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e0a565b604080519115158252519081900360200190f35b34801561034357600080fd5b5061018b6004803603604081101561035a57600080fd5b81019060208101813564010000000081111561037557600080fd5b82018360208201111561038757600080fd5b803590602001918460018302840111640100000000831117156103a957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903573ffffffffffffffffffffffffffffffffffffffff169150610ee29050565b6101e9600480360360c081101561041857600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff60208201358116916040810135916060820135169060808101359060a00135611119565b34801561046157600080fd5b5061018b61148f565b34801561047657600080fd5b5061047f611571565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104b457600080fd5b5061047f611589565b3480156104c957600080fd5b506101e96115a6565b3480156104de57600080fd5b506103236115ac565b3480156104f357600080fd5b5061018b6004803603602081101561050a57600080fd5b50356115ea565b6101e9600480360360e081101561052757600080fd5b81019060208101813564010000000081111561054257600080fd5b82018360208201111561055457600080fd5b8035906020019184602083028401116401000000008311171561057657600080fd5b9193909273ffffffffffffffffffffffffffffffffffffffff8335169260208101359291906060810190604001356401000000008111156105b657600080fd5b8201836020820111156105c857600080fd5b803590602001918460208302840111640100000000831117156105ea57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602081013590604001356116fe565b34801561062357600080fd5b5061018b6004803603602081101561063a57600080fd5b5035611b8f565b34801561064d57600080fd5b506101e9600480360360a081101561066457600080fd5b81019060208101813564010000000081111561067f57600080fd5b82018360208201111561069157600080fd5b803590602001918460208302840111640100000000831117156106b357600080fd5b9193909273ffffffffffffffffffffffffffffffffffffffff833516926040810190602001356401000000008111156106eb57600080fd5b8201836020820111156106fd57600080fd5b8035906020019184602083028401116401000000008311171561071f57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611e25565b34801561075257600080fd5b506101e9612034565b34801561076757600080fd5b506107856004803603602081101561077e57600080fd5b503561203a565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845261ffff90921660208401527fffffffffffffffffffffffffffffffff000000000000000000000000000000001682820152519081900360600190f35b3480156107eb57600080fd5b5061018b6004803603602081101561080257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661208b565b34801561082b57600080fd5b506108496004803603602081101561084257600080fd5b503561216d565b6040518080602001841515151581526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825285818151815260200191508051906020019080838360005b838110156108c25781810151838201526020016108aa565b50505050905090810190601f1680156108ef5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b34801561090b57600080fd5b5061018b6004803603602081101561092257600080fd5b503561225f565b34801561093557600080fd5b5061047f612434565b34801561094a57600080fd5b5061018b6004803603602081101561096157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612450565b34801561098a57600080fd5b50610323600480360360208110156109a157600080fd5b50356124cf565b600080600187815481106109b857fe5b6000918252602080832060029290920290910160010154604080517f1eac74b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a81166024830152604482018a9052915161010090930490911694508492631eac74b392606480840193829003018186803b158015610a5157600080fd5b505afa158015610a65573d6000803e3d6000fd5b505050506040513d6020811015610a7b57600080fd5b50519050610a8981856124fb565b98975050505050505050565b610a9d6115ac565b610b0857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60038190556040805182815290517f738c273cf923a5ca62dc0dd129c7e7c8213c8e0fa97cb428225e17e2cc5f16759181900360200190a150565b610b4b6115ac565b610bb657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60648261ffff161115610c2a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6665653a206e6f206d6f7265207468616e203125000000000000000000000000604482015290519081900360640190fd5b610c32613a9f565b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff85811680835261ffff86811660208086018281527fffffffffffffffffffffffffffffffff00000000000000000000000000000000898116888a0181815260008f8152600286528b90208a51815495517fffffffffffffffffffffffff00000000000000000000000000000000000000009096169a16999099177fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000949097169390930295909517875590516001909601805490911660809690961c9590951790945585519081529283015283519293909288927f5c403d036e1c349774b6d02e8239a8ead8b2cc6cce35e81b098361da1ded89a292908290030190a35050505050565b610d746115ac565b610ddf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610e0673ffffffffffffffffffffffffffffffffffffffff8316338363ffffffff6125d916565b5050565b60045460009073ffffffffffffffffffffffffffffffffffffffff16610e3257506000610edd565b60035460048054604080517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811694820194909452905192909116916370a0823191602480820192602092909190829003018186803b158015610eac57600080fd5b505afa158015610ec0573d6000803e3d6000fd5b505050506040513d6020811015610ed657600080fd5b5051101590505b919050565b610eea6115ac565b610f5557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b604080516060810182528381526001602080830182905273ffffffffffffffffffffffffffffffffffffffff851693830193909352805480820180835560009290925282518051929460029092027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60192610fd39284920190613abf565b50602082810151600192830180546040958601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909116921515929092177fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff938416021790559154835182815287518184015287517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920195509286169333937fe50f1a4b29420cb0144d8fbaa9aa5d75b03b32b5abd03553588c9f40baf970bf938993919283929083019185019080838360005b838110156110db5781810151838201526020016110c3565b50505050905090810190601f1680156111085780820380516001836020036101000a031916815260200191505b509250505060405180910390a45050565b60045460009074010000000000000000000000000000000000000000900460ff166111a557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff169055600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8816146112285761122873ffffffffffffffffffffffffffffffffffffffff881633308963ffffffff61266b16565b61123488888888612706565b905061123f33610e0a565b6112515761124e838287612d1e565b90505b838110156112c057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f64657374696e6174696f6e20616d6f756e7420697320746f6f206c6f772e0000604482015290519081900360640190fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8616141561139957604051600090339083908381818185875af1925050503d8060008114611334576040519150601f19603f3d011682016040523d82523d6000602084013e611339565b606091505b5050905080611393576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613b7a6025913960400191505060405180910390fd5b506113c0565b6113c073ffffffffffffffffffffffffffffffffffffffff8616338363ffffffff6125d916565b3373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f8fc98f27a8ede6c2eaf4c0c1a9dc70869c311fae9c121f647bdfe88a726876a58985604051808381526020018281526020019250505060405180910390a49050600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b6114976115ac565b61150257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b60005473ffffffffffffffffffffffffffffffffffffffff165b90565b60035481565b6000805473ffffffffffffffffffffffffffffffffffffffff166115ce612fe7565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6115f26115ac565b61165d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b604051600090339083908381818185875af1925050503d806000811461169f576040519150601f19603f3d011682016040523d82523d6000602084013e6116a4565b606091505b5050905080610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613b7a6025913960400191505060405180910390fd5b60045460009074010000000000000000000000000000000000000000900460ff1661178a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690558861181e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f726f757465732063616e206e6f7420626520656d707479000000000000000000604482015290519081900360640190fd5b888514611876576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613bec6026913960400191505060405180910390fd5b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8a16146118d1576118d173ffffffffffffffffffffffffffffffffffffffff8a1633308b63ffffffff61266b16565b60005b8a8110156119325760008c8c838181106118ea57fe5b905060200201359050600089898481811061190157fe5b905060200201359050611926611919838e848c612706565b859063ffffffff612feb16565b935050506001016118d4565b5061193c33610e0a565b61194e5761194b838287612d1e565b90505b838110156119bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f64657374696e6174696f6e20616d6f756e7420697320746f6f206c6f772e0000604482015290519081900360640190fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff86161415611a9657604051600090339083908381818185875af1925050503d8060008114611a31576040519150601f19603f3d011682016040523d82523d6000602084013e611a36565b606091505b5050905080611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613b7a6025913960400191505060405180910390fd5b50611abd565b611abd73ffffffffffffffffffffffffffffffffffffffff8616338363ffffffff6125d916565b3373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f8fc98f27a8ede6c2eaf4c0c1a9dc70869c311fae9c121f647bdfe88a726876a58b85604051808381526020018281526020019250505060405180910390a49050600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559998505050505050505050565b611b976115ac565b611c0257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b8060018181548110611c1057fe5b60009182526020909120600160029092020181015460ff16151514611c9657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f546869732074726164696e6720726f7574652069732064697361626c65640000604482015290519081900360640190fd5b600060018381548110611ca557fe5b906000526020600020906002020160010160006101000a81548160ff0219169083151502179055508160018381548110611cdb57fe5b906000526020600020906002020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f522343fed4da4ad88198645bf4de396fd09d83359b80334e5cab68eba80cd59e60018681548110611d6857fe5b600091825260209182902060408051848152600293840290920180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001831615020116939093049382018490529192909182919082019084908015611e135780601f10611de857610100808354040283529160200191611e13565b820191906000526020600020905b815481529060010190602001808311611df657829003601f168201915b50509250505060405180910390a45050565b600086611e9357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f726f757465732063616e206e6f7420626520656d707479000000000000000000604482015290519081900360640190fd5b868414611eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613bec6026913960400191505060405180910390fd5b6000805b8881101561201c5760008a8a83818110611f0557fe5b9050602002013590506000888884818110611f1c57fe5b905060200201359050600060018381548110611f3457fe5b600091825260209182902060016002909202010154604080517f1eac74b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8f811660048301528c8116602483015260448201879052915161010090930491909116935061200b928492631eac74b3926064808201939291829003018186803b158015611fd257600080fd5b505afa158015611fe6573d6000803e3d6000fd5b505050506040513d6020811015611ffc57600080fd5b5051869063ffffffff612feb16565b94505060019092019150611eef9050565b5061202781846124fb565b9998505050505050505050565b60015490565b6002602052600090815260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff82169174010000000000000000000000000000000000000000900461ffff169060801b83565b6120936115ac565b6120fe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe88298080913cf71aa73490a2e1bf9c29b4816c8ffda9078d180dd1278321f4190600090a250565b6001818154811061217a57fe5b60009182526020918290206002918202018054604080516001831615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190921693909304601f81018590048502820185019093528281529093509183919083018282801561222e5780601f106122035761010080835404028352916020019161222e565b820191906000526020600020905b81548152906001019060200180831161221157829003601f168201915b5050506001909301549192505060ff81169073ffffffffffffffffffffffffffffffffffffffff6101009091041683565b6122676115ac565b6122d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80600181815481106122e057fe5b600091825260209091206001600290920201015460ff161561236357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f546869732074726164696e6720726f75746520697320656e61626c6564000000604482015290519081900360640190fd5b600180838154811061237157fe5b906000526020600020906002020160010160006101000a81548160ff02191690831515021790555081600183815481106123a757fe5b906000526020600020906002020160010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe18f2d774ca2ed7ecfb01f8117b026c2c909e254f21f9d50461b1a7c1b14540560018681548110611d6857fe5b60045473ffffffffffffffffffffffffffffffffffffffff1681565b6124586115ac565b6124c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6124cc8161305f565b50565b6000600182815481106124de57fe5b600091825260209091206002909102016001015460ff1692915050565b6000818152600260205260408120805473ffffffffffffffffffffffffffffffffffffffff1661255157506000805260026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b5b805474010000000000000000000000000000000000000000900461ffff1661257c57839150506125d3565b80546000906125bc90612710906125b090889074010000000000000000000000000000000000000000900461ffff16613158565b9063ffffffff6131cb16565b90506125ce858263ffffffff61320d16565b925050505b92915050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261266690849061324f565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905261270090859061324f565b50505050565b6000846001818154811061271657fe5b60009182526020909120600160029092020181015460ff1615151461279c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f546869732074726164696e6720726f7574652069732064697361626c65640000604482015290519081900360640190fd5b6000808073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff891614156127da57479150612875565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8a16916370a08231916024808301926020929190829003018186803b15801561284657600080fd5b505afa15801561285a573d6000803e3d6000fd5b505050506040513d602081101561287057600080fd5b505191505b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff871614156128ae575047612949565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8816916370a08231916024808301926020929190829003018186803b15801561291a57600080fd5b505afa15801561292e573d6000803e3d6000fd5b505050506040513d602081101561294457600080fd5b505190505b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8916141561298d5761298689888861348d565b92506129d9565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff871614156129ca57612986898989613584565b6129d689898989613697565b92505b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff89161415612a7757612a1b828863ffffffff61320d16565b4714612a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613b586022913960400191505060405180910390fd5b612b75565b612a87828863ffffffff61320d16565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8b16916370a08231916024808301926020929190829003018186803b158015612af357600080fd5b505afa158015612b07573d6000803e3d6000fd5b505050506040513d6020811015612b1d57600080fd5b505114612b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613b586022913960400191505060405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff87161415612c1357612bb7818463ffffffff612feb16565b4714612c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180613bc56027913960400191505060405180910390fd5b612d11565b612c23818463ffffffff612feb16565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8916916370a08231916024808301926020929190829003018186803b158015612c8f57600080fd5b505afa158015612ca3573d6000803e3d6000fd5b505050506040513d6020811015612cb957600080fd5b505114612d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180613bc56027913960400191505060405180910390fd5b5090979650505050505050565b6000838152600260205260408120805473ffffffffffffffffffffffffffffffffffffffff16612d7757506000808052600260205293507fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b5b805474010000000000000000000000000000000000000000900461ffff16612da25783915050612fe0565b8054600090612dd690612710906125b090889074010000000000000000000000000000000000000000900461ffff16613158565b9050848110612e4657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f66656520657863656564732072657475726e20616d6f756e7421000000000000604482015290519081900360640190fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff85161415612f4c57815460405160009173ffffffffffffffffffffffffffffffffffffffff169083908381818185875af1925050503d8060008114612ed1576040519150601f19603f3d011682016040523d82523d6000602084013e612ed6565b606091505b5050905080612f4657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5472616e7366657220666565206f66206574686572206661696c65642e000000604482015290519081900360640190fd5b50612f78565b8154612f789073ffffffffffffffffffffffffffffffffffffffff86811691168363ffffffff6125d916565b815460408051838152905173ffffffffffffffffffffffffffffffffffffffff9283169287169189917f9050eacbec2458f587bc890a13b95d69e1584e0c68a6f1a362aa5a9cf7ac29979181900360200190a4612fdb858263ffffffff61320d16565b925050505b9392505050565b3390565b600082820183811015612fe057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166130cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613b9f6026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600082613167575060006125d3565b8282028284828161317457fe5b0414612fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613c126021913960400191505060405180910390fd5b6000612fe083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506137a5565b6000612fe083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613861565b61326e8273ffffffffffffffffffffffffffffffffffffffff166138d5565b6132d957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040518082805190602001908083835b6020831061334257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613305565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146133a4576040519150601f19603f3d011682016040523d82523d6000602084013e6133a9565b606091505b50915091508161341a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156127005780806020019051602081101561343657600080fd5b5051612700576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613c33602a913960400191505060405180910390fd5b6000806001858154811061349d57fe5b6000918252602080832060029290920290910160010154604080517f5253baae00000000000000000000000000000000000000000000000000000000815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600482015273ffffffffffffffffffffffffffffffffffffffff8881166024830152604482018a9052915161010090930490911694508492635253baae928992606480820193929182900301818588803b15801561354d57600080fd5b505af1158015613561573d6000803e3d6000fd5b50505050506040513d602081101561357857600080fd5b50519695505050505050565b6000806001858154811061359457fe5b600091825260209091206001600290920201015473ffffffffffffffffffffffffffffffffffffffff610100909104811691506135da908516828563ffffffff61391116565b604080517f5253baae00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6024830152604482018690529151600092841691635253baae91606480830192602092919082900301818787803b15801561366d57600080fd5b505af1158015613681573d6000803e3d6000fd5b505050506040513d602081101561357857600080fd5b600080600186815481106136a757fe5b600091825260209091206001600290920201015473ffffffffffffffffffffffffffffffffffffffff610100909104811691506136ed908616828663ffffffff61391116565b604080517f5253baae00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528581166024830152604482018790529151600092841691635253baae91606480830192602092919082900301818787803b15801561376e57600080fd5b505af1158015613782573d6000803e3d6000fd5b505050506040513d602081101561379857600080fd5b5051979650505050505050565b6000818361384b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156138105781810151838201526020016137f8565b50505050905090810190601f16801561383d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161385757fe5b0495945050505050565b600081848411156138cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156138105781810151838201526020016137f8565b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061390957508115155b949350505050565b8015806139bd5750604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561398f57600080fd5b505afa1580156139a3573d6000803e3d6000fd5b505050506040513d60208110156139b957600080fd5b5051155b613a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180613c5d6036913960400191505060405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017905261266690849061324f565b604080516060810182526000808252602082018190529181019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b0057805160ff1916838001178555613b2d565b82800160010185558215613b2d579182015b82811115613b2d578251825591602001919060010190613b12565b50613b39929150613b3d565b5090565b6115a391905b80821115613b395760008155600101613b4356fe736f7572636520616d6f756e74206d69736d617463682061667465722074726164655472616e73666572206574686572206261636b20746f2063616c6c6572206661696c65642e4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737364657374696e6174696f6e20616d6f756e74206d69736d61746368206166746572207472616465726f7574657320616e6420737263416d6f756e7473206c656e67746873206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a72315820673d2f8c2f0d239441e080555781176b473d073b01b663d04034e58e24a040fa64736f6c63430005110032

Deployed ByteCode Sourcemap

34389:13275:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45468:520;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45468:520:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;45468:520:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33888:189;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33888:189:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33888:189:0;;:::i;31602:337::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31602:337:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;31602:337:0;;;;;;;;;;;;;;;;;;;;;;;:::i;47071:180::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47071:180:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47071:180:0;;;;;;;;;:::i;34085:297::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34085:297:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34085:297:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;28180:386;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28180:386:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28180:386:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;28180:386:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;28180:386:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;28180:386:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;28180:386:0;;-1:-1:-1;;;28180:386:0;;;;;-1:-1:-1;28180:386:0;;-1:-1:-1;28180:386:0:i;41460:1350::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;41460:1350:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23644:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23644:140:0;;;:::i;31251:86::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31251:86:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22833:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22833:79:0;;;:::i;33510:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33510:40:0;;;:::i;23199:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23199:94:0;;;:::i;47394:267::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47394:267:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47394:267:0;;:::i;43313:1779::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;43313:1779:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;43313:1779:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;43313:1779:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;43313:1779:0;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;43313:1779:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;43313:1779:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;43313:1779:0;;-1:-1:-1;43313:1779:0;-1:-1:-1;43313:1779:0;;;;;;;;;;;;;;:::i;28745:310::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28745:310:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28745:310:0;;:::i;45996:932::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45996:932:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;45996:932:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;45996:932:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45996:932:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;45996:932:0;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;45996:932:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45996:932:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;45996:932:0;;-1:-1:-1;45996:932:0;-1:-1:-1;45996:932:0;;;;;;;;;:::i;29659:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29659:103:0;;;:::i;31346:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31346:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31346:43:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33704:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33704:176:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33704:176:0;;;;:::i;27577:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27577:28:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27577:28:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;27577:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29232:308;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29232:308:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29232:308:0;;:::i;33567:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33567:25:0;;;:::i;23939:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23939:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23939:109:0;;;;:::i;29951:128::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29951:128:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29951:128:0;;:::i;45468:520::-;45700:7;45756:32;45791:13;45805:17;45791:32;;;;;;;;;;;;;;;;;;;;;;;;:38;;;45861:61;;;;;;45791:38;45861:61;;;;;;;;;;;;;;;;;;;;;;45791:38;;;;;;;;-1:-1:-1;45791:38:0;;45861:39;;:61;;;;;;;;;;45791:38;45861:61;;;5:2:-1;;;;30:1;27;20:12;5:2;45861:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45861:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45861:61:0;;-1:-1:-1;45940:40:0;45861:61;45967:12;45940:14;:40::i;:::-;45933:47;45468:520;-1:-1:-1;;;;;;;;45468:520:0:o;33888:189::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34002:14;:23;;;34041:28;;;;;;;;;;;;;;;;;33888:189;:::o;31602:337::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31750:3;31743;:10;;;;31735:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31789:22;;:::i;:::-;-1:-1:-1;31814:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31851:15:0;;;:8;:15;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31851:25:0;;;;;;;;;;;;;;;;;;;;31892:39;;;;;;;;;;;31814:26;;;;31851:15;;31892:39;;;;;;;;;23102:1;31602:337;;;;:::o;47071:180::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47205:38;:18;;;47224:10;47236:6;47205:38;:18;:38;:::i;:::-;47071:180;;:::o;34085:297::-;34213:11;;34179:4;;34213:11;;34201:111;;-1:-1:-1;34295:5:0;34288:12;;34201:111;34360:14;;34329:11;;;:27;;;;;;:11;:27;;;;;;;;;;;;:11;;;;;:21;;:27;;;;;;;;;;;;;;;:11;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;34329:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34329:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34329:27:0;:45;;;-1:-1:-1;34085:297:0;;;;:::o;28180:386::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28354:108;;;;;;;;;;;28335:13;28354:108;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;;-1:-1;28335:128:0;;;;;;;;23:18:-1;;28335:128:0;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;28335:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28533:20;;28479:79;;;;;;;;;;;;;28533:24;;;;;-1:-1:-1;28479:79:0;;;;28497:10;;28479:79;;;;;;;;;;;;;;;;;;-1:-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;28479:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28180:386;;:::o;41460:1350::-;5013:11;;41740:7;;5013:11;;;;;5005:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5138:11;:19;;;;;;5152:5;31294:42;41833:17;;;;41829:142;;41867:58;:20;;;41888:10;41908:4;41915:9;41867:58;:20;:58;:::i;:::-;42021:47;42028:17;42047:3;42052:9;42063:4;42021:6;:47::i;:::-;42008:60;;42084:34;42107:10;42084:22;:34::i;:::-;42079:124;;42148:43;42160:12;42174:10;42186:4;42148:11;:43::i;:::-;42135:56;;42079:124;42318:13;42304:10;:27;;42296:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31294:42;42381:18;;;;42377:311;;;42435:37;;42417:12;;42435:10;;42457;;42417:12;42435:37;42417:12;42435:37;42457:10;42435;:37;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;42416:56:0;;;42524:7;42516:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42377:311;;;;42635:41;:17;;;42653:10;42665;42635:41;:17;:41;:::i;:::-;42763:10;42705:69;;42744:4;42705:69;;42719:3;42705:69;;;42725:9;42751:10;42705:69;;;;;;;;;;;;;;;;;;;;;;;;42792:10;-1:-1:-1;5318:11:0;:18;;;;;;;;41460:1350;;-1:-1:-1;;;;;;41460:1350:0:o;23644:140::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23743:1;23727:6;;23706:40;;;23727:6;;;;23706:40;;23743:1;;23706:40;23774:1;23757:19;;;;;;23644:140::o;31251:86::-;31294:42;31251:86;:::o;22833:79::-;22871:7;22898:6;;;22833:79;;:::o;33510:40::-;;;;:::o;23199:94::-;23239:4;23279:6;;;;23263:12;:10;:12::i;:::-;:22;;;23256:29;;23199:94;:::o;47394:267::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47523:33;;47505:12;;47523:10;;47545:6;;47505:12;47523:33;47505:12;47523:33;47545:6;47523:10;:33;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;47504:52:0;;;47604:7;47596:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43313:1779;5013:11;;43642:7;;5013:11;;;;;5005:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5138:11;:19;;;;;;43675:17;43667:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43739:34;;;43731:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43827:18;31294:42;43899:17;;;;43895:147;;43933:63;:20;;;43954:10;43974:4;43981:14;43933:63;:20;:63;:::i;:::-;44087:6;44082:238;44099:17;;;44082:238;;;44138:25;44166:6;;44173:1;44166:9;;;;;;;;;;;;;44138:37;;44190:14;44207:10;;44218:1;44207:13;;;;;;;;;;;;;44190:30;;44248:60;44263:44;44270:17;44289:3;44294:6;44302:4;44263:6;:44::i;:::-;44248:10;;:60;:14;:60;:::i;:::-;44235:73;-1:-1:-1;;;44118:3:0;;44082:238;;;;44361:34;44384:10;44361:22;:34::i;:::-;44356:124;;44425:43;44437:12;44451:10;44463:4;44425:11;:43::i;:::-;44412:56;;44356:124;44595:13;44581:10;:27;;44573:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31294:42;44658:18;;;;44654:311;;;44712:37;;44694:12;;44712:10;;44734;;44694:12;44712:37;44694:12;44712:37;44734:10;44712;:37;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;44693:56:0;;;44801:7;44793:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44654:311;;;;44912:41;:17;;;44930:10;44942;44912:41;:17;:41;:::i;:::-;45045:10;44982:74;;45026:4;44982:74;;44996:3;44982:74;;;45002:14;45033:10;44982:74;;;;;;;;;;;;;;;;;;;;;;;;45074:10;-1:-1:-1;5318:11:0;:18;;;;;;;;43313:1779;;-1:-1:-1;;;;;;;;;43313:1779:0:o;28745:310::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28874:6;27705:13;27719:6;27705:21;;;;;;;;;;;;;;;;:28;:21;;;;;:28;;;;;:36;;;27697:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28929:5;28898:13;28912:6;28898:21;;;;;;;;;;;;;;;;;;:28;;;:36;;;;;;;;;;;;;;;;;;29040:6;29011:13;29025:6;29011:21;;;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28950:97;;28971:10;28950:97;;;28983:13;28997:6;28983:21;;;;;;;;;;;;;;;;;28950:97;;;;;;28983:21;;;;;;;28950:97;;;;;;;;;;;;;;;;;;;;;28983:21;;28950:97;;;;;;;;28983:21;;28950:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23102:1;28745:310;:::o;45996:932::-;46260:7;46293:17;46285:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46357:34;;;46349:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46445:18;;46488:375;46505:17;;;46488:375;;;46544:25;46572:6;;46579:1;46572:9;;;;;;;;;;;;;46544:37;;46596:14;46613:10;;46624:1;46613:13;;;;;;;;;;;;;46596:30;;46676:32;46711:13;46725:17;46711:32;;;;;;;;;;;;;;;;;:38;:32;;;;;:38;;46792:58;;;;;;46711:38;46792:58;;;;;;;;;;;;;;;;;;;;;;46711:38;;;;;;;;;-1:-1:-1;46777:74:0;;46711:38;;46792:39;;:58;;;;;46711:32;46792:58;;;;;;46711:38;46792:58;;;5:2:-1;;;;30:1;27;20:12;5:2;46792:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46792:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46792:58:0;46777:10;;:74;:14;:74;:::i;:::-;46764:87;-1:-1:-1;;46524:3:0;;;;;-1:-1:-1;46488:375:0;;-1:-1:-1;46488:375:0;;;46880:40;46895:10;46907:12;46880:14;:40::i;:::-;46873:47;45996:932;-1:-1:-1;;;;;;;;;45996:932:0:o;29659:103::-;29734:13;:20;29659:103;:::o;31346:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33704:176::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33813:11;:19;;;;;;;;;;;;;33848:24;;;;-1:-1:-1;;33848:24:0;33704:176;:::o;27577:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27577:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27577:28:0;;;;;;;-1:-1:-1;;27577:28:0;;;;;;;;;;;:::o;29232:308::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29361:6;27870:13;27884:6;27870:21;;;;;;;;;;;;;;;;:28;:21;;;;;:28;;;;:37;27862:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29416:4;29385:13;29399:6;29385:21;;;;;;;;;;;;;;;;;;:28;;;:35;;;;;;;;;;;;;;;;;;29525:6;29496:13;29510:6;29496:21;;;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29436:96;;29456:10;29436:96;;;29468:13;29482:6;29468:21;;;;;;;33567:25;;;;;;:::o;23939:109::-;23045:9;:7;:9::i;:::-;23037:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24012:28;24031:8;24012:18;:28::i;:::-;23939:109;:::o;29951:128::-;30019:4;30043:13;30057:6;30043:21;;;;;;;;;;;;;;;;;;;;;:28;;;;;;29951:128;-1:-1:-1;;29951:128:0:o;31947:494::-;32058:23;32125:22;;;:8;:22;;;;;32162:14;;;;32158:112;;-1:-1:-1;32247:11:0;;;:8;:11;;;32158:112;32284:11;;;;;;;32280:62;;32324:6;32317:13;;;;;32280:62;32377:11;;32352;;32366:34;;32394:5;;32366:23;;:6;;32377:11;;;;;32366:10;:23::i;:::-;:27;:34;:27;:34;:::i;:::-;32352:48;-1:-1:-1;32418:15:0;:6;32352:48;32418:15;:10;:15;:::i;:::-;32411:22;;;;31947:494;;;;;:::o;17505:176::-;17614:58;;;17637:14;17614:58;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17614:58:0;;;;;;;;25:18:-1;;61:17;;17614:58:0;182:15:-1;17637:23:0;179:29:-1;160:49;;17588:85:0;;17607:5;;17588:18;:85::i;:::-;17505:176;;;:::o;17689:204::-;17816:68;;;17839:18;17816:68;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17816:68:0;;;;;;;;25:18:-1;;61:17;;17816:68:0;182:15:-1;17839:27:0;179:29:-1;160:49;;17790:95:0;;17809:5;;17790:18;:95::i;:::-;17689:204;;;;:::o;38573:2029::-;38844:7;38807:18;27705:13;27719:6;27705:21;;;;;;;;;;;;;;;;:28;:21;;;;;:28;;;;;:36;;;27697:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38900:18;;;31294:42;39067:18;;;;39063:180;;;39130:21;39112:39;;39063:180;;;39202:29;;;;;;39225:4;39202:29;;;;;;:14;;;;;;:29;;;;;;;;;;;;;;:14;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;39202:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39202:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39202:29:0;;-1:-1:-1;39063:180:0;31294:42;39257:19;;;;39253:182;;;-1:-1:-1;39320:21:0;39253:182;;;39393:30;;;;;;39417:4;39393:30;;;;;;:15;;;;;;:30;;;;;;;;;;;;;;:15;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;39393:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39393:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39393:30:0;;-1:-1:-1;39253:182:0;31294:42;39449:18;;;;39445:425;;;39519:57;39538:18;39558:10;39570:5;39519:18;:57::i;:::-;39506:70;;39445:425;;;31294:42;39598:19;;;;39594:276;;;39669:56;39688:18;39708:4;39714:10;39669:18;:56::i;39594:276::-;39795:63;39814:18;39834:4;39840:10;39852:5;39795:18;:63::i;:::-;39782:76;;39594:276;31294:42;39933:18;;;;39929:308;;;40011:31;:15;40031:10;40011:31;:19;:31;:::i;:::-;39986:21;:56;39978:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39929:308;;;40155:31;:15;40175:10;40155:31;:19;:31;:::i;:::-;40122:29;;;;;;40145:4;40122:29;;;;;;:14;;;;;;:29;;;;;;;;;;;;;;:14;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;40122:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40122:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40122:29:0;:64;40114:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31294:42;40251:19;;;;40247:320;;;40328:32;:16;40349:10;40328:32;:20;:32;:::i;:::-;40303:21;:57;40295:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40247:320;;;40479:32;:16;40500:10;40479:32;:20;:32;:::i;:::-;40445:30;;;;;;40469:4;40445:30;;;;;;:15;;;;;;:30;;;;;;;;;;;;;;:15;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;40445:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40445:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40445:30:0;:66;40437:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40584:10:0;;38573:2029;-1:-1:-1;;;;;;;38573:2029:0:o;32449:936::-;32557:23;32624:22;;;:8;:22;;;;;32661:14;;;;32657:145;;-1:-1:-1;32753:1:0;32779:11;;;:8;:11;;32753:1;-1:-1:-1;32779:11:0;32657:145;32816:11;;;;;;;32812:62;;32856:6;32849:13;;;;;32812:62;32909:11;;32884;;32898:34;;32926:5;;32898:23;;:6;;32909:11;;;;;32898:10;:23::i;:34::-;32884:48;;32957:6;32951:3;:12;32943:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31294:42;33009:19;;;;33005:270;;;33064:14;;:34;;33046:12;;33064:14;;;33090:3;;33046:12;33064:34;33046:12;33064:34;33090:3;33064:14;:34;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;33045:53:0;;;33150:7;33142:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33005:270;;;;33243:14;;33224:39;;33243:14;33224:18;;;;33243:14;33259:3;33224:39;:18;:39;:::i;:::-;33322:14;;33290:52;;;;;;;;33322:14;;;;;33290:52;;;33301:12;;33290:52;;;;;;;;;33362:15;:6;33373:3;33362:15;:10;:15;:::i;:::-;33355:22;;;;32449:936;;;;;;:::o;21531:98::-;21611:10;21531:98;:::o;6272:181::-;6330:7;6362:5;;;6386:6;;;;6378:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24154:229;24228:22;;;24220:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24330:6;;;24309:38;;;;;;;24330:6;;;24309:38;;;24358:6;:17;;;;;;;;;;;;;;;24154:229::o;7644:471::-;7702:7;7947:6;7943:47;;-1:-1:-1;7977:1:0;7970:8;;7943:47;8014:5;;;8018:1;8014;:5;:1;8038:5;;;;;:10;8030:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8583:132;8641:7;8668:39;8672:1;8675;8668:39;;;;;;;;;;;;;;;;;:3;:39::i;6728:136::-;6786:7;6813:43;6817:1;6820;6813:43;;;;;;;;;;;;;;;;;:3;:43::i;19544:1114::-;20148:27;20156:5;20148:25;;;:27::i;:::-;20140:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20285:12;20299:23;20334:5;20326:19;;20346:4;20326:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20326:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;20284:67:0;;;;20370:7;20362:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20431:17;;:21;20427:224;;20573:10;20562:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20562:30:0;20554:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35404:493;35559:7;35615:32;35650:13;35664:17;35650:32;;;;;;;;;;;;;;;;;;;;;;;;:38;;;35747:114;;;;;;31294:42;35747:114;;;;35650:38;35747:114;;;;;;;;;;;;;;;35650:38;;;;;;;;-1:-1:-1;35650:38:0;;35747:18;;:114;;;;;;;35650:32;35747:114;;;;;;;35650:38;35747:114;;;5:2:-1;;;;30:1;27;20:12;5:2;35747:114:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35747:114:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35747:114:0;;35404:493;-1:-1:-1;;;;;;35404:493:0:o;36359:571::-;36513:7;36569:32;36604:13;36618:17;36604:32;;;;;;;;;;;;;;;;:38;:32;;;;;:38;;;;;;;;;;-1:-1:-1;36689:49:0;;:15;;36604:38;36728:9;36689:49;:15;:49;:::i;:::-;36798:96;;;;;;:18;:96;;;;;;;31294:42;36798:96;;;;;;;;;;;;36777:18;;36798;;;;;:96;;;;;;;;;;;;;;36777:18;36798;:96;;;5:2:-1;;;;30:1;27;20:12;5:2;36798:96:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36798:96:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;37247:587:0;37423:7;37479:32;37514:13;37528:17;37514:32;;;;;;;;;;;;;;;;:38;:32;;;;;:38;;;;;;;;;;-1:-1:-1;37599:49:0;;:15;;37514:38;37638:9;37599:49;:15;:49;:::i;:::-;37708:90;;;;;;:18;:90;;;;;;;;;;;;;;;;;;;;;;37687:18;;37708;;;;;:90;;;;;;;;;;;;;;37687:18;37708;:90;;;5:2:-1;;;;30:1;27;20:12;5:2;37708:90:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37708:90:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37708:90:0;;37247:587;-1:-1:-1;;;;;;;37247:587:0:o;9245:345::-;9331:7;9433:12;9426:5;9418:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;9418:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9457:9;9473:1;9469;:5;;;;;;;9245:345;-1:-1:-1;;;;;9245:345:0:o;7201:192::-;7287:7;7323:12;7315:6;;;;7307:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7307:29:0;-1:-1:-1;;;7359:5:0;;;7201:192::o;14528:619::-;14588:4;15056:20;;14899:66;15096:23;;;;;;:42;;-1:-1:-1;15123:15:0;;;15096:42;15088:51;14528:619;-1:-1:-1;;;;14528:619:0:o;17901:621::-;18271:10;;;18270:62;;-1:-1:-1;18287:39:0;;;;;;18311:4;18287:39;;;;:15;:39;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;18287:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18287:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18287:39:0;:44;18270:62;18262:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18451:62;;;18474:13;18451:62;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;18451:62:0;;;;;;;;25:18:-1;;61:17;;18451:62:0;182:15:-1;18474:22:0;179:29:-1;160:49;;18425:89:0;;18444:5;;18425:18;:89::i;34389:13275::-;;;;;;;;;-1:-1:-1;34389:13275:0;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34389:13275:0;;;-1:-1:-1;34389:13275:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://673d2f8c2f0d239441e080555781176b473d073b01b663d04034e58e24a040fa
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.