Contract 0xc4238e4891F77f9e740067BB5535eDd5765d34a5

 

Contract Overview

Balance:
0.066401677094944099 BNB

BNB Value:
$25.38 (@ $382.24/BNB)

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xfb69b5536e5cf87b5f49a2c4d713f5740de1e020eec0f5e7cdb83d6b1e6bb3caSELL145619482022-01-21 15:09:461 day 17 hrs ago0x902638c31cf707b8adb9c344d0bcba4651661d6d IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50 BNB0.003504444
0x497c89251547b5e2dd1a1be1579e319e2beec5c50f151551a19e824b5d1f7d43SELL145334752022-01-20 15:23:522 days 17 hrs ago0xe8d55910f99effe2574e6f47b141b9d861a87762 IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50 BNB0.003264504
0x40a82c77e68709f3978345d245aa3cdb9261c7daf92d5299e2d5110e8fbf73b3SELL144982912022-01-19 9:58:463 days 22 hrs ago0x902638c31cf707b8adb9c344d0bcba4651661d6d IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50 BNB0.00324387
0x94090932f5865ba2a54dd88bd484a82f5965a2969f3fee3ddef913d9a58c2555SELL144156102022-01-16 12:23:126 days 20 hrs ago0x902638c31cf707b8adb9c344d0bcba4651661d6d IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50 BNB0.005147155
0xd4f95f570d8a750b06ab8577b14c619d15c554470d25e047d89aab6ce90fa301BUY144098392022-01-16 7:34:177 days 1 hr ago0x3e7127a896299e2c01c5c0ff82c6d4ff52cd62ee IN  0xc4238e4891f77f9e740067bb5535edd5765d34a52 BNB0.00222875
0x7bcd44d19cd50a51307993080364e7e33d6428490a3ad8d92e1b3ab7ecaa3abcBUY144097792022-01-16 7:31:177 days 1 hr ago0x3e7127a896299e2c01c5c0ff82c6d4ff52cd62ee IN  0xc4238e4891f77f9e740067bb5535edd5765d34a52 BNB0.00222875
0xe7dbe81e28e1ced730e67ea15e66678cff2396f435da9fce1413207b238d2fb4SELL143914542022-01-15 16:11:037 days 16 hrs ago0x902638c31cf707b8adb9c344d0bcba4651661d6d IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50 BNB0.00324387
0xc3e2f0b30b8cf61b131545ac2bde49346fbc5e91828e96e8f55a4f3c0d55cfb4BUY143910502022-01-15 15:50:517 days 17 hrs ago0x63a345a7b2a59924c45bd7d034695f8f98b73d53 IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50.1 BNB0.002204245
0x15f010a440e07dc8e8e619b20171fc39120b8924b50438dfe8183208b54e7c4aBUY143910422022-01-15 15:50:277 days 17 hrs ago0x63a345a7b2a59924c45bd7d034695f8f98b73d53 IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50.2 BNB0.002204375
0xc111e7e1966fb1114248786ac9935ab8b596ef517a8f2c37980b900e9377be07BUY143910222022-01-15 15:49:277 days 17 hrs ago0x63a345a7b2a59924c45bd7d034695f8f98b73d53 IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50.2 BNB0.002204375
0xee55af32b7c774c0b9f9a1ec28b626639af51078d2369ad21ab84d2d6e31b0abBUY143910092022-01-15 15:48:487 days 17 hrs ago0x63a345a7b2a59924c45bd7d034695f8f98b73d53 IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50.4 BNB0.002204375
0xc43f63895a4c21e3b82c9bd0bde2418a6f71b4a3a8aaee0ca9970dd0e79cf45aSELL143801372022-01-15 6:44:088 days 2 hrs ago0x3e7127a896299e2c01c5c0ff82c6d4ff52cd62ee IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50 BNB0.007860005
0x25c09f425c8825fe59fdee5747b26a40d589ab4838c00959b71280eb336a1844SELL143525012022-01-14 7:40:129 days 1 hr ago0x3e7127a896299e2c01c5c0ff82c6d4ff52cd62ee IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50 BNB0.00292025
0xddf77b936b3807e92d7ac850fda74cdb1229969a2a67c90f8141153df96dbed5Swap To Swap143441292022-01-14 0:39:109 days 8 hrs ago0xffe231ec752fd2b20acc3614ccf92ae04162c99f IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50 BNB0.001189185
0x9422e79e80b4ac892760348fc54da14653bf5815ad6d82b72ee7b59d535ffe04SELL143046262022-01-12 15:42:2710 days 17 hrs ago0x024bfd2647945c0db4416545e2ea5f30c0bcf741 IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50 BNB0.00272042
0x25ebf8aac4b1155c7282d65c4c07fcb5ebe66ac387c8d262655617b60a24a434Swap To Swap143008632022-01-12 12:33:3610 days 20 hrs ago0xffe231ec752fd2b20acc3614ccf92ae04162c99f IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50 BNB0.001179225
0x0db687be5e9ca0fc7e1013b5a8963196134aaebfd29a2ae52f051ca9ed83e2edSELL142705972022-01-11 11:17:3311 days 21 hrs ago0x902638c31cf707b8adb9c344d0bcba4651661d6d IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50 BNB0.00324387
0xd1d1d019d17963dc57ce721e3ed0940536d549da69dc16b6a3415984ea4059f8Withdraw Interna...142668192022-01-11 8:06:2712 days 46 mins ago0x86882fa66ac57039b10d78e2d3205592a44664c0 IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50 BNB0.00061365
0x860643becc842cbc634c9a880161253f626103486e74b8a59ab38c2226734333SELL142658932022-01-11 7:20:0912 days 1 hr ago0x902638c31cf707b8adb9c344d0bcba4651661d6d IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50 BNB0.00995315
0xc1a33bf13716178df11950d9c8e155a85db00db343e19d1fa3ac95687a223161BUY142398642022-01-10 9:34:4812 days 23 hrs ago0xfbca9a5f3df3ebc629ae053233c60d447f217ceb IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50.5 BNB0.002204375
0xcaf9fa45da108651a0db96223e6e4d81864ad9ea00a17993208115b1c9e5d110BUY142386272022-01-10 8:32:5713 days 20 mins ago0xd4698105510c9dd40302a318aa2ac6f5e4100dc9 IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50.19 BNB0.002366645
0xcef7bb9aa04d33e8cede855dc89dccc4b020d5059b4c142d6641c8e394c65fb5BUY142374662022-01-10 7:34:5413 days 1 hr ago0xdc1d2465eb6b29621512cd444311cf840502585a IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50.05 BNB0.002195585
0x2da086f76766060c19d713eb7500edb70079f535342b63804fee7b9a43e5f346BUY142153282022-01-09 13:07:5313 days 19 hrs ago0x5d25f77d1704a2c18e406404483aa594c83c2305 IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50.3 BNB0.002366715
0x7a7449dae54b07b1f11693f83cab2508edfd1a8eaee1b57778eeaaedb2c872f8BUY142128032022-01-09 11:00:4713 days 21 hrs ago0x58e682e34f939cc61e5ea5cfcaea16b873eaa93b IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50.166 BNB0.002195525
0x075d50e5156acbabf4eb771317a75dfef3a1be66f7c7d72fcfda34da43f21c92BUY142106142022-01-09 9:11:1913 days 23 hrs ago0x58e682e34f939cc61e5ea5cfcaea16b873eaa93b IN  0xc4238e4891f77f9e740067bb5535edd5765d34a50.21 BNB0.002195715
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xfb69b5536e5cf87b5f49a2c4d713f5740de1e020eec0f5e7cdb83d6b1e6bb3ca145619482022-01-21 15:09:461 day 17 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a50x902638c31cf707b8adb9c344d0bcba4651661d6d1.015302009284412215 BNB
0xfb69b5536e5cf87b5f49a2c4d713f5740de1e020eec0f5e7cdb83d6b1e6bb3ca145619482022-01-21 15:09:461 day 17 hrs ago 0x87b1acce6a1958e522233a737313c086551a5c76 0xc4238e4891f77f9e740067bb5535edd5765d34a51.016846566013305869 BNB
0x497c89251547b5e2dd1a1be1579e319e2beec5c50f151551a19e824b5d1f7d43145334752022-01-20 15:23:522 days 17 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a50xe8d55910f99effe2574e6f47b141b9d861a877620.034877261145548288 BNB
0x497c89251547b5e2dd1a1be1579e319e2beec5c50f151551a19e824b5d1f7d43145334752022-01-20 15:23:522 days 17 hrs ago 0x87b1acce6a1958e522233a737313c086551a5c76 0xc4238e4891f77f9e740067bb5535edd5765d34a50.0349303191597107 BNB
0x40a82c77e68709f3978345d245aa3cdb9261c7daf92d5299e2d5110e8fbf73b3144982912022-01-19 9:58:463 days 22 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a50x902638c31cf707b8adb9c344d0bcba4651661d6d0.256248488394355135 BNB
0x40a82c77e68709f3978345d245aa3cdb9261c7daf92d5299e2d5110e8fbf73b3144982912022-01-19 9:58:463 days 22 hrs ago 0x87b1acce6a1958e522233a737313c086551a5c76 0xc4238e4891f77f9e740067bb5535edd5765d34a50.256638313612269639 BNB
0x94090932f5865ba2a54dd88bd484a82f5965a2969f3fee3ddef913d9a58c2555144156102022-01-16 12:23:126 days 20 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a5 0x818e2013dd7d9bf4547aaabf6b617c1262578bc70.010878546135377413 BNB
0x94090932f5865ba2a54dd88bd484a82f5965a2969f3fee3ddef913d9a58c2555144156102022-01-16 12:23:126 days 20 hrs ago 0x87b1acce6a1958e522233a737313c086551a5c76 0xc4238e4891f77f9e740067bb5535edd5765d34a50.010878546135377414 BNB
0x94090932f5865ba2a54dd88bd484a82f5965a2969f3fee3ddef913d9a58c2555144156102022-01-16 12:23:126 days 20 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a50x902638c31cf707b8adb9c344d0bcba4651661d6d0.938323923945960264 BNB
0x94090932f5865ba2a54dd88bd484a82f5965a2969f3fee3ddef913d9a58c2555144156102022-01-16 12:23:126 days 20 hrs ago 0x87b1acce6a1958e522233a737313c086551a5c76 0xc4238e4891f77f9e740067bb5535edd5765d34a50.939751375598138217 BNB
0xd4f95f570d8a750b06ab8577b14c619d15c554470d25e047d89aab6ce90fa301144098392022-01-16 7:34:177 days 1 hr ago 0xc4238e4891f77f9e740067bb5535edd5765d34a50x3e7127a896299e2c01c5c0ff82c6d4ff52cd62ee0.006 BNB
0xd4f95f570d8a750b06ab8577b14c619d15c554470d25e047d89aab6ce90fa301144098392022-01-16 7:34:177 days 1 hr ago 0xc4238e4891f77f9e740067bb5535edd5765d34a5 0x87b1acce6a1958e522233a737313c086551a5c761.994 BNB
0x7bcd44d19cd50a51307993080364e7e33d6428490a3ad8d92e1b3ab7ecaa3abc144097792022-01-16 7:31:177 days 1 hr ago 0xc4238e4891f77f9e740067bb5535edd5765d34a50x3e7127a896299e2c01c5c0ff82c6d4ff52cd62ee0.006 BNB
0x7bcd44d19cd50a51307993080364e7e33d6428490a3ad8d92e1b3ab7ecaa3abc144097792022-01-16 7:31:177 days 1 hr ago 0xc4238e4891f77f9e740067bb5535edd5765d34a5 0x87b1acce6a1958e522233a737313c086551a5c761.994 BNB
0xe7dbe81e28e1ced730e67ea15e66678cff2396f435da9fce1413207b238d2fb4143914542022-01-15 16:11:037 days 16 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a50x902638c31cf707b8adb9c344d0bcba4651661d6d0.239251500008350518 BNB
0xe7dbe81e28e1ced730e67ea15e66678cff2396f435da9fce1413207b238d2fb4143914542022-01-15 16:11:037 days 16 hrs ago 0x87b1acce6a1958e522233a737313c086551a5c76 0xc4238e4891f77f9e740067bb5535edd5765d34a50.239615468079778102 BNB
0xc3e2f0b30b8cf61b131545ac2bde49346fbc5e91828e96e8f55a4f3c0d55cfb4143910502022-01-15 15:50:517 days 17 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a50x63a345a7b2a59924c45bd7d034695f8f98b73d530.0003 BNB
0xc3e2f0b30b8cf61b131545ac2bde49346fbc5e91828e96e8f55a4f3c0d55cfb4143910502022-01-15 15:50:517 days 17 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a5 0x87b1acce6a1958e522233a737313c086551a5c760.0997 BNB
0x15f010a440e07dc8e8e619b20171fc39120b8924b50438dfe8183208b54e7c4a143910422022-01-15 15:50:277 days 17 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a50x63a345a7b2a59924c45bd7d034695f8f98b73d530.0006 BNB
0x15f010a440e07dc8e8e619b20171fc39120b8924b50438dfe8183208b54e7c4a143910422022-01-15 15:50:277 days 17 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a5 0x87b1acce6a1958e522233a737313c086551a5c760.1994 BNB
0xc111e7e1966fb1114248786ac9935ab8b596ef517a8f2c37980b900e9377be07143910222022-01-15 15:49:277 days 17 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a50x63a345a7b2a59924c45bd7d034695f8f98b73d530.0006 BNB
0xc111e7e1966fb1114248786ac9935ab8b596ef517a8f2c37980b900e9377be07143910222022-01-15 15:49:277 days 17 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a5 0x87b1acce6a1958e522233a737313c086551a5c760.1994 BNB
0xee55af32b7c774c0b9f9a1ec28b626639af51078d2369ad21ab84d2d6e31b0ab143910092022-01-15 15:48:487 days 17 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a50x63a345a7b2a59924c45bd7d034695f8f98b73d530.0012 BNB
0xee55af32b7c774c0b9f9a1ec28b626639af51078d2369ad21ab84d2d6e31b0ab143910092022-01-15 15:48:487 days 17 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a5 0x87b1acce6a1958e522233a737313c086551a5c760.3988 BNB
0xc43f63895a4c21e3b82c9bd0bde2418a6f71b4a3a8aaee0ca9970dd0e79cf45a143801372022-01-15 6:44:088 days 2 hrs ago 0xc4238e4891f77f9e740067bb5535edd5765d34a50x3e7127a896299e2c01c5c0ff82c6d4ff52cd62ee2.270490424155908552 BNB
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xa178EF66fb228A5ee9Bb80B26Ebb721650390032

Contract Name:
FEGexPRO

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 5 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

pragma solidity 0.8.7;     
// SPDX-License-Identifier: UNLICENSED 

contract FEGmath {

    function btoi(uint256 a)
        internal pure
        returns (uint256)
    {
        return a / 1e18;
    }

    function bfloor(uint256 a)
        internal pure
        returns (uint256)
    {
        return btoi(a) * 1e18;
    }

    function badd(uint256 a, uint256 b)
        internal pure
        returns (uint256)
    {
        uint256 c = a + b;
        require(c >= a, "ERR_ADD_OVERFLOW");
        return c;
    }

    function bsub(uint256 a, uint256 b)
        internal pure
        returns (uint256)
    {
        (uint256 c, bool flag) = bsubSign(a, b);
        require(!flag, "ERR_SUB_UNDERFLOW");
        return c;
    }

    function bsubSign(uint256 a, uint256 b)
        internal pure
        returns (uint, bool)
    {
        if (a >= b) {
            return (a - b, false);
        } else {
            return (b - a, true);
        }
    }

    function bmul(uint256 a, uint256 b)
        internal pure
        returns (uint256)
    {
        uint256 c0 = a * b;
        require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW");
        uint256 c1 = c0 + (1e18 / 2);
        require(c1 >= c0, "ERR_MUL_OVERFLOW");
        uint256 c2 = c1 / 1e18;
        return c2;
    }

    function bdiv(uint256 a, uint256 b)
        internal pure
        returns (uint256)
    {
        require(b != 0, "ERR_DIV_ZERO");
        uint256 c0 = a * 1e18;
        require(a == 0 || c0 / a == 1e18, "ERR_DIV_INTERNAL"); // bmul overflow
        uint256 c1 = c0 + (b / 2);
        require(c1 >= c0, "ERR_DIV_INTERNAL"); //  badd require
        uint256 c2 = c1 / b;
        return c2;
    }

    function bpowi(uint256 a, uint256 n)
        internal pure
        returns (uint256)
    {
        uint256 z = n % 2 != 0 ? a : 1e18;

        for (n /= 2; n != 0; n /= 2) {
            a = bmul(a, a);

            if (n % 2 != 0) {
                z = bmul(z, a);
            }
        }
        return z;
    }

    function bpow(uint256 base, uint256 exp)
        internal pure
        returns (uint256)
    {
        require(base >= 1 wei, "ERR_BPOW_BASE_TOO_LOW");
        require(base <= (2 * 1e18) - 1 wei, "ERR_BPOW_BASE_TOO_HIGH");

        uint256 whole  = bfloor(exp);
        uint256 remain = bsub(exp, whole);

        uint256 wholePow = bpowi(base, btoi(whole));

        if (remain == 0) {
            return wholePow;
        }

        uint256 partialResult = bpowApprox(base, remain, 1e18 / 1e10);
        return bmul(wholePow, partialResult);
    }

    function bpowApprox(uint256 base, uint256 exp, uint256 precision)
        internal pure
        returns (uint256)
    {
        uint256 a     = exp;
        (uint256 x, bool xneg)  = bsubSign(base, 1e18);
        uint256 term = 1e18;
        uint256 sum   = term;
        bool negative = false;


        for (uint256 i = 1; term >= precision; i++) {
            uint256 bigK = i * 1e18;
            (uint256 c, bool cneg) = bsubSign(a, bsub(bigK, 1e18));
            term = bmul(term, bmul(c, x));
            term = bdiv(term, bigK);
            if (term == 0) break;

            if (xneg) negative = !negative;
            if (cneg) negative = !negative;
            if (negative) {
                sum = bsub(sum, term);
            } else {
                sum = badd(sum, term);
            }
        }

        return sum;
    }
}

contract FMath is FEGmath {
    
        function calcSpotPrice(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 swapFee
    )
        public pure
        returns (uint256 spotPrice)
    {
        uint256 numer = bdiv(tokenBalanceIn, tokenWeightIn);
        uint256 denom = bdiv(tokenBalanceOut, tokenWeightOut);
        uint256 ratio = bdiv(numer, denom);
        uint256 scale = bdiv(10**18, bsub(10**18, swapFee));
        return  (spotPrice = bmul(ratio, scale));
    }


    function calcOutGivenIn(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountIn,
        uint256 swapFee
    )
        public pure
        returns (uint256 tokenAmountOut, uint256 tokenInFee)
    {
        uint256 weightRatio = bdiv(tokenWeightIn, tokenWeightOut);
        uint256 adjustedIn = bsub(10**18, swapFee);
        adjustedIn = bmul(tokenAmountIn, adjustedIn);
        uint256 y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
        uint256 foo = bpow(y, weightRatio);
        uint256 bar = bsub(1e18, foo);
        tokenAmountOut = bmul(tokenBalanceOut, bar);
        tokenInFee = bsub(tokenAmountIn, adjustedIn);
        return (tokenAmountOut, tokenInFee);
    }

    function calcOutGivenIn1(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountIn
    )
        public pure
        returns (uint256 tokenAmountOut)
    {
        uint256 weightRatio = bdiv(tokenWeightIn, tokenWeightOut);
        uint256 adjustedIn = bsub(10**18, 0);
        adjustedIn = bmul(tokenAmountIn, adjustedIn);
        uint256 y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn));
        uint256 foo = bpow(y, weightRatio);
        uint256 bar = bsub(1e18, foo);
        tokenAmountOut = bmul(tokenBalanceOut, bar);
        return tokenAmountOut;
    }

    function calcInGivenOut(
        uint256 tokenBalanceIn,
        uint256 tokenWeightIn,
        uint256 tokenBalanceOut,
        uint256 tokenWeightOut,
        uint256 tokenAmountOut,
        uint256 swapFee
    )
        public pure
        returns (uint256 tokenAmountIn, uint256 tokenInFee)
    {
        uint256 weightRatio = bdiv(tokenWeightOut, tokenWeightIn);
        uint256 diff = bsub(tokenBalanceOut, tokenAmountOut);
        uint256 y = bdiv(tokenBalanceOut, diff);
        uint256 foo = bpow(y, weightRatio);
        foo = bsub(foo, 1e18);
        foo = bmul(tokenBalanceIn, foo);
        tokenAmountIn = bsub(1e18, swapFee);
        tokenAmountIn = bdiv(foo, tokenAmountIn);
        tokenInFee = bdiv(foo, 1e18);
        tokenInFee = bsub(tokenAmountIn, tokenInFee);
        return (tokenAmountIn, tokenInFee);
    }
}

interface IERC20 {

    function totalSupply() external view returns (uint256);
    function balanceOf(address whom) external view returns (uint256);
    function allowance(address src, address dst) external view returns (uint256);
    function approve(address dst, uint256 amt) external returns (bool);
    function transfer(address dst, uint256 amt) external returns (bool);
    function transferFrom(
        address src, address dst, uint256 amt
    ) external returns (bool);
}

interface wrap {
    function deposit() external payable;
    function withdraw(uint256 amt) external;
    function transfer(address recipient, uint256 amount) external returns (bool);
}

interface swap {
    function depositInternal(address asset, uint256 amt) external;
    function payMain(address payee, uint256 amount) external;
    function payToken(address payee, uint256 amount) external;
    function BUY(uint256 dot, address to, uint256 minAmountOut) external payable;
}

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

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

library Address {
    
    function isContract(address account) internal view returns (bool) {
         bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
    
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
   
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract LPTokenBase is FEGmath {

    mapping(address => uint256)                   internal _balance;
    mapping(address => mapping(address=>uint256)) internal _allowance;
    uint256 public totalSupply = 0;
    event Approval(address indexed src, address indexed dst, uint256 amt);
    event Transfer(address indexed src, address indexed dst, uint256 amt);
    
    function _mint(uint256 amt) internal {
        _balance[address(this)] = badd(_balance[address(this)], amt);
        totalSupply = badd(totalSupply, amt);
        emit Transfer(address(0), address(this), amt);
    }

    function _move(address src, address dst, uint256 amt) internal {
        require(_balance[src] >= amt);
        _balance[src] = bsub(_balance[src], amt);
        _balance[dst] = badd(_balance[dst], amt);
        emit Transfer(src, dst, amt);
    }

    function _push(address to, uint256 amt) internal {
        _move(address(this), to, amt);
    }
}

contract LPToken is LPTokenBase {

    string  public name     = "FEGex PRO";
    string  public symbol   = "LP Token";
    uint8   public decimals = 18;

    function allowance(address src, address dst) external view returns (uint256) {
        return _allowance[src][dst];
    }

    function balanceOf(address whom) external view returns (uint256) {
        return _balance[whom];
    }

    function approve(address dst, uint256 amt) external returns (bool) {
        _allowance[msg.sender][dst] = amt;
        emit Approval(msg.sender, dst, amt);
        return true;
    }

    function increaseApproval(address dst, uint256 amt) external returns (bool) {
        _allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt);
        emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
        return true;
    }

    function decreaseApproval(address dst, uint256 amt) external returns (bool) {
        uint256 oldValue = _allowance[msg.sender][dst];
        if (amt > oldValue) {
            _allowance[msg.sender][dst] = 0;
        } else {
            _allowance[msg.sender][dst] = bsub(oldValue, amt);
        }
        emit Approval(msg.sender, dst, _allowance[msg.sender][dst]);
        return true;
    }
}

interface FEGexPair {
    function initialize(address, address, address, address, uint256) external; 
    function deploySwap(address, uint256) external;
    function userBalanceInternal(address _addr) external returns (uint256, uint256);
}

interface newDeployer {
    function createPair(address token, uint256 liqmain, uint256 liqtoken, address owner) external;
}

contract FEGexPRO is LPToken, FMath {
    using Address for address;
    struct Record {
        uint256 index;
        uint256 balance;
    }
    
    struct userLock {
        bool setLock; // true = lockedLiquidity, false = unlockedLiquidity
        uint256 unlockTime; // time liquidity can be released
    }
    
    function getUserLock(address usr) public view returns(bool lock){
        return (_userlock[usr].setLock);
    }

    event LOG_SWAP(
        address indexed caller,
        address indexed tokenIn,
        address indexed tokenOut,
        uint256         tokenAmountIn,
        uint256         tokenAmountOut
);

    event LOG_JOIN(
        address indexed caller,
        address indexed tokenIn,
        uint256         tokenAmountIn,
        uint256         reservesAmount
);

    event LOG_EXIT(
        address indexed caller,
        address indexed tokenOut,
        uint256         tokenAmountOut,
        uint256         reservesAmount
    );

    event LOG_SMARTSWAP(
        address indexed caller,
        address indexed tokenIn,
        address indexed tokenOut,
        uint256         AmountIn,
        uint256         AmountOut
);

    uint256 private spec;
    address private _controller = 0x4c9BC793716e8dC05d1F48D8cA8f84318Ec3043C; 
    address private _setter = 0x86882FA66aC57039b10D78e2D3205592A44664c0;
    address private fegp;
    address private FEG = 0xacFC95585D80Ab62f67A14C566C1b7a49Fe91167;
    address private burn = 0x000000000000000000000000000000000000dEaD;
    address public _poolOwner;
    address public Main = 0x87b1AccE6a1958E522233A737313C086551a5c76;
    address private newDep;
    address public Token;
    address public pairRewardPool;
    address private FEGstake;
    address public Bonus;
    uint256 public MAX_BUY_RATIO = 100e18;
    uint256 public MAX_SELL_RATIO;
    uint256 public PSS = 20; // pairRewardPool Share 0.2% default
    uint256 public RPF = 1000; // Smart Rising Price Floor Setting
    address[] private _tokens;
    uint256 public _totalSupply1;
    uint256 public _totalSupply2;
    uint256 public _totalSupply7;
    uint256 public _totalSupply8;
    uint256 public lockedLiquidity;
    uint256 public totalSentRebates;
    bool private live = false;
    //bool private on = true;
    bool public open = false;
    mapping(address=>Record) private  _records;
    mapping(address=>userLock) private  _userlock;
    mapping(address=>userLock) public  _unlockTime;
    mapping(address=>bool) private whiteListContract;
    mapping(address => uint256) private _balances1;
    mapping(address => uint256) private _balances2;
    uint256 private constant MAX_RATIO  = 50; // Max ratio for all trades based on liquidity amount
    uint256 public tx1;
    uint256 public tx2 = 99;
    uint256 private status = 0;
   
    function initialize( address _token1, address owner, address _made, address _fegp, uint256 ol) external{
        require(live == false, "Can only use once");
        Token = _token1;
        _poolOwner = owner;
        pairRewardPool = owner;
        spec = ol;
        fegp = _fegp;
        FEGstake = _made;
        MAX_SELL_RATIO = bmul(IERC20(Token).totalSupply(), bdiv(1, 20));
    }
    
    receive() external payable {
    }

    function userBalanceInternal(address _addr) public view returns(uint256, uint256) {
        uint256 main  = _balances2[_addr];
        uint256 token = _balances1[_addr];
        return (token, main);
    } 
    
    function isContract(address account) internal view returns(bool) {
        
        if(IsWhiteListContract(account)) {  return false; }
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
    
    function addWhiteListContract(address _addy, bool boolean) public {
        require(msg.sender == _setter);
        whiteListContract[_addy] = boolean;
    }
    
    function IsWhiteListContract(address _addy) public view returns(bool){
        return whiteListContract[_addy];
    }
    
    modifier noContract() {
        require(isContract(msg.sender) == false, "Unapproved contracts are not allowed to interact with the swap");
        _;
    }
    
    function sync() public {  // updates the liquidity to current state
        _records[Token].balance = IERC20(Token).balanceOf(address(this)) - _totalSupply1;  
        uint256 al = (_totalSupply2 + _totalSupply7 + _totalSupply8);
        _records[Main].balance = IERC20(Main).balanceOf(address(this)) - al;
    }
    
    function setMaxBuySellRatio(uint256 sellmax, uint256 buymax) public {
        require(msg.sender == _poolOwner, "You do not have permission");
        uint256 tob = IERC20(Token).totalSupply();
        require (sellmax >= tob/1000 && sellmax <= tob, "min 0.1% of token supply, max 100% of token supply"); 
        require (buymax >= 1e18, "1 BNB minimum");
        MAX_SELL_RATIO = sellmax;
        MAX_BUY_RATIO = buymax;
    }
    
    function openit() public{ // Since only sets to true, trading can never be turned off
        require(msg.sender == _poolOwner);
        open = true;
    }
    
    function setBonus(address _bonus) public{ // For tokens that have a 3rd party token reflection
        require(msg.sender == _poolOwner && _bonus != Main  && _bonus != Token);
        require(isContract(_bonus) == true);
        Bonus = _bonus;
    }
    
    function setStakePool(address _stake, address _fegp, address newd) public {
        require(msg.sender == _setter);
        FEGstake = _stake;
        fegp = _fegp;
        newDep = newd;
    }
    
    function setPRP(address prp) public {
        require(msg.sender == _setter);
        pairRewardPool = prp;
    }
    
    function setTX1(uint256 amt) public {
        require(msg.sender == _setter);
        tx1 = amt;
    }
    
    function getBalance(address token)
        external view
        returns (uint256)
    {
        
        return _records[token].balance;
    }

    function setCont(address manager, address set, address ad)
        external
    {
        require(msg.sender == _controller);
        _controller = manager;
        _setter = set;
        _poolOwner = ad; // Incase pool owner wallet was compromised and needs new access
    }
    
    function setLockLiquidity() public { //
        address user;
        user = msg.sender;
        require(getUserLock(user) == false, "Liquidity already locked");
        uint256 total = IERC20(address(this)).balanceOf(user);
        userLock storage ulock = _userlock[user];
        userLock storage time = _unlockTime[user];
        ulock.setLock = true;
        time.unlockTime = block.timestamp + 90 days; 
        lockedLiquidity += total;
    }
    
    function deploySwap (address _from, uint256 liqtoken)
        external
        {
        require(live == false);
        uint256 much = IERC20(Token).balanceOf(address(this));
        uint256 much1 = IERC20(Main).balanceOf(address(this));
        _records[Token] = Record({
            index: _tokens.length,
            balance: much
        });
        
        _records[Main] = Record({
            index: _tokens.length,
            balance: much1
        });
        
        _tokens.push(Token);
        _tokens.push(Main);
        uint256 a = bdiv(_records[Token].balance, 1e9);
        uint256 b = bdiv(_records[Main].balance, 1e18);
        uint256 c = a + b;
        _mint(c);
        _push(_from, c);
        lockedLiquidity = badd(lockedLiquidity, c);
        userLock storage ulock = _userlock[_from];
        userLock storage time = _unlockTime[_from];
        ulock.setLock = true;
        time.unlockTime = block.timestamp + 365 days; 
        live = true;
        tx1 = bmul(100, bdiv(much, liqtoken)); 
    }
   
    function getSpotPrice(address tokenIn, address tokenOut)
        public view
        returns (uint256 spotPrice)
    {
        
        Record storage inRecord = _records[address(tokenIn)];
        Record storage outRecord = _records[address(tokenOut)];
        return calcSpotPrice(inRecord.balance, bmul(1e18, 25), outRecord.balance, bmul(1e18, 25), 2e15);
    }
        
    function depositInternal(address asset, uint256 amt) external {
        require(asset == Main || asset == Token, "Not supported");
        require(status == 0, "No reentry");
        status = 1;
        require(open == true);
        
        if(asset == Token){
        uint256 bef = _records[Token].balance;     
        _pullUnderlying(Token, msg.sender, amt);
        uint256 aft = bsub(IERC20(Token).balanceOf(address(this)), _totalSupply1);  
        uint256 finalAmount = bsub(aft, bef);  
        _totalSupply1 += finalAmount;
        _balances1[msg.sender] += finalAmount;
        }
        else{
        uint256 bef = _records[Main].balance;
        _pullUnderlying(Main, msg.sender, amt);
        uint256 aft = bsub(IERC20(Main).balanceOf(address(this)), badd(_totalSupply2, badd(_totalSupply7, _totalSupply8)));
        uint256 finalAmount = bsub(aft, bef);
        _totalSupply2  += finalAmount;
        _balances2[msg.sender] += finalAmount;
        }
        status = 0;
    }

    function withdrawInternal(address asset, uint256 amt) external {
        require(asset == Main || asset == Token, "Not supported");
        require(status == 0, "No reentry");
        status = 1;
        
        if(asset == Token){
        require(_balances1[msg.sender] >= amt, "Not enough Token");
        _totalSupply1 -= amt;
        _balances1[msg.sender] -= amt;
        _pushUnderlying(Token, msg.sender, amt);
        }
        else{
        require(_balances2[msg.sender] >= amt, "Not enough Main");
        _totalSupply2 -= amt;
        _balances2[msg.sender] -= amt;
        _pushUnderlying(Main, msg.sender, amt);
        }
        status = 0;
    }

    function swapToSwap(address path, address asset, address to, uint256 amt) external {
        require(asset == Main || asset == Token, "Not supported");
        require(status == 0, "No reentry");
        status = 1;
        if(asset == Main){
        require(_balances2[msg.sender] >= amt, "Not enough Main");
        IERC20(address(Main)).approve(address(path), amt);   
        _totalSupply2 -= amt;
        _balances2[msg.sender] -= amt;
        swap(path).depositInternal(Main, amt);
        (uint256 tokens, uint256 mains) = FEGexPair(path).userBalanceInternal(address(this));
        swap(path).payMain(to, mains);
        tokens = 0;
        }
    
        else{
        require(_balances1[msg.sender] >= amt, "Not enough Token");
        IERC20(address(Token)).approve(address(path), amt);
        _totalSupply1 -= amt;
        _balances1[msg.sender] -= amt;
        swap(path).depositInternal(Token, amt);
        (uint256 tokens, uint256 mains) = FEGexPair(path).userBalanceInternal(address(this));
        swap(path).payToken(to, tokens);
        mains = 0;
        }
        status = 0;
    }
    
    function transfer(address dst, uint256 amt) external returns(bool) {
        require(getUserLock(msg.sender) == false, "Liquidity is locked, you cannot remove liquidity until after lock time.");
        _move(msg.sender, dst, amt);
        return true;
    }

    function transferFrom(address src, address dst, uint256 amt) external returns(bool) {
        require(msg.sender == src || amt <= _allowance[src][msg.sender]);
        require(getUserLock(msg.sender) == false, "Liquidity is locked, you cannot remove liquidity until after lock time.");
        _move(src, dst, amt);
        if (msg.sender != src && _allowance[src][msg.sender] != type(uint256).max) {
            _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt);
            emit Approval(msg.sender, dst, _allowance[src][msg.sender]);
        }
        return true;
    }
    
    function addBothLiquidity(uint256 poolAmountOut, uint[] calldata maxAmountsIn)
        external 
    {
        require(status == 0, "No reentry");
        status = 1;
        uint256 poolTotal = totalSupply;
        uint256 ratio = bdiv(poolAmountOut, poolTotal);
        
        if(getUserLock(msg.sender) == true){
        lockedLiquidity += poolAmountOut;    
        }
        
        for (uint256 i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint256 bal = _records[t].balance;
            
            uint256 tokenAmountIn = bmul(ratio, bal); 
            require(tokenAmountIn <= maxAmountsIn[i]);
            emit LOG_JOIN(msg.sender, t, tokenAmountIn, 0);
            _pullUnderlying(t, msg.sender, tokenAmountIn);
            
        }
        _mint(poolAmountOut);
        _push(msg.sender, poolAmountOut);
        sync();
        status = 0;
    }
   
    function removeBothLiquidity(uint256 poolAmountIn, uint[] calldata minAmountsOut)
        external 
    {
        
        require(getUserLock(msg.sender) == false, "Liquidity is locked, you cannot remove liquidity until after lock time.");
        require(status == 0, "No reentry");
        status = 1;
        sync();
        uint256 poolTotal = totalSupply;
        uint256 ratio = bdiv(poolAmountIn, poolTotal);

        _balance[msg.sender] -= poolAmountIn;
        totalSupply -= poolAmountIn;
        emit Transfer(msg.sender, address(0), poolAmountIn);
        
        for (uint256 i = 0; i < _tokens.length; i++) {
            address t = _tokens[i];
            uint256 bal = _records[t].balance;
            uint256 tokenAmountOut = bmul(ratio, bal);
            require(tokenAmountOut >= minAmountsOut[i], "Minimum amount out not met");
            emit LOG_EXIT(msg.sender, t, tokenAmountOut, 0);
            _pushUnderlying(t, msg.sender, tokenAmountOut);
        }
        
        uint256 tab = bmul(ratio, _balances2[burn]);
        _balances2[burn] -= tab;
        _balances2[msg.sender] += tab;
        sync();
        if(Bonus != address(0)){
        uint256 bal1 = bmul(ratio, IERC20(Bonus).balanceOf(address(this)));
        if(bal1 > 0){
        _pushUnderlying(Bonus, msg.sender, bal1);
        }
        }
        status = 0;
    }
    
    function sendRebate() internal {
        uint256 re = address(this).balance / 8;
        TransferHelper.safeTransferETH(msg.sender, re);
        totalSentRebates += re;
    }
    
    function BUYSmart(
        uint256 tokenAmountIn,
        uint256 minAmountOut
    )   
        external 
        returns(uint256 tokenAmountOut)
    {

        require(_balances2[msg.sender] >= tokenAmountIn, "Not enough Main, deposit more");
        require(status == 0, "No reentry");
        status = 1;
        Record storage inRecord = _records[address(Main)];
        Record storage outRecord = _records[address(Token)];
        require(tokenAmountIn <= MAX_BUY_RATIO, "ERR_BUY_IN_RATIO");
        uint256 tokenInFee;
        (tokenAmountOut, tokenInFee) = calcOutGivenIn(
                                            inRecord.balance,
                                            bmul(1e18, 25),
                                            outRecord.balance,
                                            bmul(1e18, 25),
                                            bmul(tokenAmountIn, bdiv(999, 1000)),
                                            0
                                        );
        
        require(tokenAmountOut <= bmul(outRecord.balance, bdiv(MAX_RATIO, 100)), "Over MAX_OUT_RATIO");                                
        require(tokenAmountOut >= minAmountOut, "Minimum amount out not met");   
        _balances2[msg.sender] -= tokenAmountIn;
        _totalSupply2 -= tokenAmountIn;
        _balances1[msg.sender] += tokenAmountOut;
        _totalSupply1 += tokenAmountOut;
        _totalSupply8 += bmul(tokenAmountIn, bdiv(1, 1000));
        sync();
        emit LOG_SMARTSWAP(msg.sender, Main, Token, tokenAmountIn, tokenAmountOut);
        uint256 hold = IERC20(FEG).balanceOf(address(msg.sender));
        if(address(this).balance > 0 && tokenAmountIn >= 2e17 && hold >= 2e19){
        uint256 re = bdiv(address(this).balance, 8);
        TransferHelper.safeTransferETH(msg.sender, re);
        totalSentRebates += re;
        }
        status = 0;
        return(tokenAmountOut);
    }
    
    function BUY(
        uint256 dot,
        address to,
        uint256 minAmountOut
    )  
        external payable
        returns(uint256 tokenAmountOut)
    {
        require(status == 0, "No reentry");
        status = 1;
        require(open == true, "Swap not opened");
        uint256 maker = bmul(msg.value, bdiv(997, 1000));
        wrap(Main).deposit{value: maker}();
        TransferHelper.safeTransferETH(msg.sender, bmul(msg.value, bdiv(3, 1000)));
        
        if(Address.isContract(msg.sender) == true){ 
        require(dot == spec, "Contracts are not allowed to interact with the Swap");
        }
        
        uint256 hold = IERC20(FEG).balanceOf(address(msg.sender));
        uint256 io = address(this).balance;
        
        if(io > 0 && msg.value >= 2e17 && hold >= 2e19){
        sendRebate();
        }
        
        Record storage inRecord = _records[address(Main)];
        Record storage outRecord = _records[address(Token)];
        
        require(msg.value <= MAX_BUY_RATIO, "ERR_BUY_IN_RATIO");
        
        uint256 tokenInFee;
        (tokenAmountOut, tokenInFee) = calcOutGivenIn(
                                            inRecord.balance,
                                            bmul(1e18, 25),
                                            outRecord.balance,
                                            bmul(1e18, 25),
                                            bmul(maker, bdiv(999, 1000)),
                                            0
                                        );
                                        
        require(tokenAmountOut <= bmul(outRecord.balance, bdiv(MAX_RATIO, 100)), "Over MAX_OUT_RATIO");
        _totalSupply8 += bmul(msg.value, bdiv(1, 1000));                                
        require(tokenAmountOut >= minAmountOut, "Minimum amount out not met");
        _pushUnderlying(Token, to, tokenAmountOut);
        sync();

        emit LOG_SWAP(msg.sender, Main, Token, msg.value, bmul(tokenAmountOut, bdiv(tx1, 100)));
        status = 0;
        return(tokenAmountOut);
    }
    
    function SELL(
        uint256 dot,
        address to,
        uint256 tokenAmountIn,
        uint256 minAmountOut
    )   
        external
        returns(uint256 tokenAmountOut)
    {   
        if(IsWhiteListContract(msg.sender) == false){
        require(status == 0, "No reentry");
        }
        status = 1;
        require(open == true, "Swap not opened");
        if(Address.isContract(msg.sender) == true){ 
        require(dot == spec, "Contracts are not allowed to interact with the Swap");
        }
        
        require(tokenAmountIn <= MAX_SELL_RATIO, "ERR_SELL_RATIO");
        uint256 omm = _records[Token].balance;
        _pullUnderlying(Token, msg.sender, tokenAmountIn);
        _records[Token].balance = IERC20(Token).balanceOf(address(this)) - _totalSupply1;
        uint256 trueamount = bmul((_records[Token].balance - omm), bdiv(998, 1000));
        
        tokenAmountOut = calcOutGivenIn1(
                                            _records[Token].balance,
                                            bmul(1e18, 25),
                                            _records[Main].balance,
                                            bmul(1e18, 25),
                                            trueamount
                                        );
        
        require(tokenAmountOut <= bmul(_records[Main].balance, bdiv(MAX_RATIO, 100)), "Over MAX_OUT_RATIO");                                
        require(tokenAmountOut >= minAmountOut, "Minimum amount out not met");
        uint256 toka = bmul(tokenAmountOut, bdiv(RPF, 1000));
        uint256 tokAmountI  = bmul(toka, bdiv(15, 10000));
        uint256 tok = bmul(toka, bdiv(15, 10000));
        uint256 tokAmountI2 =  bmul(toka, bdiv(PSS, 10000));
        uint256 io = (toka - (tokAmountI + tok + tokAmountI2));
        uint256 tokAmountI1 = bmul(io, bdiv(999, 1000));
        uint256 ox = _balances2[address(this)];
        
        if(ox > 1e16){
        _totalSupply2 -= ox;
        _balances2[address(this)] = 0;
        }
        
        wrap(Main).withdraw(tokAmountI1 + ox + tokAmountI);
        TransferHelper.safeTransferETH(to, bmul(tokAmountI1, bdiv(99, 100)));
        _totalSupply8 += bmul(io, bdiv(1, 1000));
        uint256 oss = bmul(tokAmountI2, bdiv(5, 100));
        uint256 osss = bmul(tokAmountI2, bdiv(15, 100));
        _balances2[pairRewardPool] += bmul(tokAmountI2, bdiv(80, 100));
        _balances2[_setter] += osss;
        _balances2[burn] += oss;
        _totalSupply2 += tokAmountI2;
        _totalSupply7 += tok;
        payStake();
        burnFEG();
        sync();
        emit LOG_SWAP(msg.sender, Token, Main, trueamount, bmul(tokAmountI1, bdiv(99, 100)));
        status = 0;
        return tokAmountI1;
    }
    
     function SELLSmart(
        uint256 tokenAmountIn,
        uint256 minAmountOut
    )   
        external
        returns(uint256 tokenAmountOut)
    {
        require(status == 0, "No reentry");
        status = 1;
        uint256 tai = tokenAmountIn;
        require(_balances1[msg.sender] >= tokenAmountIn, "Not enough Token");
        Record storage inRecord = _records[address(Token)];
        Record storage outRecord = _records[address(Main)];
        require(tokenAmountIn <= MAX_SELL_RATIO, "ERR_SELL_RATIO");

        tokenAmountOut = calcOutGivenIn1(
                                            inRecord.balance,
                                            bmul(1e18, 25),
                                            outRecord.balance,
                                            bmul(1e18, 25),
                                            bmul(tokenAmountIn, bdiv(998, 1000)) // 0.2% liquidity fee
                                        );

        require(tokenAmountOut <= bmul(outRecord.balance, bdiv(MAX_RATIO, 100)), "Over MAX_OUT_RATIO");
        uint256 toka = bmul(tokenAmountOut, bdiv(RPF, 1000));
        uint256 tokAmountI  = bmul(toka, bdiv(15, 10000));
        uint256 tok = bmul(toka, bdiv(15, 10000));
        uint256 tokAmountI2 =  bmul(toka, bdiv(PSS, 10000));
        uint256 io = (toka - (tokAmountI + tok + tokAmountI2));
        uint256 tokAmountI1 = bmul(io, bdiv(999, 1000));
        _totalSupply8 += bmul(io, bdiv(1, 1000));
        require(tokAmountI1 >= minAmountOut, "Minimum amount out not met");
        _balances1[msg.sender] -= tokenAmountIn;
        _totalSupply1 -= tokenAmountIn;
        _balances2[msg.sender] += tokAmountI1;
        _balances2[address(this)] += tokAmountI;
        uint256 os = bmul(tokAmountI2, bdiv(80, 100));
        uint256 oss = bmul(tokAmountI2, bdiv(5, 100));
        uint256 osss = bmul(tokAmountI2, bdiv(15, 100));
        _balances2[pairRewardPool] += os;
        _balances2[_setter] += osss;
        _balances2[burn] += oss;
        _totalSupply2 += (tokAmountI + tokAmountI2 + tokAmountI1);
        _totalSupply7 += tok;
        sync();
        burnFEG();
        emit LOG_SMARTSWAP(msg.sender, Token, Main, tai, tokAmountI1);
        status = 0;
        return(tokAmountI1);
    }
        
    function setPSSRPF(uint256 _PSS, uint256 _RPF) external {
        
        uint256 tot = _records[Main].balance;
        require(msg.sender == _poolOwner && tot >= 20e18, "You do not have permission");
        
        if(tot < 100e18) {// Incentive for providing higher liquidity
        require(_RPF >= 990 && _RPF <= 1000 && _PSS <= 100 && _PSS != 0, "Cannot set over 1%"); 
        }
        
        if(tot >= 100e18) {// Incentive for providing higher liquidity
        require(_RPF >= 900 && _RPF <= 1000 && _PSS <= 500 && _PSS != 0, "Cannot set PSS over 5% or RPF over 10%"); 
        }
        
        RPF = _RPF;
        PSS = _PSS;
    }
    
    function releaseLiquidity(address user) external { // Allows removal of liquidity after the lock period is over
        require(status == 0, "No reentry");
        status = 1;
        require(getUserLock(user) == true, "Liquidity not locked");
        userLock storage ulock = _userlock[user];
        userLock storage time = _unlockTime[user];
        if(msg.sender == _controller){
        time.unlockTime = block.timestamp + 1 days; // 24 hour notice for users
        }
        else{
        require(block.timestamp >= time.unlockTime && msg.sender == _poolOwner, "Liquidity is locked, you cannot release liquidity until after lock time.");
        ulock.setLock = false;
        uint256 total = IERC20(address(this)).balanceOf(user);
        lockedLiquidity -= total;
        }
        status = 0;
    }

    function Migrate() external { //Incase we upgrade to PROv2 in the future
        require(status == 0, "No reentry");
        status = 1;
        require(msg.sender == _poolOwner || msg.sender == _controller && newDep != address(0), "Not ready");
        sync();
        userLock storage ulock = _userlock[_poolOwner];
        IERC20(Main).approve(newDep, 1e30);
        IERC20(Token).approve(newDep, 1e50);
        uint256 tot = _balance[_poolOwner];
        _balance[_poolOwner] -= tot;
        uint256 ts = totalSupply;
        uint256 amt = bmul(_records[Main].balance, bdiv(tot, ts));
        uint256 amt1 = bmul(_records[Token].balance, bdiv(tot, ts));
        totalSupply -= tot;
        ulock.setLock = false;
        lockedLiquidity -= tot;
        newDeployer(newDep).createPair(Token, amt, amt1, _poolOwner);
        sync();
        status = 0;
    }

    function _pullUnderlying(address erc20, address from, uint256 amount)
        internal 
    {   
        bool xfer = IERC20(erc20).transferFrom(from, address(this), amount);
        require(xfer);
    }
    
    function _pushUnderlying(address erc20, address to, uint256 amount)
        internal 
    {   
        bool xfer = IERC20(erc20).transfer(to, amount);
        require(xfer);
    }
    
    function burnFEG() internal {
        if(_totalSupply8 > 75e14){ 
        wrap(Main).withdraw(_totalSupply8);
        swap(fegp).BUY{value:bmul(_totalSupply8, bdiv(99, 100))}(1001, burn, 1);
        _totalSupply8 = 0;
        }
    }
    
    function payStake() internal {   
        if(_totalSupply7 > 25e14) {
        _pushUnderlying(Main, FEGstake, _totalSupply7);
        _totalSupply7 = 0;
        }
    }
    
    function payMain(address payee, uint256 amount)
        external  
        
    {   
        require(_balances2[msg.sender] >= amount, "Not enough token");
        uint256 amt = bmul(amount, bdiv(997, 1000));
        _balances2[msg.sender] -= amount;
        _balances2[payee] += amt;
        _balances2[burn] += bsub(amount, amt);
        status = 0;
    }
    
    function payToken(address payee, uint256 amount)
        external  
        
    {
        require(status == 0, "No reentry");
        status = 1;
        require(_balances1[msg.sender] >= amount, "Not enough token");
        _balances1[msg.sender] -= amount;
        _balances1[payee] += amount;
        status = 0;
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"AmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"AmountOut","type":"uint256"}],"name":"LOG_SMARTSWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_SWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"dot","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"BUY","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"BUYSmart","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Bonus","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addy","type":"address"}],"name":"IsWhiteListContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUY_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SELL_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Main","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"PSS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RPF","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dot","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"SELL","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"SELLSmart","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_poolOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply7","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply8","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_unlockTime","outputs":[{"internalType":"bool","name":"setLock","type":"bool"},{"internalType":"uint256","name":"unlockTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"addBothLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addy","type":"address"},{"internalType":"bool","name":"boolean","type":"bool"}],"name":"addWhiteListContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"tokenInFee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"tokenInFee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"name":"calcOutGivenIn1","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"liqtoken","type":"uint256"}],"name":"deploySwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"depositInternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"getUserLock","outputs":[{"internalType":"bool","name":"lock","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token1","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"_made","type":"address"},{"internalType":"address","name":"_fegp","type":"address"},{"internalType":"uint256","name":"ol","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pairRewardPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payee","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"payMain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"payee","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"payToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"releaseLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"removeBothLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bonus","type":"address"}],"name":"setBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"set","type":"address"},{"internalType":"address","name":"ad","type":"address"}],"name":"setCont","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setLockLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellmax","type":"uint256"},{"internalType":"uint256","name":"buymax","type":"uint256"}],"name":"setMaxBuySellRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"prp","type":"address"}],"name":"setPRP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PSS","type":"uint256"},{"internalType":"uint256","name":"_RPF","type":"uint256"}],"name":"setPSSRPF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stake","type":"address"},{"internalType":"address","name":"_fegp","type":"address"},{"internalType":"address","name":"newd","type":"address"}],"name":"setStakePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"setTX1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"path","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"swapToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSentRebates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tx1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tx2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"userBalanceInternal","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdrawInternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600060025560c0604052600960808190526846454765782050524f60b81b60a090815262000031916003919062000142565b50604080518082019091526008808252672628102a37b5b2b760c11b6020909201918252620000639160049162000142565b506005805460ff19166012179055600780546001600160a01b0319908116734c9bc793716e8dc05d1f48d8ca8f84318ec3043c179091556008805482167386882fa66ac57039b10d78e2d3205592a44664c0179055600a8054821673acfc95585d80ab62f67a14c566c1b7a49fe91167179055600b8054821661dead179055600d80549091167387b1acce6a1958e522233a737313c086551a5c7617905568056bc75e2d6310000060135560146015556103e8601655601e805461ffff19169055606360265560006027553480156200013b57600080fd5b5062000225565b8280546200015090620001e8565b90600052602060002090601f016020900481019282620001745760008555620001bf565b82601f106200018f57805160ff1916838001178555620001bf565b82800160010185558215620001bf579182015b82811115620001bf578251825591602001919060010190620001a2565b50620001cd929150620001d1565b5090565b5b80821115620001cd5760008155600101620001d2565b600181811c90821680620001fd57607f821691505b602082108114156200021f57634e487b7160e01b600052602260045260246000fd5b50919050565b61557980620002356000396000f3fe6080604052600436106102e15760003560e01c80627b44a7146102ed5780630149e5c714610316578063036fe1bb14610346578063055a03c51461035c57806306fdde031461037257806307d729c414610394578063095ea7b3146103e5578063103ff68d1461040557806310510ec11461042757806312dcff7a1461044757806315e84af91461046757806318160ddd14610487578063192661121461049d578063207aba24146104bd5780632140fb40146104d257806323b872dd146104f257806329dfe3b2146105125780632b9abe1a14610532578063313ce5671461058257806331705705146105ae578063390a73e2146105db57806349a3fa9e146105f15780634f5c3d1b14610611578063520bb81b1461063157806365d1a40d1461065157806366188463146106715780636a8ebcd2146106915780636c5c6814146106a657806370a08231146106bc57806371a1e6dd146106f25780637bc224f91461071257806388f60dcb146107325780638c340f641461075257806395d89b411461077257806396c4b648146107875780639a6204ed146107a7578063a16faa18146107bd578063a221ee49146107d2578063a2e70a2e146107f2578063a9059cbb14610808578063ac7a36a214610828578063add975cc14610848578063ae1931be14610868578063b071148314610888578063b4398244146108a8578063ba9530a6146108be578063bbf12714146108de578063c172715c146108fe578063c241267614610911578063cdfec52d14610931578063d62b6f7e14610947578063d68de8de14610967578063d73dd62314610987578063da6d6578146109a7578063dbb74e22146109bd578063dd62ed3e146109dd578063ef8fdfd814610a23578063f1091b6e14610a43578063f7013ef614610a59578063f8b2cb4f14610a79578063f8d6aed414610ab2578063fbe8998914610ad2578063fcfff16f14610ae8578063fea4393a14610b07578063fff6cae914610b2757600080fd5b366102e857005b600080fd5b3480156102f957600080fd5b5061030360165481565b6040519081526020015b60405180910390f35b34801561032257600080fd5b50610336610331366004614c0f565b610b3c565b604051901515815260200161030d565b34801561035257600080fd5b5061030360195481565b34801561036857600080fd5b5061030360135481565b34801561037e57600080fd5b50610387610b5a565b60405161030d919061501e565b3480156103a057600080fd5b506103ce6103af366004614c0f565b6021602052600090815260409020805460019091015460ff9091169082565b60408051921515835260208301919091520161030d565b3480156103f157600080fd5b50610336610400366004614dba565b610be8565b34801561041157600080fd5b50610425610420366004614d83565b610c43565b005b34801561043357600080fd5b50610425610442366004614dba565b610c85565b34801561045357600080fd5b50610425610462366004614c0f565b610d3c565b34801561047357600080fd5b50610303610482366004614c2a565b610dc0565b34801561049357600080fd5b5061030360025481565b3480156104a957600080fd5b506104256104b8366004614dba565b610e2e565b3480156104c957600080fd5b50610425610fbe565b3480156104de57600080fd5b506103366104ed366004614c0f565b6112ff565b3480156104fe57600080fd5b5061033661050d366004614d47565b61131c565b34801561051e57600080fd5b5061042561052d366004614e93565b61145b565b34801561053e57600080fd5b5061057461054d366004614c0f565b6001600160a01b031660009081526024602090815260408083205460239092529091205491565b60405161030d92919061532a565b34801561058e57600080fd5b5060055461059c9060ff1681565b60405160ff909116815260200161030d565b3480156105ba57600080fd5b506010546105ce906001600160a01b031681565b60405161030d9190614ff1565b3480156105e757600080fd5b50610303601b5481565b3480156105fd57600080fd5b5061042561060c366004614c5d565b611773565b34801561061d57600080fd5b5061030361062c366004614f57565b6117c9565b34801561063d57600080fd5b50600c546105ce906001600160a01b031681565b34801561065d57600080fd5b5061042561066c366004614dba565b61184f565b34801561067d57600080fd5b5061033661068c366004614dba565b61192c565b34801561069d57600080fd5b50610425611a02565b3480156106b257600080fd5b5061030360255481565b3480156106c857600080fd5b506103036106d7366004614c0f565b6001600160a01b031660009081526020819052604090205490565b3480156106fe57600080fd5b5061042561070d366004614e93565b611a2a565b34801561071e57600080fd5b5061042561072d366004614c5d565b611b94565b34801561073e57600080fd5b5061042561074d366004614f11565b611bea565b34801561075e57600080fd5b5061042561076d366004614f11565b611d62565b34801561077e57600080fd5b50610387611ee1565b34801561079357600080fd5b506104256107a2366004614c0f565b611eee565b3480156107b357600080fd5b50610303601d5481565b3480156107c957600080fd5b506104256120de565b3480156107de57600080fd5b506103036107ed366004614f57565b612208565b3480156107fe57600080fd5b5061030360185481565b34801561081457600080fd5b50610336610823366004614dba565b61226d565b34801561083457600080fd5b50610425610843366004614dba565b6122a9565b34801561085457600080fd5b50610303610863366004614e58565b61257b565b34801561087457600080fd5b50610303610883366004614f11565b612b19565b34801561089457600080fd5b506104256108a3366004614cfc565b612f3a565b3480156108b457600080fd5b50610303601c5481565b3480156108ca57600080fd5b506105746108d9366004614f92565b613444565b3480156108ea57600080fd5b506104256108f9366004614dba565b6134d5565b61030361090c366004614e33565b6137a1565b34801561091d57600080fd5b50600f546105ce906001600160a01b031681565b34801561093d57600080fd5b5061030360145481565b34801561095357600080fd5b50600d546105ce906001600160a01b031681565b34801561097357600080fd5b50610425610982366004614e01565b613b17565b34801561099357600080fd5b506103366109a2366004614dba565b613b33565b3480156109b357600080fd5b50610303601a5481565b3480156109c957600080fd5b506104256109d8366004614c0f565b613ba6565b3480156109e957600080fd5b506103036109f8366004614c2a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a2f57600080fd5b506012546105ce906001600160a01b031681565b348015610a4f57600080fd5b5061030360155481565b348015610a6557600080fd5b50610425610a74366004614ca0565b613bdf565b348015610a8557600080fd5b50610303610a94366004614c0f565b6001600160a01b03166000908152601f602052604090206001015490565b348015610abe57600080fd5b50610574610acd366004614f92565b613d08565b348015610ade57600080fd5b5061030360265481565b348015610af457600080fd5b50601e5461033690610100900460ff1681565b348015610b1357600080fd5b50610303610b22366004614f11565b613db2565b348015610b3357600080fd5b506104256140d6565b6001600160a01b031660009081526022602052604090205460ff1690565b60038054610b67906153c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b93906153c6565b8015610be05780601f10610bb557610100808354040283529160200191610be0565b820191906000526020600020905b815481529060010190602001808311610bc357829003601f168201915b505050505081565b3360008181526001602090815260408083206001600160a01b0387168085529252808320859055519192909160008051602061550483398151915290610c319086815260200190565b60405180910390a35060015b92915050565b6008546001600160a01b03163314610c5a57600080fd5b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b60275415610cae5760405162461bcd60e51b8152600401610ca590615051565b60405180910390fd5b600160275533600090815260236020526040902054811115610ce25760405162461bcd60e51b8152600401610ca5906150d3565b3360009081526023602052604081208054839290610d01908490615383565b90915550506001600160a01b03821660009081526023602052604081208054839290610d2e908490615338565b909155505060006027555050565b600c546001600160a01b031633148015610d645750600d546001600160a01b03828116911614155b8015610d7e5750600f546001600160a01b03828116911614155b610d8757600080fd5b610d9081614251565b1515600114610d9e57600080fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038083166000908152601f6020526040808220928416825281206001830154919291610e2590610e00670de0b6b3a76400006019614291565b8360010154610e18670de0b6b3a76400006019614291565b66071afd498d0000612208565b95945050505050565b600d546001600160a01b0383811691161480610e575750600f546001600160a01b038381169116145b610e735760405162461bcd60e51b8152600401610ca590615303565b60275415610e935760405162461bcd60e51b8152600401610ca590615051565b6001602755600f546001600160a01b0383811691161415610f345733600090815260236020526040902054811115610edd5760405162461bcd60e51b8152600401610ca5906150a9565b8060186000828254610eef9190615383565b90915550503360009081526023602052604081208054839290610f13908490615383565b9091555050600f54610f2f906001600160a01b03163383614325565b610fb5565b33600090815260246020526040902054811115610f635760405162461bcd60e51b8152600401610ca5906151ac565b8060196000828254610f759190615383565b90915550503360009081526024602052604081208054839290610f99908490615383565b9091555050600d54610fb5906001600160a01b03163383614325565b50506000602755565b60275415610fde5760405162461bcd60e51b8152600401610ca590615051565b6001602755600c546001600160a01b031633148061101b57506007546001600160a01b03163314801561101b5750600e546001600160a01b031615155b6110535760405162461bcd60e51b81526020600482015260096024820152684e6f7420726561647960b81b6044820152606401610ca5565b61105b6140d6565b600c546001600160a01b03908116600090815260208052604090819020600d54600e54925163095ea7b360e01b815291939081169263095ea7b3926110b592919091169068327cb2734119d3b7a9601e1b90600401615005565b602060405180830381600087803b1580156110cf57600080fd5b505af11580156110e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111079190614de4565b50600f54600e5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611150929116906e111b0ec57e6499a1f4b1014d3f6d5960321b90600401615005565b602060405180830381600087803b15801561116a57600080fd5b505af115801561117e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a29190614de4565b50600c546001600160a01b031660009081526020819052604081208054918291906111cd8380615383565b9091555050600254600d546001600160a01b03166000908152601f60205260408120600101546112069061120185856143ba565b614291565b600f546001600160a01b03166000908152601f6020526040812060010154919250906112369061120186866143ba565b9050836002600082825461124a9190615383565b9091555050845460ff19168555601c805485919060009061126c908490615383565b9091555050600e54600f54600c54604051632f1c0f2560e01b81526001600160a01b03928316600482015260248101869052604481018590529082166064820152911690632f1c0f2590608401600060405180830381600087803b1580156112d357600080fd5b505af11580156112e7573d6000803e3d6000fd5b505050506112f36140d6565b50506000602755505050565b6001600160a01b0316600090815260208052604090205460ff1690565b6000336001600160a01b038516148061135857506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b61136157600080fd5b61136a336112ff565b156113875760405162461bcd60e51b8152600401610ca590615151565b61139284848461448c565b336001600160a01b038516148015906113d057506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b15611451576001600160a01b0384166000908152600160209081526040808320338452909152902054611403908361454a565b6001600160a01b038581166000908152600160209081526040808320338085529083529281902085905551938452918616929091600080516020615504833981519152910160405180910390a35b5060019392505050565b611464336112ff565b156114815760405162461bcd60e51b8152600401610ca590615151565b602754156114a15760405162461bcd60e51b8152600401610ca590615051565b60016027556114ae6140d6565b60025460006114bd85836143ba565b336000908152602081905260408120805492935087929091906114e1908490615383565b9250508190555084600260008282546114fa9190615383565b909155505060405185815260009033906000805160206154e48339815191529060200160405180910390a360005b601754811015611625576000601782815481106115475761154761545c565b60009182526020808320909101546001600160a01b0316808352601f90915260408220600101549092509061157c8583614291565b90508787858181106115905761159061545c565b905060200201358110156115b65760405162461bcd60e51b8152600401610ca5906151d5565b826001600160a01b0316336001600160a01b03167f9d9058fd2f25ccc389fec7720abef0ca83472f5abfafd5f10d37f51e6a0493f38360006040516115fc92919061532a565b60405180910390a361160f833383614325565b505050808061161d90615401565b915050611528565b50600b546001600160a01b031660009081526024602052604081205461164c908390614291565b600b546001600160a01b031660009081526024602052604081208054929350839290919061167b908490615383565b9091555050336000908152602460205260408120805483929061169f908490615338565b909155506116ad90506140d6565b6012546001600160a01b031615611766576012546040516370a0823160e01b81526000916117459185916001600160a01b0316906370a08231906116f5903090600401614ff1565b60206040518083038186803b15801561170d57600080fd5b505afa158015611721573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112019190614e1a565b9050801561176457601254611764906001600160a01b03163383614325565b505b5050600060275550505050565b6008546001600160a01b0316331461178a57600080fd5b601180546001600160a01b039485166001600160a01b0319918216179091556009805493851693821693909317909255600e8054919093169116179055565b6000806117d686856143ba565b905060006117ed670de0b6b3a7640000600061454a565b90506117f98482614291565b905060006118108961180b8b856145a7565b6143ba565b9050600061181e8285614600565b90506000611834670de0b6b3a76400008361454a565b90506118408982614291565b9b9a5050505050505050505050565b3360009081526024602052604090205481111561187e5760405162461bcd60e51b8152600401610ca5906150d3565b6000611892826112016103e56103e86143ba565b336000908152602460205260408120805492935084929091906118b6908490615383565b90915550506001600160a01b038316600090815260246020526040812080548392906118e3908490615338565b909155506118f39050828261454a565b600b546001600160a01b03166000908152602460205260408120805490919061191d908490615338565b90915550506000602755505050565b3360009081526001602090815260408083206001600160a01b038616845290915281205480831115611981573360009081526001602090815260408083206001600160a01b03881684529091528120556119b0565b61198b818461454a565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b03891680855290835292819020549051908152919291600080516020615504833981519152910160405180910390a35060019392505050565b600c546001600160a01b03163314611a1957600080fd5b601e805461ff001916610100179055565b60275415611a4a5760405162461bcd60e51b8152600401610ca590615051565b60016027556002546000611a5e85836143ba565b9050611a69336112ff565b151560011415611a8b5784601c6000828254611a859190615338565b90915550505b60005b601754811015611b7857600060178281548110611aad57611aad61545c565b60009182526020808320909101546001600160a01b0316808352601f909152604082206001015490925090611ae28583614291565b9050878785818110611af657611af661545c565b90506020020135811115611b0957600080fd5b826001600160a01b0316336001600160a01b03167f15a8ca63e37b2cff1677df2b6b82d36fcf8a524228bd7a4b4d02d107c28c1e8a836000604051611b4f92919061532a565b60405180910390a3611b62833383614704565b5050508080611b7090615401565b915050611a8e565b50611b8285614743565b611b8c33866147a6565b6112f36140d6565b6007546001600160a01b03163314611bab57600080fd5b600780546001600160a01b039485166001600160a01b0319918216179091556008805493851693821693909317909255600c8054919093169116179055565b600d546001600160a01b039081166000908152601f6020526040902060010154600c5490911633148015611c2757506801158e460913d000008110155b611c435760405162461bcd60e51b8152600401610ca590615075565b68056bc75e2d63100000811015611cc1576103de8210158015611c6857506103e88211155b8015611c75575060648311155b8015611c8057508215155b611cc15760405162461bcd60e51b815260206004820152601260248201527143616e6e6f7420736574206f76657220312560701b6044820152606401610ca5565b68056bc75e2d631000008110611d59576103848210158015611ce557506103e88211155b8015611cf357506101f48311155b8015611cfe57508215155b611d595760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f742073657420505353206f766572203525206f7220525046206f7660448201526565722031302560d01b6064820152608401610ca5565b50601655601555565b600c546001600160a01b03163314611d8c5760405162461bcd60e51b8152600401610ca590615075565b600f54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b158015611dd157600080fd5b505afa158015611de5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e099190614e1a565b9050611e176103e882615350565b8310158015611e265750808311155b611e8d5760405162461bcd60e51b815260206004820152603260248201527f6d696e20302e3125206f6620746f6b656e20737570706c792c206d61782031306044820152713025206f6620746f6b656e20737570706c7960701b6064820152608401610ca5565b670de0b6b3a7640000821015611ed55760405162461bcd60e51b815260206004820152600d60248201526c3120424e42206d696e696d756d60981b6044820152606401610ca5565b50601491909155601355565b60048054610b67906153c6565b60275415611f0e5760405162461bcd60e51b8152600401610ca590615051565b6001602755611f1c816112ff565b1515600114611f645760405162461bcd60e51b8152602060048201526014602482015273131a5c5d5a591a5d1e481b9bdd081b1bd8dad95960621b6044820152606401610ca5565b6001600160a01b0381811660009081526020808052604080832060219092529091206007549192909116331415611fac57611fa24262015180615338565b60018201556120d4565b80600101544210158015611fca5750600c546001600160a01b031633145b61203b5760405162461bcd60e51b8152602060048201526048602482015260008051602061552483398151915260448201527f72656c65617365206c697175696469747920756e74696c206166746572206c6f60648201526731b5903a34b6b29760c11b608482015260a401610ca5565b815460ff191682556040516370a0823160e01b815260009030906370a0823190612069908790600401614ff1565b60206040518083038186803b15801561208157600080fd5b505afa158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190614e1a565b905080601c60008282546120cd9190615383565b9091555050505b5050600060275550565b336120e8816112ff565b156121305760405162461bcd60e51b8152602060048201526018602482015277131a5c5d5a591a5d1e48185b1c9958591e481b1bd8dad95960421b6044820152606401610ca5565b6040516370a0823160e01b815260009030906370a0823190612156908590600401614ff1565b60206040518083038186803b15801561216e57600080fd5b505afa158015612182573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a69190614e1a565b6001600160a01b0383166000908152602080805260408083206021909252909120815460ff19166001178255919250906121e3426276a700615338565b816001018190555082601c60008282546121fd9190615338565b909155505050505050565b60008061221587876143ba565b9050600061222386866143ba565b9050600061223183836143ba565b90506000612253670de0b6b3a764000061180b670de0b6b3a76400008961454a565b905061225f8282614291565b9a9950505050505050505050565b6000612278336112ff565b156122955760405162461bcd60e51b8152600401610ca590615151565b6122a033848461448c565b50600192915050565b601e5460ff16156122b957600080fd5b600f546040516370a0823160e01b81526000916001600160a01b0316906370a08231906122ea903090600401614ff1565b60206040518083038186803b15801561230257600080fd5b505afa158015612316573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233a9190614e1a565b600d546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190612370903090600401614ff1565b60206040518083038186803b15801561238857600080fd5b505afa15801561239c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c09190614e1a565b6040805180820182526017805482526020808301878152600f80546001600160a01b039081166000908152601f80865288822097518855935160019788015587518089018952865481528086018a8152600d80548516845295909652888220905181559451948701949094558154855480880187557fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1590810180549284166001600160a01b03199384161790559354865480890190975595909301805495821695909316949094179091555490911681529182200154919250906124a890633b9aca006143ba565b600d546001600160a01b03166000908152601f6020526040812060010154919250906124dc90670de0b6b3a76400006143ba565b905060006124ea8284615338565b90506124f581614743565b6124ff87826147a6565b61250b601c54826145a7565b601c556001600160a01b0387166000908152602080805260408083206021909252909120815460ff19166001178255612548426301e13380615338565b600180830191909155601e805460ff1916909117905561256d6064611201898b6143ba565b602555505050505050505050565b600061258633610b3c565b6125aa57602754156125aa5760405162461bcd60e51b8152600401610ca590615051565b60016027819055601e54610100900460ff161515146125db5760405162461bcd60e51b8152600401610ca590615209565b6125e4336147b5565b15156001141561260f57600654851461260f5760405162461bcd60e51b8152600401610ca5906152b0565b6014548311156126315760405162461bcd60e51b8152600401610ca59061525c565b600f546001600160a01b03166000818152601f60205260409020600101549061265b903386614704565b601854600f546040516370a0823160e01b81526001600160a01b03909116906370a082319061268e903090600401614ff1565b60206040518083038186803b1580156126a657600080fd5b505afa1580156126ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126de9190614e1a565b6126e89190615383565b600f80546001600160a01b039081166000908152601f6020526040808220600190810195909555925490911681529081209091015461273a9061272c908490615383565b6112016103e66103e86143ba565b600f546001600160a01b03166000908152601f60205260409020600101549091506127a990612772670de0b6b3a76400006019614291565b600d546001600160a01b03166000908152601f60205260409020600101546127a3670de0b6b3a76400006019614291565b856117c9565b600d546001600160a01b03166000908152601f60205260409020600101549093506127da90611201603260646143ba565b8311156127f95760405162461bcd60e51b8152600401610ca590615284565b838310156128195760405162461bcd60e51b8152600401610ca5906151d5565b600061282d846112016016546103e86143ba565b9050600061284282611201600f6127106143ba565b9050600061285783611201600f6127106143ba565b9050600061286d846112016015546127106143ba565b905060008161287c8486615338565b6128869190615338565b6128909086615383565b905060006128a6826112016103e76103e86143ba565b30600090815260246020526040902054909150662386f26fc100008111156128f05780601960008282546128da9190615383565b9091555050306000908152602460205260408120555b600d546001600160a01b0316632e1a7d4d8761290c8486615338565b6129169190615338565b6040518263ffffffff1660e01b815260040161293491815260200190565b600060405180830381600087803b15801561294e57600080fd5b505af1158015612962573d6000803e3d6000fd5b5050505061297f8d61297a84611201606360646143ba565b6147dc565b6129908361120160016103e86143ba565b601b60008282546129a19190615338565b90915550600090506129b985611201600560646143ba565b905060006129cd86611201600f60646143ba565b90506129df86611201605060646143ba565b6010546001600160a01b031660009081526024602052604081208054909190612a09908490615338565b90915550506008546001600160a01b031660009081526024602052604081208054839290612a38908490615338565b9091555050600b546001600160a01b031660009081526024602052604081208054849290612a67908490615338565b925050819055508560196000828254612a809190615338565b9250508190555086601a6000828254612a999190615338565b90915550612aa790506148aa565b612aaf6148e3565b612ab76140d6565b600d54600f546001600160a01b039182169116336000805160206154c48339815191528d612aeb89611201606360646143ba565b604051612af992919061532a565b60405180910390a450506000602755509c9b505050505050505050505050565b6000602754600014612b3d5760405162461bcd60e51b8152600401610ca590615051565b6001602755336000908152602360205260409020548390811115612b735760405162461bcd60e51b8152600401610ca5906150a9565b600f546001600160a01b039081166000908152601f6020526040808220600d5490931682529020601454861115612bbc5760405162461bcd60e51b8152600401610ca59061525c565b612c018260010154612bd7670de0b6b3a76400006019614291565b8360010154612bef670de0b6b3a76400006019614291565b61062c8b6112016103e66103e86143ba565b9350612c178160010154611201603260646143ba565b841115612c365760405162461bcd60e51b8152600401610ca590615284565b6000612c4a856112016016546103e86143ba565b90506000612c5f82611201600f6127106143ba565b90506000612c7483611201600f6127106143ba565b90506000612c8a846112016015546127106143ba565b9050600081612c998486615338565b612ca39190615338565b612cad9086615383565b90506000612cc3826112016103e76103e86143ba565b9050612cd68261120160016103e86143ba565b601b6000828254612ce79190615338565b90915550508a811015612d0c5760405162461bcd60e51b8152600401610ca5906151d5565b33600090815260236020526040812080548e9290612d2b908490615383565b925050819055508b60186000828254612d449190615383565b90915550503360009081526024602052604081208054839290612d68908490615338565b90915550503060009081526024602052604081208054879290612d8c908490615338565b9091555060009050612da484611201605060646143ba565b90506000612db885611201600560646143ba565b90506000612dcc86611201600f60646143ba565b6010546001600160a01b0316600090815260246020526040812080549293508592909190612dfb908490615338565b90915550506008546001600160a01b031660009081526024602052604081208054839290612e2a908490615338565b9091555050600b546001600160a01b031660009081526024602052604081208054849290612e59908490615338565b90915550849050612e6a878a615338565b612e749190615338565b60196000828254612e859190615338565b9250508190555086601a6000828254612e9e9190615338565b90915550612eac90506140d6565b612eb46148e3565b600d60009054906101000a90046001600160a01b03166001600160a01b0316600f60009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b03166000805160206154a48339815191528f88604051612f1b92919061532a565b60405180910390a450506000602755509b9a5050505050505050505050565b600d546001600160a01b0384811691161480612f635750600f546001600160a01b038481169116145b612f7f5760405162461bcd60e51b8152600401610ca590615303565b60275415612f9f5760405162461bcd60e51b8152600401610ca590615051565b6001602755600d546001600160a01b03848116911614156131fc5733600090815260246020526040902054811115612fe95760405162461bcd60e51b8152600401610ca5906151ac565b600d5460405163095ea7b360e01b81526001600160a01b039091169063095ea7b39061301b9087908590600401615005565b602060405180830381600087803b15801561303557600080fd5b505af1158015613049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306d9190614de4565b5080601960008282546130809190615383565b909155505033600090815260246020526040812080548392906130a4908490615383565b9091555050600d54604051632efc49c560e21b81526001600160a01b038681169263bbf12714926130dd92909116908590600401615005565b600060405180830381600087803b1580156130f757600080fd5b505af115801561310b573d6000803e3d6000fd5b50505050600080856001600160a01b0316632b9abe1a306040518263ffffffff1660e01b815260040161313e9190614ff1565b6040805180830381600087803b15801561315757600080fd5b505af115801561316b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061318f9190614f33565b6040516365d1a40d60e01b815291935091506001600160a01b038716906365d1a40d906131c29087908590600401615005565b600060405180830381600087803b1580156131dc57600080fd5b505af11580156131f0573d6000803e3d6000fd5b50613439945050505050565b3360009081526023602052604090205481111561322b5760405162461bcd60e51b8152600401610ca5906150a9565b600f5460405163095ea7b360e01b81526001600160a01b039091169063095ea7b39061325d9087908590600401615005565b602060405180830381600087803b15801561327757600080fd5b505af115801561328b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132af9190614de4565b5080601860008282546132c29190615383565b909155505033600090815260236020526040812080548392906132e6908490615383565b9091555050600f54604051632efc49c560e21b81526001600160a01b038681169263bbf127149261331f92909116908590600401615005565b600060405180830381600087803b15801561333957600080fd5b505af115801561334d573d6000803e3d6000fd5b50505050600080856001600160a01b0316632b9abe1a306040518263ffffffff1660e01b81526004016133809190614ff1565b6040805180830381600087803b15801561339957600080fd5b505af11580156133ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d19190614f33565b6040516310510ec160e01b815291935091506001600160a01b038716906310510ec1906134049087908690600401615005565b600060405180830381600087803b15801561341e57600080fd5b505af1158015613432573d6000803e3d6000fd5b5050505050505b505060006027555050565b600080600061345388876143ba565b90506000613469670de0b6b3a76400008661454a565b90506134758682614291565b905060006134878b61180b8d856145a7565b905060006134958285614600565b905060006134ab670de0b6b3a76400008361454a565b90506134b78b82614291565b96506134c3898561454a565b95505050505050965096945050505050565b600d546001600160a01b03838116911614806134fe5750600f546001600160a01b038381169116145b61351a5760405162461bcd60e51b8152600401610ca590615303565b6027541561353a5760405162461bcd60e51b8152600401610ca590615051565b60016027819055601e54610100900460ff1615151461355857600080fd5b600f546001600160a01b038381169116141561367b57600f546001600160a01b03166000818152601f602052604090206001015490613598903384614704565b600f546040516370a0823160e01b8152600091613627916001600160a01b03909116906370a08231906135cf903090600401614ff1565b60206040518083038186803b1580156135e757600080fd5b505afa1580156135fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361f9190614e1a565b60185461454a565b90506000613635828461454a565b905080601860008282546136499190615338565b9091555050336000908152602360205260408120805483929061366d908490615338565b90915550610fb59350505050565b600d546001600160a01b03166000818152601f6020526040902060010154906136a5903384614704565b600d546040516370a0823160e01b815260009161374a916001600160a01b03909116906370a08231906136dc903090600401614ff1565b60206040518083038186803b1580156136f457600080fd5b505afa158015613708573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061372c9190614e1a565b613745601954613740601a54601b546145a7565b6145a7565b61454a565b90506000613758828461454a565b9050806019600082825461376c9190615338565b90915550503360009081526024602052604081208054839290613790908490615338565b909155505050505050506000602755565b60006027546000146137c55760405162461bcd60e51b8152600401610ca590615051565b60016027819055601e54610100900460ff161515146137f65760405162461bcd60e51b8152600401610ca590615209565b600061380a346112016103e56103e86143ba565b9050600d60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561385c57600080fd5b505af1158015613870573d6000803e3d6000fd5b505050505061388a3361297a3461120160036103e86143ba565b613893336147b5565b1515600114156138be5760065485146138be5760405162461bcd60e51b8152600401610ca5906152b0565b600a546040516370a0823160e01b81526000916001600160a01b0316906370a08231906138ef903390600401614ff1565b60206040518083038186803b15801561390757600080fd5b505afa15801561391b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061393f9190614e1a565b905047801580159061395957506702c68af0bb1400003410155b801561396e57506801158e460913d000008210155b1561397b5761397b6149f5565b600d546001600160a01b039081166000908152601f6020526040808220600f54909316825290206013543411156139c45760405162461bcd60e51b8152600401610ca5906150fd565b6000613a1283600101546139e1670de0b6b3a76400006019614291565b84600101546139f9670de0b6b3a76400006019614291565b613a0b8b6112016103e76103e86143ba565b6000613444565b60018401549198509150613a2c90611201603260646143ba565b871115613a4b5760405162461bcd60e51b8152600401610ca590615284565b613a5c3461120160016103e86143ba565b601b6000828254613a6d9190615338565b909155505087871015613a925760405162461bcd60e51b8152600401610ca5906151d5565b600f54613aa9906001600160a01b03168a89614325565b613ab16140d6565b600f54600d546025546001600160a01b03928316929091169033906000805160206154c4833981519152903490613aef908d906112019060646143ba565b604051613afd92919061532a565b60405180910390a450506000602755505050509392505050565b6008546001600160a01b03163314613b2e57600080fd5b602555565b3360009081526001602090815260408083206001600160a01b0386168452909152812054613b6190836145a7565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208590555193845290926000805160206155048339815191529101610c31565b6008546001600160a01b03163314613bbd57600080fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b601e5460ff1615613c265760405162461bcd60e51b815260206004820152601160248201527043616e206f6e6c7920757365206f6e636560781b6044820152606401610ca5565b600f80546001600160a01b038088166001600160a01b03199283168117909355600c8054888316908416811790915560108054841690911790556006849055600980548683169084161790556011805491871691909216179055604080516318160ddd60e01b81529051613cfe92916318160ddd916004808301926020929190829003018186803b158015613cba57600080fd5b505afa158015613cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cf29190614e1a565b611201600160146143ba565b6014555050505050565b6000806000613d1786896143ba565b90506000613d25888761454a565b90506000613d3389836143ba565b90506000613d418285614600565b9050613d5581670de0b6b3a764000061454a565b9050613d618c82614291565b9050613d75670de0b6b3a76400008861454a565b9550613d8181876143ba565b9550613d9581670de0b6b3a76400006143ba565b9450613da1868661454a565b945050505050965096945050505050565b33600090815260246020526040812054831115613e115760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f756768204d61696e2c206465706f736974206d6f72650000006044820152606401610ca5565b60275415613e315760405162461bcd60e51b8152600401610ca590615051565b6001602755600d546001600160a01b039081166000908152601f6020526040808220600f5490931682529020601354851115613e7f5760405162461bcd60e51b8152600401610ca5906150fd565b6000613e9c83600101546139e1670de0b6b3a76400006019614291565b60018401549195509150613eb690611201603260646143ba565b841115613ed55760405162461bcd60e51b8152600401610ca590615284565b84841015613ef55760405162461bcd60e51b8152600401610ca5906151d5565b3360009081526024602052604081208054889290613f14908490615383565b925050819055508560196000828254613f2d9190615383565b90915550503360009081526023602052604081208054869290613f51908490615338565b925050819055508360186000828254613f6a9190615338565b90915550613f8190508661120160016103e86143ba565b601b6000828254613f929190615338565b90915550613fa090506140d6565b600f54600d546040516001600160a01b03928316929091169033906000805160206154a483398151915290613fd8908b908a9061532a565b60405180910390a4600a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190614011903390600401614ff1565b60206040518083038186803b15801561402957600080fd5b505afa15801561403d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140619190614e1a565b905060004711801561407b57506702c68af0bb1400008710155b801561409057506801158e460913d000008110155b156140c75760006140a24760086143ba565b90506140ae33826147dc565b80601d60008282546140c09190615338565b9091555050505b50506000602755505092915050565b601854600f546040516370a0823160e01b81526001600160a01b03909116906370a0823190614109903090600401614ff1565b60206040518083038186803b15801561412157600080fd5b505afa158015614135573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141599190614e1a565b6141639190615383565b600f546001600160a01b03166000908152601f6020526040812060010191909155601b54601a546019546141979190615338565b6141a19190615338565b600d546040516370a0823160e01b815291925082916001600160a01b03909116906370a08231906141d6903090600401614ff1565b60206040518083038186803b1580156141ee57600080fd5b505afa158015614202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142269190614e1a565b6142309190615383565b600d546001600160a01b03166000908152601f602052604090206001015550565b600061425c82610b3c565b1561426957506000919050565b813f60008051602061548483398151915281158015906142895750808214155b949350505050565b60008061429e8385615364565b90508315806142b55750826142b38583615350565b145b6142d15760405162461bcd60e51b8152600401610ca590615232565b60006142e5826706f05b59d3b20000615338565b9050818110156143075760405162461bcd60e51b8152600401610ca590615232565b600061431b670de0b6b3a764000083615350565b9695505050505050565b60405163a9059cbb60e01b81526000906001600160a01b0385169063a9059cbb906143569086908690600401615005565b602060405180830381600087803b15801561437057600080fd5b505af1158015614384573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143a89190614de4565b9050806143b457600080fd5b50505050565b6000816143f85760405162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b6044820152606401610ca5565b600061440c84670de0b6b3a7640000615364565b905083158061442b57506144208482615350565b670de0b6b3a7640000145b6144475760405162461bcd60e51b8152600401610ca590615127565b6000614454600285615350565b61445e9083615338565b9050818110156144805760405162461bcd60e51b8152600401610ca590615127565b600061431b8583615350565b6001600160a01b0383166000908152602081905260409020548111156144b157600080fd5b6001600160a01b0383166000908152602081905260409020546144d4908261454a565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461450390826145a7565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616916000805160206154e4833981519152910160405180910390a3505050565b60008060006145598585614a28565b91509150801561459f5760405162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b6044820152606401610ca5565b509392505050565b6000806145b48385615338565b9050838110156145f95760405162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b6044820152606401610ca5565b9392505050565b6000600183101561464b5760405162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b6044820152606401610ca5565b671bc16d674ec7ffff83111561469c5760405162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b6044820152606401610ca5565b60006146a783614a5f565b905060006146b5848361454a565b905060006146cb866146c685614a7c565b614a90565b9050816146dc579250610c3d915050565b60006146ed87846305f5e100614b03565b90506146f98282614291565b979650505050505050565b6040516323b872dd60e01b81526001600160a01b03838116600483015230602483015260448201839052600091908516906323b872dd90606401614356565b3060009081526020819052604090205461475d90826145a7565b3060009081526020819052604090205560025461477a90826145a7565b60025560405181815230906000906000805160206154e48339815191529060200160405180910390a350565b6147b130838361448c565b5050565b6000813f600080516020615484833981519152818114801590614289575050151592915050565b604080516000808252602082019092526001600160a01b0384169083906040516148069190614fd5565b60006040518083038185875af1925050503d8060008114614843576040519150601f19603f3d011682016040523d82523d6000602084013e614848565b606091505b50509050806148a55760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b6064820152608401610ca5565b505050565b6608e1bc9bf04000601a5411156148e157600d54601154601a546148db926001600160a01b03908116921690614325565b6000601a555b565b661aa535d3d0c000601b5411156148e157600d54601b54604051632e1a7d4d60e01b81526001600160a01b0390921691632e1a7d4d916149299160040190815260200190565b600060405180830381600087803b15801561494357600080fd5b505af1158015614957573d6000803e3d6000fd5b5050600954601b546001600160a01b03909116925063c172715c915061498390611201606360646143ba565b600b5460405160e084901b6001600160e01b03191681526103e960048201526001600160a01b039091166024820152600160448201526064016000604051808303818588803b1580156149d557600080fd5b505af11580156149e9573d6000803e3d6000fd5b50506000601b55505050565b6000614a02600847615350565b9050614a0e33826147dc565b80601d6000828254614a209190615338565b909155505050565b600080828410614a4757614a3c8385615383565b600091509150614a58565b614a518484615383565b6001915091505b9250929050565b6000614a6a82614a7c565b610c3d90670de0b6b3a7640000615364565b6000610c3d670de0b6b3a764000083615350565b600080614a9e60028461541c565b614ab057670de0b6b3a7640000614ab2565b835b9050614abf600284615350565b92505b82156145f957614ad28485614291565b9350614adf60028461541c565b15614af157614aee8185614291565b90505b614afc600284615350565b9250614ac2565b6000828180614b1a87670de0b6b3a7640000614a28565b9092509050670de0b6b3a764000080600060015b888410614be4576000614b4982670de0b6b3a7640000615364565b9050600080614b698a614b6485670de0b6b3a764000061454a565b614a28565b91509150614b7b87611201848c614291565b9650614b8787846143ba565b965086614b9657505050614be4565b8715614ba0579315935b8015614baa579315935b8415614bc157614bba868861454a565b9550614bce565b614bcb86886145a7565b95505b5050508080614bdc90615401565b915050614b2e565b50909998505050505050505050565b80356001600160a01b0381168114614c0a57600080fd5b919050565b600060208284031215614c2157600080fd5b6145f982614bf3565b60008060408385031215614c3d57600080fd5b614c4683614bf3565b9150614c5460208401614bf3565b90509250929050565b600080600060608486031215614c7257600080fd5b614c7b84614bf3565b9250614c8960208501614bf3565b9150614c9760408501614bf3565b90509250925092565b600080600080600060a08688031215614cb857600080fd5b614cc186614bf3565b9450614ccf60208701614bf3565b9350614cdd60408701614bf3565b9250614ceb60608701614bf3565b949793965091946080013592915050565b60008060008060808587031215614d1257600080fd5b614d1b85614bf3565b9350614d2960208601614bf3565b9250614d3760408601614bf3565b9396929550929360600135925050565b600080600060608486031215614d5c57600080fd5b614d6584614bf3565b9250614d7360208501614bf3565b9150604084013590509250925092565b60008060408385031215614d9657600080fd5b614d9f83614bf3565b91506020830135614daf81615472565b809150509250929050565b60008060408385031215614dcd57600080fd5b614dd683614bf3565b946020939093013593505050565b600060208284031215614df657600080fd5b81516145f981615472565b600060208284031215614e1357600080fd5b5035919050565b600060208284031215614e2c57600080fd5b5051919050565b600080600060608486031215614e4857600080fd5b83359250614d7360208501614bf3565b60008060008060808587031215614e6e57600080fd5b84359350614e7e60208601614bf3565b93969395505050506040820135916060013590565b600080600060408486031215614ea857600080fd5b8335925060208401356001600160401b0380821115614ec657600080fd5b818601915086601f830112614eda57600080fd5b813581811115614ee957600080fd5b8760208260051b8501011115614efe57600080fd5b6020830194508093505050509250925092565b60008060408385031215614f2457600080fd5b50508035926020909101359150565b60008060408385031215614f4657600080fd5b505080516020909101519092909150565b600080600080600060a08688031215614f6f57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060008060008060c08789031215614fab57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60008251614fe781846020870161539a565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b602081526000825180602084015261503d81604085016020870161539a565b601f01601f19169190910160400192915050565b6020808252600a90820152694e6f207265656e74727960b01b604082015260600190565b6020808252601a90820152792cb7ba903237903737ba103430bb32903832b936b4b9b9b4b7b760311b604082015260600190565b60208082526010908201526f2737ba1032b737bab3b4102a37b5b2b760811b604082015260600190565b60208082526010908201526f2737ba1032b737bab3b4103a37b5b2b760811b604082015260600190565b60208082526010908201526f4552525f4255595f494e5f524154494f60801b604082015260600190565b60208082526010908201526f11549497d1125597d25395115493905360821b604082015260600190565b602080825260479082015260008051602061552483398151915260408201527f72656d6f7665206c697175696469747920756e74696c206166746572206c6f6360608201526635903a34b6b29760c91b608082015260a00190565b6020808252600f908201526e2737ba1032b737bab3b41026b0b4b760891b604082015260600190565b6020808252601a9082015279135a5b9a5b5d5b48185b5bdd5b9d081bdd5d081b9bdd081b595d60321b604082015260600190565b6020808252600f908201526e14ddd85c081b9bdd081bdc195b9959608a1b604082015260600190565b60208082526010908201526f4552525f4d554c5f4f564552464c4f5760801b604082015260600190565b6020808252600e908201526d4552525f53454c4c5f524154494f60901b604082015260600190565b6020808252601290820152714f766572204d41585f4f55545f524154494f60701b604082015260600190565b60208082526033908201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e7460408201527206572616374207769746820746865205377617606c1b606082015260800190565b6020808252600d908201526c139bdd081cdd5c1c1bdc9d1959609a1b604082015260600190565b918252602082015260400190565b6000821982111561534b5761534b615430565b500190565b60008261535f5761535f615446565b500490565b600081600019048311821515161561537e5761537e615430565b500290565b60008282101561539557615395615430565b500390565b60005b838110156153b557818101518382015260200161539d565b838111156143b45750506000910152565b600181811c908216806153da57607f821691505b602082108114156153fb57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561541557615415615430565b5060010190565b60008261542b5761542b615446565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b801515811461548057600080fd5b5056fec5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470c5f954edb6f50c3415e43c4c343ed2fac83243f08807d721c27e2ccb634c36fa908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9254c6971756964697479206973206c6f636b65642c20796f752063616e6e6f7420a2646970667358221220e820958d79af7372991cedfecfc73b17b1b4c78e3732ea480863c5515ad2a90b64736f6c63430008070033

Deployed ByteCode Sourcemap

13032:27963:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15007:25;;;;;;;;;;;;;;;;;;;21195::1;;;21183:2;21168:18;15007:25:0;;;;;;;;17170:119;;;;;;;;;;-1:-1:-1;17170:119:0;;;;;:::i;:::-;;:::i;:::-;;;8732:14:1;;8725:22;8707:41;;8695:2;8680:18;17170:119:0;8567:187:1;15142:28:0;;;;;;;;;;;;;;;;14860:37;;;;;;;;;;;;;;;;11418;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;15517:46::-;;;;;;;;;;-1:-1:-1;15517:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8952:14:1;;8945:22;8927:41;;8999:2;8984:18;;8977:34;;;;8900:18;15517:46:0;8759:258:1;11786:187:0;;;;;;;;;;-1:-1:-1;11786:187:0;;;;;:::i;:::-;;:::i;16998:160::-;;;;;;;;;;-1:-1:-1;16998:160:0;;;;;:::i;:::-;;:::i;:::-;;40660:332;;;;;;;;;;-1:-1:-1;40660:332:0;;;;;:::i;:::-;;:::i;18417:254::-;;;;;;;;;;-1:-1:-1;18417:254:0;;;;;:::i;:::-;;:::i;21127:372::-;;;;;;;;;;-1:-1:-1;21127:372:0;;;;;:::i;:::-;;:::i;10591:30::-;;;;;;;;;;;;;;;;22537:680;;;;;;;;;;-1:-1:-1;22537:680:0;;;;;:::i;:::-;;:::i;38543:879::-;;;;;;;;;;;;;:::i;13366:114::-;;;;;;;;;;-1:-1:-1;13366:114:0;;;;;:::i;:::-;;:::i;24637:601::-;;;;;;;;;;-1:-1:-1;24637:601:0;;;;;:::i;:::-;;:::i;26186:1393::-;;;;;;;;;;-1:-1:-1;26186:1393:0;;;;;:::i;:::-;;:::i;16377:209::-;;;;;;;;;;-1:-1:-1;16377:209:0;;;;;:::i;:::-;-1:-1:-1;;;;;16486:17:0;16441:7;16486:17;;;:10;:17;;;;;;;;;16530:10;:17;;;;;;;;16377:209;;;;;;;;;:::i;11505:28::-;;;;;;;;;;-1:-1:-1;11505:28:0;;;;;;;;;;;21917:4:1;21905:17;;;21887:36;;21875:2;21860:18;11505:28:0;21745:184:1;14766:29:0;;;;;;;;;;-1:-1:-1;14766:29:0;;;;-1:-1:-1;;;;;14766:29:0;;;;;;;;;;:::i;15212:28::-;;;;;;;;;;;;;;;;18683:198;;;;;;;;;;-1:-1:-1;18683:198:0;;;;;:::i;:::-;;:::i;4953:690::-;;;;;;;;;;-1:-1:-1;4953:690:0;;;;;:::i;:::-;;:::i;14607:25::-;;;;;;;;;;-1:-1:-1;14607:25:0;;;;-1:-1:-1;;;;;14607:25:0;;;40281:367;;;;;;;;;;-1:-1:-1;40281:367:0;;;;;:::i;:::-;;:::i;12244:403::-;;;;;;;;;;-1:-1:-1;12244:403:0;;;;;:::i;:::-;;:::i;18247:158::-;;;;;;;;;;;;;:::i;15832:18::-;;;;;;;;;;;;;;;;11673:105;;;;;;;;;;-1:-1:-1;11673:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;11756:14:0;11729:7;11756:14;;;;;;;;;;;;11673:105;25250:925;;;;;;;;;;-1:-1:-1;25250:925:0;;;;;:::i;:::-;;:::i;19295:282::-;;;;;;;;;;-1:-1:-1;19295:282:0;;;;;:::i;:::-;;:::i;37035:664::-;;;;;;;;;;-1:-1:-1;37035:664:0;;;;;:::i;:::-;;:::i;17800:435::-;;;;;;;;;;-1:-1:-1;17800:435:0;;;;;:::i;:::-;;:::i;11462:36::-;;;;;;;;;;;;;:::i;37711:824::-;;;;;;;;;;-1:-1:-1;37711:824:0;;;;;:::i;:::-;;:::i;15284:31::-;;;;;;;;;;;;;;;;19589:459;;;;;;;;;;;;;:::i;3582:543::-;;;;;;;;;;-1:-1:-1;3582:543:0;;;;;:::i;:::-;;:::i;15107:28::-;;;;;;;;;;;;;;;;24367:262;;;;;;;;;;-1:-1:-1;24367:262:0;;;;;:::i;:::-;;:::i;20060:1056::-;;;;;;;;;;-1:-1:-1;20060:1056:0;;;;;:::i;:::-;;:::i;31892:2806::-;;;;;;;;;;-1:-1:-1;31892:2806:0;;;;;:::i;:::-;;:::i;34711:2308::-;;;;;;;;;;-1:-1:-1;34711:2308:0;;;;;:::i;:::-;;:::i;23225:1130::-;;;;;;;;;;-1:-1:-1;23225:1130:0;;;;;:::i;:::-;;:::i;15247:30::-;;;;;;;;;;;;;;;;4135:810;;;;;;;;;;-1:-1:-1;4135:810:0;;;;;:::i;:::-;;:::i;21515:1014::-;;;;;;;;;;-1:-1:-1;21515:1014:0;;;;;:::i;:::-;;:::i;29753:2127::-;;;;;;:::i;:::-;;:::i;14739:20::-;;;;;;;;;;-1:-1:-1;14739:20:0;;;;-1:-1:-1;;;;;14739:20:0;;;14904:29;;;;;;;;;;;;;;;;14639:64;;;;;;;;;;-1:-1:-1;14639:64:0;;;;-1:-1:-1;;;;;14639:64:0;;;19021:105;;;;;;;;;;-1:-1:-1;19021:105:0;;;;;:::i;:::-;;:::i;11981:255::-;;;;;;;;;;-1:-1:-1;11981:255:0;;;;;:::i;:::-;;:::i;15177:28::-;;;;;;;;;;;;;;;;18893:116;;;;;;;;;;-1:-1:-1;18893:116:0;;;;;:::i;:::-;;:::i;11542:123::-;;;;;;;;;;-1:-1:-1;11542:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;11637:15:0;;;11610:7;11637:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;11542:123;14833:20;;;;;;;;;;-1:-1:-1;14833:20:0;;;;-1:-1:-1;;;;;14833:20:0;;;14940:23;;;;;;;;;;;;;;;;15925:397;;;;;;;;;;-1:-1:-1;15925:397:0;;;;;:::i;:::-;;:::i;19138:149::-;;;;;;;;;;-1:-1:-1;19138:149:0;;;;;:::i;:::-;-1:-1:-1;;;;;19256:15:0;19214:7;19256:15;;;:8;:15;;;;;:23;;;;19138:149;5651:853;;;;;;;;;;-1:-1:-1;5651:853:0;;;;;:::i;:::-;;:::i;15857:23::-;;;;;;;;;;;;;;;;15385:24;;;;;;;;;;-1:-1:-1;15385:24:0;;;;;;;;;;;27781:1960;;;;;;;;;;-1:-1:-1;27781:1960:0;;;;;:::i;:::-;;:::i;17472:316::-;;;;;;;;;;;;;:::i;17170:119::-;-1:-1:-1;;;;;17257:24:0;17234:4;17257:24;;;:17;:24;;;;;;;;;17170:119::o;11418:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11786:187::-;11875:10;11847:4;11864:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;11864:27:0;;;;;;;;;;:33;;;11913:30;11847:4;;11864:27;;-1:-1:-1;;;;;;;;;;;11913:30:0;;;11894:3;21195:25:1;;21183:2;21168:18;;21049:177;11913:30:0;;;;;;;;-1:-1:-1;11961:4:0;11786:187;;;;;:::o;16998:160::-;17097:7;;-1:-1:-1;;;;;17097:7:0;17083:10;:21;17075:30;;;;;;-1:-1:-1;;;;;17116:24:0;;;;;;;;:17;:24;;;;;:34;;-1:-1:-1;;17116:34:0;;;;;;;;;;16998:160::o;40660:332::-;40763:6;;:11;40755:34;;;;-1:-1:-1;;;40755:34:0;;;;;;;:::i;:::-;;;;;;;;;40809:1;40800:6;:10;40840;40829:22;;;;:10;:22;;;;;;:32;-1:-1:-1;40829:32:0;40821:61;;;;-1:-1:-1;;;40821:61:0;;;;;;;:::i;:::-;40904:10;40893:22;;;;:10;:22;;;;;:32;;40919:6;;40893:22;:32;;40919:6;;40893:32;:::i;:::-;;;;-1:-1:-1;;;;;;;40936:17:0;;;;;;:10;:17;;;;;:27;;40957:6;;40936:17;:27;;40957:6;;40936:27;:::i;:::-;;;;-1:-1:-1;;40983:1:0;40974:6;:10;-1:-1:-1;;40660:332:0:o;18417:254::-;18543:10;;-1:-1:-1;;;;;18543:10:0;18529;:24;:42;;;;-1:-1:-1;18567:4:0;;-1:-1:-1;;;;;18557:14:0;;;18567:4;;18557:14;;18529:42;:62;;;;-1:-1:-1;18586:5:0;;-1:-1:-1;;;;;18576:15:0;;;18586:5;;18576:15;;18529:62;18521:71;;;;;;18611:18;18622:6;18611:10;:18::i;:::-;:26;;18633:4;18611:26;18603:35;;;;;;18649:5;:14;;-1:-1:-1;;;;;;18649:14:0;-1:-1:-1;;;;;18649:14:0;;;;;;;;;;18417:254::o;21127:372::-;-1:-1:-1;;;;;21294:26:0;;;21223:17;21294:26;;;:8;:26;;;;;;21358:27;;;;;;;21417:16;;;;21223:17;;21294:26;21403:88;;21435:14;21440:4;21446:2;21435:4;:14::i;:::-;21451:9;:17;;;21470:14;21475:4;21481:2;21470:4;:14::i;:::-;21486:4;21403:13;:88::i;:::-;21396:95;21127:372;-1:-1:-1;;;;;21127:372:0:o;22537:680::-;22628:4;;-1:-1:-1;;;;;22619:13:0;;;22628:4;;22619:13;;:31;;-1:-1:-1;22645:5:0;;-1:-1:-1;;;;;22636:14:0;;;22645:5;;22636:14;22619:31;22611:57;;;;-1:-1:-1;;;22611:57:0;;;;;;;:::i;:::-;22687:6;;:11;22679:34;;;;-1:-1:-1;;;22679:34:0;;;;;;;:::i;:::-;22733:1;22724:6;:10;22767:5;;-1:-1:-1;;;;;22758:14:0;;;22767:5;;22758:14;22755:434;;;22803:10;22792:22;;;;:10;:22;;;;;;:29;-1:-1:-1;22792:29:0;22784:58;;;;-1:-1:-1;;;22784:58:0;;;;;;;:::i;:::-;22870:3;22853:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;22895:10:0;22884:22;;;;:10;:22;;;;;:29;;22910:3;;22884:22;:29;;22910:3;;22884:29;:::i;:::-;;;;-1:-1:-1;;22940:5:0;;22924:39;;-1:-1:-1;;;;;22940:5:0;22947:10;22959:3;22924:15;:39::i;:::-;22755:434;;;23019:10;23008:22;;;;:10;:22;;;;;;:29;-1:-1:-1;23008:29:0;23000:57;;;;-1:-1:-1;;;23000:57:0;;;;;;;:::i;:::-;23085:3;23068:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;23110:10:0;23099:22;;;;:10;:22;;;;;:29;;23125:3;;23099:22;:29;;23125:3;;23099:29;:::i;:::-;;;;-1:-1:-1;;23155:4:0;;23139:38;;-1:-1:-1;;;;;23155:4:0;23161:10;23173:3;23139:15;:38::i;:::-;-1:-1:-1;;23208:1:0;23199:6;:10;22537:680::o;38543:879::-;38633:6;;:11;38625:34;;;;-1:-1:-1;;;38625:34:0;;;;;;;:::i;:::-;38679:1;38670:6;:10;38713;;-1:-1:-1;;;;;38713:10:0;38699;:24;;:77;;-1:-1:-1;38741:11:0;;-1:-1:-1;;;;;38741:11:0;38727:10;:25;:49;;;;-1:-1:-1;38756:6:0;;-1:-1:-1;;;;;38756:6:0;:20;;38727:49;38691:99;;;;-1:-1:-1;;;38691:99:0;;10675:2:1;38691:99:0;;;10657:21:1;10714:1;10694:18;;;10687:29;-1:-1:-1;;;10732:18:1;;;10725:39;10781:18;;38691:99:0;10473:332:1;38691:99:0;38801:6;:4;:6::i;:::-;38853:10;;-1:-1:-1;;;;;38853:10:0;;;38818:22;38843:21;;;:9;:21;;;;;;;38882:4;;38896:6;;38875:34;;-1:-1:-1;;;38875:34:0;;38843:21;;38882:4;;;;38875:20;;:34;;38896:6;;;;;-1:-1:-1;;;38904:4:0;38875:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;38927:5:0;;38942:6;;38920:35;;-1:-1:-1;;;38920:35:0;;-1:-1:-1;;;;;38927:5:0;;;;38920:21;;:35;;38942:6;;;-1:-1:-1;;;38950:4:0;38920:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;38989:10:0;;-1:-1:-1;;;;;38989:10:0;38966:11;38980:20;;;;;;;;;;;;;;;;39011:27;38980:20;;39011:27;:::i;:::-;;;;-1:-1:-1;;39062:11:0;;39112:4;;-1:-1:-1;;;;;39112:4:0;39049:10;39103:14;;;:8;:14;;;;;39112:4;39103:22;;39098:43;;39127:13;39132:3;39062:11;39127:4;:13::i;:::-;39098:4;:43::i;:::-;39181:5;;-1:-1:-1;;;;;39181:5:0;39152:12;39172:15;;;:8;:15;;;;;39181:5;39172:23;;39084:57;;-1:-1:-1;39152:12:0;39167:44;;39197:13;39202:3;39207:2;39197:4;:13::i;39167:44::-;39152:59;;39237:3;39222:11;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;39251:21:0;;-1:-1:-1;;39251:21:0;;;39283:15;:22;;39302:3;;39283:15;39267:5;;39283:22;;39302:3;;39283:22;:::i;:::-;;;;-1:-1:-1;;39328:6:0;;39347:5;;39365:10;;39316:60;;-1:-1:-1;;;39316:60:0;;-1:-1:-1;;;;;39347:5:0;;;39316:60;;;8384:34:1;8434:18;;;8427:34;;;8477:18;;;8470:34;;;39365:10:0;;;8520:18:1;;;8513:43;39328:6:0;;;39316:30;;8318:19:1;;39316:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39387:6;:4;:6::i;:::-;-1:-1:-1;;39413:1:0;39404:6;:10;-1:-1:-1;;;38543:879:0:o;13366:114::-;-1:-1:-1;;;;;13449:14:0;13420:9;13449:14;;;:9;:14;;;;;:22;;;;13366:114::o;24637:601::-;24715:4;24740:10;-1:-1:-1;;;;;24740:17:0;;;;:55;;-1:-1:-1;;;;;;24768:15:0;;;;;;:10;:15;;;;;;;;24784:10;24768:27;;;;;;;;24761:34;;;24740:55;24732:64;;;;;;24815:23;24827:10;24815:11;:23::i;:::-;:32;24807:116;;;;-1:-1:-1;;;24807:116:0;;;;;;;:::i;:::-;24934:20;24940:3;24945;24950;24934:5;:20::i;:::-;24969:10;-1:-1:-1;;;;;24969:17:0;;;;;;:69;;-1:-1:-1;;;;;;24990:15:0;;;;;;:10;:15;;;;;;;;25006:10;24990:27;;;;;;;;-1:-1:-1;;24990:48:0;;24969:69;24965:244;;;-1:-1:-1;;;;;25090:15:0;;;;;;:10;:15;;;;;;;;25106:10;25090:27;;;;;;;;25085:38;;25119:3;25085:4;:38::i;:::-;-1:-1:-1;;;;;25055:15:0;;;;;;;:10;:15;;;;;;;;25071:10;25055:27;;;;;;;;;;:68;;;25143:54;21195:25:1;;;25143:54:0;;;;25071:10;;-1:-1:-1;;;;;;;;;;;25143:54:0;21168:18:1;25143:54:0;;;;;;;24965:244;-1:-1:-1;25226:4:0;24637:601;;;;;:::o;26186:1393::-;26321:23;26333:10;26321:11;:23::i;:::-;:32;26313:116;;;;-1:-1:-1;;;26313:116:0;;;;;;;:::i;:::-;26448:6;;:11;26440:34;;;;-1:-1:-1;;;26440:34:0;;;;;;;:::i;:::-;26494:1;26485:6;:10;26506:6;:4;:6::i;:::-;26543:11;;26523:17;26581:29;26586:12;26543:11;26581:4;:29::i;:::-;26632:10;26623:8;:20;;;;;;;;;;:36;;26565:45;;-1:-1:-1;26647:12:0;;26623:20;;:8;:36;;26647:12;;26623:36;:::i;:::-;;;;;;;;26685:12;26670:11;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;26713:46:0;;21195:25:1;;;26742:1:0;;26722:10;;-1:-1:-1;;;;;;;;;;;26713:46:0;21183:2:1;21168:18;26713:46:0;;;;;;;26785:9;26780:409;26804:7;:14;26800:18;;26780:409;;;26840:9;26852:7;26860:1;26852:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;26852:10:0;26891:11;;;:8;:11;;;;;;26852:10;26891:19;;26852:10;;-1:-1:-1;26891:19:0;26950:16;26955:5;26891:19;26950:4;:16::i;:::-;26925:41;;27007:13;;27021:1;27007:16;;;;;;;:::i;:::-;;;;;;;26989:14;:34;;26981:73;;;;-1:-1:-1;;;26981:73:0;;;;;;;:::i;:::-;27095:1;-1:-1:-1;;;;;27074:42:0;27083:10;-1:-1:-1;;;;;27074:42:0;;27098:14;27114:1;27074:42;;;;;;;:::i;:::-;;;;;;;;27131:46;27147:1;27150:10;27162:14;27131:15;:46::i;:::-;26825:364;;;26820:3;;;;;:::i;:::-;;;;26780:409;;;-1:-1:-1;27246:4:0;;-1:-1:-1;;;;;27246:4:0;27209:11;27235:16;;;:10;:16;;;;;;27223:29;;27228:5;;27223:4;:29::i;:::-;27274:4;;-1:-1:-1;;;;;27274:4:0;27263:16;;;;:10;:16;;;;;:23;;27209:43;;-1:-1:-1;27209:43:0;;27263:16;;;:23;;27209:43;;27263:23;:::i;:::-;;;;-1:-1:-1;;27308:10:0;27297:22;;;;:10;:22;;;;;:29;;27323:3;;27297:22;:29;;27323:3;;27297:29;:::i;:::-;;;;-1:-1:-1;27337:6:0;;-1:-1:-1;27337:4:0;:6::i;:::-;27357:5;;-1:-1:-1;;;;;27357:5:0;:19;27354:197;;27422:5;;27415:38;;-1:-1:-1;;;27415:38:0;;27388:12;;27403:51;;27408:5;;-1:-1:-1;;;;;27422:5:0;;27415:23;;:38;;27447:4;;27415:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27403:51::-;27388:66;-1:-1:-1;27468:8:0;;27465:75;;27504:5;;27488:40;;-1:-1:-1;;;;;27504:5:0;27511:10;27523:4;27488:15;:40::i;:::-;27377:174;27354:197;-1:-1:-1;;27570:1:0;27561:6;:10;-1:-1:-1;;;;26186:1393:0:o;18683:198::-;18790:7;;-1:-1:-1;;;;;18790:7:0;18776:10;:21;18768:30;;;;;;18809:8;:17;;-1:-1:-1;;;;;18809:17:0;;;-1:-1:-1;;;;;;18809:17:0;;;;;;;18837:4;:12;;;;;;;;;;;;;;;18860:6;:13;;;;;;;;;;;18683:198::o;4953:690::-;5188:22;5228:19;5250:35;5255:13;5270:14;5250:4;:35::i;:::-;5228:57;;5296:18;5317:15;5322:6;5330:1;5317:4;:15::i;:::-;5296:36;;5356:31;5361:13;5376:10;5356:4;:31::i;:::-;5343:44;;5398:9;5410:54;5415:14;5431:32;5436:14;5452:10;5431:4;:32::i;:::-;5410:4;:54::i;:::-;5398:66;;5475:11;5489:20;5494:1;5497:11;5489:4;:20::i;:::-;5475:34;;5520:11;5534:15;5539:4;5545:3;5534:4;:15::i;:::-;5520:29;;5577:26;5582:15;5599:3;5577:4;:26::i;:::-;5560:43;4953:690;-1:-1:-1;;;;;;;;;;;4953:690:0:o;40281:367::-;40397:10;40386:22;;;;:10;:22;;;;;;:32;-1:-1:-1;40386:32:0;40378:61;;;;-1:-1:-1;;;40378:61:0;;;;;;;:::i;:::-;40450:11;40464:29;40469:6;40477:15;40482:3;40487:4;40477;:15::i;40464:29::-;40515:10;40504:22;;;;:10;:22;;;;;:32;;40450:43;;-1:-1:-1;40530:6:0;;40504:22;;;:32;;40530:6;;40504:32;:::i;:::-;;;;-1:-1:-1;;;;;;;40547:17:0;;;;;;:10;:17;;;;;:24;;40568:3;;40547:17;:24;;40568:3;;40547:24;:::i;:::-;;;;-1:-1:-1;40602:17:0;;-1:-1:-1;40607:6:0;40615:3;40602:4;:17::i;:::-;40593:4;;-1:-1:-1;;;;;40593:4:0;40582:16;;;;:10;:16;;;;;:37;;:16;;;:37;;;;;:::i;:::-;;;;-1:-1:-1;;40639:1:0;40630:6;:10;-1:-1:-1;;;40281:367:0:o;12244:403::-;12361:10;12314:4;12350:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12350:27:0;;;;;;;;;;12392:14;;;12388:160;;;12434:10;12453:1;12423:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12423:27:0;;;;;;;;;:31;12388:160;;;12517:19;12522:8;12532:3;12517:4;:19::i;:::-;12498:10;12487:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12487:27:0;;;;;;;;;:49;12388:160;12572:10;12589:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12563:54:0;;12589:27;;;;;;;;;;;12563:54;;21195:25:1;;;12563:54:0;;12572:10;-1:-1:-1;;;;;;;;;;;12563:54:0;21168:18:1;12563:54:0;;;;;;;-1:-1:-1;12635:4:0;;12244:403;-1:-1:-1;;;12244:403:0:o;18247:158::-;18364:10;;-1:-1:-1;;;;;18364:10:0;18350;:24;18342:33;;;;;;18386:4;:11;;-1:-1:-1;;18386:11:0;;;;;18247:158::o;25250:925::-;25372:6;;:11;25364:34;;;;-1:-1:-1;;;25364:34:0;;;;;;;:::i;:::-;25418:1;25409:6;:10;25450:11;;25430:17;25488:30;25493:13;25450:11;25488:4;:30::i;:::-;25472:46;;25542:23;25554:10;25542:11;:23::i;:::-;:31;;25569:4;25542:31;25539:94;;;25604:13;25585:15;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;25539:94:0;25658:9;25653:403;25677:7;:14;25673:18;;25653:403;;;25713:9;25725:7;25733:1;25725:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;25725:10:0;25764:11;;;:8;:11;;;;;;25725:10;25764:19;;25725:10;;-1:-1:-1;25764:19:0;25836:16;25841:5;25764:19;25836:4;:16::i;:::-;25812:40;;25893:12;;25906:1;25893:15;;;;;;;:::i;:::-;;;;;;;25876:13;:32;;25868:41;;;;;;25950:1;-1:-1:-1;;;;;25929:41:0;25938:10;-1:-1:-1;;;;;25929:41:0;;25953:13;25968:1;25929:41;;;;;;;:::i;:::-;;;;;;;;25985:45;26001:1;26004:10;26016:13;25985:15;:45::i;:::-;25698:358;;;25693:3;;;;;:::i;:::-;;;;25653:403;;;;26066:20;26072:13;26066:5;:20::i;:::-;26097:32;26103:10;26115:13;26097:5;:32::i;:::-;26140:6;:4;:6::i;19295:282::-;19410:11;;-1:-1:-1;;;;;19410:11:0;19396:10;:25;19388:34;;;;;;19433:11;:21;;-1:-1:-1;;;;;19433:21:0;;;-1:-1:-1;;;;;;19433:21:0;;;;;;;19465:7;:13;;;;;;;;;;;;;;;19489:10;:15;;;;;;;;;;;19295:282::o;37035:664::-;37135:4;;-1:-1:-1;;;;;37135:4:0;;;37112:11;37126:14;;;:8;:14;;;;;37135:4;37126:22;;37181:10;;37126:22;;37181:10;37167;:24;:40;;;;;37202:5;37195:3;:12;;37167:40;37159:79;;;;-1:-1:-1;;;37159:79:0;;;;;;;:::i;:::-;37268:6;37262:3;:12;37259:170;;;37346:3;37338:4;:11;;:27;;;;;37361:4;37353;:12;;37338:27;:42;;;;;37377:3;37369:4;:11;;37338:42;:55;;;;-1:-1:-1;37384:9:0;;;37338:55;37330:86;;;;-1:-1:-1;;;37330:86:0;;20553:2:1;37330:86:0;;;20535:21:1;20592:2;20572:18;;;20565:30;-1:-1:-1;;;20611:18:1;;;20604:48;20669:18;;37330:86:0;20351:342:1;37330:86:0;37459:6;37452:3;:13;37449:191;;37537:3;37529:4;:11;;:27;;;;;37552:4;37544;:12;;37529:27;:42;;;;;37568:3;37560:4;:11;;37529:42;:55;;;;-1:-1:-1;37575:9:0;;;37529:55;37521:106;;;;-1:-1:-1;;;37521:106:0;;15157:2:1;37521:106:0;;;15139:21:1;15196:2;15176:18;;;15169:30;15235:34;15215:18;;;15208:62;-1:-1:-1;;;15286:18:1;;;15279:36;15332:19;;37521:106:0;14955:402:1;37521:106:0;-1:-1:-1;37660:3:0;:10;37681:3;:10;37035:664::o;17800:435::-;17901:10;;-1:-1:-1;;;;;17901:10:0;17887;:24;17879:63;;;;-1:-1:-1;;;17879:63:0;;;;;;;:::i;:::-;17974:5;;17967:27;;;-1:-1:-1;;;17967:27:0;;;;17953:11;;-1:-1:-1;;;;;17974:5:0;;17967:25;;:27;;;;;;;;;;;;;;17974:5;17967:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17953:41;-1:-1:-1;18025:8:0;18029:4;17953:41;18025:8;:::i;:::-;18014:7;:19;;:37;;;;;18048:3;18037:7;:14;;18014:37;18005:101;;;;-1:-1:-1;;;18005:101:0;;14048:2:1;18005:101:0;;;14030:21:1;14087:2;14067:18;;;14060:30;14126:34;14106:18;;;14099:62;-1:-1:-1;;;14177:18:1;;;14170:48;14235:19;;18005:101:0;13846:414:1;18005:101:0;18137:4;18127:6;:14;;18118:41;;;;-1:-1:-1;;;18118:41:0;;12191:2:1;18118:41:0;;;12173:21:1;12230:2;12210:18;;;12203:30;-1:-1:-1;;;12249:18:1;;;12242:43;12302:18;;18118:41:0;11989:337:1;18118:41:0;-1:-1:-1;18170:14:0;:24;;;;18205:13;:22;17800:435::o;11462:36::-;;;;;;;:::i;37711:824::-;37840:6;;:11;37832:34;;;;-1:-1:-1;;;37832:34:0;;;;;;;:::i;:::-;37886:1;37877:6;:10;37906:17;37918:4;37906:11;:17::i;:::-;:25;;37927:4;37906:25;37898:58;;;;-1:-1:-1;;;37898:58:0;;15919:2:1;37898:58:0;;;15901:21:1;15958:2;15938:18;;;15931:30;-1:-1:-1;;;15977:18:1;;;15970:50;16037:18;;37898:58:0;15717:344:1;37898:58:0;-1:-1:-1;;;;;37992:15:0;;;37967:22;37992:15;;;:9;:15;;;;;;;38042:11;:17;;;;;;38087:11;;37992:15;;38042:17;;38087:11;38073:10;:25;38070:437;;;38128:24;:15;38146:6;38128:24;:::i;:::-;38110:15;;;:42;38070:437;;;38244:4;:15;;;38225;:34;;:62;;;;-1:-1:-1;38277:10:0;;-1:-1:-1;;;;;38277:10:0;38263;:24;38225:62;38217:147;;;;-1:-1:-1;;;38217:147:0;;11710:2:1;38217:147:0;;;11692:21:1;11749:2;11729:18;;;11722:30;-1:-1:-1;;;;;;;;;;;11768:18:1;;;11761:62;11859:34;11839:18;;;11832:62;-1:-1:-1;;;11910:19:1;;;11903:39;11959:19;;38217:147:0;11508:476:1;38217:147:0;38375:21;;-1:-1:-1;;38375:21:0;;;38423:37;;-1:-1:-1;;;38423:37:0;;38391:5;;38438:4;;38423:31;;:37;;38455:4;;38423:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38407:53;;38490:5;38471:15;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;;38070:437:0;-1:-1:-1;;38526:1:0;38517:6;:10;-1:-1:-1;37711:824:0:o;19589:459::-;19668:10;19697:17;19668:10;19697:11;:17::i;:::-;:26;19689:63;;;;-1:-1:-1;;;19689:63:0;;11357:2:1;19689:63:0;;;11339:21:1;11396:2;11376:18;;;11369:30;-1:-1:-1;;;11415:18:1;;;11408:54;11479:18;;19689:63:0;11155:348:1;19689:63:0;19779:37;;-1:-1:-1;;;19779:37:0;;19763:13;;19794:4;;19779:31;;:37;;19811:4;;19779:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19852:15:0;;19827:22;19852:15;;;:9;:15;;;;;;;19902:11;:17;;;;;;19930:20;;-1:-1:-1;;19930:20:0;19946:4;19930:20;;;19763:53;;-1:-1:-1;19852:15:0;19979:25;:15;19997:7;19979:25;:::i;:::-;19961:4;:15;;:43;;;;20035:5;20016:15;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;19589:459:0:o;3582:543::-;3809:17;3844:13;3860:35;3865:14;3881:13;3860:4;:35::i;:::-;3844:51;;3906:13;3922:37;3927:15;3944:14;3922:4;:37::i;:::-;3906:53;;3970:13;3986:18;3991:5;3998;3986:4;:18::i;:::-;3970:34;;4015:13;4031:35;4036:6;4044:21;4049:6;4057:7;4044:4;:21::i;4031:35::-;4015:51;;4098:18;4103:5;4110;4098:4;:18::i;:::-;4086:30;3582:543;-1:-1:-1;;;;;;;;;;3582:543:0:o;24367:262::-;24428:4;24453:23;24465:10;24453:11;:23::i;:::-;:32;24445:116;;;;-1:-1:-1;;;24445:116:0;;;;;;;:::i;:::-;24572:27;24578:10;24590:3;24595;24572:5;:27::i;:::-;-1:-1:-1;24617:4:0;24367:262;;;;:::o;20060:1056::-;20160:4;;;;:13;20152:22;;;;;;20207:5;;20200:38;;-1:-1:-1;;;20200:38:0;;20185:12;;-1:-1:-1;;;;;20207:5:0;;20200:23;;:38;;20232:4;;20200:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20272:4;;20265:37;;-1:-1:-1;;;20265:37:0;;20185:53;;-1:-1:-1;20249:13:0;;-1:-1:-1;;;;;20272:4:0;;;;20265:22;;:37;;20296:4;;20265:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20331:83;;;;;;;;20360:7;:14;;20331:83;;;;;;;;;20322:5;;;-1:-1:-1;;;;;20322:5:0;;;-1:-1:-1;20313:15:0;;;:8;:15;;;;;;:101;;;;;;20322:5;20313:101;;;;20452:84;;;;;;;20481:14;;20452:84;;;;;;;;20444:4;;;;;20435:14;;;;;;;;;:101;;;;;;;;;;;;;20570:5;;20557:19;;;;;;;;;;;;;20570:5;;;-1:-1:-1;;;;;;20557:19:0;;;;;;20600:4;;20587:18;;;;;;;;;;;;;;20600:4;;;20587:18;;;;;;;;;;;20642:5;;;;20633:15;;;;;:23;;20452:84;;-1:-1:-1;;20628:34:0;;20658:3;20628:4;:34::i;:::-;20699:4;;-1:-1:-1;;;;;20699:4:0;20673:9;20690:14;;;:8;:14;;;;;20699:4;20690:22;;20616:46;;-1:-1:-1;20673:9:0;20685:34;;20714:4;20685;:34::i;:::-;20673:46;-1:-1:-1;20730:9:0;20742:5;20673:46;20742:1;:5;:::i;:::-;20730:17;;20758:8;20764:1;20758:5;:8::i;:::-;20777:15;20783:5;20790:1;20777:5;:15::i;:::-;20821:24;20826:15;;20843:1;20821:4;:24::i;:::-;20803:15;:42;-1:-1:-1;;;;;20881:16:0;;20856:22;20881:16;;;:9;:16;;;;;;;20932:11;:18;;;;;;20961:20;;-1:-1:-1;;20961:20:0;20977:4;20961:20;;;21010:26;:15;21028:8;21010:26;:::i;:::-;20992:15;;;;:44;;;;21048:4;:11;;-1:-1:-1;;21048:11:0;;;;;;21076:31;21081:3;21086:20;21091:4;21097:8;21086:4;:20::i;21076:31::-;21070:3;:37;-1:-1:-1;;;;;;;;;20060:1056:0:o;31892:2806::-;32057:22;32103:31;32123:10;32103:19;:31::i;:::-;32100:101;;32163:6;;:11;32155:34;;;;-1:-1:-1;;;32155:34:0;;;;;;;:::i;:::-;32220:1;32211:6;:10;;;32240:4;;;;;;;:12;;;32232:40;;;;-1:-1:-1;;;32232:40:0;;;;;;;:::i;:::-;32286:30;32305:10;32286:18;:30::i;:::-;:38;;32320:4;32286:38;32283:141;;;32352:4;;32345:3;:11;32337:75;;;;-1:-1:-1;;;32337:75:0;;;;;;;:::i;:::-;32469:14;;32452:13;:31;;32444:58;;;;-1:-1:-1;;;32444:58:0;;;;;;;:::i;:::-;32536:5;;-1:-1:-1;;;;;32536:5:0;32513:11;32527:15;;;:8;:15;;;;;32536:5;32527:23;;;32561:49;;32584:10;32596:13;32561:15;:49::i;:::-;32688:13;;32654:5;;32647:38;;-1:-1:-1;;;32647:38:0;;-1:-1:-1;;;;;32654:5:0;;;;32647:23;;:38;;32679:4;;32647:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;32630:5;;;-1:-1:-1;;;;;32630:5:0;;;32621:15;;;;:8;:15;;;;;;32630:5;32621:23;;;:80;;;;32748:5;;;;;32739:15;;;;;:23;;;;32733:54;;32739:29;;32765:3;;32739:29;:::i;:::-;32771:15;32776:3;32781:4;32771;:15::i;32733:54::-;32896:5;;-1:-1:-1;;;;;32896:5:0;32887:15;;;;:8;:15;;;;;32896:5;32887:23;;32712:75;;-1:-1:-1;32825:376:0;;32957:14;32962:4;32968:2;32957:4;:14::i;:::-;33027:4;;-1:-1:-1;;;;;33027:4:0;33018:14;;;;:8;:14;;;;;33027:4;33018:22;;33087:14;33092:4;33098:2;33087:4;:14::i;:::-;33148:10;32825:15;:376::i;:::-;33262:4;;-1:-1:-1;;;;;33262:4:0;33253:14;;;;:8;:14;;;;;33262:4;33253:22;;32808:393;;-1:-1:-1;33248:50:0;;33277:20;15769:2;33293:3;33277:4;:20::i;33248:50::-;33230:14;:68;;33222:99;;;;-1:-1:-1;;;33222:99:0;;;;;;;:::i;:::-;33390:12;33372:14;:30;;33364:69;;;;-1:-1:-1;;;33364:69:0;;;;;;;:::i;:::-;33444:12;33459:37;33464:14;33480:15;33485:3;;33490:4;33480;:15::i;33459:37::-;33444:52;;33507:18;33529:27;33534:4;33540:15;33545:2;33549:5;33540:4;:15::i;33529:27::-;33507:49;;33567:11;33581:27;33586:4;33592:15;33597:2;33601:5;33592:4;:15::i;33581:27::-;33567:41;;33619:19;33642:28;33647:4;33653:16;33658:3;;33663:5;33653:4;:16::i;33642:28::-;33619:51;-1:-1:-1;33681:10:0;33619:51;33703:16;33716:3;33703:10;:16;:::i;:::-;:30;;;;:::i;:::-;33695:39;;:4;:39;:::i;:::-;33681:54;;33746:19;33768:25;33773:2;33777:15;33782:3;33787:4;33777;:15::i;33768:25::-;33836:4;33804:10;33817:25;;;:10;:25;;;;;;33746:47;;-1:-1:-1;33871:4:0;33866:9;;33863:95;;;33904:2;33887:13;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;33936:4:0;33945:1;33917:25;;;:10;:25;;;;;:29;33863:95;33983:4;;-1:-1:-1;;;;;33983:4:0;33978:19;34017:10;33998:16;34012:2;33998:11;:16;:::i;:::-;:29;;;;:::i;:::-;33978:50;;;;;;;;;;;;;21195:25:1;;21183:2;21168:18;;21049:177;33978:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34039:68;34070:2;34074:32;34079:11;34092:13;34097:2;34101:3;34092:4;:13::i;34074:32::-;34039:30;:68::i;:::-;34135:23;34140:2;34144:13;34149:1;34152:4;34144;:13::i;34135:23::-;34118:13;;:40;;;;;;;:::i;:::-;;;;-1:-1:-1;34169:11:0;;-1:-1:-1;34183:31:0;34188:11;34201:12;34206:1;34209:3;34201:4;:12::i;34183:31::-;34169:45;;34225:12;34240:32;34245:11;34258:13;34263:2;34267:3;34258:4;:13::i;34240:32::-;34225:47;;34313:32;34318:11;34331:13;34336:2;34340:3;34331:4;:13::i;34313:32::-;34294:14;;-1:-1:-1;;;;;34294:14:0;34283:26;;;;:10;:26;;;;;:62;;:26;;;:62;;;;;:::i;:::-;;;;-1:-1:-1;;34367:7:0;;-1:-1:-1;;;;;34367:7:0;34356:19;;;;:10;:19;;;;;:27;;34379:4;;34356:19;:27;;34379:4;;34356:27;:::i;:::-;;;;-1:-1:-1;;34405:4:0;;-1:-1:-1;;;;;34405:4:0;34394:16;;;;:10;:16;;;;;:23;;34414:3;;34394:16;:23;;34414:3;;34394:23;:::i;:::-;;;;;;;;34445:11;34428:13;;:28;;;;;;;:::i;:::-;;;;;;;;34484:3;34467:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;34498:10:0;;-1:-1:-1;34498:8:0;:10::i;:::-;34519:9;:7;:9::i;:::-;34539:6;:4;:6::i;:::-;34589:4;;34582:5;;-1:-1:-1;;;;;34589:4:0;;;;34582:5;34570:10;-1:-1:-1;;;;;;;;;;;34595:10:0;34607:32;34612:11;34625:13;34630:2;34634:3;34625:4;:13::i;34607:32::-;34561:79;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;34660:1:0;34651:6;:10;-1:-1:-1;34679:11:0;31892:2806;-1:-1:-1;;;;;;;;;;;;31892:2806:0:o;34711:2308::-;34838:22;34886:6;;34896:1;34886:11;34878:34;;;;-1:-1:-1;;;34878:34:0;;;;;;;:::i;:::-;34932:1;34923:6;:10;35001;34944:11;34990:22;;;:10;:22;;;;;;34958:13;;34990:39;-1:-1:-1;34990:39:0;34982:68;;;;-1:-1:-1;;;34982:68:0;;;;;;;:::i;:::-;35104:5;;-1:-1:-1;;;;;35104:5:0;;;35061:23;35087:24;;;:8;:24;;;;;;35166:4;;;;;35149:23;;;;35208:14;;35191:31;;;35183:58;;;;-1:-1:-1;;;35183:58:0;;;;;;;:::i;:::-;35271:412;35333:8;:16;;;35396:14;35401:4;35407:2;35396:4;:14::i;:::-;35457:9;:17;;;35521:14;35526:4;35532:2;35521:4;:14::i;:::-;35582:36;35587:13;35602:15;35607:3;35612:4;35602;:15::i;35271:412::-;35254:429;;35722:45;35727:9;:17;;;35746:20;15769:2;35762:3;35746:4;:20::i;35722:45::-;35704:14;:63;;35696:94;;;;-1:-1:-1;;;35696:94:0;;;;;;;:::i;:::-;35801:12;35816:37;35821:14;35837:15;35842:3;;35847:4;35837;:15::i;35816:37::-;35801:52;;35864:18;35886:27;35891:4;35897:15;35902:2;35906:5;35897:4;:15::i;35886:27::-;35864:49;;35924:11;35938:27;35943:4;35949:15;35954:2;35958:5;35949:4;:15::i;35938:27::-;35924:41;;35976:19;35999:28;36004:4;36010:16;36015:3;;36020:5;36010:4;:16::i;35999:28::-;35976:51;-1:-1:-1;36038:10:0;35976:51;36060:16;36073:3;36060:10;:16;:::i;:::-;:30;;;;:::i;:::-;36052:39;;:4;:39;:::i;:::-;36038:54;;36103:19;36125:25;36130:2;36134:15;36139:3;36144:4;36134;:15::i;36125:25::-;36103:47;;36178:23;36183:2;36187:13;36192:1;36195:4;36187;:13::i;36178:23::-;36161:13;;:40;;;;;;;:::i;:::-;;;;-1:-1:-1;;36220:27:0;;;;36212:66;;;;-1:-1:-1;;;36212:66:0;;;;;;;:::i;:::-;36300:10;36289:22;;;;:10;:22;;;;;:39;;36315:13;;36289:22;:39;;36315:13;;36289:39;:::i;:::-;;;;;;;;36356:13;36339;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;36391:10:0;36380:22;;;;:10;:22;;;;;:37;;36406:11;;36380:22;:37;;36406:11;;36380:37;:::i;:::-;;;;-1:-1:-1;;36447:4:0;36428:25;;;;:10;:25;;;;;:39;;36457:10;;36428:25;:39;;36457:10;;36428:39;:::i;:::-;;;;-1:-1:-1;36478:10:0;;-1:-1:-1;36491:32:0;36496:11;36509:13;36514:2;36518:3;36509:4;:13::i;36491:32::-;36478:45;;36534:11;36548:31;36553:11;36566:12;36571:1;36574:3;36566:4;:12::i;36548:31::-;36534:45;;36590:12;36605:32;36610:11;36623:13;36628:2;36632:3;36623:4;:13::i;36605:32::-;36659:14;;-1:-1:-1;;;;;36659:14:0;36648:26;;;;:10;:26;;;;;:32;;36590:47;;-1:-1:-1;36678:2:0;;36648:26;;;:32;;36678:2;;36648:32;:::i;:::-;;;;-1:-1:-1;;36702:7:0;;-1:-1:-1;;;;;36702:7:0;36691:19;;;;:10;:19;;;;;:27;;36714:4;;36691:19;:27;;36714:4;;36691:27;:::i;:::-;;;;-1:-1:-1;;36740:4:0;;-1:-1:-1;;;;;36740:4:0;36729:16;;;;:10;:16;;;;;:23;;36749:3;;36729:16;:23;;36749:3;;36729:23;:::i;:::-;;;;-1:-1:-1;36808:11:0;;-1:-1:-1;36781:24:0;36794:11;36781:10;:24;:::i;:::-;:38;;;;:::i;:::-;36763:13;;:57;;;;;;;:::i;:::-;;;;;;;;36848:3;36831:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;36862:6:0;;-1:-1:-1;36862:4:0;:6::i;:::-;36879:9;:7;:9::i;:::-;36937:4;;;;;;;;;-1:-1:-1;;;;;36937:4:0;-1:-1:-1;;;;;36904:56:0;36930:5;;;;;;;;;-1:-1:-1;;;;;36930:5:0;-1:-1:-1;;;;;36904:56:0;36918:10;-1:-1:-1;;;;;36904:56:0;-1:-1:-1;;;;;;;;;;;36943:3:0;36948:11;36904:56;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;36980:1:0;36971:6;:10;-1:-1:-1;36999:11:0;34711:2308;-1:-1:-1;;;;;;;;;;;34711:2308:0:o;23225:1130::-;23336:4;;-1:-1:-1;;;;;23327:13:0;;;23336:4;;23327:13;;:31;;-1:-1:-1;23353:5:0;;-1:-1:-1;;;;;23344:14:0;;;23353:5;;23344:14;23327:31;23319:57;;;;-1:-1:-1;;;23319:57:0;;;;;;;:::i;:::-;23395:6;;:11;23387:34;;;;-1:-1:-1;;;23387:34:0;;;;;;;:::i;:::-;23441:1;23432:6;:10;23465:4;;-1:-1:-1;;;;;23456:13:0;;;23465:4;;23456:13;23453:874;;;23500:10;23489:22;;;;:10;:22;;;;;;:29;-1:-1:-1;23489:29:0;23481:57;;;;-1:-1:-1;;;23481:57:0;;;;;;;:::i;:::-;23564:4;;23549:49;;-1:-1:-1;;;23549:49:0;;-1:-1:-1;;;;;23564:4:0;;;;23549:29;;:49;;23587:4;;23594:3;;23549:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23629:3;23612:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;23654:10:0;23643:22;;;;:10;:22;;;;;:29;;23669:3;;23643:22;:29;;23669:3;;23643:29;:::i;:::-;;;;-1:-1:-1;;23710:4:0;;23683:37;;-1:-1:-1;;;23683:37:0;;-1:-1:-1;;;;;23683:26:0;;;;;;:37;;23710:4;;;;23716:3;;23683:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23732:14;23748:13;23775:4;-1:-1:-1;;;;;23765:35:0;;23809:4;23765:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23826:29;;-1:-1:-1;;;23826:29:0;;23731:84;;-1:-1:-1;23731:84:0;-1:-1:-1;;;;;;23826:18:0;;;;;:29;;23845:2;;23731:84;;23826:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23453:874:0;;-1:-1:-1;;;;;23453:874:0;;23938:10;23927:22;;;;:10;:22;;;;;;:29;-1:-1:-1;23927:29:0;23919:58;;;;-1:-1:-1;;;23919:58:0;;;;;;;:::i;:::-;24003:5;;23988:50;;-1:-1:-1;;;23988:50:0;;-1:-1:-1;;;;;24003:5:0;;;;23988:30;;:50;;24027:4;;24034:3;;23988:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24066:3;24049:13;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;24091:10:0;24080:22;;;;:10;:22;;;;;:29;;24106:3;;24080:22;:29;;24106:3;;24080:29;:::i;:::-;;;;-1:-1:-1;;24147:5:0;;24120:38;;-1:-1:-1;;;24120:38:0;;-1:-1:-1;;;;;24120:26:0;;;;;;:38;;24147:5;;;;24154:3;;24120:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24170:14;24186:13;24213:4;-1:-1:-1;;;;;24203:35:0;;24247:4;24203:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24264:31;;-1:-1:-1;;;24264:31:0;;24169:84;;-1:-1:-1;24169:84:0;-1:-1:-1;;;;;;24264:19:0;;;;;:31;;24284:2;;24169:84;;24264:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23453:874:0;-1:-1:-1;;24346:1:0;24337:6;:10;-1:-1:-1;;23225:1130:0:o;4135:810::-;4395:22;4419:18;4455:19;4477:35;4482:13;4497:14;4477:4;:35::i;:::-;4455:57;;4523:18;4544:21;4549:6;4557:7;4544:4;:21::i;:::-;4523:42;;4589:31;4594:13;4609:10;4589:4;:31::i;:::-;4576:44;;4631:9;4643:54;4648:14;4664:32;4669:14;4685:10;4664:4;:32::i;4643:54::-;4631:66;;4708:11;4722:20;4727:1;4730:11;4722:4;:20::i;:::-;4708:34;;4753:11;4767:15;4772:4;4778:3;4767:4;:15::i;:::-;4753:29;;4810:26;4815:15;4832:3;4810:4;:26::i;:::-;4793:43;;4860:31;4865:13;4880:10;4860:4;:31::i;:::-;4847:44;;4902:35;;;;;4135:810;;;;;;;;;:::o;21515:1014::-;21605:4;;-1:-1:-1;;;;;21596:13:0;;;21605:4;;21596:13;;:31;;-1:-1:-1;21622:5:0;;-1:-1:-1;;;;;21613:14:0;;;21622:5;;21613:14;21596:31;21588:57;;;;-1:-1:-1;;;21588:57:0;;;;;;;:::i;:::-;21664:6;;:11;21656:34;;;;-1:-1:-1;;;21656:34:0;;;;;;;:::i;:::-;21710:1;21701:6;:10;;;21730:4;;;;;;;:12;;;21722:21;;;;;;21776:5;;-1:-1:-1;;;;;21767:14:0;;;21776:5;;21767:14;21764:737;;;21816:5;;-1:-1:-1;;;;;21816:5:0;21793:11;21807:15;;;:8;:15;;;;;21816:5;21807:23;;;21846:39;;21869:10;21881:3;21846:15;:39::i;:::-;21922:5;;21915:38;;-1:-1:-1;;;21915:38:0;;21896:11;;21910:59;;-1:-1:-1;;;;;21922:5:0;;;;21915:23;;:38;;21947:4;;21915:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21955:13;;21910:4;:59::i;:::-;21896:73;;21982:19;22004:14;22009:3;22014;22004:4;:14::i;:::-;21982:36;;22048:11;22031:13;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;22081:10:0;22070:22;;;;:10;:22;;;;;:37;;22096:11;;22070:22;:37;;22096:11;;22070:37;:::i;:::-;;;;-1:-1:-1;21764:737:0;;-1:-1:-1;;;;21764:737:0;;22167:4;;-1:-1:-1;;;;;22167:4:0;22144:11;22158:14;;;:8;:14;;;;;22167:4;22158:22;;;22191:38;;22213:10;22225:3;22191:15;:38::i;:::-;22266:4;;22259:37;;-1:-1:-1;;;22259:37:0;;22240:11;;22254:100;;-1:-1:-1;;;;;22266:4:0;;;;22259:22;;:37;;22290:4;;22259:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22298:55;22303:13;;22318:34;22323:13;;22338;;22318:4;:34::i;:::-;22298:4;:55::i;:::-;22254:4;:100::i;:::-;22240:114;;22365:19;22387:14;22392:3;22397;22387:4;:14::i;:::-;22365:36;;22430:11;22412:13;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;22463:10:0;22452:22;;;;:10;:22;;;;;:37;;22478:11;;22452:22;:37;;22478:11;;22452:37;:::i;:::-;;;;-1:-1:-1;;;;;;;22520:1:0;22511:6;:10;21515:1014::o;29753:2127::-;29892:22;29940:6;;29950:1;29940:11;29932:34;;;;-1:-1:-1;;;29932:34:0;;;;;;;:::i;:::-;29986:1;29977:6;:10;;;30006:4;;;;;;;:12;;;29998:40;;;;-1:-1:-1;;;29998:40:0;;;;;;;:::i;:::-;30049:13;30065:32;30070:9;30081:15;30086:3;30091:4;30081;:15::i;30065:32::-;30049:48;;30113:4;;;;;;;;;-1:-1:-1;;;;;30113:4:0;-1:-1:-1;;;;;30108:18:0;;30134:5;30108:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30153:74;30184:10;30196:30;30201:9;30212:13;30217:1;30220:4;30212;:13::i;30153:74::-;30251:30;30270:10;30251:18;:30::i;:::-;:38;;30285:4;30251:38;30248:141;;;30317:4;;30310:3;:11;30302:75;;;;-1:-1:-1;;;30302:75:0;;;;;;;:::i;:::-;30431:3;;30424:42;;-1:-1:-1;;;30424:42:0;;30409:12;;-1:-1:-1;;;;;30431:3:0;;30424:21;;:42;;30454:10;;30424:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30409:57;-1:-1:-1;30490:21:0;30535:6;;;;;:27;;;30558:4;30545:9;:17;;30535:27;:43;;;;;30574:4;30566;:12;;30535:43;30532:82;;;30590:12;:10;:12::i;:::-;30677:4;;-1:-1:-1;;;;;30677:4:0;;;30634:23;30660;;;:8;:23;;;;;;30738:5;;;;;30721:24;;;;30787:13;;30774:9;:26;;30766:55;;;;-1:-1:-1;;;30766:55:0;;;;;;;:::i;:::-;30842:18;30902:429;30963:8;:16;;;31026:14;31031:4;31037:2;31026:4;:14::i;:::-;31087:9;:17;;;31151:14;31156:4;31162:2;31151:4;:14::i;:::-;31212:28;31217:5;31224:15;31229:3;31234:4;31224;:15::i;31212:28::-;31287:1;30902:14;:429::i;:::-;31415:17;;;;30871:460;;-1:-1:-1;30871:460:0;-1:-1:-1;31410:45:0;;31434:20;15769:2;31450:3;31434:4;:20::i;31410:45::-;31392:14;:63;;31384:94;;;;-1:-1:-1;;;31384:94:0;;;;;;;:::i;:::-;31506:30;31511:9;31522:13;31527:1;31530:4;31522;:13::i;31506:30::-;31489:13;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;31587:30:0;;;;31579:69;;;;-1:-1:-1;;;31579:69:0;;;;;;;:::i;:::-;31675:5;;31659:42;;-1:-1:-1;;;;;31675:5:0;31682:2;31686:14;31659:15;:42::i;:::-;31712:6;:4;:6::i;:::-;31763:5;;31757:4;;31807:3;;-1:-1:-1;;;;;31763:5:0;;;;31757:4;;;;31745:10;;-1:-1:-1;;;;;;;;;;;31736:82:0;31770:9;;31781:36;;31786:14;;31802;;31812:3;31802:4;:14::i;31781:36::-;31736:82;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;31838:1:0;31829:6;:10;-1:-1:-1;;;;29753:2127:0;;;;;:::o;19021:105::-;19090:7;;-1:-1:-1;;;;;19090:7:0;19076:10;:21;19068:30;;;;;;19109:3;:9;19021:105::o;11981:255::-;12114:10;12051:4;12103:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12103:27:0;;;;;;;;;;12098:38;;12132:3;12098:4;:38::i;:::-;12079:10;12068:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;12068:27:0;;;;;;;;;;;;:68;;;12152:54;21195:25:1;;;12068:27:0;;-1:-1:-1;;;;;;;;;;;12152:54:0;21168:18:1;12152:54:0;21049:177:1;18893:116:0;18962:7;;-1:-1:-1;;;;;18962:7:0;18948:10;:21;18940:30;;;;;;18981:14;:20;;-1:-1:-1;;;;;;18981:20:0;-1:-1:-1;;;;;18981:20:0;;;;;;;;;;18893:116::o;15925:397::-;16047:4;;;;:13;16039:43;;;;-1:-1:-1;;;16039:43:0;;14811:2:1;16039:43:0;;;14793:21:1;14850:2;14830:18;;;14823:30;-1:-1:-1;;;14869:18:1;;;14862:47;14926:18;;16039:43:0;14609:341:1;16039:43:0;16093:5;:15;;-1:-1:-1;;;;;16093:15:0;;;-1:-1:-1;;;;;;16093:15:0;;;;;;;;16119:10;:18;;;;;;;;;;;;;16148:14;:22;;;;;;;;;16181:4;:9;;;-1:-1:-1;16201:12:0;;;;;;;;;;;16224:8;:16;;;;;;;;;;;;16273:27;;;-1:-1:-1;;;16273:27:0;;;;16268:46;;16093:15;16273:25;;:27;;;;;;;;;;;;;;16093:15;16273:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16302:11;16307:1;16310:2;16302:4;:11::i;16268:46::-;16251:14;:63;-1:-1:-1;;;;;15925:397:0:o;5651:853::-;5912:21;5935:18;5971:19;5993:35;5998:14;6014:13;5993:4;:35::i;:::-;5971:57;;6039:12;6054:37;6059:15;6076:14;6054:4;:37::i;:::-;6039:52;;6102:9;6114:27;6119:15;6136:4;6114;:27::i;:::-;6102:39;;6152:11;6166:20;6171:1;6174:11;6166:4;:20::i;:::-;6152:34;;6203:15;6208:3;6213:4;6203;:15::i;:::-;6197:21;;6235:25;6240:14;6256:3;6235:4;:25::i;:::-;6229:31;;6287:19;6292:4;6298:7;6287:4;:19::i;:::-;6271:35;;6333:24;6338:3;6343:13;6333:4;:24::i;:::-;6317:40;;6381:15;6386:3;6391:4;6381;:15::i;:::-;6368:28;;6420:31;6425:13;6440:10;6420:4;:31::i;:::-;6407:44;;6462:34;;;;5651:853;;;;;;;;;:::o;27781:1960::-;27969:10;27908:22;27958;;;:10;:22;;;;;;:39;-1:-1:-1;27958:39:0;27950:81;;;;-1:-1:-1;;;27950:81:0;;18758:2:1;27950:81:0;;;18740:21:1;18797:2;18777:18;;;18770:30;18836:31;18816:18;;;18809:59;18885:18;;27950:81:0;18556:353:1;27950:81:0;28050:6;;:11;28042:34;;;;-1:-1:-1;;;28042:34:0;;;;;;;:::i;:::-;28096:1;28087:6;:10;28151:4;;-1:-1:-1;;;;;28151:4:0;;;28108:23;28134;;;:8;:23;;;;;;28212:5;;;;;28195:24;;;;28255:13;;28238:30;;;28230:59;;;;-1:-1:-1;;;28230:59:0;;;;;;;:::i;:::-;28300:18;28360:437;28421:8;:16;;;28484:14;28489:4;28495:2;28484:4;:14::i;28360:437::-;28849:17;;;;28329:468;;-1:-1:-1;28329:468:0;-1:-1:-1;28844:45:0;;28868:20;15769:2;28884:3;28868:4;:20::i;28844:45::-;28826:14;:63;;28818:94;;;;-1:-1:-1;;;28818:94:0;;;;;;;:::i;:::-;28981:12;28963:14;:30;;28955:69;;;;-1:-1:-1;;;28955:69:0;;;;;;;:::i;:::-;29049:10;29038:22;;;;:10;:22;;;;;:39;;29064:13;;29038:22;:39;;29064:13;;29038:39;:::i;:::-;;;;;;;;29105:13;29088;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;29140:10:0;29129:22;;;;:10;:22;;;;;:40;;29155:14;;29129:22;:40;;29155:14;;29129:40;:::i;:::-;;;;;;;;29197:14;29180:13;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;29239:34:0;;-1:-1:-1;29244:13:0;29259;29264:1;29267:4;29259;:13::i;29239:34::-;29222:13;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;29284:6:0;;-1:-1:-1;29284:4:0;:6::i;:::-;29338:5;;29332:4;;29306:69;;-1:-1:-1;;;;;29338:5:0;;;;29332:4;;;;29320:10;;-1:-1:-1;;;;;;;;;;;29306:69:0;;;29345:13;;29360:14;;29306:69;:::i;:::-;;;;;;;;29408:3;;29401:42;;-1:-1:-1;;;29401:42:0;;29386:12;;-1:-1:-1;;;;;29408:3:0;;29401:21;;:42;;29431:10;;29401:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29386:57;;29481:1;29457:21;:25;:50;;;;;29503:4;29486:13;:21;;29457:50;:66;;;;;29519:4;29511;:12;;29457:66;29454:226;;;29535:10;29548:30;29553:21;29576:1;29548:4;:30::i;:::-;29535:43;;29589:46;29620:10;29632:2;29589:30;:46::i;:::-;29666:2;29646:16;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;29454:226:0;-1:-1:-1;;29699:1:0;29690:6;:10;-1:-1:-1;;27781:1960:0;;;;:::o;17472:316::-;17616:13;;17582:5;;17575:38;;-1:-1:-1;;;17575:38:0;;-1:-1:-1;;;;;17582:5:0;;;;17575:23;;:38;;17607:4;;17575:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;17558:5;;-1:-1:-1;;;;;17558:5:0;17549:15;;;;:8;:15;;;;;17558:5;17549:23;:80;;;;17688:13;;17672;;17656;;:29;;17672:13;17656:29;:::i;:::-;:45;;;;:::i;:::-;17745:4;;17738:37;;-1:-1:-1;;;17738:37:0;;17642:60;;-1:-1:-1;17642:60:0;;-1:-1:-1;;;;;17745:4:0;;;;17738:22;;:37;;17769:4;;17738:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;17722:4;;-1:-1:-1;;;;;17722:4:0;17713:14;;;;:8;:14;;;;;17722:4;17713:22;:67;-1:-1:-1;17472:316:0:o;16599:387::-;16658:4;16688:28;16708:7;16688:19;:28::i;:::-;16685:51;;;-1:-1:-1;16728:5:0;;16599:387;-1:-1:-1;16599:387:0:o;16685:51::-;16895:20;;-1:-1:-1;;;;;;;;;;;16935:15:0;;;;;:42;;;16966:11;16954:8;:23;;16935:42;16927:51;16599:387;-1:-1:-1;;;;16599:387:0:o;1009:329::-;1086:7;;1124:5;1128:1;1124;:5;:::i;:::-;1111:18;-1:-1:-1;1148:6:0;;;:21;;-1:-1:-1;1168:1:0;1158:6;1163:1;1158:2;:6;:::i;:::-;:11;1148:21;1140:50;;;;-1:-1:-1;;;1140:50:0;;;;;;;:::i;:::-;1201:10;1214:15;:2;1220:8;1214:15;:::i;:::-;1201:28;;1254:2;1248;:8;;1240:37;;;;-1:-1:-1;;;1240:37:0;;;;;;;:::i;:::-;1288:10;1301:9;1306:4;1301:2;:9;:::i;:::-;1288:22;1009:329;-1:-1:-1;;;;;;1009:329:0:o;39649:184::-;39767:34;;-1:-1:-1;;;39767:34:0;;39755:9;;-1:-1:-1;;;;;39767:22:0;;;;;:34;;39790:2;;39794:6;;39767:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39755:46;;39820:4;39812:13;;;;;;39741:92;39649:184;;;:::o;1346:405::-;1423:7;1456:6;1448:31;;;;-1:-1:-1;;;1448:31:0;;16957:2:1;1448:31:0;;;16939:21:1;16996:2;16976:18;;;16969:30;-1:-1:-1;;;17015:18:1;;;17008:42;17067:18;;1448:31:0;16755:336:1;1448:31:0;1490:10;1503:8;:1;1507:4;1503:8;:::i;:::-;1490:21;-1:-1:-1;1530:6:0;;;:24;;-1:-1:-1;1540:6:0;1545:1;1540:2;:6;:::i;:::-;1550:4;1540:14;1530:24;1522:53;;;;-1:-1:-1;;;1522:53:0;;;;;;;:::i;:::-;1603:10;1622:5;1626:1;1622;:5;:::i;:::-;1616:12;;:2;:12;:::i;:::-;1603:25;;1653:2;1647;:8;;1639:37;;;;-1:-1:-1;;;1639:37:0;;;;;;;:::i;:::-;1704:10;1717:6;1722:1;1717:2;:6;:::i;11013:252::-;-1:-1:-1;;;;;11095:13:0;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;11095:20:0;11087:29;;;;;;-1:-1:-1;;;;;11148:13:0;;:8;:13;;;;;;;;;;;11143:24;;11163:3;11143:4;:24::i;:::-;-1:-1:-1;;;;;11127:13:0;;;:8;:13;;;;;;;;;;;:40;;;;11199:13;;;;;;;11194:24;;11214:3;11194:4;:24::i;:::-;-1:-1:-1;;;;;11178:13:0;;;:8;:13;;;;;;;;;;;;:40;;;;11234:23;21195:25:1;;;11178:13:0;;11234:23;;;;-1:-1:-1;;;;;;;;;;;11234:23:0;21168:18:1;11234:23:0;;;;;;;11013:252;;;:::o;550:214::-;627:7;653:9;664;677:14;686:1;689;677:8;:14::i;:::-;652:39;;;;711:4;710:5;702:35;;;;-1:-1:-1;;;702:35:0;;19520:2:1;702:35:0;;;19502:21:1;19559:2;19539:18;;;19532:30;-1:-1:-1;;;19578:18:1;;;19571:47;19635:18;;702:35:0;19318:341:1;702:35:0;-1:-1:-1;755:1:0;550:214;-1:-1:-1;;;550:214:0:o;350:192::-;427:7;;464:5;468:1;464;:5;:::i;:::-;452:17;;493:1;488;:6;;480:35;;;;-1:-1:-1;;;480:35:0;;19866:2:1;480:35:0;;;19848:21:1;19905:2;19885:18;;;19878:30;-1:-1:-1;;;19924:18:1;;;19917:46;19980:18;;480:35:0;19664:340:1;480:35:0;533:1;350:192;-1:-1:-1;;;350:192:0:o;2093:567::-;2175:7;2216:5;2208:4;:13;;2200:47;;;;-1:-1:-1;;;2200:47:0;;18408:2:1;2200:47:0;;;18390:21:1;18447:2;18427:18;;;18420:30;-1:-1:-1;;;18466:18:1;;;18459:51;18527:18;;2200:47:0;18206:345:1;2200:47:0;2274:18;2266:4;:26;;2258:61;;;;-1:-1:-1;;;2258:61:0;;20900:2:1;2258:61:0;;;20882:21:1;20939:2;20919:18;;;20912:30;-1:-1:-1;;;20958:18:1;;;20951:52;21020:18;;2258:61:0;20698:346:1;2258:61:0;2332:13;2349:11;2356:3;2349:6;:11::i;:::-;2332:28;;2371:14;2388:16;2393:3;2398:5;2388:4;:16::i;:::-;2371:33;;2417:16;2436:24;2442:4;2448:11;2453:5;2448:4;:11::i;:::-;2436:5;:24::i;:::-;2417:43;-1:-1:-1;2477:11:0;2473:59;;2512:8;-1:-1:-1;2505:15:0;;-1:-1:-1;;2505:15:0;2473:59;2544:21;2568:37;2579:4;2585:6;2593:11;2568:10;:37::i;:::-;2544:61;;2623:29;2628:8;2638:13;2623:4;:29::i;:::-;2616:36;2093:567;-1:-1:-1;;;;;;;2093:567:0:o;39430:207::-;39550:55;;-1:-1:-1;;;39550:55:0;;-1:-1:-1;;;;;7060:15:1;;;39550:55:0;;;7042:34:1;39591:4:0;7092:18:1;;;7085:43;7144:18;;;7137:34;;;39538:9:0;;39550:26;;;;;;6977:18:1;;39550:55:0;6802:375:1;10786:219:0;10882:4;10865:8;:23;;;;;;;;;;;10860:34;;10890:3;10860:4;:34::i;:::-;10851:4;10834:8;:23;;;;;;;;;;:60;10924:11;;10919:22;;10937:3;10919:4;:22::i;:::-;10905:11;:36;10957:40;;21195:25:1;;;10986:4:0;;10974:1;;-1:-1:-1;;;;;;;;;;;10957:40:0;21183:2:1;21168:18;10957:40:0;;;;;;;10786:219;:::o;11273:97::-;11333:29;11347:4;11354:2;11358:3;11333:5;:29::i;:::-;11273:97;;:::o;8106:318::-;8166:4;8333:20;;-1:-1:-1;;;;;;;;;;;8373:23:0;;;;;;:42;;-1:-1:-1;;8400:15:0;;;8365:51;-1:-1:-1;;8106:318:0:o;7872:198::-;7983:12;;;7945;7983;;;;;;;;;-1:-1:-1;;;;;7962:7:0;;;7976:5;;7962:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7944:52;;;8015:7;8007:55;;;;-1:-1:-1;;;8007:55:0;;19116:2:1;8007:55:0;;;19098:21:1;19155:2;19135:18;;;19128:30;19194:34;19174:18;;;19167:62;-1:-1:-1;;;19245:18:1;;;19238:33;19288:19;;8007:55:0;18914:399:1;8007:55:0;7933:137;7872:198;;:::o;40096:173::-;40158:5;40142:13;;:21;40139:123;;;40192:4;;40198:8;;40208:13;;40176:46;;-1:-1:-1;;;;;40192:4:0;;;;40198:8;;40176:15;:46::i;:::-;40249:1;40233:13;:17;40139:123;40096:173::o;39845:239::-;39903:5;39887:13;;:21;39884:193;;;39926:4;;39941:13;;39921:34;;-1:-1:-1;;;39921:34:0;;-1:-1:-1;;;;;39926:4:0;;;;39921:19;;:34;;;;21195:25:1;;;21183:2;21168:18;;21049:177;39921:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39971:4:0;;39992:13;;-1:-1:-1;;;;;39971:4:0;;;;-1:-1:-1;39966:14:0;;-1:-1:-1;39987:34:0;;40007:13;40012:2;40016:3;40007:4;:13::i;39987:34::-;40029:4;;39966:71;;;;;;-1:-1:-1;;;;;;39966:71:0;;;40023:4;39966:71;;;9243:25:1;-1:-1:-1;;;;;40029:4:0;;;9284:18:1;;;9277:60;40029:4:0;9353:18:1;;;9346:34;9216:18;;39966:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40064:1:0;40048:13;:17;-1:-1:-1;;;39845:239:0:o;27591:178::-;27633:10;27646:25;27670:1;27646:21;:25;:::i;:::-;27633:38;;27682:46;27713:10;27725:2;27682:30;:46::i;:::-;27759:2;27739:16;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;27591:178:0:o;772:229::-;853:4;859;890:1;885;:6;881:113;;916:5;920:1;916;:5;:::i;:::-;923;908:21;;;;;;881:113;970:5;974:1;970;:5;:::i;:::-;977:4;962:20;;;;881:113;772:229;;;;;:::o;220:122::-;288:7;320;325:1;320:4;:7::i;:::-;:14;;330:4;320:14;:::i;98:114::-;164:7;196:8;200:4;196:1;:8;:::i;1759:326::-;1837:7;;1874:5;1878:1;1874;:5;:::i;:::-;:21;;1891:4;1874:21;;;1887:1;1874:21;1862:33;-1:-1:-1;1913:6:0;1918:1;1913:6;;:::i;:::-;;;1908:151;1921:6;;1908:151;;1956:10;1961:1;1964;1956:4;:10::i;:::-;1952:14;-1:-1:-1;1987:5:0;1991:1;1987;:5;:::i;:::-;:10;1983:65;;2022:10;2027:1;2030;2022:4;:10::i;:::-;2018:14;;1983:65;1929:6;1934:1;1929:6;;:::i;:::-;;;1908:151;;2668:864;2775:7;2816:3;2775:7;;2856:20;2865:4;2871;2856:8;:20::i;:::-;2830:46;;-1:-1:-1;2830:46:0;-1:-1:-1;2902:4:0;;2887:12;3001:1;2984:518;3012:9;3004:4;:17;2984:518;;3043:12;3058:8;:1;3062:4;3058:8;:::i;:::-;3043:23;;3082:9;3093;3106:29;3115:1;3118:16;3123:4;3129;3118;:16::i;:::-;3106:8;:29::i;:::-;3081:54;;;;3157:22;3162:4;3168:10;3173:1;3176;3168:4;:10::i;3157:22::-;3150:29;;3201:16;3206:4;3212;3201;:16::i;:::-;3194:23;-1:-1:-1;3236:9:0;3232:20;;3247:5;;;;;3232:20;3273:4;3269:30;;;3290:9;;;3269:30;3318:4;3314:30;;;3335:9;;;3314:30;3363:8;3359:132;;;3398:15;3403:3;3408:4;3398;:15::i;:::-;3392:21;;3359:132;;;3460:15;3465:3;3470:4;3460;:15::i;:::-;3454:21;;3359:132;3028:474;;;3023:3;;;;;:::i;:::-;;;;2984:518;;;-1:-1:-1;3521:3:0;;2668:864;-1:-1:-1;;;;;;;;;2668:864:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:334::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;938:38;972:2;961:9;957:18;938:38;:::i;:::-;928:48;;648:334;;;;;:::o;987:478::-;1082:6;1090;1098;1106;1114;1167:3;1155:9;1146:7;1142:23;1138:33;1135:53;;;1184:1;1181;1174:12;1135:53;1207:29;1226:9;1207:29;:::i;:::-;1197:39;;1255:38;1289:2;1278:9;1274:18;1255:38;:::i;:::-;1245:48;;1312:38;1346:2;1335:9;1331:18;1312:38;:::i;:::-;1302:48;;1369:38;1403:2;1392:9;1388:18;1369:38;:::i;:::-;987:478;;;;-1:-1:-1;987:478:1;;1454:3;1439:19;1426:33;;987:478;-1:-1:-1;;987:478:1:o;1470:403::-;1556:6;1564;1572;1580;1633:3;1621:9;1612:7;1608:23;1604:33;1601:53;;;1650:1;1647;1640:12;1601:53;1673:29;1692:9;1673:29;:::i;:::-;1663:39;;1721:38;1755:2;1744:9;1740:18;1721:38;:::i;:::-;1711:48;;1778:38;1812:2;1801:9;1797:18;1778:38;:::i;:::-;1470:403;;;;-1:-1:-1;1768:48:1;;1863:2;1848:18;1835:32;;-1:-1:-1;;1470:403:1:o;1878:328::-;1955:6;1963;1971;2024:2;2012:9;2003:7;1999:23;1995:32;1992:52;;;2040:1;2037;2030:12;1992:52;2063:29;2082:9;2063:29;:::i;:::-;2053:39;;2111:38;2145:2;2134:9;2130:18;2111:38;:::i;:::-;2101:48;;2196:2;2185:9;2181:18;2168:32;2158:42;;1878:328;;;;;:::o;2211:315::-;2276:6;2284;2337:2;2325:9;2316:7;2312:23;2308:32;2305:52;;;2353:1;2350;2343:12;2305:52;2376:29;2395:9;2376:29;:::i;:::-;2366:39;;2455:2;2444:9;2440:18;2427:32;2468:28;2490:5;2468:28;:::i;:::-;2515:5;2505:15;;;2211:315;;;;;:::o;2531:254::-;2599:6;2607;2660:2;2648:9;2639:7;2635:23;2631:32;2628:52;;;2676:1;2673;2666:12;2628:52;2699:29;2718:9;2699:29;:::i;:::-;2689:39;2775:2;2760:18;;;;2747:32;;-1:-1:-1;;;2531:254:1:o;2790:245::-;2857:6;2910:2;2898:9;2889:7;2885:23;2881:32;2878:52;;;2926:1;2923;2916:12;2878:52;2958:9;2952:16;2977:28;2999:5;2977:28;:::i;3040:180::-;3099:6;3152:2;3140:9;3131:7;3127:23;3123:32;3120:52;;;3168:1;3165;3158:12;3120:52;-1:-1:-1;3191:23:1;;3040:180;-1:-1:-1;3040:180:1:o;3225:184::-;3295:6;3348:2;3336:9;3327:7;3323:23;3319:32;3316:52;;;3364:1;3361;3354:12;3316:52;-1:-1:-1;3387:16:1;;3225:184;-1:-1:-1;3225:184:1:o;3414:322::-;3491:6;3499;3507;3560:2;3548:9;3539:7;3535:23;3531:32;3528:52;;;3576:1;3573;3566:12;3528:52;3612:9;3599:23;3589:33;;3641:38;3675:2;3664:9;3660:18;3641:38;:::i;3741:391::-;3827:6;3835;3843;3851;3904:3;3892:9;3883:7;3879:23;3875:33;3872:53;;;3921:1;3918;3911:12;3872:53;3957:9;3944:23;3934:33;;3986:38;4020:2;4009:9;4005:18;3986:38;:::i;:::-;3741:391;;3976:48;;-1:-1:-1;;;;4071:2:1;4056:18;;4043:32;;4122:2;4107:18;4094:32;;3741:391::o;4137:683::-;4232:6;4240;4248;4301:2;4289:9;4280:7;4276:23;4272:32;4269:52;;;4317:1;4314;4307:12;4269:52;4340:23;;;-1:-1:-1;4414:2:1;4399:18;;4386:32;-1:-1:-1;;;;;4467:14:1;;;4464:34;;;4494:1;4491;4484:12;4464:34;4532:6;4521:9;4517:22;4507:32;;4577:7;4570:4;4566:2;4562:13;4558:27;4548:55;;4599:1;4596;4589:12;4548:55;4639:2;4626:16;4665:2;4657:6;4654:14;4651:34;;;4681:1;4678;4671:12;4651:34;4734:7;4729:2;4719:6;4716:1;4712:14;4708:2;4704:23;4700:32;4697:45;4694:65;;;4755:1;4752;4745:12;4694:65;4786:2;4782;4778:11;4768:21;;4808:6;4798:16;;;;;4137:683;;;;;:::o;4825:248::-;4893:6;4901;4954:2;4942:9;4933:7;4929:23;4925:32;4922:52;;;4970:1;4967;4960:12;4922:52;-1:-1:-1;;4993:23:1;;;5063:2;5048:18;;;5035:32;;-1:-1:-1;4825:248:1:o;5078:245::-;5157:6;5165;5218:2;5206:9;5197:7;5193:23;5189:32;5186:52;;;5234:1;5231;5224:12;5186:52;-1:-1:-1;;5257:16:1;;5313:2;5298:18;;;5292:25;5257:16;;5292:25;;-1:-1:-1;5078:245:1:o;5328:454::-;5423:6;5431;5439;5447;5455;5508:3;5496:9;5487:7;5483:23;5479:33;5476:53;;;5525:1;5522;5515:12;5476:53;-1:-1:-1;;5548:23:1;;;5618:2;5603:18;;5590:32;;-1:-1:-1;5669:2:1;5654:18;;5641:32;;5720:2;5705:18;;5692:32;;-1:-1:-1;5771:3:1;5756:19;5743:33;;-1:-1:-1;5328:454:1;-1:-1:-1;5328:454:1:o;5787:523::-;5891:6;5899;5907;5915;5923;5931;5984:3;5972:9;5963:7;5959:23;5955:33;5952:53;;;6001:1;5998;5991:12;5952:53;-1:-1:-1;;6024:23:1;;;6094:2;6079:18;;6066:32;;-1:-1:-1;6145:2:1;6130:18;;6117:32;;6196:2;6181:18;;6168:32;;-1:-1:-1;6247:3:1;6232:19;;6219:33;;-1:-1:-1;6299:3:1;6284:19;6271:33;;-1:-1:-1;5787:523:1;-1:-1:-1;5787:523:1:o;6315:274::-;6444:3;6482:6;6476:13;6498:53;6544:6;6539:3;6532:4;6524:6;6520:17;6498:53;:::i;:::-;6567:16;;;;;6315:274;-1:-1:-1;;6315:274:1:o;6594:203::-;-1:-1:-1;;;;;6758:32:1;;;;6740:51;;6728:2;6713:18;;6594:203::o;7182:332::-;-1:-1:-1;;;;;7432:32:1;;;;7414:51;;7496:2;7481:18;;7474:34;7402:2;7387:18;;7182:332::o;9391:383::-;9540:2;9529:9;9522:21;9503:4;9572:6;9566:13;9615:6;9610:2;9599:9;9595:18;9588:34;9631:66;9690:6;9685:2;9674:9;9670:18;9665:2;9657:6;9653:15;9631:66;:::i;:::-;9758:2;9737:15;-1:-1:-1;;9733:29:1;9718:45;;;;9765:2;9714:54;;9391:383;-1:-1:-1;;9391:383:1:o;9779:334::-;9981:2;9963:21;;;10020:2;10000:18;;;9993:30;-1:-1:-1;;;10054:2:1;10039:18;;10032:40;10104:2;10089:18;;9779:334::o;10118:350::-;10320:2;10302:21;;;10359:2;10339:18;;;10332:30;-1:-1:-1;;;10393:2:1;10378:18;;10371:56;10459:2;10444:18;;10118:350::o;10810:340::-;11012:2;10994:21;;;11051:2;11031:18;;;11024:30;-1:-1:-1;;;11085:2:1;11070:18;;11063:46;11141:2;11126:18;;10810:340::o;12331:::-;12533:2;12515:21;;;12572:2;12552:18;;;12545:30;-1:-1:-1;;;12606:2:1;12591:18;;12584:46;12662:2;12647:18;;12331:340::o;12676:::-;12878:2;12860:21;;;12917:2;12897:18;;;12890:30;-1:-1:-1;;;12951:2:1;12936:18;;12929:46;13007:2;12992:18;;12676:340::o;13021:::-;13223:2;13205:21;;;13262:2;13242:18;;;13235:30;-1:-1:-1;;;13296:2:1;13281:18;;13274:46;13352:2;13337:18;;13021:340::o;13366:475::-;13568:2;13550:21;;;13607:2;13587:18;;;13580:30;-1:-1:-1;;;;;;;;;;;13641:2:1;13626:18;;13619:62;13717:34;13712:2;13697:18;;13690:62;-1:-1:-1;;;13783:3:1;13768:19;;13761:38;13831:3;13816:19;;13366:475::o;14265:339::-;14467:2;14449:21;;;14506:2;14486:18;;;14479:30;-1:-1:-1;;;14540:2:1;14525:18;;14518:45;14595:2;14580:18;;14265:339::o;15362:350::-;15564:2;15546:21;;;15603:2;15583:18;;;15576:30;-1:-1:-1;;;15637:2:1;15622:18;;15615:56;15703:2;15688:18;;15362:350::o;16066:339::-;16268:2;16250:21;;;16307:2;16287:18;;;16280:30;-1:-1:-1;;;16341:2:1;16326:18;;16319:45;16396:2;16381:18;;16066:339::o;16410:340::-;16612:2;16594:21;;;16651:2;16631:18;;;16624:30;-1:-1:-1;;;16685:2:1;16670:18;;16663:46;16741:2;16726:18;;16410:340::o;17096:338::-;17298:2;17280:21;;;17337:2;17317:18;;;17310:30;-1:-1:-1;;;17371:2:1;17356:18;;17349:44;17425:2;17410:18;;17096:338::o;17439:342::-;17641:2;17623:21;;;17680:2;17660:18;;;17653:30;-1:-1:-1;;;17714:2:1;17699:18;;17692:48;17772:2;17757:18;;17439:342::o;17786:415::-;17988:2;17970:21;;;18027:2;18007:18;;;18000:30;18066:34;18061:2;18046:18;;18039:62;-1:-1:-1;;;18132:2:1;18117:18;;18110:49;18191:3;18176:19;;17786:415::o;20009:337::-;20211:2;20193:21;;;20250:2;20230:18;;;20223:30;-1:-1:-1;;;20284:2:1;20269:18;;20262:43;20337:2;20322:18;;20009:337::o;21231:256::-;21413:25;;;21469:2;21454:18;;21447:34;21401:2;21386:18;;21231:256::o;21934:128::-;21974:3;22005:1;22001:6;21998:1;21995:13;21992:39;;;22011:18;;:::i;:::-;-1:-1:-1;22047:9:1;;21934:128::o;22067:120::-;22107:1;22133;22123:35;;22138:18;;:::i;:::-;-1:-1:-1;22172:9:1;;22067:120::o;22192:168::-;22232:7;22298:1;22294;22290:6;22286:14;22283:1;22280:21;22275:1;22268:9;22261:17;22257:45;22254:71;;;22305:18;;:::i;:::-;-1:-1:-1;22345:9:1;;22192:168::o;22365:125::-;22405:4;22433:1;22430;22427:8;22424:34;;;22438:18;;:::i;:::-;-1:-1:-1;22475:9:1;;22365:125::o;22495:258::-;22567:1;22577:113;22591:6;22588:1;22585:13;22577:113;;;22667:11;;;22661:18;22648:11;;;22641:39;22613:2;22606:10;22577:113;;;22708:6;22705:1;22702:13;22699:48;;;-1:-1:-1;;22743:1:1;22725:16;;22718:27;22495:258::o;22758:380::-;22837:1;22833:12;;;;22880;;;22901:61;;22955:4;22947:6;22943:17;22933:27;;22901:61;23008:2;23000:6;22997:14;22977:18;22974:38;22971:161;;;23054:10;23049:3;23045:20;23042:1;23035:31;23089:4;23086:1;23079:15;23117:4;23114:1;23107:15;22971:161;;22758:380;;;:::o;23143:135::-;23182:3;-1:-1:-1;;23203:17:1;;23200:43;;;23223:18;;:::i;:::-;-1:-1:-1;23270:1:1;23259:13;;23143:135::o;23283:112::-;23315:1;23341;23331:35;;23346:18;;:::i;:::-;-1:-1:-1;23380:9:1;;23283:112::o;23400:127::-;23461:10;23456:3;23452:20;23449:1;23442:31;23492:4;23489:1;23482:15;23516:4;23513:1;23506:15;23532:127;23593:10;23588:3;23584:20;23581:1;23574:31;23624:4;23621:1;23614:15;23648:4;23645:1;23638:15;23664:127;23725:10;23720:3;23716:20;23713:1;23706:31;23756:4;23753:1;23746:15;23780:4;23777:1;23770:15;23928:118;24014:5;24007:13;24000:21;23993:5;23990:32;23980:60;;24036:1;24033;24026:12;23980:60;23928:118;:::o

Swarm Source

ipfs://e820958d79af7372991cedfecfc73b17b1b4c78e3732ea480863c5515ad2a90b
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.