Contract 0xF3b653933e32B58c173F3F9A77fc20207D61A589

 

Contract Overview

Balance:
14.700833390580580911 BNB

BNB Value:
$9,670.36 (@ $657.81/BNB)

Token:
Txn Hash
Block
From
To
Value [Txn Fee]
0xd8b03ea75cb95704dd161bed53f3b94609a7e78432927566915459e7d2d2c37972645712021-05-09 8:08:385 hrs 23 mins ago0x851a3f361db0dc42951cabfbb1bea1ff8b56853a IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.00022271
0xe12a045bd05dae15fdac72b02e0fd623b738afded8acee44fde07689b07d88da72562852021-05-09 0:50:4412 hrs 41 mins ago0x7db777ddc5ebc896e0df904cae4a971bbcbebdb5 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.000670275
0xc8483b5165eafce07e8624dc3ebaae71d46a289ce9884eeb194fe4c75fb8189f72479802021-05-08 17:40:3719 hrs 51 mins ago0x5bbcc147127bd540002a9d2af12d9fc58638de28 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.001092255
0x8a885b5bc36153d4e1198763d7139491ca12f77b2e5df9054e5b59b3bf40842572449712021-05-08 14:53:4822 hrs 38 mins ago0x62544c00f6458011796605e8e6e7f799e17b1348 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.000670275
0x5556d5553a720599442a51ece908b0122eb11167aa70b7d99343671117a2188f72414362021-05-08 11:49:231 day 1 hr ago0x5bbcc147127bd540002a9d2af12d9fc58638de28 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890.01576 BNB0.00092375
0xcc7bc1aed05e879d603dcccb340f60cbba82e13e0c9d910d9565f96f034c456d72372972021-05-08 8:20:401 day 5 hrs ago0xcb1a0f26c89fbc1bcb14fe1ee9a2785bae419e81 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.000670275
0x6b4f71313a5b5c64a9585cfce84ced68b8217bcf7977b33eace5558a88421efc72335072021-05-08 5:10:291 day 8 hrs ago0x5d78e7309c3dca81b877f15f85a5a9d67bb5d156 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.000670275
0xfa6442e91570e1cbeff6cd16d2e017ba0ee3e592e4e7121661f85f5c880087e072115552021-05-07 10:22:342 days 3 hrs ago0xdbfc64ff6c4d85f42d8411680ebe90ad06bf3e81 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.001092255
0x5884e5bc103798fbfeb31b6c1c1b10f6b19fed3a4dd5ad5c97948b8907b6642572076772021-05-07 7:08:172 days 6 hrs ago0x851a3f361db0dc42951cabfbb1bea1ff8b56853a IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.000670275
0xcbea63724eda6ece5beedfb3e56267c5969a04dc788f0eb41d1a2915b5621b6272074522021-05-07 6:57:002 days 6 hrs ago0x851a3f361db0dc42951cabfbb1bea1ff8b56853a IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.00042331
0xd532d74a17394ad4165fa424f5b792932c69cd95bc025830b8184611dbb1ad6772070642021-05-07 6:37:362 days 6 hrs ago0x851a3f361db0dc42951cabfbb1bea1ff8b56853a IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.000670275
0x153be8db9fca82e41bcce9df502b65086bb857d279b17f615a384c999f6503c872034952021-05-07 3:36:292 days 9 hrs ago0xce9fa088e9c8c4ae2fea22960a1830ba62560627 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.000670275
0xe706bddd2c107a02bf5c7e8d5d646a4125ec112f0ec8d03c418b47da31309c6772032322021-05-07 3:23:092 days 10 hrs ago0xaee69ed0666a9f92a6747a9f5329a4ff843294a8 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890.00624 BNB0.00062381
0x24f2531b4519a729b9bdebf594223e81551843ca23c6a91e1da9fb403ebfc53a72031232021-05-07 3:17:422 days 10 hrs ago0xaee69ed0666a9f92a6747a9f5329a4ff843294a8 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890.00312 BNB0.00092381
0x046095373f45a8a74472d8e2132ffdba93b78db31e1decdc783c62da6dde6fb072029272021-05-07 3:07:342 days 10 hrs ago0x03731c8f76c8b064795a2721f73f93455084a73d IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.000670275
0xab41508ac68b2d45c71f3653e3636b77410a45d57e3a03b4692bf90d82d6de3f72028872021-05-07 3:05:342 days 10 hrs ago0x03731c8f76c8b064795a2721f73f93455084a73d IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.00041563
0xc8e33ae91cf4d80ec7dc133a2b6725cc19439427ca011e87df8a88d2007743ae72027662021-05-07 2:59:312 days 10 hrs ago0x03731c8f76c8b064795a2721f73f93455084a73d IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.000670275
0xa61651f4f89bdad29136f9d4d9a0e4093474b75214b4e5b9947502ac6b42e5bb71948702021-05-06 20:21:552 days 17 hrs ago0x851a3f361db0dc42951cabfbb1bea1ff8b56853a IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.000729255
0x46911f3c0370035fc5aa267611f1bdc104a3d0a2a113a3466f33f13b1240b08a71943952021-05-06 19:56:212 days 17 hrs ago0x851a3f361db0dc42951cabfbb1bea1ff8b56853a IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.000670275
0x51f1abf334872630ebc507ce7223a01eca271fc3e9a700895b32541738cf53fe71933992021-05-06 19:06:292 days 18 hrs ago0xdbfc64ff6c4d85f42d8411680ebe90ad06bf3e81 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.000670275
0x677bb7576eb05a783d333244255c37776fea04ecf6bb1cd01f259e8265a95d2f71930802021-05-06 18:50:142 days 18 hrs ago0x851a3f361db0dc42951cabfbb1bea1ff8b56853a IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.00022271
0x6533cb993b6afd74d9633b4af964d84f7bebfd47a8da2897b8a76b8ab22886f671921792021-05-06 18:03:362 days 19 hrs ago0x73c371f85246797e4f7f68f7f46b9261eba2f853 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.00020825
0xc7e6113649c4d1c3b3d94e82aa9c7d93a5bcb1b4ca93a96ce1f1c2d0f78c679d71921682021-05-06 18:02:592 days 19 hrs ago0x73c371f85246797e4f7f68f7f46b9261eba2f853 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.00031625
0x1b368921497f556a74c5848cce9c11b916076e8fe6c03fcdf13b6aa92d359b5771919292021-05-06 17:51:012 days 19 hrs ago0x73c371f85246797e4f7f68f7f46b9261eba2f853 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.00020825
0x7d90c75805a95543e9bb29866dab4f1fd81ba1dead64dec7d1a85fb53fa0dc4f71917572021-05-06 17:42:252 days 19 hrs ago0x73c371f85246797e4f7f68f7f46b9261eba2f853 IN  0xf3b653933e32b58c173f3f9a77fc20207d61a5890 BNB0.000670275
[ Download CSV Export 
Latest 24 internal transactions
Parent Txn Hash Block From To Value
0xa48e37002c5c273d0be841ca34bb03be1ab972b48ca28f9fdbc0e44d87ae62cb72640972021-05-09 7:43:515 hrs 48 mins ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x851a3f361db0dc42951cabfbb1bea1ff8b56853a0.000026512900401904 BNB
0x6533cb993b6afd74d9633b4af964d84f7bebfd47a8da2897b8a76b8ab22886f671921792021-05-06 18:03:362 days 19 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x73c371f85246797e4f7f68f7f46b9261eba2f85311.401847684665003958 BNB
0x1b368921497f556a74c5848cce9c11b916076e8fe6c03fcdf13b6aa92d359b5771919292021-05-06 17:51:012 days 19 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x73c371f85246797e4f7f68f7f46b9261eba2f8531.190384053212643649 BNB
0x76b97d5456c5162d7304c74e92af0602b367c379b01808ca465435196820ccee71745612021-05-06 2:48:533 days 10 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890xcb1a0f26c89fbc1bcb14fe1ee9a2785bae419e815.244738819086587091 BNB
0x6d96c9161683fa20647f966dadbe9dddc92af59e6e5ab04e7f6466bd0262bf3171694882021-05-05 22:29:143 days 15 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890xdbfc64ff6c4d85f42d8411680ebe90ad06bf3e8130.979611661925347371 BNB
0x73abc24fefbf73c58b6261250c875509adead884ca5418d59a8c6bf9a05ad12d71680892021-05-05 21:18:273 days 16 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890xd82f5174e03e3352a35a933a11100e6c2607ba1e5.763447441836974011 BNB
0x301656445fea8740fecff54beebd90ac6c2d654002a574896eb5ce89cfee6dbb71678282021-05-05 21:05:243 days 16 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890xd82f5174e03e3352a35a933a11100e6c2607ba1e0.07263824015649135 BNB
0x515f3d6e1d1286fd1ae6acf736fe445689d6324e1546bb586eaf2702a641538071677322021-05-05 21:00:363 days 16 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x03731c8f76c8b064795a2721f73f93455084a73d0.157266930375658597 BNB
0x13943ecf44507b814f17de7ee4afb0539457c03e48c8300ee948b617ddcb423a71668662021-05-05 20:17:173 days 17 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x5f5740d3a6d042484b048809d478a05d306d55284.614816766756078879 BNB
0x9b424fecd4275721ccd3b430d14f48e7c53e715536bccfa2248ef85caec5b5b371665602021-05-05 20:01:423 days 17 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x51dc7c7670cd5df58277a3a3ac051dd28eebcb9b0.980044023265685321 BNB
0x0f525b9affaf4dd22da7b09d16485d2425e69e7ce96689f156d795e8fbe876f171656052021-05-05 19:06:043 days 18 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x4ee32466ccc59e247e0a468f1bf8f646e55bd21c23.792293129218799888 BNB
0xeeacc872cf5d60752cd2d840d805245b18500aaf906a030008c10f33c1afd52570103652021-04-30 8:06:589 days 5 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x51dc7c7670cd5df58277a3a3ac051dd28eebcb9b0.207360838642696029 BNB
0xfe7c4b8528b2fc93e9149cebccb7fb09e42cb24d76d5cbb8a4cd86a4639d0b9b69836252021-04-29 9:35:3610 days 3 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x5357777ddd555a192e1e87b96a93aadcc463d0f82.008324934281763109 BNB
0xc816e69fe0ca75def42dfde89fc1cc5293043e66150870b2bc4829d163c2398a69827632021-04-29 8:52:2510 days 4 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x9e89384f3a38496cbe1408b953ba799afd2dd2f70.000000103317013408 BNB
0xa526a233af1cde515b91b22dc27df9e87c47f6a36a3822b65d09db453df912b569827452021-04-29 8:51:3110 days 4 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x9e89384f3a38496cbe1408b953ba799afd2dd2f70.000133818590440406 BNB
0x4edfd422d39892d1dfd1ad3f81c244d3a47c426b6480622f0051b41a179ef53e69683082021-04-28 20:46:0410 days 16 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890xa4a3b6ee833b473d85281ebfd585c04bdaecb2980.000024642224020041 BNB
0x96b2950dcefa1e65f7cfe2fe6ebf0be0fd1070950dbd395ff26a246c6d9fc4aa69678402021-04-28 20:22:4010 days 17 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890xa4a3b6ee833b473d85281ebfd585c04bdaecb2980.92007208171002509 BNB
0xe57338b7304d0fdfdc4514db95c2096145832630c0d0e91bbff5d209183e2d3568765232021-04-25 15:45:2513 days 21 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x313090a62b4dedcba807b5df8b6b9676db84af600.000082454179025036 BNB
0x2f4efb9e54eb830de05d216492c231926108a88e19c811022b3cae7e77e9c4a268764832021-04-25 15:43:2513 days 21 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x313090a62b4dedcba807b5df8b6b9676db84af600.00030922005667014 BNB
0xf18d0c2678169a879494f0b6effd1bc2fdad6d96cc0adbbb563fc37d0be0264765124012021-04-12 22:07:3126 days 15 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x2afd4ceca8640258926a24957917194fe54b97560.003 BNB
0xae429f8c6e87c6035c306198a11204bebef237c00a0e08066f6060c5dfc8490f65115472021-04-12 21:24:4926 days 16 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x2afd4ceca8640258926a24957917194fe54b97560.003 BNB
0xba4c88f71af2876d916f1a1530a8c1d8106dd60763e0e3ea3fabccc8bf537dc864096442021-04-09 8:19:2930 days 5 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890xcfef60f1b9144ede57bc1f150e86494ca9b860150.000000000023876531 BNB
0x1c90e7dbd20b3b3b7887f91110166eb19e288b3a4009c29e0a15858ba82dc2f563990322021-04-08 23:21:3730 days 14 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x73c371f85246797e4f7f68f7f46b9261eba2f8535.537014358385089808 BNB
0x2af4f99b214d4892fbfa2291e61c1b80fb91036598e97e4d83d3b0a33dc5ce3363196942021-04-06 3:04:5533 days 10 hrs ago 0xf3b653933e32b58c173f3f9a77fc20207d61a5890x51dc7c7670cd5df58277a3a3ac051dd28eebcb9b11.601775407509529376 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Hourglass

Compiler Version
v0.5.15+commit.6a57276f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity ^0.5.15;

/*
:'######::'########:'########::'#######::
'##... ##: ##.....::... ##..::'##.... ##:
 ##:::..:: ##:::::::::: ##:::: ##:::: ##:
 ##::::::: ######:::::: ##:::: ##:::: ##:
 ##::::::: ##...::::::: ##:::: ##:::: ##:
 ##::: ##: ##:::::::::: ##:::: ##:::: ##:
. ######:: ########:::: ##::::. #######::
:......:::........:::::..::::::.......:::

Creator: 773d62b24a9d49e1f990b22e3ef1a9903f44ee809a12d73e660c66c1772c47dd
*/

contract Hourglass {
    /*=================================
    =            MODIFIERS            =
    =================================*/
    // only people with tokens
    modifier onlyBagholders() {
        require(myTokens() > 0);
        _;
    }

    // administrators can:
    // -> change the name of the contract
    // -> change the name of the token
    // -> change the PoS difficulty (How many tokens it costs to hold a masternode, in case it gets crazy high later)
    // they CANNOT:
    // -> take funds
    // -> disable withdrawals
    // -> kill the contract
    // -> change the price of tokens
    modifier onlyAdministrator() {
        address _customerAddress = msg.sender;
        require(administrators[_customerAddress], "This address is not an admin");
        _;
    }

    // ensures that the first tokens in the contract will be equally distributed
    // meaning, no divine dump will be ever possible
    // result: healthy longevity.
    modifier antiEarlyWhale(uint256 _amountOfEthereum) {
        // are we still in the vulnerable phase?
        // if so, enact anti early whale protocol
        if (onlyAmbassadors) {
            address _customerAddress = msg.sender;

            if (
                (totalEthereumBalance() - _amountOfEthereum) <= ambassadorQuota_
            ) {
                require(
                    // is the customer in the ambassador list?
                    ambassadors_[_customerAddress] == true &&
                        // does the customer purchase exceed the max ambassador quota?
                        (ambassadorAccumulatedQuota_[_customerAddress] +
                            _amountOfEthereum) <=
                        ambassadorMaxPurchase_
                );

                // updated the accumulated quota
                ambassadorAccumulatedQuota_[_customerAddress] = SafeMath.add(
                    ambassadorAccumulatedQuota_[_customerAddress],
                    _amountOfEthereum
                );

                // execute
                _;
            } else {
                // in case the trx count drops low, the ambassador phase won't reinitiate
                onlyAmbassadors = false;
                _;
            }
        }

        // execute
        _;
    }

    /*==============================
    =            EVENTS            =
    ==============================*/
    event onTokenPurchase(
        address indexed customerAddress,
        uint256 incomingEthereum,
        uint256 tokensMinted,
        address indexed referredBy
    );

    event onTokenSell(
        address indexed customerAddress,
        uint256 tokensBurned,
        uint256 ethereumEarned
    );

    event onReinvestment(
        address indexed customerAddress,
        uint256 ethereumReinvested,
        uint256 tokensMinted
    );

    event onWithdraw(
        address indexed customerAddress,
        uint256 ethereumWithdrawn
    );

    // ERC20
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 tokens
    );

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    // When a customer sets up AutoReinvestment
    event onAutoReinvestmentEntry(
        address indexed customerAddress,
        uint256 nextExecutionTime,
        uint256 rewardPerInvocation,
        uint24 period,
        uint256 minimumDividendValue
    );

    // When a customer stops AutoReinvestment
    event onAutoReinvestmentStop(address indexed customerAddress);

    /*=====================================
    =            CONFIGURABLES            =
    =====================================*/
    string public name = "Crystal Elephant Token";
    string public symbol = "BCETO";
    uint8 public constant decimals = 18;
    uint8 internal constant dividendFee_ = 10;
    uint256 internal constant tokenPriceInitial_ = 500e9; // unit: wei
    uint256 internal constant tokenPriceIncremental_ = 50e9; // unit: wei
    uint256 internal constant magnitude = 2**64;

    // requirement for earning a referral bonus (defaults at 360 tokens)
    uint256 public stakingRequirement = 30e18;

    // ambassador program
    mapping(address => bool) public ambassadors_;
    uint256 internal constant ambassadorMaxPurchase_ = 20e18; // 20 BNB
    uint256 internal constant ambassadorQuota_ = 400e18; // 400 BNB

    /*================================
    =            DATASETS            =
    ================================*/
    // amount of tokens for each address (scaled number)
    mapping(address => uint256) internal tokenBalanceLedger_;

    // TODO: 
    // amount of tokens bought with their buy timestamp for each address
    struct TimestampedBalance {
        uint256 value;
        uint256 timestamp;
        uint256 valueSold;
    }

    mapping(address => TimestampedBalance[])
        internal tokenTimestampedBalanceLedger_;

    // The start and end index of the unsold timestamped transactions list
    struct Cursor {
        uint256 start;
        uint256 end;
    }

    mapping(address => Cursor) internal tokenTimestampedBalanceCursor;

    // mappings to and from referral address
    mapping(address => bytes32) public referralMapping;
    mapping(bytes32 => address) public referralReverseMapping;

    // The current referral balance
    mapping(address => uint256) public referralBalance_;
    // All time referrals earnings
    mapping(address => uint256) public referralIncome_;

    mapping(address => int256) internal payoutsTo_;
    mapping(address => uint256) internal ambassadorAccumulatedQuota_;
    uint256 internal tokenSupply_ = 0;
    uint256 internal profitPerShare_;

    // administrator list (see above on what they can do)
    mapping(address => bool) public administrators;

    // when this is set to true, only ambassadors can purchase tokens (this prevents a whale premine, it ensures a fairly distributed upper pyramid)
    bool public onlyAmbassadors = true;

    /*=======================================
    =            PUBLIC FUNCTIONS            =
    =======================================*/
    /*
     * -- APPLICATION ENTRY POINTS --
     */
    constructor() public {
        address owner = msg.sender;
        administrators[owner] = true;

        ambassadors_[0x62544c00f6458011796605E8E6E7F799E17b1348] = true;
        ambassadors_[0x5357777ddD555a192E1E87b96a93aAdcC463D0f8] = true;
        ambassadors_[0x23E0a5a85D137CaA2EA380d87a72108DAddE21B2] = true;
        ambassadors_[0xA3a58A3CC2Ed3AC259bE1Fc51626BCF71af04308] = true;
        ambassadors_[0xDBfc64ff6C4d85f42D8411680ebe90aD06bF3E81] = true;
        ambassadors_[0x73c371F85246797e4f7f68F7F46b9261EBa2F853] = true;
        ambassadors_[0x70F0e6094628C34729dF23da941b6850a60c058C] = true;
        ambassadors_[0xD82f5174e03E3352a35a933a11100e6c2607Ba1E] = true;
        ambassadors_[0x51F9cA7E4eae913C19B75bD242D0cA9A524Cf936] = true;
        ambassadors_[0x5F5740D3a6D042484B048809D478A05d306D5528] = true;
        ambassadors_[0x8c67C528a78c3142eEbA7A9FB9966c3141ABFc07] = true;
        ambassadors_[0x03731c8f76C8b064795a2721f73f93455084A73D] = true;
        ambassadors_[0x51dc7C7670CD5df58277a3A3aC051DD28EEbCB9B] = true;
        ambassadors_[0xE8E1FF43c68741B829fD531772541166F96d7A35] = true;
        ambassadors_[0x4ee32466CCC59e247E0A468f1BF8f646E55Bd21c] = true;
        ambassadors_[0x3Ee362b5DB70c2935e718f7711B1CCAC7dbAd081] = true;
        ambassadors_[0xcb1A0F26c89fbC1BCb14fE1Ee9a2785BAE419e81] = true;
    }

    /**
     * Fallback function to handle ethereum that was send straight to the contract
     * Unfortunately we cannot use a referral address this way.
     */
    function() external payable {
        purchaseTokens(msg.sender, msg.value, address(0));
    }

    /**
     * Converts all incoming ethereum to tokens for the caller, and passes down the referral addy (if any)
     */
    function buy(address _referredBy) public payable {
        purchaseTokens(msg.sender, msg.value, _referredBy);
    }

    /**
     * Converts all of caller's dividends to tokens.
     */
    function reinvest(
        bool isAutoReinvestChecked,
        uint24 period,
        uint256 rewardPerInvocation,
        uint256 minimumDividendValue
    ) public {
        _reinvest(msg.sender);

        // Setup Auto Reinvestment
        if (isAutoReinvestChecked) {
            _setupAutoReinvest(
                period,
                rewardPerInvocation,
                msg.sender,
                minimumDividendValue
            );
        }
    }

    /**
     * Alias of sell() and withdraw().
     */
    function exit() public {
        // get token count for caller & sell them all
        address _customerAddress = msg.sender;
        uint256 _tokens = tokenBalanceLedger_[_customerAddress];
        if (_tokens > 0) sell(_tokens);
        withdraw();
    }

    /**
     * Withdraws all of the callers earnings.
     */
    function withdraw() public {
        _withdraw(msg.sender);
    }

    /**
     * Liquifies tokens to ethereum.
     */
    function sell(uint256 _amountOfTokens) public onlyBagholders() {
        // setup data
        address _customerAddress = msg.sender;
        require(_amountOfTokens <= tokenBalanceLedger_[_customerAddress]);
        uint256 _tokens = _amountOfTokens;
        uint256 _ethereum = tokensToEthereum_(_tokens);

        uint256 penalty =
            mulDiv(
                calculateAveragePenaltyAndUpdateLedger(
                    _amountOfTokens,
                    _customerAddress
                ),
                _ethereum,
                100
            );

        uint256 _dividends =
            SafeMath.add(
                penalty,
                SafeMath.div(SafeMath.sub(_ethereum, penalty), dividendFee_)
            );

        uint256 _taxedEthereum = SafeMath.sub(_ethereum, _dividends);

        // burn the sold tokens
        tokenSupply_ = SafeMath.sub(tokenSupply_, _tokens);
        tokenBalanceLedger_[_customerAddress] = SafeMath.sub(
            tokenBalanceLedger_[_customerAddress],
            _tokens
        );

        // update dividends tracker
        int256 _updatedPayouts =
            (int256)(profitPerShare_ * _tokens + (_taxedEthereum * magnitude));
        payoutsTo_[_customerAddress] -= _updatedPayouts;

        if (tokenSupply_ > 0) {
            // update the amount of dividends per token
            profitPerShare_ = SafeMath.add(
                profitPerShare_,
                mulDiv(_dividends, magnitude, tokenSupply_)
            );
        }

        emit onTokenSell(_customerAddress, _tokens, _taxedEthereum);
    }

    /*----------  ADMINISTRATOR ONLY FUNCTIONS  ----------*/
    /**
     * In case the amassador quota is not met, the administrator can manually disable the ambassador phase.
     */
    function disableInitialStage() public onlyAdministrator() {
        onlyAmbassadors = false;
    }

    function setAdministrator(address _identifier, bool _status)
        public
        onlyAdministrator()
    {
        administrators[_identifier] = _status;
    }

    /**
     * Precautionary measures in case we need to adjust the masternode rate.
     */
    function setStakingRequirement(uint256 _amountOfTokens)
        public
        onlyAdministrator()
    {
        stakingRequirement = _amountOfTokens;
    }

    /**
     * If we want to rebrand, we can.
     */
    function setName(string memory _name) public onlyAdministrator() {
        name = _name;
    }

    /**
     * If we want to rebrand, we can.
     */
    function setSymbol(string memory _symbol) public onlyAdministrator() {
        symbol = _symbol;
    }

    /*----------  REFERRAL FUNCTIONS  ----------*/

    function setReferralName(bytes32 ref_name) public returns (bool) {
        referralMapping[msg.sender] = ref_name;
        referralReverseMapping[ref_name] = msg.sender;
        return true;
    }

    function getReferralAddressForName(bytes32 ref_name)
        public
        view
        returns (address)
    {
        return referralReverseMapping[ref_name];
    }

    function getReferralNameForAddress(address ref_address)
        public
        view
        returns (bytes32)
    {
        return referralMapping[ref_address];
    }

    function getReferralBalance() public view returns (uint256, uint256) {
        address _customerAddress = msg.sender;
        return (
            referralBalance_[_customerAddress],
            referralIncome_[_customerAddress]
        );
    }

    /*------READ FUNCTIONS FOR TIMESTAMPED BALANCE LEDGER-------*/

    function getCursor() public view returns (uint256, uint256) {
        address _customerAddress = msg.sender;
        Cursor storage cursor = tokenTimestampedBalanceCursor[_customerAddress];

        return (cursor.start, cursor.end);
    }

    function getTimestampedBalanceLedger(uint256 counter)
        public
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        address _customerAddress = msg.sender;
        TimestampedBalance storage transaction =
            tokenTimestampedBalanceLedger_[_customerAddress][counter];
        return (
            transaction.value,
            transaction.timestamp,
            transaction.valueSold
        );
    }

    /*----------  HELPERS AND CALCULATORS  ----------*/
    /**
     * Method to view the current Ethereum stored in the contract
     * Example: totalEthereumBalance()
     */
    function totalEthereumBalance() public view returns (uint256) {
        return address(this).balance;
    }

    /**
     * Retrieve the total token supply.
     */
    function totalSupply() public view returns (uint256) {
        return tokenSupply_;
    }

    /**
     * Retrieve the tokens owned by the caller.
     */
    function myTokens() public view returns (uint256) {
        address _customerAddress = msg.sender;
        return balanceOf(_customerAddress);
    }

    /**
     * Retrieve the dividends owned by the caller.
     * If `_includeReferralBonus` is true, the referral bonus will be included in the calculations.
     * The reason for this, is that in the frontend, we will want to get the total divs (global + ref)
     * But in the internal calculations, we want them separate.
     */
    function myDividends(bool _includeReferralBonus)
        public
        view
        returns (uint256)
    {
        address _customerAddress = msg.sender;
        return
            _includeReferralBonus
                ? dividendsOf(_customerAddress) +
                    referralBalance_[_customerAddress]
                : dividendsOf(_customerAddress);
    }

    /**
     * Retrieve the token balance of any single address.
     */
    function balanceOf(address _customerAddress) public view returns (uint256) {
        return tokenBalanceLedger_[_customerAddress];
    }

    /**
     * Retrieve the dividend balance of any single address.
     */
    function dividendsOf(address _customerAddress)
        public
        view
        returns (uint256)
    {
        return
            (uint256)(
                (int256)(
                    profitPerShare_ * tokenBalanceLedger_[_customerAddress]
                ) - payoutsTo_[_customerAddress]
            ) / magnitude;
    }

    /**
     * Return the ethereum received on selling 1 individual token.
     * We are not deducting the penalty over here as it's a general sell price
     * the user can use the `calculateEthereumReceived` to get the sell price specific to them
     */
    function sellPrice() public view returns (uint256) {
        if (tokenSupply_ == 0) {
            return tokenPriceInitial_ - tokenPriceIncremental_;
        } else {
            uint256 _ethereum = tokensToEthereum_(1e18);
            uint256 _dividends = SafeMath.div(_ethereum, dividendFee_);
            uint256 _taxedEthereum = SafeMath.sub(_ethereum, _dividends);
            return _taxedEthereum;
        }
    }

    /**
     * Return the ethereum required for buying 1 individual token.
     */
    function buyPrice() public view returns (uint256) {
        if (tokenSupply_ == 0) {
            return tokenPriceInitial_ + tokenPriceIncremental_;
        } else {
            uint256 _ethereum = tokensToEthereum_(1e18);
            uint256 _taxedEthereum =
                mulDiv(_ethereum, dividendFee_, (dividendFee_ - 1));
            return _taxedEthereum;
        }
    }

    /*
     * Function for the frontend to dynamically retrieve the price scaling of buy orders.
     */
    function calculateTokensReceived(uint256 _ethereumToSpend)
        public
        view
        returns (uint256)
    {
        uint256 _dividends = SafeMath.div(_ethereumToSpend, dividendFee_);
        uint256 _taxedEthereum = SafeMath.sub(_ethereumToSpend, _dividends);
        uint256 _amountOfTokens = ethereumToTokens_(_taxedEthereum);
        return _amountOfTokens;
    }

    function calculateTokensReinvested() public view returns (uint256) {
        uint256 _ethereumToSpend = myDividends(true);
        uint256 _dividends = SafeMath.div(_ethereumToSpend, dividendFee_);
        uint256 _taxedEthereum = SafeMath.sub(_ethereumToSpend, _dividends);
        uint256 _amountOfTokens = ethereumToTokens_(_taxedEthereum);
        return _amountOfTokens;
    }

    /**
     * Function for the frontend to dynamically retrieve the price scaling of sell orders.
     */
    function calculateEthereumReceived(uint256 _tokensToSell)
        public
        view
        returns (uint256)
    {
        require(_tokensToSell <= tokenSupply_);
        require(_tokensToSell <= myTokens());
        uint256 _ethereum = tokensToEthereum_(_tokensToSell);
        address _customerAddress = msg.sender;

        uint256 penalty =
            mulDiv(
                calculateAveragePenalty(_tokensToSell, _customerAddress),
                _ethereum,
                100
            );

        uint256 _dividends =
            SafeMath.add(
                penalty,
                SafeMath.div(SafeMath.sub(_ethereum, penalty), dividendFee_)
            );

        uint256 _taxedEthereum = SafeMath.sub(_ethereum, _dividends);
        return _taxedEthereum;
    }

    function calculateEthereumTransferred(uint256 _amountOfTokens)
        public
        view
        returns (uint256)
    {
        require(_amountOfTokens <= tokenSupply_);
        require(_amountOfTokens <= myTokens());
        uint256 _tokenFee = SafeMath.div(_amountOfTokens, dividendFee_);
        uint256 _taxedTokens = SafeMath.sub(_amountOfTokens, _tokenFee);
        return _taxedTokens;
    }

    /**
     * Calculate the early exit penalty for selling x tokens
     */
    function calculateAveragePenalty(
        uint256 _amountOfTokens,
        address _customerAddress
    ) public view onlyBagholders() returns (uint256) {
        require(_amountOfTokens <= tokenBalanceLedger_[_customerAddress]);

        uint256 tokensFound = 0;
        Cursor storage _customerCursor =
            tokenTimestampedBalanceCursor[_customerAddress];
        uint256 counter = _customerCursor.start;
        uint256 averagePenalty = 0;

        while (counter <= _customerCursor.end) {
            TimestampedBalance storage transaction =
                tokenTimestampedBalanceLedger_[_customerAddress][counter];
            uint256 tokensAvailable =
                SafeMath.sub(transaction.value, transaction.valueSold);

            uint256 tokensRequired = SafeMath.sub(_amountOfTokens, tokensFound);

            if (tokensAvailable < tokensRequired) {
                tokensFound += tokensAvailable;
                averagePenalty = SafeMath.add(
                    averagePenalty,
                    SafeMath.mul(
                        _calculatePenalty(transaction.timestamp),
                        tokensAvailable
                    )
                );
            } else if (tokensAvailable <= tokensRequired) {
                averagePenalty = SafeMath.add(
                    averagePenalty,
                    SafeMath.mul(
                        _calculatePenalty(transaction.timestamp),
                        tokensRequired
                    )
                );
                break;
            } else {
                averagePenalty = SafeMath.add(
                    averagePenalty,
                    SafeMath.mul(
                        _calculatePenalty(transaction.timestamp),
                        tokensRequired
                    )
                );
                break;
            }

            counter = SafeMath.add(counter, 1);
        }
        return SafeMath.div(averagePenalty, _amountOfTokens);
    }

    /**
     * Calculate the early exit penalty for selling after x days
     */
    function _calculatePenalty(uint256 timestamp)
        public
        view
        returns (uint256)
    {
        uint256 gap = block.timestamp - timestamp;

        if (gap > 30 days) {
            return 0;
        } else if (gap > 20 days) {
            return 25;
        } else if (gap > 10 days) {
            return 50;
        }
        return 75;
    }

    /**
     * Calculate Token price based on an amount of incoming ethereum
     * Some conversions occurred to prevent decimal errors or underflows / overflows in solidity code.
     */
    function ethereumToTokens_(uint256 _ethereum)
        public
        view
        returns (uint256)
    {
        uint256 _tokenPriceInitial = tokenPriceInitial_ * 1e18;
        uint256 _tokensReceived =
            ((
                SafeMath.sub(
                    (
                        sqrt(
                            (_tokenPriceInitial**2) +
                                (2 *
                                    (tokenPriceIncremental_ * 1e18) *
                                    (_ethereum * 1e18)) +
                                (((tokenPriceIncremental_)**2) *
                                    (tokenSupply_**2)) +
                                (2 *
                                    (tokenPriceIncremental_) *
                                    _tokenPriceInitial *
                                    tokenSupply_)
                        )
                    ),
                    _tokenPriceInitial
                )
            ) / (tokenPriceIncremental_)) - (tokenSupply_);

        return _tokensReceived;
    }

    /**
     * Calculate token sell value.
     * Some conversions occurred to prevent decimal errors or underflows / overflows in solidity code.
     */
    function tokensToEthereum_(uint256 _tokens) public view returns (uint256) {
        uint256 tokens_ = (_tokens + 1e18);
        uint256 _tokenSupply = (tokenSupply_ + 1e18);
        uint256 _ethereumReceived =
            (SafeMath.sub(
                (((tokenPriceInitial_ +
                    (tokenPriceIncremental_ * (_tokenSupply / 1e18))) -
                    tokenPriceIncremental_) * (tokens_ - 1e18)),
                (tokenPriceIncremental_ * ((tokens_**2 - tokens_) / 1e18)) / 2
            ) / 1e18);

        return _ethereumReceived;
    }

    /*==========================================
    =            INTERNAL FUNCTIONS            =
    ==========================================*/
    function purchaseTokens(
        address _customerAddress,
        uint256 _incomingEthereum,
        address _referredBy
    ) internal antiEarlyWhale(_incomingEthereum) returns (uint256) {
        // data setup
        uint256 _undividedDividends =
            SafeMath.div(_incomingEthereum, dividendFee_);
        uint256 _referralBonus = SafeMath.div(_undividedDividends, 3);
        uint256 _dividends = SafeMath.sub(_undividedDividends, _referralBonus);
        uint256 _taxedEthereum =
            SafeMath.sub(_incomingEthereum, _undividedDividends);
        uint256 _amountOfTokens = ethereumToTokens_(_taxedEthereum);
        uint256 _fee = _dividends * magnitude;

        require(
            _amountOfTokens > 0 &&
                SafeMath.add(_amountOfTokens, tokenSupply_) > tokenSupply_
        );

        // is the user referred by a masternode?
        if (
            _referredBy != address(0) &&
            _referredBy != _customerAddress &&
            tokenBalanceLedger_[_referredBy] >= stakingRequirement
        ) {
            // wealth redistribution
            referralBalance_[_referredBy] = SafeMath.add(
                referralBalance_[_referredBy],
                _referralBonus
            );
            referralIncome_[_referredBy] = SafeMath.add(
                referralIncome_[_referredBy],
                _referralBonus
            );
        } else {
            // no ref purchase
            // add the referral bonus back to the global dividends cake
            _dividends = SafeMath.add(_dividends, _referralBonus);
            _fee = _dividends * magnitude;
        }

        if (tokenSupply_ > 0) {
            // add tokens to the pool
            tokenSupply_ = SafeMath.add(tokenSupply_, _amountOfTokens);

            // take the amount of dividends gained through this transaction, and allocates them evenly to each shareholder
            profitPerShare_ += ((_dividends * magnitude) / (tokenSupply_));

            // calculate the amount of tokens the customer receives over his purchase
            _fee =
                _fee -
                (_fee -
                    (_amountOfTokens *
                        ((_dividends * magnitude) / (tokenSupply_))));
        } else {
            // add tokens to the pool
            tokenSupply_ = _amountOfTokens;
        }

        // update circulating supply & the ledger address for the customer
        tokenBalanceLedger_[_customerAddress] = SafeMath.add(
            tokenBalanceLedger_[_customerAddress],
            _amountOfTokens
        );
        tokenTimestampedBalanceLedger_[_customerAddress].push(
            TimestampedBalance(_amountOfTokens, block.timestamp, 0)
        );
        tokenTimestampedBalanceCursor[_customerAddress].end += 1;

        // You don't get dividends for the tokens before they owned them
        int256 _updatedPayouts =
            (int256)(profitPerShare_ * _amountOfTokens - _fee);
        payoutsTo_[_customerAddress] += _updatedPayouts;

        // fire event
        emit onTokenPurchase(
            _customerAddress,
            _incomingEthereum,
            _amountOfTokens,
            _referredBy
        );

        emit Transfer(
            address(0),
            _customerAddress,
            _amountOfTokens
        );

        return _amountOfTokens;
    }

    function _reinvest(address _customerAddress) internal {
        uint256 _dividends = dividendsOf(_customerAddress);

        // onlyStronghands
        require(_dividends + referralBalance_[_customerAddress] > 0);

        payoutsTo_[_customerAddress] += (int256)(_dividends * magnitude);

        // retrieve ref. bonus
        _dividends += referralBalance_[_customerAddress];
        referralBalance_[_customerAddress] = 0;

        // dispatch a buy order with the virtualized "withdrawn dividends"
        uint256 _tokens =
            purchaseTokens(_customerAddress, _dividends, address(0));

        // fire event
        emit onReinvestment(_customerAddress, _dividends, _tokens);
    }

    function _withdraw(address _customerAddress) internal {
        uint256 _dividends = dividendsOf(_customerAddress); // get ref. bonus later in the code

        // onlyStronghands
        require(_dividends + referralBalance_[_customerAddress] > 0);

        // update dividend tracker
        payoutsTo_[_customerAddress] += (int256)(_dividends * magnitude);

        // add ref. bonus
        _dividends += referralBalance_[_customerAddress];
        referralBalance_[_customerAddress] = 0;

        address payable _payableCustomerAddress =
            address(uint160(_customerAddress));
        _payableCustomerAddress.transfer(_dividends);

        // fire event
        emit onWithdraw(_customerAddress, _dividends);
    }

    /**
     * Update ledger after transferring x tokens
     */
    function _updateLedgerForTransfer(
        uint256 _amountOfTokens,
        address _customerAddress
    ) internal {
        // Parse through the list of transactions
        uint256 tokensFound = 0;
        Cursor storage _customerCursor =
            tokenTimestampedBalanceCursor[_customerAddress];
        uint256 counter = _customerCursor.start;

        while (counter <= _customerCursor.end) {
            TimestampedBalance storage transaction =
                tokenTimestampedBalanceLedger_[_customerAddress][counter];
            uint256 tokensAvailable =
                SafeMath.sub(transaction.value, transaction.valueSold);

            uint256 tokensRequired = SafeMath.sub(_amountOfTokens, tokensFound);

            if (tokensAvailable < tokensRequired) {
                tokensFound += tokensAvailable;

                delete tokenTimestampedBalanceLedger_[_customerAddress][
                    counter
                ];
            } else if (tokensAvailable <= tokensRequired) {
                delete tokenTimestampedBalanceLedger_[_customerAddress][
                    counter
                ];
                _customerCursor.start = counter + 1;
                break;
            } else {
                transaction.valueSold += tokensRequired;
                _customerCursor.start = counter;
                break;
            }
            counter += 1;
        }
    }

    /**
     * Calculate the early exit penalty for selling x tokens and edit the timestamped ledger
     */
    function calculateAveragePenaltyAndUpdateLedger(
        uint256 _amountOfTokens,
        address _customerAddress
    ) internal onlyBagholders() returns (uint256) {
        // Parse through the list of transactions
        uint256 tokensFound = 0;
        Cursor storage _customerCursor =
            tokenTimestampedBalanceCursor[_customerAddress];
        uint256 counter = _customerCursor.start;
        uint256 averagePenalty = 0;

        while (counter <= _customerCursor.end) {
            TimestampedBalance storage transaction =
                tokenTimestampedBalanceLedger_[_customerAddress][counter];
            uint256 tokensAvailable =
                SafeMath.sub(transaction.value, transaction.valueSold);

            uint256 tokensRequired = SafeMath.sub(_amountOfTokens, tokensFound);

            if (tokensAvailable < tokensRequired) {
                tokensFound += tokensAvailable;
                averagePenalty = SafeMath.add(
                    averagePenalty,
                    SafeMath.mul(
                        _calculatePenalty(transaction.timestamp),
                        tokensAvailable
                    )
                );
                delete tokenTimestampedBalanceLedger_[_customerAddress][
                    counter
                ];
            } else if (tokensAvailable <= tokensRequired) {
                averagePenalty = SafeMath.add(
                    averagePenalty,
                    SafeMath.mul(
                        _calculatePenalty(transaction.timestamp),
                        tokensRequired
                    )
                );
                delete tokenTimestampedBalanceLedger_[_customerAddress][
                    counter
                ];
                _customerCursor.start = counter + 1;
                break;
            } else {
                averagePenalty = SafeMath.add(
                    averagePenalty,
                    SafeMath.mul(
                        _calculatePenalty(transaction.timestamp),
                        tokensRequired
                    )
                );
                transaction.valueSold += tokensRequired;
                _customerCursor.start = counter;
                break;
            }

            counter += 1;
        }

        return SafeMath.div(averagePenalty, _amountOfTokens);
    }

    function sqrt(uint256 x) internal pure returns (uint256 y) {
        uint256 z = (x + 1) / 2;
        y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
    }

    /**
     * @dev calculates x*y and outputs a emulated 512bit number as l being the lower 256bit half and h the upper 256bit half.
     */
    function fullMul(uint256 x, uint256 y)
        public
        pure
        returns (uint256 l, uint256 h)
    {
        uint256 mm = mulmod(x, y, uint256(-1));
        l = x * y;
        h = mm - l;
        if (mm < l) h -= 1;
    }

    /**
     * @dev calculates x*y/z taking care of phantom overflows.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 z
    ) public pure returns (uint256) {
        (uint256 l, uint256 h) = fullMul(x, y);
        require(h < z);
        uint256 mm = mulmod(x, y, z);
        if (mm > l) h -= 1;
        l -= mm;
        uint256 pow2 = z & -z;
        z /= pow2;
        l /= pow2;
        l += h * ((-pow2) / pow2 + 1);
        uint256 r = 1;
        r *= 2 - z * r;
        r *= 2 - z * r;
        r *= 2 - z * r;
        r *= 2 - z * r;
        r *= 2 - z * r;
        r *= 2 - z * r;
        r *= 2 - z * r;
        r *= 2 - z * r;
        return l * r;
    }

    /*
     * =========================
     * Auto Reinvestment Feature
     * =========================
     */

    // uint256 recommendedRewardPerInvocation = 5000000; // 5 TRX

    struct AutoReinvestEntry {
        uint256 nextExecutionTime;
        uint256 rewardPerInvocation;
        uint256 minimumDividendValue;
        uint24 period;
    }

    mapping(address => AutoReinvestEntry) internal autoReinvestment;

    function setupAutoReinvest(
        uint24 period,
        uint256 rewardPerInvocation,
        uint256 minimumDividendValue
    ) public {
        _setupAutoReinvest(
            period,
            rewardPerInvocation,
            msg.sender,
            minimumDividendValue
        );
    }

    function _setupAutoReinvest(
        uint24 period,
        uint256 rewardPerInvocation,
        address customerAddress,
        uint256 minimumDividendValue
    ) internal {
        autoReinvestment[customerAddress] = AutoReinvestEntry(
            block.timestamp + period,
            rewardPerInvocation,
            minimumDividendValue,
            period
        );

        // Launch an event that this entry has been created
        emit onAutoReinvestmentEntry(
            customerAddress,
            autoReinvestment[customerAddress].nextExecutionTime,
            rewardPerInvocation,
            period,
            minimumDividendValue
        );
    }

    // Anyone can call this function and claim the reward
    function invokeAutoReinvest(address _customerAddress)
        external
        returns (uint256)
    {
        AutoReinvestEntry storage entry = autoReinvestment[_customerAddress];

        if (
            entry.nextExecutionTime > 0 &&
            block.timestamp >= entry.nextExecutionTime
        ) {
            // fetch dividends
            uint256 _dividends = dividendsOf(_customerAddress);

            // Only execute if the user's dividends are more that the
            // rewardPerInvocation and the minimumDividendValue
            if (
                _dividends > entry.minimumDividendValue &&
                _dividends > entry.rewardPerInvocation
            ) {
                // Deduct the reward from the users dividends
                payoutsTo_[_customerAddress] += (int256)(
                    entry.rewardPerInvocation * magnitude
                );

                // Update the Auto Reinvestment entry
                entry.nextExecutionTime +=
                    (((block.timestamp - entry.nextExecutionTime) /
                        uint256(entry.period)) + 1) *
                    uint256(entry.period);

                /*
                 * Do the reinvestment
                 */
                _reinvest(_customerAddress);

                // Send the caller their reward
                msg.sender.transfer(entry.rewardPerInvocation);
            }
        }

        return entry.nextExecutionTime;
    }

    // Read function for the frontend to determine if the user has setup Auto Reinvestment or not
    function getAutoReinvestEntry()
        public
        view
        returns (
            uint256,
            uint256,
            uint24,
            uint256
        )
    {
        address _customerAddress = msg.sender;
        AutoReinvestEntry storage _autoReinvestEntry =
            autoReinvestment[_customerAddress];
        return (
            _autoReinvestEntry.nextExecutionTime,
            _autoReinvestEntry.rewardPerInvocation,
            _autoReinvestEntry.period,
            _autoReinvestEntry.minimumDividendValue
        );
    }

    // Read function for the scheduling workers determine if the user has setup Auto Reinvestment or not
    function getAutoReinvestEntryOf(address _customerAddress)
        public
        view
        returns (
            uint256,
            uint256,
            uint24,
            uint256
        )
    {
        AutoReinvestEntry storage _autoReinvestEntry =
            autoReinvestment[_customerAddress];
        return (
            _autoReinvestEntry.nextExecutionTime,
            _autoReinvestEntry.rewardPerInvocation,
            _autoReinvestEntry.period,
            _autoReinvestEntry.minimumDividendValue
        );
    }

    // The user can stop the autoReinvestment whenever they want
    function stopAutoReinvest() external {
        address customerAddress = msg.sender;
        if (autoReinvestment[customerAddress].nextExecutionTime > 0) {
            delete autoReinvestment[customerAddress];

            // Launch an event that this entry has been deleted
            emit onAutoReinvestmentStop(customerAddress);
        }
    }

    // Allowance, Approval and Transfer From

    mapping(address => mapping(address => uint256)) private _allowances;

    function allowance(address owner, address spender)
        public
        view
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public returns (bool) {
        uint256 final_amount =
            SafeMath.sub(_allowances[sender][msg.sender], amount);

        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, final_amount);
        return true;
    }

    function transfer(address _toAddress, uint256 _amountOfTokens)
        public
        onlyBagholders
        returns (bool)
    {
        _transfer(msg.sender, _toAddress, _amountOfTokens);
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient` after liquifying 10% of the tokens `amount` as dividens.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `_customerAddress` cannot be the zero address.
     * - `_toAddress` cannot be the zero address.
     * - `_customerAddress` must have a balance of at least `_amountOfTokens`.
     */
    function _transfer(
        address _customerAddress,
        address _toAddress,
        uint256 _amountOfTokens
    ) internal {
        require(
            _customerAddress != address(0),
            "ERC20: transfer from the zero address"
        );
        require(
            _toAddress != address(0),
            "ERC20: transfer to the zero address"
        );

        // also disables transfers until ambassador phase is over
        // ( we dont want whale premines )
        // make sure we have the requested tokens
        require(
            !onlyAmbassadors &&
                _amountOfTokens <= tokenBalanceLedger_[_customerAddress]
        );

        // withdraw all outstanding dividends first
        if (
            dividendsOf(_customerAddress) + referralBalance_[_customerAddress] >
            0
        ) {
            _withdraw(_customerAddress);
        }

        // updating tokenTimestampedBalanceLedger_ for _customerAddress
        _updateLedgerForTransfer(_amountOfTokens, _customerAddress);

        // liquify 10% of the remaining tokens that are transfered
        // these are dispersed to shareholders
        uint256 _tokenFee = SafeMath.div(_amountOfTokens, dividendFee_);

        uint256 _taxedTokens = SafeMath.sub(_amountOfTokens, _tokenFee);
        uint256 _dividends = tokensToEthereum_(_tokenFee);

        // burn the fee tokens
        tokenSupply_ = SafeMath.sub(tokenSupply_, _tokenFee);

        // exchange tokens
        tokenBalanceLedger_[_customerAddress] = SafeMath.sub(
            tokenBalanceLedger_[_customerAddress],
            _amountOfTokens
        );
        tokenBalanceLedger_[_toAddress] = SafeMath.add(
            tokenBalanceLedger_[_toAddress],
            _taxedTokens
        );

        // updating tokenTimestampedBalanceLedger_ for _toAddress
        tokenTimestampedBalanceLedger_[_toAddress].push(
            TimestampedBalance(_taxedTokens, block.timestamp, 0)
        );
        tokenTimestampedBalanceCursor[_toAddress].end += 1;

        // update dividend trackers
        payoutsTo_[_customerAddress] -= (int256)(
            profitPerShare_ * _amountOfTokens
        );
        payoutsTo_[_toAddress] += (int256)(profitPerShare_ * _taxedTokens);

        // disperse dividends among holders
        profitPerShare_ = SafeMath.add(
            profitPerShare_,
            mulDiv(_dividends, magnitude, tokenSupply_)
        );

        // fire event
        emit Transfer(_customerAddress, _toAddress, _taxedTokens);
    }

    // Atomically increases the allowance granted to `spender` by the caller.

    function increaseAllowance(address spender, uint256 addedValue)
        public
        returns (bool)
    {
        uint256 final_allowance =
            SafeMath.add(_allowances[msg.sender][spender], addedValue);

        _approve(msg.sender, spender, final_allowance);
        return true;
    }

    //Atomically decreases the allowance granted to `spender` by the caller.
    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        returns (bool)
    {
        uint256 final_allowance =
            SafeMath.sub(_allowances[msg.sender][spender], subtractedValue);

        _approve(msg.sender, spender, final_allowance);
        return true;
    }

    // Sets `amount` as the allowance of `spender` over the `owner`s tokens.
    function _approve(
        address owner,
        address spender,
        uint256 value
    ) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = value;
        emit Approval(owner, spender, value);
    }
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
    /**
     * @dev Multiplies two numbers, throws on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }

    /**
     * @dev Integer division of two numbers, truncating the quotient.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    /**
     * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }

    /**
     * @dev Adds two numbers, throws on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"nextExecutionTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerInvocation","type":"uint256"},{"indexed":false,"internalType":"uint24","name":"period","type":"uint24"},{"indexed":false,"internalType":"uint256","name":"minimumDividendValue","type":"uint256"}],"name":"onAutoReinvestmentEntry","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"}],"name":"onAutoReinvestmentStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethereumReinvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensMinted","type":"uint256"}],"name":"onReinvestment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"incomingEthereum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensMinted","type":"uint256"},{"indexed":true,"internalType":"address","name":"referredBy","type":"address"}],"name":"onTokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensBurned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethereumEarned","type":"uint256"}],"name":"onTokenSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"customerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethereumWithdrawn","type":"uint256"}],"name":"onWithdraw","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"_calculatePenalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"administrators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ambassadors_","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_customerAddress","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_referredBy","type":"address"}],"name":"buy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"buyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"},{"internalType":"address","name":"_customerAddress","type":"address"}],"name":"calculateAveragePenalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokensToSell","type":"uint256"}],"name":"calculateEthereumReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"}],"name":"calculateEthereumTransferred","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_ethereumToSpend","type":"uint256"}],"name":"calculateTokensReceived","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"calculateTokensReinvested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"disableInitialStage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_customerAddress","type":"address"}],"name":"dividendsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_ethereum","type":"uint256"}],"name":"ethereumToTokens_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"fullMul","outputs":[{"internalType":"uint256","name":"l","type":"uint256"},{"internalType":"uint256","name":"h","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getAutoReinvestEntry","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint24","name":"","type":"uint24"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_customerAddress","type":"address"}],"name":"getAutoReinvestEntryOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint24","name":"","type":"uint24"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCursor","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"ref_name","type":"bytes32"}],"name":"getReferralAddressForName","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReferralBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"ref_address","type":"address"}],"name":"getReferralNameForAddress","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"counter","type":"uint256"}],"name":"getTimestampedBalanceLedger","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_customerAddress","type":"address"}],"name":"invokeAutoReinvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"z","type":"uint256"}],"name":"mulDiv","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bool","name":"_includeReferralBonus","type":"bool"}],"name":"myDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"myTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"onlyAmbassadors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralBalance_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralIncome_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralMapping","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"referralReverseMapping","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"isAutoReinvestChecked","type":"bool"},{"internalType":"uint24","name":"period","type":"uint24"},{"internalType":"uint256","name":"rewardPerInvocation","type":"uint256"},{"internalType":"uint256","name":"minimumDividendValue","type":"uint256"}],"name":"reinvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"}],"name":"sell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sellPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_identifier","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAdministrator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"ref_name","type":"bytes32"}],"name":"setReferralName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"}],"name":"setStakingRequirement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"setSymbol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint24","name":"period","type":"uint24"},{"internalType":"uint256","name":"rewardPerInvocation","type":"uint256"},{"internalType":"uint256","name":"minimumDividendValue","type":"uint256"}],"name":"setupAutoReinvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingRequirement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"stopAutoReinvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"tokensToEthereum_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalEthereumBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280601681526020017f4372797374616c20456c657068616e7420546f6b656e0000000000000000000081525060009080519060200190620000519291906200086b565b506040518060400160405280600581526020017f424345544f000000000000000000000000000000000000000000000000000000815250600190805190602001906200009f9291906200086b565b506801a055690d9db800006002556000600d556001601060006101000a81548160ff021916908315150217905550348015620000da57600080fd5b5060003390506001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007362544c00f6458011796605e8e6e7f799e17b134873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000735357777ddd555a192e1e87b96a93aadcc463d0f873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007323e0a5a85d137caa2ea380d87a72108dadde21b273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073a3a58a3cc2ed3ac259be1fc51626bcf71af0430873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073dbfc64ff6c4d85f42d8411680ebe90ad06bf3e8173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007373c371f85246797e4f7f68f7f46b9261eba2f85373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007370f0e6094628c34729df23da941b6850a60c058c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073d82f5174e03e3352a35a933a11100e6c2607ba1e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007351f9ca7e4eae913c19b75bd242d0ca9a524cf93673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000735f5740d3a6d042484b048809d478a05d306d552873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000738c67c528a78c3142eeba7a9fb9966c3141abfc0773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007303731c8f76c8b064795a2721f73f93455084a73d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007351dc7c7670cd5df58277a3a3ac051dd28eebcb9b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073e8e1ff43c68741b829fd531772541166f96d7a3573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000734ee32466ccc59e247e0a468f1bf8f646e55bd21c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000733ee362b5db70c2935e718f7711b1ccac7dbad08173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073cb1a0f26c89fbc1bcb14fe1ee9a2785bae419e8173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506200091a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620008ae57805160ff1916838001178555620008df565b82800160010185558215620008df579182015b82811115620008de578251825591602001919060010190620008c1565b5b509050620008ee9190620008f2565b5090565b6200091791905b8082111562000913576000816000905550600101620008f9565b5090565b90565b615726806200092a6000396000f3fe60806040526004361061036a5760003560e01c80636b2f4632116101c6578063a8e04f34116100f7578063c664f7f111610095578063e9fad8ee1161006f578063e9fad8ee14611586578063ec536a171461159d578063ee7743ca146115e7578063f088d547146116475761036a565b8063c664f7f114611461578063dd62ed3e146114c6578063e4849b321461154b5761036a565b8063b84c8246116100d1578063b84c82461461126b578063bbcb15cc14611333578063bf3b397b1461134a578063c47f0027146113995761036a565b8063a8e04f341461117e578063a9059cbb14611195578063aa9a0912146112085761036a565b80638620410b11610164578063949e8acd1161013e578063949e8acd14610fcc57806395d89b4114610ff7578063a457c2d714611087578063a7c73c3e146110fa5761036a565b80638620410b14610edf57806387c9505814610f0a5780638d12530f14610f675761036a565b806370a08231116101a057806370a0823114610d8757806376be158514610dec5780637ad20cac14610e555780638328b61014610ea45761036a565b80636b2f463214610c925780636d93805814610cbd5780636dc7bed014610d225761036a565b8063380169ea116102a0578063542f76a51161023e5780636122d906116102185780636122d90614610b1357806367a4a3dd14610b7c578063688abbf714610bdc5780636988a3ef14610c2d5761036a565b8063542f76a514610a3c57806356d399e814610a8b5780635db6d1d214610ab65761036a565b80634193d03a1161027a5780634193d03a146108f5578063452cf42d146109645780634b750334146109df5780634c33047114610a0a5761036a565b8063380169ea14610839578063395093511461086b5780633ccfd60b146108de5761036a565b8063229f465d1161030d57806327defa1f116102e757806327defa1f1461070f5780632a2d2b971461073e5780632a9121c7146107b9578063313ce567146108085761036a565b8063229f465d146105d557806323b872dd1461062957806323d114be146106bc5761036a565b80630ad0385a116103495780630ad0385a146104e157806310d0ffdd1461050c57806318160ddd1461055b57806322609373146105865761036a565b806265318b1461037957806306fdde03146103de578063095ea7b31461046e575b6103763334600061168b565b50005b34801561038557600080fd5b506103c86004803603602081101561039c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f9565b6040518082815260200191505060405180910390f35b3480156103ea57600080fd5b506103f3612999565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610433578082015181840152602081019050610418565b50505050905090810190601f1680156104605780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561047a57600080fd5b506104c76004803603604081101561049157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a37565b604051808215151515815260200191505060405180910390f35b3480156104ed57600080fd5b506104f6612a4e565b6040518082815260200191505060405180910390f35b34801561051857600080fd5b506105456004803603602081101561052f57600080fd5b8101908080359060200190929190505050612a94565b6040518082815260200191505060405180910390f35b34801561056757600080fd5b50610570612acd565b6040518082815260200191505060405180910390f35b34801561059257600080fd5b506105bf600480360360208110156105a957600080fd5b8101908080359060200190929190505050612ad7565b6040518082815260200191505060405180910390f35b3480156105e157600080fd5b50610627600480360360608110156105f857600080fd5b81019080803562ffffff1690602001909291908035906020019092919080359060200190929190505050612b66565b005b34801561063557600080fd5b506106a26004803603606081101561064c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b77565b604051808215151515815260200191505060405180910390f35b3480156106c857600080fd5b506106f5600480360360208110156106df57600080fd5b8101908080359060200190929190505050612c24565b604051808215151515815260200191505060405180910390f35b34801561071b57600080fd5b50610724612cc5565b604051808215151515815260200191505060405180910390f35b34801561074a57600080fd5b506107776004803603602081101561076157600080fd5b8101908080359060200190929190505050612cd8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107c557600080fd5b506107f2600480360360208110156107dc57600080fd5b8101908080359060200190929190505050612d15565b6040518082815260200191505060405180910390f35b34801561081457600080fd5b5061081d612da0565b604051808260ff1660ff16815260200191505060405180910390f35b34801561084557600080fd5b5061084e612da5565b604051808381526020018281526020019250505060405180910390f35b34801561087757600080fd5b506108c46004803603604081101561088e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e04565b604051808215151515815260200191505060405180910390f35b3480156108ea57600080fd5b506108f3612ea5565b005b34801561090157600080fd5b5061094e6004803603604081101561091857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612eb0565b6040518082815260200191505060405180910390f35b34801561097057600080fd5b5061099d6004803603602081101561098757600080fd5b81019080803590602001909291905050506130aa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109eb57600080fd5b506109f46130dd565b6040518082815260200191505060405180910390f35b348015610a1657600080fd5b50610a1f61313c565b604051808381526020018281526020019250505060405180910390f35b348015610a4857600080fd5b50610a7560048036036020811015610a5f57600080fd5b81019080803590602001909291905050506131cd565b6040518082815260200191505060405180910390f35b348015610a9757600080fd5b50610aa061321c565b6040518082815260200191505060405180910390f35b348015610ac257600080fd5b50610aef60048036036020811015610ad957600080fd5b8101908080359060200190929190505050613222565b60405180848152602001838152602001828152602001935050505060405180910390f35b348015610b1f57600080fd5b50610b6260048036036020811015610b3657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132a5565b604051808215151515815260200191505060405180910390f35b348015610b8857600080fd5b50610bbf60048036036040811015610b9f57600080fd5b8101908080359060200190929190803590602001909291905050506132c5565b604051808381526020018281526020019250505060405180910390f35b348015610be857600080fd5b50610c1760048036036020811015610bff57600080fd5b81019080803515159060200190929190505050613318565b6040518082815260200191505060405180910390f35b348015610c3957600080fd5b50610c7c60048036036020811015610c5057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613384565b6040518082815260200191505060405180910390f35b348015610c9e57600080fd5b50610ca761339c565b6040518082815260200191505060405180910390f35b348015610cc957600080fd5b50610d0c60048036036020811015610ce057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133a4565b6040518082815260200191505060405180910390f35b348015610d2e57600080fd5b50610d7160048036036020811015610d4557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133bc565b6040518082815260200191505060405180910390f35b348015610d9357600080fd5b50610dd660048036036020811015610daa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613405565b6040518082815260200191505060405180910390f35b348015610df857600080fd5b50610e3b60048036036020811015610e0f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061344e565b604051808215151515815260200191505060405180910390f35b348015610e6157600080fd5b50610e8e60048036036020811015610e7857600080fd5b810190808035906020019092919050505061346e565b6040518082815260200191505060405180910390f35b348015610eb057600080fd5b50610edd60048036036020811015610ec757600080fd5b81019080803590602001909291905050506134c0565b005b348015610eeb57600080fd5b50610ef461358f565b6040518082815260200191505060405180910390f35b348015610f1657600080fd5b50610f6560048036036040811015610f2d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506135e7565b005b348015610f7357600080fd5b50610fb660048036036020811015610f8a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613707565b6040518082815260200191505060405180910390f35b348015610fd857600080fd5b50610fe16138a6565b6040518082815260200191505060405180910390f35b34801561100357600080fd5b5061100c6138bb565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561104c578082015181840152602081019050611031565b50505050905090810190601f1680156110795780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561109357600080fd5b506110e0600480360360408110156110aa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613959565b604051808215151515815260200191505060405180910390f35b34801561110657600080fd5b506111496004803603602081101561111d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139fa565b604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390f35b34801561118a57600080fd5b50611193613a76565b005b3480156111a157600080fd5b506111ee600480360360408110156111b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613b58565b604051808215151515815260200191505060405180910390f35b34801561121457600080fd5b506112556004803603606081101561122b57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050613b82565b6040518082815260200191505060405180910390f35b34801561127757600080fd5b506113316004803603602081101561128e57600080fd5b81019080803590602001906401000000008111156112ab57600080fd5b8201836020820111156112bd57600080fd5b803590602001918460018302840111640100000000831117156112df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613c63565b005b34801561133f57600080fd5b50611348613d42565b005b34801561135657600080fd5b506113836004803603602081101561136d57600080fd5b8101908080359060200190929190505050613e49565b6040518082815260200191505060405180910390f35b3480156113a557600080fd5b5061145f600480360360208110156113bc57600080fd5b81019080803590602001906401000000008111156113d957600080fd5b8201836020820111156113eb57600080fd5b8035906020019184600183028401116401000000008311171561140d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613eed565b005b34801561146d57600080fd5b506114b06004803603602081101561148457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fcc565b6040518082815260200191505060405180910390f35b3480156114d257600080fd5b50611535600480360360408110156114e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fe4565b6040518082815260200191505060405180910390f35b34801561155757600080fd5b506115846004803603602081101561156e57600080fd5b810190808035906020019092919050505061406b565b005b34801561159257600080fd5b5061159b6142c1565b005b3480156115a957600080fd5b506115b2614329565b604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390f35b3480156115f357600080fd5b506116456004803603608081101561160a57600080fd5b81019080803515159060200190929190803562ffffff16906020019092919080359060200190929190803590602001909291905050506143aa565b005b6116896004803603602081101561165d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506143cc565b005b600082601060009054906101000a900460ff16156123575760003390506815af1d78b58c400000826116bb61339c565b0311611d9f5760011515600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514801561176b57506801158e460913d0000082600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540111155b61177457600080fd5b6117bd600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143db565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061181086600a60ff166143f7565b9050600061181f8260036143f7565b9050600061182d8383614410565b9050600061183b8985614410565b9050600061184882612d15565b9050600068010000000000000000840290506000821180156118765750600d5461187483600d546143db565b115b61187f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16141580156118e857508b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614155b80156119355750600254600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b15611a5757611983600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143db565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a0f600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143db565b600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a72565b611a6184866143db565b935068010000000000000000840290505b6000600d541115611ad957611a89600d54836143db565b600d81905550600d5468010000000000000000850281611aa557fe5b04600e60008282540192505081905550600d5468010000000000000000850281611acb57fe5b048202810381039050611ae1565b81600d819055505b611b2a600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143db565b600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508a73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58e86604051808381526020018281526020019250505060405180910390a38c73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a382995050505050505050612355565b6000601060006101000a81548160ff0219169083151502179055506000611dca86600a60ff166143f7565b90506000611dd98260036143f7565b90506000611de78383614410565b90506000611df58985614410565b90506000611e0282612d15565b905060006801000000000000000084029050600082118015611e305750600d54611e2e83600d546143db565b115b611e3957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614158015611ea257508b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614155b8015611eef5750600254600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b1561201157611f3d600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143db565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fc9600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143db565b600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061202c565b61201b84866143db565b935068010000000000000000840290505b6000600d54111561209357612043600d54836143db565b600d81905550600d546801000000000000000085028161205f57fe5b04600e60008282540192505081905550600d546801000000000000000085028161208557fe5b04820281038103905061209b565b81600d819055505b6120e4600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143db565b600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508a73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58e86604051808381526020018281526020019250505060405180910390a38c73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3829950505050505050505b505b600061236785600a60ff166143f7565b905060006123768260036143f7565b905060006123848383614410565b905060006123928885614410565b9050600061239f82612d15565b9050600068010000000000000000840290506000821180156123cd5750600d546123cb83600d546143db565b115b6123d657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415801561243f57508a73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b801561248c5750600254600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b156125ae576124da600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143db565b600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612566600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143db565b600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125c9565b6125b884866143db565b935068010000000000000000840290505b6000600d541115612630576125e0600d54836143db565b600d81905550600d54680100000000000000008502816125fc57fe5b04600e60008282540192505081905550600d546801000000000000000085028161262257fe5b048202810381039050612638565b81600d819055505b612681600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143db565b600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508973ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58d86604051808381526020018281526020019250505060405180910390a38b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a382985050505050505050509392505050565b600068010000000000000000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600e5402038161299157fe5b049050919050565b60008054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a2f5780601f10612a0457610100808354040283529160200191612a2f565b820191906000526020600020905b815481529060010190602001808311612a1257829003601f168201915b505050505081565b6000612a44338484614427565b6001905092915050565b600080612a5b6001613318565b90506000612a6d82600a60ff166143f7565b90506000612a7b8383614410565b90506000612a8882612d15565b90508094505050505090565b600080612aa583600a60ff166143f7565b90506000612ab38483614410565b90506000612ac082612d15565b9050809350505050919050565b6000600d54905090565b6000600d54821115612ae857600080fd5b612af06138a6565b821115612afc57600080fd5b6000612b0783613e49565b905060003390506000612b25612b1d8684612eb0565b846064613b82565b90506000612b4982612b44612b3a8786614410565b600a60ff166143f7565b6143db565b90506000612b578583614410565b90508095505050505050919050565b612b728383338461461e565b505050565b600080612c00601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484614410565b9050612c0d858585614788565b612c18853383614427565b60019150509392505050565b600081600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550336008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b601060009054906101000a900460ff1681565b60006008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080670de0b6b3a764000064746a5288000290506000600d54640ba43b7400612d8b612d85600d5486640ba43b740060020202026002600d540a6002640ba43b74000a02670de0b6b3a76400008a02670de0b6b3a7640000640ba43b740002600202026002890a010101614ce4565b85614410565b81612d9257fe5b040390508092505050919050565b601281565b60008060003390506000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101549350935050509091565b600080612e8d601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846143db565b9050612e9a338583614427565b600191505092915050565b612eae33614d29565b565b600080612ebb6138a6565b11612ec557600080fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054831115612f1157600080fd5b60008090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008090505b82600101548211613094576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110612fbf57fe5b906000526020600020906003020190506000612fe382600001548360020154614410565b90506000612ff18a88614410565b90508082101561302657818701965061301f8461301a613014866001015461346e565b85614f04565b6143db565b935061307f565b8082116130565761304c84613047613041866001015461346e565b84614f04565b6143db565b9350505050613094565b6130758461307061306a866001015461346e565b84614f04565b6143db565b9350505050613094565b61308a8560016143db565b9450505050612f68565b61309e81886143f7565b94505050505092915050565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600d5414156130fd57640ba43b740064746a528800039050613139565b6000613110670de0b6b3a7640000613e49565b9050600061312282600a60ff166143f7565b905060006131308383614410565b90508093505050505b90565b6000806000339050600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492509250509091565b6000600d548211156131de57600080fd5b6131e66138a6565b8211156131f257600080fd5b600061320283600a60ff166143f7565b905060006132108483614410565b90508092505050919050565b60025481565b6000806000803390506000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020868154811061327757fe5b9060005260206000209060030201905080600001548160010154826002015494509450945050509193909250565b60036020528060005260406000206000915054906101000a900460ff1681565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff806132f257fe5b84860990508385029250828103915082811015613310576001820391505b509250929050565b600080339050826133315761332c816128f9565b61337c565b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461337a826128f9565b015b915050919050565b60076020528060005260406000206000915090505481565b600047905090565b600a6020528060005260406000206000915090505481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600080824203905062278d0081111561348b5760009150506134bb565b621a5e008111156134a05760199150506134bb565b620d2f008111156134b55760329150506134bb565b604b9150505b919050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b816002819055505050565b600080600d5414156135af57640ba43b740064746a5288000190506135e4565b60006135c2670de0b6b3a7640000613e49565b905060006135dc82600a60ff166001600a0360ff16613b82565b905080925050505b90565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166136ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b81600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154118015613763575080600001544210155b15613899576000613773846128f9565b905081600201548111801561378b5750816001015481115b156138975768010000000000000000826001015402600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508160030160009054906101000a900462ffffff1662ffffff1660018360030160009054906101000a900462ffffff1662ffffff16846000015442038161382e57fe5b040102826000016000828254019250508190555061384b84614f3b565b3373ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f19350505050158015613895573d6000803e3d6000fd5b505b505b8060000154915050919050565b6000803390506138b581613405565b91505090565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156139515780601f1061392657610100808354040283529160200191613951565b820191906000526020600020905b81548152906001019060200180831161393457829003601f168201915b505050505081565b6000806139e2601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484614410565b90506139ef338583614427565b600191505092915050565b6000806000806000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260030160009054906101000a900462ffffff1683600201549450945094509450509193509193565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613b3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b6000601060006101000a81548160ff02191690831515021790555050565b600080613b636138a6565b11613b6d57600080fd5b613b78338484614788565b6001905092915050565b6000806000613b9186866132c5565b91509150838110613ba157600080fd5b60008480613bab57fe5b868809905082811115613bbf576001820391505b808303925060008560000386169050808681613bd757fe5b049550808481613be357fe5b0493506001818260000381613bf457fe5b04018302840193506000600190508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808502955050505050509392505050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613d27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b8160019080519060200190613d3d9291906155be565b505050565b60003390506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115613e4657601160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160006101000a81549062ffffff021916905550508073ffffffffffffffffffffffffffffffffffffffff167f6214dbd07605045f34f5c5c9a7e8cb3a40ed431c434bf262b1d0a9b485abaebe60405160405180910390a25b50565b600080670de0b6b3a7640000830190506000670de0b6b3a7640000600d540190506000670de0b6b3a7640000613ed8670de0b6b3a76400008503640ba43b7400670de0b6b3a76400008681613e9a57fe5b04640ba43b74000264746a5288000103026002670de0b6b3a7640000876002890a0381613ec357fe5b04640ba43b74000281613ed257fe5b04614410565b81613edf57fe5b049050809350505050919050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b8160009080519060200190613fc79291906155be565b505050565b60096020528060005260406000206000915090505481565b6000601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006140756138a6565b1161407f57600080fd5b6000339050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156140d057600080fd5b600082905060006140e082613e49565b905060006140f96140f186866150e2565b836064613b82565b9050600061411d8261411861410e8686614410565b600a60ff166143f7565b6143db565b9050600061412b8483614410565b9050614139600d5486614410565b600d81905550614188600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205486614410565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600068010000000000000000820286600e540201905080600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506000600d5411156142615761425a600e546142558568010000000000000000600d54613b82565b6143db565b600e819055505b8673ffffffffffffffffffffffffffffffffffffffff167fc4823739c5787d2ca17e404aa47d5569ae71dfb49cbf21b3f6152ed238a311398784604051808381526020018281526020019250505060405180910390a25050505050505050565b60003390506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561431d5761431c8161406b565b5b614325612ea5565b5050565b60008060008060003390506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260030160009054906101000a900462ffffff1683600201549550955095509550505090919293565b6143b333614f3b565b83156143c6576143c58383338461461e565b5b50505050565b6143d733348361168b565b5050565b6000808284019050838110156143ed57fe5b8091505092915050565b60008082848161440357fe5b0490508091505092915050565b60008282111561441c57fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156144ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806156ce6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614533576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806156876022913960400191505060405180910390fd5b80601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b60405180608001604052808562ffffff16420181526020018481526020018281526020018562ffffff16815250601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548162ffffff021916908362ffffff1602179055509050508173ffffffffffffffffffffffffffffffffffffffff167f4bf1c14e646c965eb2b35b7e0d08e65d0044d5d5a1eaf7f80f5f161688c34579601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154858785604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390a250505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561480e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806156a96025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614894576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806156646023913960400191505060405180910390fd5b601060009054906101000a900460ff161580156148f05750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111155b6148f957600080fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614944856128f9565b0111156149555761495483614d29565b5b61495f8184615396565b600061496f82600a60ff166143f7565b9050600061497d8383614410565b9050600061498a83613e49565b9050614998600d5484614410565b600d819055506149e7600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485614410565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614a73600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143db565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555083600e5402600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600e5402600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550614c71600e54614c6c8368010000000000000000600d54613b82565b6143db565b600e819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050565b60008060026001840181614cf457fe5b0490508291505b81811015614d2357809150600281828581614d1257fe5b040181614d1b57fe5b049050614cfb565b50919050565b6000614d34826128f9565b90506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054820111614d8457600080fd5b680100000000000000008102600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054810190506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008290508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015614eb0573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff167fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc836040518082815260200191505060405180910390a2505050565b600080831415614f175760009050614f35565b6000828402905082848281614f2857fe5b0414614f3057fe5b809150505b92915050565b6000614f46826128f9565b90506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054820111614f9657600080fd5b680100000000000000008102600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054810190506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006150858383600061168b565b90508273ffffffffffffffffffffffffffffffffffffffff167fbe339fc14b041c2b0e0f3dd2cd325d0c3668b78378001e53160eab36153264588383604051808381526020018281526020019250505060405180910390a2505050565b6000806150ed6138a6565b116150f757600080fd5b60008090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008090505b82600101548211615380576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106151a557fe5b9060005260206000209060030201905060006151c982600001548360020154614410565b905060006151d78a88614410565b90508082101561527f578187019650615205846152006151fa866001015461346e565b85614f04565b6143db565b9350600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061525157fe5b9060005260206000209060030201600080820160009055600182016000905560028201600090555050615372565b80821161532e576152a5846152a061529a866001015461346e565b84614f04565b6143db565b9350600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106152f157fe5b9060005260206000209060030201600080820160009055600182016000905560028201600090555050600185018660000181905550505050615380565b61534d84615348615342866001015461346e565b84614f04565b6143db565b9350808360020160008282540192505081905550848660000181905550505050615380565b60018501945050505061514e565b61538a81886143f7565b94505050505092915050565b60008090506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490505b816001015481116155b7576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061543f57fe5b90600052602060002090600302019050600061546382600001548360020154614410565b905060006154718887614410565b9050808210156154f8578186019550600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106154ca57fe5b90600052602060002090600302016000808201600090556001820160009055600282016000905550506155a9565b80821161558657600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061554957fe5b90600052602060002090600302016000808201600090556001820160009055600282016000905550506001840185600001819055505050506155b7565b8083600201600082825401925050819055508385600001819055505050506155b7565b6001840193505050506153e8565b5050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106155ff57805160ff191683800117855561562d565b8280016001018555821561562d579182015b8281111561562c578251825591602001919060010190615611565b5b50905061563a919061563e565b5090565b61566091905b8082111561565c576000816000905550600101615644565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a72315820d0df64e0e2e9d044a4789a949b52a67e2d2b32e5586874c682b5117b2348c41664736f6c634300050f0032

Deployed ByteCode Sourcemap

459:44533:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8422:49;8437:10;8449:9;8468:1;8422:14;:49::i;:::-;;459:44533;15934:339;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15934:339:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15934:339:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4272:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4272:45:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4272:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39824:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39824:148:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39824:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17964:387;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17964:387:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17570:386;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17570:386:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17570:386:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14585:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14585:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18469:809;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18469:809:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18469:809:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35187:305;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35187:305:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35187:305:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39980:361;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39980:361:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39980:361:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12574:200;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12574:200:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12574:200:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6602:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6602:34:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12782:173;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12782:173:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12782:173:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22484:1081;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22484:1081:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22484:1081:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4361:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4361:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13472:244;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13472:244:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;43828:306;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43828:306:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43828:306:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9688:67;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9688:67:0;;;:::i;:::-;;19785:2031;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19785:2031:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19785:2031:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5877:57;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5877:57:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5877:57:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16543:429;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16543:429:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13143:251;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13143:251:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;19286:411;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19286:411:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19286:411:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4724:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4724:41:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13724:495;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13724:495:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13724:495:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4801:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4801:44:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4801:44:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33768:241;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33768:241:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33768:241:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;15250:375;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15250:375:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15250:375:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5820:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5820:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5820:50:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14409:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14409:109:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6074:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6074:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6074:50:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12963:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12963:172:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12963:172:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15709:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15709:138:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15709:138:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6397:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6397:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6397:46:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21908:376;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21908:376:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21908:376:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12021:161;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12021:161:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12021:161:0;;;;;;;;;;;;;;;;;:::i;:::-;;17066:388;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17066:388:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11750:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11750:167:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11750:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36257:1490;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36257:1490:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36257:1490:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14751:151;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14751:151:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4324:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4324:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4324:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44220:316;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44220:316:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44220:316:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38539:549;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38539:549:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38539:549:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11642:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11642:100:0;;;:::i;:::-;;40349:223;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40349:223:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40349:223:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34099:640;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34099:640:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34099:640:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12408:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12408:104:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12408:104:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;12408:104:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12408:104:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;12408:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;12408:104:0;;;;;;;;;;;;;;;:::i;:::-;;39162:356;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39162:356:0;;;:::i;:::-;;23731:568;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23731:568:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23731:568:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12247:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12247:96:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12247:96:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;12247:96:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12247:96:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;12247:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;12247:96:0;;;;;;;;;;;;;;;:::i;:::-;;5980:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5980:51:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5980:51:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39650:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39650:166:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39650:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9819:1626;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9819:1626:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9819:1626:0;;;;;;;;;;;;;;;;;:::i;:::-;;9353:262;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9353:262:0;;;:::i;:::-;;37854:571;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37854:571:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8811:476;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8811:476:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;8811:476:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8613:118;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8613:118:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;24457:3424;24641:7;24613:17;1626:15;;;;;;;;;;;1622:1136;;;1658:24;1685:10;1658:37;;4970:6;1760:17;1735:22;:20;:22::i;:::-;:42;1734:64;1712:1035;;1961:4;1927:38;;:12;:30;1940:16;1927:30;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;:302;;;;;4903:5;2160:17;2083:27;:45;2111:16;2083:45;;;;;;;;;;;;;;;;:94;2082:147;;1927:302;1833:415;;;;;;2367:139;2402:27;:45;2430:16;2402:45;;;;;;;;;;;;;;;;2470:17;2367:12;:139::i;:::-;2319:27;:45;2347:16;2319:45;;;;;;;;;;;;;;;:187;;;;24684:27;24727:45;24740:17;4442:2;24727:45;;:12;:45::i;:::-;24684:88;;24783:22;24808:36;24821:19;24842:1;24808:12;:36::i;:::-;24783:61;;24855:18;24876:49;24889:19;24910:14;24876:12;:49::i;:::-;24855:70;;24936:22;24974:52;24987:17;25006:19;24974:12;:52::i;:::-;24936:90;;25037:23;25063:33;25081:14;25063:17;:33::i;:::-;25037:59;;25107:12;4636:5;25122:10;:22;25107:37;;25197:1;25179:15;:19;:98;;;;;25265:12;;25219:43;25232:15;25249:12;;25219;:43::i;:::-;:58;25179:98;25157:131;;;;;;25392:1;25369:25;;:11;:25;;;;:73;;;;;25426:16;25411:31;;:11;:31;;;;25369:73;:144;;;;;25495:18;;25459:19;:32;25479:11;25459:32;;;;;;;;;;;;;;;;:54;;25369:144;25351:767;;;25610:108;25641:16;:29;25658:11;25641:29;;;;;;;;;;;;;;;;25689:14;25610:12;:108::i;:::-;25578:16;:29;25595:11;25578:29;;;;;;;;;;;;;;;:140;;;;25764:107;25795:15;:28;25811:11;25795:28;;;;;;;;;;;;;;;;25842:14;25764:12;:107::i;:::-;25733:15;:28;25749:11;25733:28;;;;;;;;;;;;;;;:138;;;;25351:767;;;26022:40;26035:10;26047:14;26022:12;:40::i;:::-;26009:53;;4636:5;26084:10;:22;26077:29;;25351:767;26149:1;26134:12;;:16;26130:721;;;26221:43;26234:12;;26248:15;26221:12;:43::i;:::-;26206:12;:58;;;;26453:12;;4636:5;26426:10;:22;26425:41;;;;;;26405:15;;:62;;;;;;;;;;;26721:12;;4636:5;26694:10;:22;26693:41;;;;;;26649:15;:86;26620:4;:116;26595:4;:142;26571:166;;26130:721;;;26824:15;26809:12;:30;;;;26130:721;26979:105;27006:19;:37;27026:16;27006:37;;;;;;;;;;;;;;;;27058:15;26979:12;:105::i;:::-;26939:19;:37;26959:16;26939:37;;;;;;;;;;;;;;;:145;;;;27095:30;:48;27126:16;27095:48;;;;;;;;;;;;;;;27163:55;;;;;;;;27182:15;27163:55;;;;27199:15;27163:55;;;;27216:1;27163:55;;;27095:134;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27095:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27295:1;27240:29;:47;27270:16;27240:47;;;;;;;;;;;;;;;:51;;;:56;;;;;;;;;;;27383:22;27466:4;27448:15;27430;;:33;:40;27383:88;;27514:15;27482:10;:28;27493:16;27482:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;27693:11;27570:145;;27600:16;27570:145;;;27631:17;27663:15;27570:145;;;;;;;;;;;;;;;;;;;;;;;;27781:16;27733:105;;27764:1;27733:105;;;27812:15;27733:105;;;;;;;;;;;;;;;;;;27858:15;27851:22;;;;;;;;;1712:1035;;;2706:5;2688:15;;:23;;;;;;;;;;;;;;;;;;24684:27;24727:45;24740:17;4442:2;24727:45;;:12;:45::i;:::-;24684:88;;24783:22;24808:36;24821:19;24842:1;24808:12;:36::i;:::-;24783:61;;24855:18;24876:49;24889:19;24910:14;24876:12;:49::i;:::-;24855:70;;24936:22;24974:52;24987:17;25006:19;24974:12;:52::i;:::-;24936:90;;25037:23;25063:33;25081:14;25063:17;:33::i;:::-;25037:59;;25107:12;4636:5;25122:10;:22;25107:37;;25197:1;25179:15;:19;:98;;;;;25265:12;;25219:43;25232:15;25249:12;;25219;:43::i;:::-;:58;25179:98;25157:131;;;;;;25392:1;25369:25;;:11;:25;;;;:73;;;;;25426:16;25411:31;;:11;:31;;;;25369:73;:144;;;;;25495:18;;25459:19;:32;25479:11;25459:32;;;;;;;;;;;;;;;;:54;;25369:144;25351:767;;;25610:108;25641:16;:29;25658:11;25641:29;;;;;;;;;;;;;;;;25689:14;25610:12;:108::i;:::-;25578:16;:29;25595:11;25578:29;;;;;;;;;;;;;;;:140;;;;25764:107;25795:15;:28;25811:11;25795:28;;;;;;;;;;;;;;;;25842:14;25764:12;:107::i;:::-;25733:15;:28;25749:11;25733:28;;;;;;;;;;;;;;;:138;;;;25351:767;;;26022:40;26035:10;26047:14;26022:12;:40::i;:::-;26009:53;;4636:5;26084:10;:22;26077:29;;25351:767;26149:1;26134:12;;:16;26130:721;;;26221:43;26234:12;;26248:15;26221:12;:43::i;:::-;26206:12;:58;;;;26453:12;;4636:5;26426:10;:22;26425:41;;;;;;26405:15;;:62;;;;;;;;;;;26721:12;;4636:5;26694:10;:22;26693:41;;;;;;26649:15;:86;26620:4;:116;26595:4;:142;26571:166;;26130:721;;;26824:15;26809:12;:30;;;;26130:721;26979:105;27006:19;:37;27026:16;27006:37;;;;;;;;;;;;;;;;27058:15;26979:12;:105::i;:::-;26939:19;:37;26959:16;26939:37;;;;;;;;;;;;;;;:145;;;;27095:30;:48;27126:16;27095:48;;;;;;;;;;;;;;;27163:55;;;;;;;;27182:15;27163:55;;;;27199:15;27163:55;;;;27216:1;27163:55;;;27095:134;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27095:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27295:1;27240:29;:47;27270:16;27240:47;;;;;;;;;;;;;;;:51;;;:56;;;;;;;;;;;27383:22;27466:4;27448:15;27430;;:33;:40;27383:88;;27514:15;27482:10;:28;27493:16;27482:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;27693:11;27570:145;;27600:16;27570:145;;;27631:17;27663:15;27570:145;;;;;;;;;;;;;;;;;;;;;;;;27781:16;27733:105;;27764:1;27733:105;;;27812:15;27733:105;;;;;;;;;;;;;;;;;;27858:15;27851:22;;;;;;;;;1712:1035;1622:1136;;24684:27;24727:45;24740:17;4442:2;24727:45;;:12;:45::i;:::-;24684:88;;24783:22;24808:36;24821:19;24842:1;24808:12;:36::i;:::-;24783:61;;24855:18;24876:49;24889:19;24910:14;24876:12;:49::i;:::-;24855:70;;24936:22;24974:52;24987:17;25006:19;24974:12;:52::i;:::-;24936:90;;25037:23;25063:33;25081:14;25063:17;:33::i;:::-;25037:59;;25107:12;4636:5;25122:10;:22;25107:37;;25197:1;25179:15;:19;:98;;;;;25265:12;;25219:43;25232:15;25249:12;;25219;:43::i;:::-;:58;25179:98;25157:131;;;;;;25392:1;25369:25;;:11;:25;;;;:73;;;;;25426:16;25411:31;;:11;:31;;;;25369:73;:144;;;;;25495:18;;25459:19;:32;25479:11;25459:32;;;;;;;;;;;;;;;;:54;;25369:144;25351:767;;;25610:108;25641:16;:29;25658:11;25641:29;;;;;;;;;;;;;;;;25689:14;25610:12;:108::i;:::-;25578:16;:29;25595:11;25578:29;;;;;;;;;;;;;;;:140;;;;25764:107;25795:15;:28;25811:11;25795:28;;;;;;;;;;;;;;;;25842:14;25764:12;:107::i;:::-;25733:15;:28;25749:11;25733:28;;;;;;;;;;;;;;;:138;;;;25351:767;;;26022:40;26035:10;26047:14;26022:12;:40::i;:::-;26009:53;;4636:5;26084:10;:22;26077:29;;25351:767;26149:1;26134:12;;:16;26130:721;;;26221:43;26234:12;;26248:15;26221:12;:43::i;:::-;26206:12;:58;;;;26453:12;;4636:5;26426:10;:22;26425:41;;;;;;26405:15;;:62;;;;;;;;;;;26721:12;;4636:5;26694:10;:22;26693:41;;;;;;26649:15;:86;26620:4;:116;26595:4;:142;26571:166;;26130:721;;;26824:15;26809:12;:30;;;;26130:721;26979:105;27006:19;:37;27026:16;27006:37;;;;;;;;;;;;;;;;27058:15;26979:12;:105::i;:::-;26939:19;:37;26959:16;26939:37;;;;;;;;;;;;;;;:145;;;;27095:30;:48;27126:16;27095:48;;;;;;;;;;;;;;;27163:55;;;;;;;;27182:15;27163:55;;;;27199:15;27163:55;;;;27216:1;27163:55;;;27095:134;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27095:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27295:1;27240:29;:47;27270:16;27240:47;;;;;;;;;;;;;;;:51;;;:56;;;;;;;;;;;27383:22;27466:4;27448:15;27430;;:33;:40;27383:88;;27514:15;27482:10;:28;27493:16;27482:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;27693:11;27570:145;;27600:16;27570:145;;;27631:17;27663:15;27570:145;;;;;;;;;;;;;;;;;;;;;;;;27781:16;27733:105;;27764:1;27733:105;;;27812:15;27733:105;;;;;;;;;;;;;;;;;;27858:15;27851:22;;;;;;;;;24457:3424;;;;;;:::o;15934:339::-;16029:7;4636:5;16210:10;:28;16221:16;16210:28;;;;;;;;;;;;;;;;16151:19;:37;16171:16;16151:37;;;;;;;;;;;;;;;;16133:15;;:55;16102:136;16074:191;;;;;;16054:211;;15934:339;;;:::o;4272:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39824:148::-;39889:4;39906:36;39915:10;39927:7;39936:5;39906:8;:36::i;:::-;39960:4;39953:11;;39824:148;;;;:::o;17964:387::-;18022:7;18042:24;18069:17;18081:4;18069:11;:17::i;:::-;18042:44;;18097:18;18118:44;18131:16;4442:2;18118:44;;:12;:44::i;:::-;18097:65;;18173:22;18198:42;18211:16;18229:10;18198:12;:42::i;:::-;18173:67;;18251:23;18277:33;18295:14;18277:17;:33::i;:::-;18251:59;;18328:15;18321:22;;;;;;17964:387;:::o;17570:386::-;17677:7;17702:18;17723:44;17736:16;4442:2;17723:44;;:12;:44::i;:::-;17702:65;;17778:22;17803:42;17816:16;17834:10;17803:12;:42::i;:::-;17778:67;;17856:23;17882:33;17900:14;17882:17;:33::i;:::-;17856:59;;17933:15;17926:22;;;;;17570:386;;;:::o;14585:91::-;14629:7;14656:12;;14649:19;;14585:91;:::o;18469:809::-;18575:7;18625:12;;18608:13;:29;;18600:38;;;;;;18674:10;:8;:10::i;:::-;18657:13;:27;;18649:36;;;;;;18696:17;18716:32;18734:13;18716:17;:32::i;:::-;18696:52;;18759:24;18786:10;18759:37;;18809:15;18840:146;18865:56;18889:13;18904:16;18865:23;:56::i;:::-;18940:9;18968:3;18840:6;:146::i;:::-;18809:177;;18999:18;19033:132;19064:7;19090:60;19103:32;19116:9;19127:7;19103:12;:32::i;:::-;4442:2;19090:60;;:12;:60::i;:::-;19033:12;:132::i;:::-;18999:166;;19178:22;19203:35;19216:9;19227:10;19203:12;:35::i;:::-;19178:60;;19256:14;19249:21;;;;;;;18469:809;;;:::o;35187:305::-;35340:144;35373:6;35394:19;35428:10;35453:20;35340:18;:144::i;:::-;35187:305;;;:::o;39980:361::-;40103:4;40120:20;40156:53;40169:11;:19;40181:6;40169:19;;;;;;;;;;;;;;;:31;40189:10;40169:31;;;;;;;;;;;;;;;;40202:6;40156:12;:53::i;:::-;40120:89;;40222:36;40232:6;40240:9;40251:6;40222:9;:36::i;:::-;40269:42;40278:6;40286:10;40298:12;40269:8;:42::i;:::-;40329:4;40322:11;;;39980:361;;;;;:::o;12574:200::-;12633:4;12680:8;12650:15;:27;12666:10;12650:27;;;;;;;;;;;;;;;:38;;;;12734:10;12699:22;:32;12722:8;12699:32;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;12762:4;12755:11;;12574:200;;;:::o;6602:34::-;;;;;;;;;;;;;:::o;12782:173::-;12883:7;12915:22;:32;12938:8;12915:32;;;;;;;;;;;;;;;;;;;;;12908:39;;12782:173;;;:::o;22484:1081::-;22578:7;22603:26;22653:4;4498:5;22632:25;22603:54;;22668:23;23509:12;;4574:4;22727:735;22789:590;23339:12;;23281:18;4574:4;23176:1;:65;:123;:175;23136:1;23122:12;;:15;23079:1;4574:4;23053:27;23052:86;23009:4;22997:9;:16;22951:4;4574;22926:29;22884:1;:72;:130;22845:1;22825:18;:21;22824:191;:315;:528;22789:4;:590::i;:::-;23425:18;22727:12;:735::i;:::-;22708:796;;;;;;22707:815;22668:854;;23542:15;23535:22;;;;22484:1081;;;:::o;4361:35::-;4394:2;4361:35;:::o;13472:244::-;13514:7;13523;13543:24;13570:10;13543:37;;13591:21;13615:29;:47;13645:16;13615:47;;;;;;;;;;;;;;;13591:71;;13683:6;:12;;;13697:6;:10;;;13675:33;;;;;;13472:244;;:::o;43828:306::-;43926:4;43948:23;43987:58;44000:11;:23;44012:10;44000:23;;;;;;;;;;;;;;;:32;44024:7;44000:32;;;;;;;;;;;;;;;;44034:10;43987:12;:58::i;:::-;43948:97;;44058:46;44067:10;44079:7;44088:15;44058:8;:46::i;:::-;44122:4;44115:11;;;43828:306;;;;:::o;9688:67::-;9726:21;9736:10;9726:9;:21::i;:::-;9688:67::o;19785:2031::-;19932:7;698:1;685:10;:8;:10::i;:::-;:14;677:23;;;;;;19979:19;:37;19999:16;19979:37;;;;;;;;;;;;;;;;19960:15;:56;;19952:65;;;;;;20030:19;20052:1;20030:23;;20064:30;20110:29;:47;20140:16;20110:47;;;;;;;;;;;;;;;20064:93;;20168:15;20186;:21;;;20168:39;;20218:22;20243:1;20218:26;;20257:1489;20275:15;:19;;;20264:7;:30;20257:1489;;20311:38;20369:30;:48;20400:16;20369:48;;;;;;;;;;;;;;;20418:7;20369:57;;;;;;;;;;;;;;;;;;20311:115;;20441:23;20484:54;20497:11;:17;;;20516:11;:21;;;20484:12;:54::i;:::-;20441:97;;20555:22;20580:42;20593:15;20610:11;20580:12;:42::i;:::-;20555:67;;20661:14;20643:15;:32;20639:1045;;;20711:15;20696:30;;;;20762:235;20797:14;20834:144;20873:40;20891:11;:21;;;20873:17;:40::i;:::-;20940:15;20834:12;:144::i;:::-;20762:12;:235::i;:::-;20745:252;;20639:1045;;;21042:14;21023:15;:33;21019:665;;21094:234;21129:14;21166:143;21205:40;21223:11;:21;;;21205:17;:40::i;:::-;21272:14;21166:12;:143::i;:::-;21094:12;:234::i;:::-;21077:251;;21347:5;;;;;21019:665;21410:234;21445:14;21482:143;21521:40;21539:11;:21;;;21521:17;:40::i;:::-;21588:14;21482:12;:143::i;:::-;21410:12;:234::i;:::-;21393:251;;21663:5;;;;;20639:1045;21710:24;21723:7;21732:1;21710:12;:24::i;:::-;21700:34;;20257:1489;;;;;;21763:45;21776:14;21792:15;21763:12;:45::i;:::-;21756:52;;;;;;19785:2031;;;;:::o;5877:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;16543:429::-;16585:7;16625:1;16609:12;;:17;16605:360;;;4574:4;4498:5;16650:43;16643:50;;;;16605:360;16726:17;16746:23;16764:4;16746:17;:23::i;:::-;16726:43;;16784:18;16805:37;16818:9;4442:2;16805:37;;:12;:37::i;:::-;16784:58;;16857:22;16882:35;16895:9;16906:10;16882:12;:35::i;:::-;16857:60;;16939:14;16932:21;;;;;16543:429;;:::o;13143:251::-;13194:7;13203;13223:24;13250:10;13223:37;;13293:16;:34;13310:16;13293:34;;;;;;;;;;;;;;;;13342:15;:33;13358:16;13342:33;;;;;;;;;;;;;;;;13271:115;;;;;13143:251;;:::o;19286:411::-;19397:7;19449:12;;19430:15;:31;;19422:40;;;;;;19500:10;:8;:10::i;:::-;19481:15;:29;;19473:38;;;;;;19522:17;19542:43;19555:15;4442:2;19542:43;;:12;:43::i;:::-;19522:63;;19596:20;19619:40;19632:15;19649:9;19619:12;:40::i;:::-;19596:63;;19677:12;19670:19;;;;19286:411;;;:::o;4724:41::-;;;;:::o;13724:495::-;13840:7;13862;13884;13919:24;13946:10;13919:37;;13967:38;14021:30;:48;14052:16;14021:48;;;;;;;;;;;;;;;14070:7;14021:57;;;;;;;;;;;;;;;;;;13967:111;;14111:11;:17;;;14143:11;:21;;;14179:11;:21;;;14089:122;;;;;;;;13724:495;;;;;:::o;4801:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;33768:241::-;33855:9;33866;33893:10;33927:2;33906:25;;;;;33916:1;33913;33906:25;33893:38;;33950:1;33946;:5;33942:9;;33971:1;33966:2;:6;33962:10;;33992:1;33987:2;:6;33983:18;;;34000:1;33995:6;;;;33983:18;33768:241;;;;;;:::o;15250:375::-;15347:7;15372:24;15399:10;15372:37;;15440:21;:177;;15588:29;15600:16;15588:11;:29::i;:::-;15440:177;;;15534:16;:34;15551:16;15534:34;;;;;;;;;;;;;;;;15481:29;15493:16;15481:11;:29::i;:::-;:87;15440:177;15420:197;;;15250:375;;;:::o;5820:50::-;;;;;;;;;;;;;;;;;:::o;14409:109::-;14462:7;14489:21;14482:28;;14409:109;:::o;6074:50::-;;;;;;;;;;;;;;;;;:::o;12963:172::-;13067:7;13099:15;:28;13115:11;13099:28;;;;;;;;;;;;;;;;13092:35;;12963:172;;;:::o;15709:138::-;15775:7;15802:19;:37;15822:16;15802:37;;;;;;;;;;;;;;;;15795:44;;15709:138;;;:::o;6397:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;21908:376::-;22002:7;22027:11;22059:9;22041:15;:27;22027:41;;22091:7;22085:3;:13;22081:176;;;22122:1;22115:8;;;;;22081:176;22151:7;22145:3;:13;22141:116;;;22182:2;22175:9;;;;;22141:116;22212:7;22206:3;:13;22202:55;;;22243:2;22236:9;;;;;22202:55;22274:2;22267:9;;;21908:376;;;;:::o;12021:161::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12159:15;12138:18;:36;;;;12021:161;;:::o;17066:388::-;17107:7;17147:1;17131:12;;:17;17127:320;;;4574:4;4498:5;17172:43;17165:50;;;;17127:320;17248:17;17268:23;17286:4;17268:17;:23::i;:::-;17248:43;;17306:22;17348:51;17355:9;4442:2;17348:51;;17396:1;4442:2;17381:16;17348:51;;:6;:51::i;:::-;17306:93;;17421:14;17414:21;;;;17066:388;;:::o;11750:167::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11902:7;11872:14;:27;11887:11;11872:27;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;11750:167;;;:::o;36257:1490::-;36347:7;36372:31;36406:16;:34;36423:16;36406:34;;;;;;;;;;;;;;;36372:68;;36497:1;36471:5;:23;;;:27;:86;;;;;36534:5;:23;;;36515:15;:42;;36471:86;36453:1244;;;36616:18;36637:29;36649:16;36637:11;:29::i;:::-;36616:50;;36854:5;:26;;;36841:10;:39;:98;;;;;36914:5;:25;;;36901:10;:38;36841:98;36819:867;;;4636:5;37100;:25;;;:37;37037:10;:28;37048:16;37037:28;;;;;;;;;;;;;;;;:119;;;;;;;;;;;37412:5;:12;;;;;;;;;;;;37404:21;;37378:1;37361:5;:12;;;;;;;;;;;;37353:21;;37301:5;:23;;;37283:15;:41;37282:92;;;;;;37281:98;37280:145;37232:5;:23;;;:193;;;;;;;;;;;37527:27;37537:16;37527:9;:27::i;:::-;37624:10;:19;;:46;37644:5;:25;;;37624:46;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37624:46:0;36819:867;36453:1244;;37716:5;:23;;;37709:30;;;36257:1490;;;:::o;14751:151::-;14792:7;14812:24;14839:10;14812:37;;14867:27;14877:16;14867:9;:27::i;:::-;14860:34;;;14751:151;:::o;4324:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44220:316::-;44323:4;44345:23;44384:63;44397:11;:23;44409:10;44397:23;;;;;;;;;;;;;;;:32;44421:7;44397:32;;;;;;;;;;;;;;;;44431:15;44384:12;:63::i;:::-;44345:102;;44460:46;44469:10;44481:7;44490:15;44460:8;:46::i;:::-;44524:4;44517:11;;;44220:316;;;;:::o;38539:549::-;38659:7;38681;38703:6;38724:7;38759:44;38819:16;:34;38836:16;38819:34;;;;;;;;;;;;;;;38759:94;;38886:18;:36;;;38937:18;:38;;;38990:18;:25;;;;;;;;;;;;39030:18;:39;;;38864:216;;;;;;;;;38539:549;;;;;:::o;11642:100::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11729:5;11711:15;;:23;;;;;;;;;;;;;;;;;;11642:100;:::o;40349:223::-;40470:4;698:1;685:10;:8;:10::i;:::-;:14;677:23;;;;;;40492:50;40502:10;40514;40526:15;40492:9;:50::i;:::-;40560:4;40553:11;;40349:223;;;;:::o;34099:640::-;34203:7;34224:9;34235;34248:13;34256:1;34259;34248:7;:13::i;:::-;34223:38;;;;34284:1;34280;:5;34272:14;;;;;;34297:10;34323:1;34310:15;;;;;34320:1;34317;34310:15;34297:28;;34345:1;34340:2;:6;34336:18;;;34353:1;34348:6;;;;34336:18;34370:2;34365:7;;;;34383:12;34403:1;34402:2;;34398:1;:6;34383:21;;34420:4;34415:9;;;;;;;;;34440:4;34435:9;;;;;;;;;34482:1;34475:4;34467;34466:5;;34465:14;;;;;;:18;34460:1;:24;34455:29;;;;34495:9;34507:1;34495:13;;34532:1;34528;:5;34524:1;:9;34519:14;;;;34557:1;34553;:5;34549:1;:9;34544:14;;;;34582:1;34578;:5;34574:1;:9;34569:14;;;;34607:1;34603;:5;34599:1;:9;34594:14;;;;34632:1;34628;:5;34624:1;:9;34619:14;;;;34657:1;34653;:5;34649:1;:9;34644:14;;;;34682:1;34678;:5;34674:1;:9;34669:14;;;;34707:1;34703;:5;34699:1;:9;34694:14;;;;34730:1;34726;:5;34719:12;;;;;;;34099:640;;;;;:::o;12408:104::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12497:7;12488:6;:16;;;;;;;;;;;;:::i;:::-;;12408:104;;:::o;39162:356::-;39210:23;39236:10;39210:36;;39315:1;39261:16;:33;39278:15;39261:33;;;;;;;;;;;;;;;:51;;;:55;39257:254;;;39340:16;:33;39357:15;39340:33;;;;;;;;;;;;;;;;39333:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39483:15;39460:39;;;;;;;;;;;;39257:254;39162:356;:::o;23731:568::-;23796:7;23816:15;23845:4;23835:7;:14;23816:34;;23861:20;23900:4;23885:12;;:19;23861:44;;23916:25;24249:4;23958:288;24144:4;24134:7;:14;4574:4;24076;24061:12;:19;;;;;;4574:4;24035:46;4498:5;23992:90;23991:138;23990:159;24230:1;24221:4;24210:7;24206:1;24197:7;:10;:20;24196:29;;;;;;4574:4;24170:56;24169:62;;;;;;23958:12;:288::i;:::-;:295;;;;;;23916:338;;24274:17;24267:24;;;;;23731:568;;;:::o;12247:96::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12330:5;12323:4;:12;;;;;;;;;;;;:::i;:::-;;12247:96;;:::o;5980:51::-;;;;;;;;;;;;;;;;;:::o;39650:166::-;39749:7;39781:11;:18;39793:5;39781:18;;;;;;;;;;;;;;;:27;39800:7;39781:27;;;;;;;;;;;;;;;;39774:34;;39650:166;;;;:::o;9819:1626::-;698:1;685:10;:8;:10::i;:::-;:14;677:23;;;;;;9916:24;9943:10;9916:37;;9991:19;:37;10011:16;9991:37;;;;;;;;;;;;;;;;9972:15;:56;;9964:65;;;;;;10040:15;10058;10040:33;;10084:17;10104:26;10122:7;10104:17;:26::i;:::-;10084:46;;10143:15;10174:224;10199:134;10260:15;10298:16;10199:38;:134::i;:::-;10352:9;10380:3;10174:6;:224::i;:::-;10143:255;;10411:18;10445:132;10476:7;10502:60;10515:32;10528:9;10539:7;10515:12;:32::i;:::-;4442:2;10502:60;;:12;:60::i;:::-;10445:12;:132::i;:::-;10411:166;;10590:22;10615:35;10628:9;10639:10;10615:12;:35::i;:::-;10590:60;;10711:35;10724:12;;10738:7;10711:12;:35::i;:::-;10696:12;:50;;;;10797:97;10824:19;:37;10844:16;10824:37;;;;;;;;;;;;;;;;10876:7;10797:12;:97::i;:::-;10757:19;:37;10777:16;10757:37;;;;;;;;;;;;;;;:137;;;;10944:22;4636:5;11020:14;:26;11009:7;10991:15;;:25;:56;10944:104;;11091:15;11059:10;:28;11070:16;11059:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;11138:1;11123:12;;:16;11119:247;;;11231:123;11262:15;;11296:43;11303:10;4636:5;11326:12;;11296:6;:43::i;:::-;11231:12;:123::i;:::-;11213:15;:141;;;;11119:247;11395:16;11383:54;;;11413:7;11422:14;11383:54;;;;;;;;;;;;;;;;;;;;;;;;711:1;;;;;;;9819:1626;:::o;9353:262::-;9442:24;9469:10;9442:37;;9490:15;9508:19;:37;9528:16;9508:37;;;;;;;;;;;;;;;;9490:55;;9570:1;9560:7;:11;9556:30;;;9573:13;9578:7;9573:4;:13::i;:::-;9556:30;9597:10;:8;:10::i;:::-;9353:262;;:::o;37854:571::-;37948:7;37970;37992:6;38013:7;38048:24;38075:10;38048:37;;38096:44;38156:16;:34;38173:16;38156:34;;;;;;;;;;;;;;;38096:94;;38223:18;:36;;;38274:18;:38;;;38327:18;:25;;;;;;;;;;;;38367:18;:39;;;38201:216;;;;;;;;;;37854:571;;;;:::o;8811:476::-;8992:21;9002:10;8992:9;:21::i;:::-;9066;9062:218;;;9104:164;9141:6;9166:19;9204:10;9233:20;9104:18;:164::i;:::-;9062:218;8811:476;;;;:::o;8613:118::-;8673:50;8688:10;8700:9;8711:11;8673:14;:50::i;:::-;;8613:118;:::o;46110:147::-;46168:7;46188:9;46204:1;46200;:5;46188:17;;46228:1;46223;:6;;46216:14;;;;46248:1;46241:8;;;46110:147;;;;:::o;45494:288::-;45552:7;45651:9;45667:1;45663;:5;;;;;;45651:17;;45773:1;45766:8;;;45494:288;;;;:::o;45910:123::-;45968:7;46000:1;45995;:6;;45988:14;;;;46024:1;46020;:5;46013:12;;45910:123;;;;:::o;44622:367::-;44766:1;44749:19;;:5;:19;;;;44741:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44847:1;44828:21;;:7;:21;;;;44820:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44929:5;44899:11;:18;44911:5;44899:18;;;;;;;;;;;;;;;:27;44918:7;44899:27;;;;;;;;;;;;;;;:35;;;;44966:7;44950:31;;44959:5;44950:31;;;44975:5;44950:31;;;;;;;;;;;;;;;;;;44622:367;;;:::o;35500:690::-;35726:157;;;;;;;;35776:6;35758:24;;:15;:24;35726:157;;;;35797:19;35726:157;;;;35831:20;35726:157;;;;35866:6;35726:157;;;;;35690:16;:33;35707:15;35690:33;;;;;;;;;;;;;;;:193;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36000:15;35962:220;;;36030:16;:33;36047:15;36030:33;;;;;;;;;;;;;;;:51;;;36096:19;36130:6;36151:20;35962:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35500:690;;;;:::o;41148:2591::-;41342:1;41314:30;;:16;:30;;;;41292:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41464:1;41442:24;;:10;:24;;;;41420:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41727:15;;;;;;;;;;;41726:16;:93;;;;;41782:19;:37;41802:16;41782:37;;;;;;;;;;;;;;;;41763:15;:56;;41726:93;41704:126;;;;;;41996:1;41946:16;:34;41963:16;41946:34;;;;;;;;;;;;;;;;41914:29;41926:16;41914:11;:29::i;:::-;:66;:83;41896:167;;;42024:27;42034:16;42024:9;:27::i;:::-;41896:167;42148:59;42173:15;42190:16;42148:24;:59::i;:::-;42336:17;42356:43;42369:15;4442:2;42356:43;;:12;:43::i;:::-;42336:63;;42412:20;42435:40;42448:15;42465:9;42435:12;:40::i;:::-;42412:63;;42486:18;42507:28;42525:9;42507:17;:28::i;:::-;42486:49;;42595:37;42608:12;;42622:9;42595:12;:37::i;:::-;42580:12;:52;;;;42713:105;42740:19;:37;42760:16;42740:37;;;;;;;;;;;;;;;;42792:15;42713:12;:105::i;:::-;42673:19;:37;42693:16;42673:37;;;;;;;;;;;;;;;:145;;;;42863:96;42890:19;:31;42910:10;42890:31;;;;;;;;;;;;;;;;42936:12;42863;:96::i;:::-;42829:19;:31;42849:10;42829:31;;;;;;;;;;;;;;;:130;;;;43039:30;:42;43070:10;43039:42;;;;;;;;;;;;;;;43101:52;;;;;;;;43120:12;43101:52;;;;43134:15;43101:52;;;;43151:1;43101:52;;;43039:125;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;43039:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43224:1;43175:29;:41;43205:10;43175:41;;;;;;;;;;;;;;;:45;;;:50;;;;;;;;;;;43348:15;43330;;:33;43275:10;:28;43286:16;43275:28;;;;;;;;;;;;;;;;:99;;;;;;;;;;;43438:12;43420:15;;:30;43385:10;:22;43396:10;43385:22;;;;;;;;;;;;;;;;:66;;;;;;;;;;;43527:111;43554:15;;43584:43;43591:10;4636:5;43614:12;;43584:6;:43::i;:::-;43527:12;:111::i;:::-;43509:15;:129;;;;43706:10;43679:52;;43688:16;43679:52;;;43718:12;43679:52;;;;;;;;;;;;;;;;;;41148:2591;;;;;;:::o;33408:207::-;33456:9;33478;33500:1;33495;33491;:5;33490:11;;;;;;33478:23;;33516:1;33512:5;;33528:80;33539:1;33535;:5;33528:80;;;33561:1;33557:5;;33595:1;33590;33586;33582;:5;;;;;;:9;33581:15;;;;;;33577:19;;33528:80;;;33408:207;;;;:::o;28610:748::-;28675:18;28696:29;28708:16;28696:11;:29::i;:::-;28675:50;;28860:1;28823:16;:34;28840:16;28823:34;;;;;;;;;;;;;;;;28810:10;:47;:51;28802:60;;;;;;4636:5;28952:10;:22;28911:10;:28;28922:16;28911:28;;;;;;;;;;;;;;;;:64;;;;;;;;;;;29029:16;:34;29046:16;29029:34;;;;;;;;;;;;;;;;29015:48;;;;29111:1;29074:16;:34;29091:16;29074:34;;;;;;;;;;;;;;;:38;;;;29125:39;29196:16;29125:89;;29225:23;:32;;:44;29258:10;29225:44;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29225:44:0;29321:16;29310:40;;;29339:10;29310:40;;;;;;;;;;;;;;;;;;28610:748;;;:::o;45189:208::-;45247:7;45276:1;45271;:6;45267:47;;;45301:1;45294:8;;;;45267:47;45324:9;45340:1;45336;:5;45324:17;;45368:1;45363;45359;:5;;;;;;:10;45352:18;;;;45388:1;45381:8;;;45189:208;;;;;:::o;27889:713::-;27954:18;27975:29;27987:16;27975:11;:29::i;:::-;27954:50;;28103:1;28066:16;:34;28083:16;28066:34;;;;;;;;;;;;;;;;28053:10;:47;:51;28045:60;;;;;;4636:5;28159:10;:22;28118:10;:28;28129:16;28118:28;;;;;;;;;;;;;;;;:64;;;;;;;;;;;28241:16;:34;28258:16;28241:34;;;;;;;;;;;;;;;;28227:48;;;;28323:1;28286:16;:34;28303:16;28286:34;;;;;;;;;;;;;;;:38;;;;28413:15;28444:56;28459:16;28477:10;28497:1;28444:14;:56::i;:::-;28413:87;;28556:16;28541:53;;;28574:10;28586:7;28541:53;;;;;;;;;;;;;;;;;;;;;;;;27889:713;;;:::o;30996:2404::-;31155:7;698:1;685:10;:8;:10::i;:::-;:14;677:23;;;;;;31226:19;31248:1;31226:23;;31260:30;31306:29;:47;31336:16;31306:47;;;;;;;;;;;;;;;31260:93;;31364:15;31382;:21;;;31364:39;;31414:22;31439:1;31414:26;;31453:1875;31471:15;:19;;;31460:7;:30;31453:1875;;31507:38;31565:30;:48;31596:16;31565:48;;;;;;;;;;;;;;;31614:7;31565:57;;;;;;;;;;;;;;;;;;31507:115;;31637:23;31680:54;31693:11;:17;;;31712:11;:21;;;31680:12;:54::i;:::-;31637:97;;31751:22;31776:42;31789:15;31806:11;31776:12;:42::i;:::-;31751:67;;31857:14;31839:15;:32;31835:1453;;;31907:15;31892:30;;;;31958:235;31993:14;32030:144;32069:40;32087:11;:21;;;32069:17;:40::i;:::-;32136:15;32030:12;:144::i;:::-;31958:12;:235::i;:::-;31941:252;;32219:30;:48;32250:16;32219:48;;;;;;;;;;;;;;;32290:7;32219:97;;;;;;;;;;;;;;;;;;;32212:104;;;;;;;;;;;;;;;;;;;;31835:1453;;;32361:14;32342:15;:33;32338:950;;32413:234;32448:14;32485:143;32524:40;32542:11;:21;;;32524:17;:40::i;:::-;32591:14;32485:12;:143::i;:::-;32413:12;:234::i;:::-;32396:251;;32673:30;:48;32704:16;32673:48;;;;;;;;;;;;;;;32744:7;32673:97;;;;;;;;;;;;;;;;;;;32666:104;;;;;;;;;;;;;;;;;;;;32823:1;32813:7;:11;32789:15;:21;;:35;;;;32843:5;;;;;32338:950;32906:234;32941:14;32978:143;33017:40;33035:11;:21;;;33017:17;:40::i;:::-;33084:14;32978:12;:143::i;:::-;32906:12;:234::i;:::-;32889:251;;33184:14;33159:11;:21;;;:39;;;;;;;;;;;33241:7;33217:15;:21;;:31;;;;33267:5;;;;;31835:1453;33315:1;33304:12;;;;31453:1875;;;;;;33347:45;33360:14;33376:15;33347:12;:45::i;:::-;33340:52;;;;;;30996:2404;;;;:::o;29434:1442::-;29615:19;29637:1;29615:23;;29649:30;29695:29;:47;29725:16;29695:47;;;;;;;;;;;;;;;29649:93;;29753:15;29771;:21;;;29753:39;;29805:1064;29823:15;:19;;;29812:7;:30;29805:1064;;29859:38;29917:30;:48;29948:16;29917:48;;;;;;;;;;;;;;;29966:7;29917:57;;;;;;;;;;;;;;;;;;29859:115;;29989:23;30032:54;30045:11;:17;;;30064:11;:21;;;30032:12;:54::i;:::-;29989:97;;30103:22;30128:42;30141:15;30158:11;30128:12;:42::i;:::-;30103:67;;30209:14;30191:15;:32;30187:644;;;30259:15;30244:30;;;;30302;:48;30333:16;30302:48;;;;;;;;;;;;;;;30373:7;30302:97;;;;;;;;;;;;;;;;;;;30295:104;;;;;;;;;;;;;;;;;;;;30187:644;;;30444:14;30425:15;:33;30421:410;;30486:30;:48;30517:16;30486:48;;;;;;;;;;;;;;;30557:7;30486:97;;;;;;;;;;;;;;;;;;;30479:104;;;;;;;;;;;;;;;;;;;;30636:1;30626:7;:11;30602:15;:21;;:35;;;;30656:5;;;;;30421:410;30727:14;30702:11;:21;;;:39;;;;;;;;;;;30784:7;30760:15;:21;;:31;;;;30810:5;;;;;30187:644;30856:1;30845:12;;;;29805:1064;;;;;;29434:1442;;;;;:::o;459:44533::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

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