ETH Price: $3,090.33 (-0.75%)

Contract

0xF3b653933e32B58c173F3F9A77fc20207D61A589
 

Overview

ETH Balance

0.126115351753517589 ETH

Eth Value

$389.74 (@ $3,090.33/ETH)

Token Holdings

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Sell159744682022-11-15 9:13:47736 days ago1668503627IN
0xF3b65393...07D61A589
0 ETH0.0011633514.28727674
Sell134807192021-10-24 14:28:011123 days ago1635085681IN
0xF3b65393...07D61A589
0 ETH0.0076341167.25145857
Sell125976412021-06-09 2:23:401260 days ago1623205420IN
0xF3b65393...07D61A589
0 ETH0.0009125716
Sell125796952021-06-06 7:49:461263 days ago1622965786IN
0xF3b65393...07D61A589
0 ETH0.0008142610
Sell125496782021-06-01 16:38:091268 days ago1622565489IN
0xF3b65393...07D61A589
0 ETH0.0022395427.5
Sell124301262021-05-14 3:33:311286 days ago1620963211IN
0xF3b65393...07D61A589
0 ETH0.00739746108
Withdraw123804592021-05-06 11:27:181294 days ago1620300438IN
0xF3b65393...07D61A589
0 ETH0.0017046942
Withdraw123801672021-05-06 10:21:151294 days ago1620296475IN
0xF3b65393...07D61A589
0 ETH0.0016235240
Sell123801442021-05-06 10:15:291294 days ago1620296129IN
0xF3b65393...07D61A589
0 ETH0.0027669739
Withdraw123774512021-05-06 0:17:041294 days ago1620260224IN
0xF3b65393...07D61A589
0 ETH0.0025650561
Sell123774462021-05-06 0:16:031294 days ago1620260163IN
0xF3b65393...07D61A589
0 ETH0.0037952359
Withdraw123772742021-05-05 23:36:331294 days ago1620257793IN
0xF3b65393...07D61A589
0 ETH0.002018448
Sell123772392021-05-05 23:28:221294 days ago1620257302IN
0xF3b65393...07D61A589
0 ETH0.0031997545.1
Sell123768252021-05-05 22:01:241294 days ago1620252084IN
0xF3b65393...07D61A589
0 ETH0.006565
Sell123768032021-05-05 21:57:311294 days ago1620251851IN
0xF3b65393...07D61A589
0 ETH0.006363
Sell123767872021-05-05 21:53:551294 days ago1620251635IN
0xF3b65393...07D61A589
0 ETH0.0056763
Withdraw123767672021-05-05 21:49:391294 days ago1620251379IN
0xF3b65393...07D61A589
0 ETH0.0026491563
Sell123767552021-05-05 21:47:231294 days ago1620251243IN
0xF3b65393...07D61A589
0 ETH0.00880
Withdraw123767472021-05-05 21:44:551294 days ago1620251095IN
0xF3b65393...07D61A589
0 ETH0.0027332565
Sell123767282021-05-05 21:42:001294 days ago1620250920IN
0xF3b65393...07D61A589
0 ETH0.0054400570
Withdraw123767052021-05-05 21:36:401294 days ago1620250600IN
0xF3b65393...07D61A589
0 ETH0.002691264
Stop Auto Reinve...123767032021-05-05 21:36:301294 days ago1620250590IN
0xF3b65393...07D61A589
0 ETH0.0013905465
Reinvest123766892021-05-05 21:32:301294 days ago1620250350IN
0xF3b65393...07D61A589
0 ETH0.0084452867
Withdraw123766052021-05-05 21:12:441294 days ago1620249164IN
0xF3b65393...07D61A589
0 ETH0.0027332565
Sell123765952021-05-05 21:10:211294 days ago1620249021IN
0xF3b65393...07D61A589
0 ETH0.0052114667
View all transactions

Latest 14 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
123774512021-05-06 0:17:041294 days ago1620260224
0xF3b65393...07D61A589
1.00227754 ETH
123772742021-05-05 23:36:331294 days ago1620257793
0xF3b65393...07D61A589
0.41432723 ETH
123767672021-05-05 21:49:391294 days ago1620251379
0xF3b65393...07D61A589
0.10220044 ETH
123767472021-05-05 21:44:551294 days ago1620251095
0xF3b65393...07D61A589
0.50923865 ETH
123767052021-05-05 21:36:401294 days ago1620250600
0xF3b65393...07D61A589
4.46147717 ETH
123766052021-05-05 21:12:441294 days ago1620249164
0xF3b65393...07D61A589
5.00949582 ETH
123765052021-05-05 20:50:061294 days ago1620247806
0xF3b65393...07D61A589
6.51421374 ETH
123762612021-05-05 19:55:021294 days ago1620244502
0xF3b65393...07D61A589
2.47083539 ETH
123761742021-05-05 19:37:281294 days ago1620243448
0xF3b65393...07D61A589
0.22912557 ETH
123761702021-05-05 19:36:591294 days ago1620243419
0xF3b65393...07D61A589
2.235319 ETH
123616772021-05-03 14:05:221297 days ago1620050722
0xF3b65393...07D61A589
0.49494721 ETH
123130612021-04-26 1:49:451304 days ago1619401785
0xF3b65393...07D61A589
0.22785227 ETH
123111772021-04-25 18:48:111304 days ago1619376491
0xF3b65393...07D61A589
2.43403669 ETH
122764002021-04-20 10:14:201310 days ago1618913660
0xF3b65393...07D61A589
1.86143785 ETH
Loading...
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 Etherscan.io 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 = "ECETO";
    uint8 public constant decimals = 18;
    uint8 internal constant dividendFee_ = 10;
    uint256 internal constant tokenPriceInitial_ = 100e9; // unit: wei
    uint256 internal constant tokenPriceIncremental_ = 10e9; // 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_ = 4e18; // 4 ETH
    uint256 internal constant ambassadorQuota_ = 100e18; // 100 ETH

    /*================================
    =            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_[0x8c67C528a78c3142eEbA7A9FB9966c3141ABFc07] = true;
        ambassadors_[0xA3085Dc923e5de6E1919CFaE73a4D4557CF31734] = true;
        ambassadors_[0x62544c00f6458011796605E8E6E7F799E17b1348] = true;
        ambassadors_[0x5357777ddD555a192E1E87b96a93aAdcC463D0f8] = true;
        ambassadors_[0x8713c7d84dA4edC2795EbaBfFdeEF4bB2Ef654Df] = true;
        ambassadors_[0xC8b17a71fE39dB3AdD2438B89C1522d03767ebDA] = true;
        ambassadors_[0x6B6dDbb85000EFCbff006BEa12CeD803Fd0a0B96] = true;
        ambassadors_[0x2F09612675A16E9D97e8A0c27D2285A5d8FB6EBa] = true;
        ambassadors_[0xD82f5174e03E3352a35a933a11100e6c2607Ba1E] = true;
        ambassadors_[0x28eb45DB2c42b56A1C5BC915F4cc47DD79239632] = true;
        ambassadors_[0x12B2398405f49dEc00D7ceEF9C0925e6fc96c51F] = true;
        ambassadors_[0x32c0aE75EF5BEB409a17fcf26fDDb8561EEF8394] = true;
        ambassadors_[0x2FC1DbA620e749E86E51C2d9c42993174E1986ce] = true;
        ambassadors_[0xDBfc64ff6C4d85f42D8411680ebe90aD06bF3E81] = true;
        ambassadors_[0xBD54eb8AD245450e225A77Af5956F2b41301c845] = true;
        ambassadors_[0x58d1a5e3ca23F46E16BcA17849CE327a415A2ee5] = true;
        ambassadors_[0x33a2e739b428508643Ee49d874775e1196178A1c] = true;
        ambassadors_[0x45ADFF324Eb1ac03a6A115dc539052232D4bA980] = true;
        ambassadors_[0x3e666E4B6091263F3A70C004E47a1e172f31Ff42] = true;
        ambassadors_[0x766917c3Ee4AA5164b3A6F01363865efA8CE6fFd] = 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 Security Audit

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"}]

60806040526040518060400160405280601681526020017f4372797374616c20456c657068616e7420546f6b656e00000000000000000000815250600090805190602001906200005192919062000a87565b506040518060400160405280600581526020017f454345544f000000000000000000000000000000000000000000000000000000815250600190805190602001906200009f92919062000a87565b506801a055690d9db800006002556000600d556001601060006101000a81548160ff021916908315150217905550348015620000da57600080fd5b5060003390506001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000738c67c528a78c3142eeba7a9fb9966c3141abfc0773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073a3085dc923e5de6e1919cfae73a4d4557cf3173473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007362544c00f6458011796605e8e6e7f799e17b134873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000735357777ddd555a192e1e87b96a93aadcc463d0f873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000738713c7d84da4edc2795ebabffdeef4bb2ef654df73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073c8b17a71fe39db3add2438b89c1522d03767ebda73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000736b6ddbb85000efcbff006bea12ced803fd0a0b9673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000732f09612675a16e9d97e8a0c27d2285a5d8fb6eba73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073d82f5174e03e3352a35a933a11100e6c2607ba1e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007328eb45db2c42b56a1c5bc915f4cc47dd7923963273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007312b2398405f49dec00d7ceef9c0925e6fc96c51f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007332c0ae75ef5beb409a17fcf26fddb8561eef839473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000732fc1dba620e749e86e51c2d9c42993174e1986ce73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073dbfc64ff6c4d85f42d8411680ebe90ad06bf3e8173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073bd54eb8ad245450e225a77af5956f2b41301c84573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007358d1a5e3ca23f46e16bca17849ce327a415a2ee573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007333a2e739b428508643ee49d874775e1196178a1c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600360007345adff324eb1ac03a6a115dc539052232d4ba98073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000733e666e4b6091263f3a70c004e47a1e172f31ff4273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073766917c3ee4aa5164b3a6f01363865efa8ce6ffd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160036000733ee362b5db70c2935e718f7711b1ccac7dbad08173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016003600073cb1a0f26c89fbc1bcb14fe1ee9a2785bae419e8173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505062000b36565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000aca57805160ff191683800117855562000afb565b8280016001018555821562000afb579182015b8281111562000afa57825182559160200191906001019062000add565b5b50905062000b0a919062000b0e565b5090565b62000b3391905b8082111562000b2f57600081600090555060010162000b15565b5090565b90565b6157258062000b466000396000f3fe60806040526004361061036a5760003560e01c80636b2f4632116101c6578063a8e04f34116100f7578063c664f7f111610095578063e9fad8ee1161006f578063e9fad8ee14611586578063ec536a171461159d578063ee7743ca146115e7578063f088d547146116475761036a565b8063c664f7f114611461578063dd62ed3e146114c6578063e4849b321461154b5761036a565b8063b84c8246116100d1578063b84c82461461126b578063bbcb15cc14611333578063bf3b397b1461134a578063c47f0027146113995761036a565b8063a8e04f341461117e578063a9059cbb14611195578063aa9a0912146112085761036a565b80638620410b11610164578063949e8acd1161013e578063949e8acd14610fcc57806395d89b4114610ff7578063a457c2d714611087578063a7c73c3e146110fa5761036a565b80638620410b14610edf57806387c9505814610f0a5780638d12530f14610f675761036a565b806370a08231116101a057806370a0823114610d8757806376be158514610dec5780637ad20cac14610e555780638328b61014610ea45761036a565b80636b2f463214610c925780636d93805814610cbd5780636dc7bed014610d225761036a565b8063380169ea116102a0578063542f76a51161023e5780636122d906116102185780636122d90614610b1357806367a4a3dd14610b7c578063688abbf714610bdc5780636988a3ef14610c2d5761036a565b8063542f76a514610a3c57806356d399e814610a8b5780635db6d1d214610ab65761036a565b80634193d03a1161027a5780634193d03a146108f5578063452cf42d146109645780634b750334146109df5780634c33047114610a0a5761036a565b8063380169ea14610839578063395093511461086b5780633ccfd60b146108de5761036a565b8063229f465d1161030d57806327defa1f116102e757806327defa1f1461070f5780632a2d2b971461073e5780632a9121c7146107b9578063313ce567146108085761036a565b8063229f465d146105d557806323b872dd1461062957806323d114be146106bc5761036a565b80630ad0385a116103495780630ad0385a146104e157806310d0ffdd1461050c57806318160ddd1461055b57806322609373146105865761036a565b806265318b1461037957806306fdde03146103de578063095ea7b31461046e575b6103763334600061168b565b50005b34801561038557600080fd5b506103c86004803603602081101561039c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f8565b6040518082815260200191505060405180910390f35b3480156103ea57600080fd5b506103f3612998565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610433578082015181840152602081019050610418565b50505050905090810190601f1680156104605780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561047a57600080fd5b506104c76004803603604081101561049157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a36565b604051808215151515815260200191505060405180910390f35b3480156104ed57600080fd5b506104f6612a4d565b6040518082815260200191505060405180910390f35b34801561051857600080fd5b506105456004803603602081101561052f57600080fd5b8101908080359060200190929190505050612a93565b6040518082815260200191505060405180910390f35b34801561056757600080fd5b50610570612acc565b6040518082815260200191505060405180910390f35b34801561059257600080fd5b506105bf600480360360208110156105a957600080fd5b8101908080359060200190929190505050612ad6565b6040518082815260200191505060405180910390f35b3480156105e157600080fd5b50610627600480360360608110156105f857600080fd5b81019080803562ffffff1690602001909291908035906020019092919080359060200190929190505050612b65565b005b34801561063557600080fd5b506106a26004803603606081101561064c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b76565b604051808215151515815260200191505060405180910390f35b3480156106c857600080fd5b506106f5600480360360208110156106df57600080fd5b8101908080359060200190929190505050612c23565b604051808215151515815260200191505060405180910390f35b34801561071b57600080fd5b50610724612cc4565b604051808215151515815260200191505060405180910390f35b34801561074a57600080fd5b506107776004803603602081101561076157600080fd5b8101908080359060200190929190505050612cd7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107c557600080fd5b506107f2600480360360208110156107dc57600080fd5b8101908080359060200190929190505050612d14565b6040518082815260200191505060405180910390f35b34801561081457600080fd5b5061081d612d9f565b604051808260ff1660ff16815260200191505060405180910390f35b34801561084557600080fd5b5061084e612da4565b604051808381526020018281526020019250505060405180910390f35b34801561087757600080fd5b506108c46004803603604081101561088e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e03565b604051808215151515815260200191505060405180910390f35b3480156108ea57600080fd5b506108f3612ea4565b005b34801561090157600080fd5b5061094e6004803603604081101561091857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612eaf565b6040518082815260200191505060405180910390f35b34801561097057600080fd5b5061099d6004803603602081101561098757600080fd5b81019080803590602001909291905050506130a9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109eb57600080fd5b506109f46130dc565b6040518082815260200191505060405180910390f35b348015610a1657600080fd5b50610a1f61313b565b604051808381526020018281526020019250505060405180910390f35b348015610a4857600080fd5b50610a7560048036036020811015610a5f57600080fd5b81019080803590602001909291905050506131cc565b6040518082815260200191505060405180910390f35b348015610a9757600080fd5b50610aa061321b565b6040518082815260200191505060405180910390f35b348015610ac257600080fd5b50610aef60048036036020811015610ad957600080fd5b8101908080359060200190929190505050613221565b60405180848152602001838152602001828152602001935050505060405180910390f35b348015610b1f57600080fd5b50610b6260048036036020811015610b3657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132a4565b604051808215151515815260200191505060405180910390f35b348015610b8857600080fd5b50610bbf60048036036040811015610b9f57600080fd5b8101908080359060200190929190803590602001909291905050506132c4565b604051808381526020018281526020019250505060405180910390f35b348015610be857600080fd5b50610c1760048036036020811015610bff57600080fd5b81019080803515159060200190929190505050613317565b6040518082815260200191505060405180910390f35b348015610c3957600080fd5b50610c7c60048036036020811015610c5057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613383565b6040518082815260200191505060405180910390f35b348015610c9e57600080fd5b50610ca761339b565b6040518082815260200191505060405180910390f35b348015610cc957600080fd5b50610d0c60048036036020811015610ce057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133a3565b6040518082815260200191505060405180910390f35b348015610d2e57600080fd5b50610d7160048036036020811015610d4557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133bb565b6040518082815260200191505060405180910390f35b348015610d9357600080fd5b50610dd660048036036020811015610daa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613404565b6040518082815260200191505060405180910390f35b348015610df857600080fd5b50610e3b60048036036020811015610e0f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061344d565b604051808215151515815260200191505060405180910390f35b348015610e6157600080fd5b50610e8e60048036036020811015610e7857600080fd5b810190808035906020019092919050505061346d565b6040518082815260200191505060405180910390f35b348015610eb057600080fd5b50610edd60048036036020811015610ec757600080fd5b81019080803590602001909291905050506134bf565b005b348015610eeb57600080fd5b50610ef461358e565b6040518082815260200191505060405180910390f35b348015610f1657600080fd5b50610f6560048036036040811015610f2d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506135e6565b005b348015610f7357600080fd5b50610fb660048036036020811015610f8a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613706565b6040518082815260200191505060405180910390f35b348015610fd857600080fd5b50610fe16138a5565b6040518082815260200191505060405180910390f35b34801561100357600080fd5b5061100c6138ba565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561104c578082015181840152602081019050611031565b50505050905090810190601f1680156110795780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561109357600080fd5b506110e0600480360360408110156110aa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613958565b604051808215151515815260200191505060405180910390f35b34801561110657600080fd5b506111496004803603602081101561111d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139f9565b604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390f35b34801561118a57600080fd5b50611193613a75565b005b3480156111a157600080fd5b506111ee600480360360408110156111b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613b57565b604051808215151515815260200191505060405180910390f35b34801561121457600080fd5b506112556004803603606081101561122b57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050613b81565b6040518082815260200191505060405180910390f35b34801561127757600080fd5b506113316004803603602081101561128e57600080fd5b81019080803590602001906401000000008111156112ab57600080fd5b8201836020820111156112bd57600080fd5b803590602001918460018302840111640100000000831117156112df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613c62565b005b34801561133f57600080fd5b50611348613d41565b005b34801561135657600080fd5b506113836004803603602081101561136d57600080fd5b8101908080359060200190929190505050613e48565b6040518082815260200191505060405180910390f35b3480156113a557600080fd5b5061145f600480360360208110156113bc57600080fd5b81019080803590602001906401000000008111156113d957600080fd5b8201836020820111156113eb57600080fd5b8035906020019184600183028401116401000000008311171561140d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613eec565b005b34801561146d57600080fd5b506114b06004803603602081101561148457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fcb565b6040518082815260200191505060405180910390f35b3480156114d257600080fd5b50611535600480360360408110156114e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fe3565b6040518082815260200191505060405180910390f35b34801561155757600080fd5b506115846004803603602081101561156e57600080fd5b810190808035906020019092919050505061406a565b005b34801561159257600080fd5b5061159b6142c0565b005b3480156115a957600080fd5b506115b2614328565b604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390f35b3480156115f357600080fd5b506116456004803603608081101561160a57600080fd5b81019080803515159060200190929190803562ffffff16906020019092919080359060200190929190803590602001909291905050506143a9565b005b6116896004803603602081101561165d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506143cb565b005b600082601060009054906101000a900460ff161561235657600033905068056bc75e2d63100000826116bb61339b565b0311611d9e5760011515600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514801561176a5750673782dace9d90000082600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540111155b61177357600080fd5b6117bc600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061180f86600a60ff166143f6565b9050600061181e8260036143f6565b9050600061182c838361440f565b9050600061183a898561440f565b9050600061184782612d14565b9050600068010000000000000000840290506000821180156118755750600d5461187383600d546143da565b115b61187e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16141580156118e757508b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614155b80156119345750600254600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b15611a5657611982600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a0e600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a71565b611a6084866143da565b935068010000000000000000840290505b6000600d541115611ad857611a88600d54836143da565b600d81905550600d5468010000000000000000850281611aa457fe5b04600e60008282540192505081905550600d5468010000000000000000850281611aca57fe5b048202810381039050611ae0565b81600d819055505b611b29600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508a73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58e86604051808381526020018281526020019250505060405180910390a38c73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a382995050505050505050612354565b6000601060006101000a81548160ff0219169083151502179055506000611dc986600a60ff166143f6565b90506000611dd88260036143f6565b90506000611de6838361440f565b90506000611df4898561440f565b90506000611e0182612d14565b905060006801000000000000000084029050600082118015611e2f5750600d54611e2d83600d546143da565b115b611e3857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614158015611ea157508b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614155b8015611eee5750600254600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b1561201057611f3c600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fc8600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061202b565b61201a84866143da565b935068010000000000000000840290505b6000600d54111561209257612042600d54836143da565b600d81905550600d546801000000000000000085028161205e57fe5b04600e60008282540192505081905550600d546801000000000000000085028161208457fe5b04820281038103905061209a565b81600d819055505b6120e3600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508a73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58e86604051808381526020018281526020019250505060405180910390a38c73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3829950505050505050505b505b600061236685600a60ff166143f6565b905060006123758260036143f6565b90506000612383838361440f565b90506000612391888561440f565b9050600061239e82612d14565b9050600068010000000000000000840290506000821180156123cc5750600d546123ca83600d546143da565b115b6123d557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415801561243e57508a73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b801561248b5750600254600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b156125ad576124d9600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612565600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125c8565b6125b784866143da565b935068010000000000000000840290505b6000600d54111561262f576125df600d54836143da565b600d81905550600d54680100000000000000008502816125fb57fe5b04600e60008282540192505081905550600d546801000000000000000085028161262157fe5b048202810381039050612637565b81600d819055505b612680600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508973ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58d86604051808381526020018281526020019250505060405180910390a38b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a382985050505050505050509392505050565b600068010000000000000000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600e5402038161299057fe5b049050919050565b60008054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a2e5780601f10612a0357610100808354040283529160200191612a2e565b820191906000526020600020905b815481529060010190602001808311612a1157829003601f168201915b505050505081565b6000612a43338484614426565b6001905092915050565b600080612a5a6001613317565b90506000612a6c82600a60ff166143f6565b90506000612a7a838361440f565b90506000612a8782612d14565b90508094505050505090565b600080612aa483600a60ff166143f6565b90506000612ab2848361440f565b90506000612abf82612d14565b9050809350505050919050565b6000600d54905090565b6000600d54821115612ae757600080fd5b612aef6138a5565b821115612afb57600080fd5b6000612b0683613e48565b905060003390506000612b24612b1c8684612eaf565b846064613b81565b90506000612b4882612b43612b39878661440f565b600a60ff166143f6565b6143da565b90506000612b56858361440f565b90508095505050505050919050565b612b718383338461461d565b505050565b600080612bff601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461440f565b9050612c0c858585614787565b612c17853383614426565b60019150509392505050565b600081600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550336008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b601060009054906101000a900460ff1681565b60006008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080670de0b6b3a764000064174876e8000290506000600d546402540be400612d8a612d84600d54866402540be40060020202026002600d540a60026402540be4000a02670de0b6b3a76400008a02670de0b6b3a76400006402540be40002600202026002890a010101614ce3565b8561440f565b81612d9157fe5b040390508092505050919050565b601281565b60008060003390506000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101549350935050509091565b600080612e8c601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846143da565b9050612e99338583614426565b600191505092915050565b612ead33614d28565b565b600080612eba6138a5565b11612ec457600080fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054831115612f1057600080fd5b60008090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008090505b82600101548211613093576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110612fbe57fe5b906000526020600020906003020190506000612fe28260000154836002015461440f565b90506000612ff08a8861440f565b90508082101561302557818701965061301e84613019613013866001015461346d565b85614f03565b6143da565b935061307e565b8082116130555761304b84613046613040866001015461346d565b84614f03565b6143da565b9350505050613093565b6130748461306f613069866001015461346d565b84614f03565b6143da565b9350505050613093565b6130898560016143da565b9450505050612f67565b61309d81886143f6565b94505050505092915050565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600d5414156130fc576402540be40064174876e800039050613138565b600061310f670de0b6b3a7640000613e48565b9050600061312182600a60ff166143f6565b9050600061312f838361440f565b90508093505050505b90565b6000806000339050600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492509250509091565b6000600d548211156131dd57600080fd5b6131e56138a5565b8211156131f157600080fd5b600061320183600a60ff166143f6565b9050600061320f848361440f565b90508092505050919050565b60025481565b6000806000803390506000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020868154811061327657fe5b9060005260206000209060030201905080600001548160010154826002015494509450945050509193909250565b60036020528060005260406000206000915054906101000a900460ff1681565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff806132f157fe5b8486099050838502925082810391508281101561330f576001820391505b509250929050565b600080339050826133305761332b816128f8565b61337b565b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613379826128f8565b015b915050919050565b60076020528060005260406000206000915090505481565b600047905090565b600a6020528060005260406000206000915090505481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600080824203905062278d0081111561348a5760009150506134ba565b621a5e0081111561349f5760199150506134ba565b620d2f008111156134b45760329150506134ba565b604b9150505b919050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b816002819055505050565b600080600d5414156135ae576402540be40064174876e8000190506135e3565b60006135c1670de0b6b3a7640000613e48565b905060006135db82600a60ff166001600a0360ff16613b81565b905080925050505b90565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166136aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b81600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154118015613762575080600001544210155b15613898576000613772846128f8565b905081600201548111801561378a5750816001015481115b156138965768010000000000000000826001015402600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508160030160009054906101000a900462ffffff1662ffffff1660018360030160009054906101000a900462ffffff1662ffffff16846000015442038161382d57fe5b040102826000016000828254019250508190555061384a84614f3a565b3373ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f19350505050158015613894573d6000803e3d6000fd5b505b505b8060000154915050919050565b6000803390506138b481613404565b91505090565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156139505780601f1061392557610100808354040283529160200191613950565b820191906000526020600020905b81548152906001019060200180831161393357829003601f168201915b505050505081565b6000806139e1601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461440f565b90506139ee338583614426565b600191505092915050565b6000806000806000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260030160009054906101000a900462ffffff1683600201549450945094509450509193509193565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b6000601060006101000a81548160ff02191690831515021790555050565b600080613b626138a5565b11613b6c57600080fd5b613b77338484614787565b6001905092915050565b6000806000613b9086866132c4565b91509150838110613ba057600080fd5b60008480613baa57fe5b868809905082811115613bbe576001820391505b808303925060008560000386169050808681613bd657fe5b049550808481613be257fe5b0493506001818260000381613bf357fe5b04018302840193506000600190508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808502955050505050509392505050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613d26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b8160019080519060200190613d3c9291906155bd565b505050565b60003390506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115613e4557601160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160006101000a81549062ffffff021916905550508073ffffffffffffffffffffffffffffffffffffffff167f6214dbd07605045f34f5c5c9a7e8cb3a40ed431c434bf262b1d0a9b485abaebe60405160405180910390a25b50565b600080670de0b6b3a7640000830190506000670de0b6b3a7640000600d540190506000670de0b6b3a7640000613ed7670de0b6b3a764000085036402540be400670de0b6b3a76400008681613e9957fe5b046402540be4000264174876e8000103026002670de0b6b3a7640000876002890a0381613ec257fe5b046402540be4000281613ed157fe5b0461440f565b81613ede57fe5b049050809350505050919050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613fb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b8160009080519060200190613fc69291906155bd565b505050565b60096020528060005260406000206000915090505481565b6000601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006140746138a5565b1161407e57600080fd5b6000339050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156140cf57600080fd5b600082905060006140df82613e48565b905060006140f86140f086866150e1565b836064613b81565b9050600061411c8261411761410d868661440f565b600a60ff166143f6565b6143da565b9050600061412a848361440f565b9050614138600d548661440f565b600d81905550614187600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548661440f565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600068010000000000000000820286600e540201905080600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506000600d54111561426057614259600e546142548568010000000000000000600d54613b81565b6143da565b600e819055505b8673ffffffffffffffffffffffffffffffffffffffff167fc4823739c5787d2ca17e404aa47d5569ae71dfb49cbf21b3f6152ed238a311398784604051808381526020018281526020019250505060405180910390a25050505050505050565b60003390506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561431c5761431b8161406a565b5b614324612ea4565b5050565b60008060008060003390506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260030160009054906101000a900462ffffff1683600201549550955095509550505090919293565b6143b233614f3a565b83156143c5576143c48383338461461d565b5b50505050565b6143d633348361168b565b5050565b6000808284019050838110156143ec57fe5b8091505092915050565b60008082848161440257fe5b0490508091505092915050565b60008282111561441b57fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156144ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806156cd6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614532576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806156866022913960400191505060405180910390fd5b80601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b60405180608001604052808562ffffff16420181526020018481526020018281526020018562ffffff16815250601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548162ffffff021916908362ffffff1602179055509050508173ffffffffffffffffffffffffffffffffffffffff167f4bf1c14e646c965eb2b35b7e0d08e65d0044d5d5a1eaf7f80f5f161688c34579601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154858785604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390a250505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561480d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806156a86025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614893576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806156636023913960400191505060405180910390fd5b601060009054906101000a900460ff161580156148ef5750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111155b6148f857600080fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614943856128f8565b0111156149545761495383614d28565b5b61495e8184615395565b600061496e82600a60ff166143f6565b9050600061497c838361440f565b9050600061498983613e48565b9050614997600d548461440f565b600d819055506149e6600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561440f565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614a72600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555083600e5402600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600e5402600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550614c70600e54614c6b8368010000000000000000600d54613b81565b6143da565b600e819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050565b60008060026001840181614cf357fe5b0490508291505b81811015614d2257809150600281828581614d1157fe5b040181614d1a57fe5b049050614cfa565b50919050565b6000614d33826128f8565b90506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054820111614d8357600080fd5b680100000000000000008102600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054810190506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008290508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015614eaf573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff167fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc836040518082815260200191505060405180910390a2505050565b600080831415614f165760009050614f34565b6000828402905082848281614f2757fe5b0414614f2f57fe5b809150505b92915050565b6000614f45826128f8565b90506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054820111614f9557600080fd5b680100000000000000008102600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054810190506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006150848383600061168b565b90508273ffffffffffffffffffffffffffffffffffffffff167fbe339fc14b041c2b0e0f3dd2cd325d0c3668b78378001e53160eab36153264588383604051808381526020018281526020019250505060405180910390a2505050565b6000806150ec6138a5565b116150f657600080fd5b60008090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008090505b8260010154821161537f576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106151a457fe5b9060005260206000209060030201905060006151c88260000154836002015461440f565b905060006151d68a8861440f565b90508082101561527e578187019650615204846151ff6151f9866001015461346d565b85614f03565b6143da565b9350600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061525057fe5b9060005260206000209060030201600080820160009055600182016000905560028201600090555050615371565b80821161532d576152a48461529f615299866001015461346d565b84614f03565b6143da565b9350600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106152f057fe5b906000526020600020906003020160008082016000905560018201600090556002820160009055505060018501866000018190555050505061537f565b61534c84615347615341866001015461346d565b84614f03565b6143da565b935080836002016000828254019250508190555084866000018190555050505061537f565b60018501945050505061514d565b61538981886143f6565b94505050505092915050565b60008090506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490505b816001015481116155b6576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061543e57fe5b9060005260206000209060030201905060006154628260000154836002015461440f565b90506000615470888761440f565b9050808210156154f7578186019550600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106154c957fe5b90600052602060002090600302016000808201600090556001820160009055600282016000905550506155a8565b80821161558557600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061554857fe5b90600052602060002090600302016000808201600090556001820160009055600282016000905550506001840185600001819055505050506155b6565b8083600201600082825401925050819055508385600001819055505050506155b6565b6001840193505050506153e7565b5050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106155fe57805160ff191683800117855561562c565b8280016001018555821561562c579182015b8281111561562b578251825591602001919060010190615610565b5b509050615639919061563d565b5090565b61565f91905b8082111561565b576000816000905550600101615643565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a723158202c4790f7928bf9a3a45a9f8993b6a67a03c0e30cb3eae470bc64181e301607b864736f6c634300050f0032

Deployed Bytecode

0x60806040526004361061036a5760003560e01c80636b2f4632116101c6578063a8e04f34116100f7578063c664f7f111610095578063e9fad8ee1161006f578063e9fad8ee14611586578063ec536a171461159d578063ee7743ca146115e7578063f088d547146116475761036a565b8063c664f7f114611461578063dd62ed3e146114c6578063e4849b321461154b5761036a565b8063b84c8246116100d1578063b84c82461461126b578063bbcb15cc14611333578063bf3b397b1461134a578063c47f0027146113995761036a565b8063a8e04f341461117e578063a9059cbb14611195578063aa9a0912146112085761036a565b80638620410b11610164578063949e8acd1161013e578063949e8acd14610fcc57806395d89b4114610ff7578063a457c2d714611087578063a7c73c3e146110fa5761036a565b80638620410b14610edf57806387c9505814610f0a5780638d12530f14610f675761036a565b806370a08231116101a057806370a0823114610d8757806376be158514610dec5780637ad20cac14610e555780638328b61014610ea45761036a565b80636b2f463214610c925780636d93805814610cbd5780636dc7bed014610d225761036a565b8063380169ea116102a0578063542f76a51161023e5780636122d906116102185780636122d90614610b1357806367a4a3dd14610b7c578063688abbf714610bdc5780636988a3ef14610c2d5761036a565b8063542f76a514610a3c57806356d399e814610a8b5780635db6d1d214610ab65761036a565b80634193d03a1161027a5780634193d03a146108f5578063452cf42d146109645780634b750334146109df5780634c33047114610a0a5761036a565b8063380169ea14610839578063395093511461086b5780633ccfd60b146108de5761036a565b8063229f465d1161030d57806327defa1f116102e757806327defa1f1461070f5780632a2d2b971461073e5780632a9121c7146107b9578063313ce567146108085761036a565b8063229f465d146105d557806323b872dd1461062957806323d114be146106bc5761036a565b80630ad0385a116103495780630ad0385a146104e157806310d0ffdd1461050c57806318160ddd1461055b57806322609373146105865761036a565b806265318b1461037957806306fdde03146103de578063095ea7b31461046e575b6103763334600061168b565b50005b34801561038557600080fd5b506103c86004803603602081101561039c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f8565b6040518082815260200191505060405180910390f35b3480156103ea57600080fd5b506103f3612998565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610433578082015181840152602081019050610418565b50505050905090810190601f1680156104605780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561047a57600080fd5b506104c76004803603604081101561049157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a36565b604051808215151515815260200191505060405180910390f35b3480156104ed57600080fd5b506104f6612a4d565b6040518082815260200191505060405180910390f35b34801561051857600080fd5b506105456004803603602081101561052f57600080fd5b8101908080359060200190929190505050612a93565b6040518082815260200191505060405180910390f35b34801561056757600080fd5b50610570612acc565b6040518082815260200191505060405180910390f35b34801561059257600080fd5b506105bf600480360360208110156105a957600080fd5b8101908080359060200190929190505050612ad6565b6040518082815260200191505060405180910390f35b3480156105e157600080fd5b50610627600480360360608110156105f857600080fd5b81019080803562ffffff1690602001909291908035906020019092919080359060200190929190505050612b65565b005b34801561063557600080fd5b506106a26004803603606081101561064c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b76565b604051808215151515815260200191505060405180910390f35b3480156106c857600080fd5b506106f5600480360360208110156106df57600080fd5b8101908080359060200190929190505050612c23565b604051808215151515815260200191505060405180910390f35b34801561071b57600080fd5b50610724612cc4565b604051808215151515815260200191505060405180910390f35b34801561074a57600080fd5b506107776004803603602081101561076157600080fd5b8101908080359060200190929190505050612cd7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107c557600080fd5b506107f2600480360360208110156107dc57600080fd5b8101908080359060200190929190505050612d14565b6040518082815260200191505060405180910390f35b34801561081457600080fd5b5061081d612d9f565b604051808260ff1660ff16815260200191505060405180910390f35b34801561084557600080fd5b5061084e612da4565b604051808381526020018281526020019250505060405180910390f35b34801561087757600080fd5b506108c46004803603604081101561088e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e03565b604051808215151515815260200191505060405180910390f35b3480156108ea57600080fd5b506108f3612ea4565b005b34801561090157600080fd5b5061094e6004803603604081101561091857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612eaf565b6040518082815260200191505060405180910390f35b34801561097057600080fd5b5061099d6004803603602081101561098757600080fd5b81019080803590602001909291905050506130a9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109eb57600080fd5b506109f46130dc565b6040518082815260200191505060405180910390f35b348015610a1657600080fd5b50610a1f61313b565b604051808381526020018281526020019250505060405180910390f35b348015610a4857600080fd5b50610a7560048036036020811015610a5f57600080fd5b81019080803590602001909291905050506131cc565b6040518082815260200191505060405180910390f35b348015610a9757600080fd5b50610aa061321b565b6040518082815260200191505060405180910390f35b348015610ac257600080fd5b50610aef60048036036020811015610ad957600080fd5b8101908080359060200190929190505050613221565b60405180848152602001838152602001828152602001935050505060405180910390f35b348015610b1f57600080fd5b50610b6260048036036020811015610b3657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132a4565b604051808215151515815260200191505060405180910390f35b348015610b8857600080fd5b50610bbf60048036036040811015610b9f57600080fd5b8101908080359060200190929190803590602001909291905050506132c4565b604051808381526020018281526020019250505060405180910390f35b348015610be857600080fd5b50610c1760048036036020811015610bff57600080fd5b81019080803515159060200190929190505050613317565b6040518082815260200191505060405180910390f35b348015610c3957600080fd5b50610c7c60048036036020811015610c5057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613383565b6040518082815260200191505060405180910390f35b348015610c9e57600080fd5b50610ca761339b565b6040518082815260200191505060405180910390f35b348015610cc957600080fd5b50610d0c60048036036020811015610ce057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133a3565b6040518082815260200191505060405180910390f35b348015610d2e57600080fd5b50610d7160048036036020811015610d4557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133bb565b6040518082815260200191505060405180910390f35b348015610d9357600080fd5b50610dd660048036036020811015610daa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613404565b6040518082815260200191505060405180910390f35b348015610df857600080fd5b50610e3b60048036036020811015610e0f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061344d565b604051808215151515815260200191505060405180910390f35b348015610e6157600080fd5b50610e8e60048036036020811015610e7857600080fd5b810190808035906020019092919050505061346d565b6040518082815260200191505060405180910390f35b348015610eb057600080fd5b50610edd60048036036020811015610ec757600080fd5b81019080803590602001909291905050506134bf565b005b348015610eeb57600080fd5b50610ef461358e565b6040518082815260200191505060405180910390f35b348015610f1657600080fd5b50610f6560048036036040811015610f2d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506135e6565b005b348015610f7357600080fd5b50610fb660048036036020811015610f8a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613706565b6040518082815260200191505060405180910390f35b348015610fd857600080fd5b50610fe16138a5565b6040518082815260200191505060405180910390f35b34801561100357600080fd5b5061100c6138ba565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561104c578082015181840152602081019050611031565b50505050905090810190601f1680156110795780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561109357600080fd5b506110e0600480360360408110156110aa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613958565b604051808215151515815260200191505060405180910390f35b34801561110657600080fd5b506111496004803603602081101561111d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139f9565b604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390f35b34801561118a57600080fd5b50611193613a75565b005b3480156111a157600080fd5b506111ee600480360360408110156111b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613b57565b604051808215151515815260200191505060405180910390f35b34801561121457600080fd5b506112556004803603606081101561122b57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050613b81565b6040518082815260200191505060405180910390f35b34801561127757600080fd5b506113316004803603602081101561128e57600080fd5b81019080803590602001906401000000008111156112ab57600080fd5b8201836020820111156112bd57600080fd5b803590602001918460018302840111640100000000831117156112df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613c62565b005b34801561133f57600080fd5b50611348613d41565b005b34801561135657600080fd5b506113836004803603602081101561136d57600080fd5b8101908080359060200190929190505050613e48565b6040518082815260200191505060405180910390f35b3480156113a557600080fd5b5061145f600480360360208110156113bc57600080fd5b81019080803590602001906401000000008111156113d957600080fd5b8201836020820111156113eb57600080fd5b8035906020019184600183028401116401000000008311171561140d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613eec565b005b34801561146d57600080fd5b506114b06004803603602081101561148457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fcb565b6040518082815260200191505060405180910390f35b3480156114d257600080fd5b50611535600480360360408110156114e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613fe3565b6040518082815260200191505060405180910390f35b34801561155757600080fd5b506115846004803603602081101561156e57600080fd5b810190808035906020019092919050505061406a565b005b34801561159257600080fd5b5061159b6142c0565b005b3480156115a957600080fd5b506115b2614328565b604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390f35b3480156115f357600080fd5b506116456004803603608081101561160a57600080fd5b81019080803515159060200190929190803562ffffff16906020019092919080359060200190929190803590602001909291905050506143a9565b005b6116896004803603602081101561165d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506143cb565b005b600082601060009054906101000a900460ff161561235657600033905068056bc75e2d63100000826116bb61339b565b0311611d9e5760011515600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514801561176a5750673782dace9d90000082600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540111155b61177357600080fd5b6117bc600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061180f86600a60ff166143f6565b9050600061181e8260036143f6565b9050600061182c838361440f565b9050600061183a898561440f565b9050600061184782612d14565b9050600068010000000000000000840290506000821180156118755750600d5461187383600d546143da565b115b61187e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16141580156118e757508b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614155b80156119345750600254600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b15611a5657611982600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a0e600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a71565b611a6084866143da565b935068010000000000000000840290505b6000600d541115611ad857611a88600d54836143da565b600d81905550600d5468010000000000000000850281611aa457fe5b04600e60008282540192505081905550600d5468010000000000000000850281611aca57fe5b048202810381039050611ae0565b81600d819055505b611b29600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508a73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58e86604051808381526020018281526020019250505060405180910390a38c73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a382995050505050505050612354565b6000601060006101000a81548160ff0219169083151502179055506000611dc986600a60ff166143f6565b90506000611dd88260036143f6565b90506000611de6838361440f565b90506000611df4898561440f565b90506000611e0182612d14565b905060006801000000000000000084029050600082118015611e2f5750600d54611e2d83600d546143da565b115b611e3857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614158015611ea157508b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614155b8015611eee5750600254600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b1561201057611f3c600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fc8600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600a60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061202b565b61201a84866143da565b935068010000000000000000840290505b6000600d54111561209257612042600d54836143da565b600d81905550600d546801000000000000000085028161205e57fe5b04600e60008282540192505081905550600d546801000000000000000085028161208457fe5b04820281038103905061209a565b81600d819055505b6120e3600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508a73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58e86604051808381526020018281526020019250505060405180910390a38c73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3829950505050505050505b505b600061236685600a60ff166143f6565b905060006123758260036143f6565b90506000612383838361440f565b90506000612391888561440f565b9050600061239e82612d14565b9050600068010000000000000000840290506000821180156123cc5750600d546123ca83600d546143da565b115b6123d557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161415801561243e57508a73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b801561248b5750600254600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b156125ad576124d9600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612565600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866143da565b600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506125c8565b6125b784866143da565b935068010000000000000000840290505b6000600d54111561262f576125df600d54836143da565b600d81905550600d54680100000000000000008502816125fb57fe5b04600e60008282540192505081905550600d546801000000000000000085028161262157fe5b048202810381039050612637565b81600d819055505b612680600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555060008183600e540203905080600b60008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508973ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58d86604051808381526020018281526020019250505060405180910390a38b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a382985050505050505050509392505050565b600068010000000000000000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600e5402038161299057fe5b049050919050565b60008054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a2e5780601f10612a0357610100808354040283529160200191612a2e565b820191906000526020600020905b815481529060010190602001808311612a1157829003601f168201915b505050505081565b6000612a43338484614426565b6001905092915050565b600080612a5a6001613317565b90506000612a6c82600a60ff166143f6565b90506000612a7a838361440f565b90506000612a8782612d14565b90508094505050505090565b600080612aa483600a60ff166143f6565b90506000612ab2848361440f565b90506000612abf82612d14565b9050809350505050919050565b6000600d54905090565b6000600d54821115612ae757600080fd5b612aef6138a5565b821115612afb57600080fd5b6000612b0683613e48565b905060003390506000612b24612b1c8684612eaf565b846064613b81565b90506000612b4882612b43612b39878661440f565b600a60ff166143f6565b6143da565b90506000612b56858361440f565b90508095505050505050919050565b612b718383338461461d565b505050565b600080612bff601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461440f565b9050612c0c858585614787565b612c17853383614426565b60019150509392505050565b600081600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550336008600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b601060009054906101000a900460ff1681565b60006008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080670de0b6b3a764000064174876e8000290506000600d546402540be400612d8a612d84600d54866402540be40060020202026002600d540a60026402540be4000a02670de0b6b3a76400008a02670de0b6b3a76400006402540be40002600202026002890a010101614ce3565b8561440f565b81612d9157fe5b040390508092505050919050565b601281565b60008060003390506000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101549350935050509091565b600080612e8c601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846143da565b9050612e99338583614426565b600191505092915050565b612ead33614d28565b565b600080612eba6138a5565b11612ec457600080fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054831115612f1057600080fd5b60008090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008090505b82600101548211613093576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110612fbe57fe5b906000526020600020906003020190506000612fe28260000154836002015461440f565b90506000612ff08a8861440f565b90508082101561302557818701965061301e84613019613013866001015461346d565b85614f03565b6143da565b935061307e565b8082116130555761304b84613046613040866001015461346d565b84614f03565b6143da565b9350505050613093565b6130748461306f613069866001015461346d565b84614f03565b6143da565b9350505050613093565b6130898560016143da565b9450505050612f67565b61309d81886143f6565b94505050505092915050565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600d5414156130fc576402540be40064174876e800039050613138565b600061310f670de0b6b3a7640000613e48565b9050600061312182600a60ff166143f6565b9050600061312f838361440f565b90508093505050505b90565b6000806000339050600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492509250509091565b6000600d548211156131dd57600080fd5b6131e56138a5565b8211156131f157600080fd5b600061320183600a60ff166143f6565b9050600061320f848361440f565b90508092505050919050565b60025481565b6000806000803390506000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020868154811061327657fe5b9060005260206000209060030201905080600001548160010154826002015494509450945050509193909250565b60036020528060005260406000206000915054906101000a900460ff1681565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff806132f157fe5b8486099050838502925082810391508281101561330f576001820391505b509250929050565b600080339050826133305761332b816128f8565b61337b565b600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613379826128f8565b015b915050919050565b60076020528060005260406000206000915090505481565b600047905090565b600a6020528060005260406000206000915090505481565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600080824203905062278d0081111561348a5760009150506134ba565b621a5e0081111561349f5760199150506134ba565b620d2f008111156134b45760329150506134ba565b604b9150505b919050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b816002819055505050565b600080600d5414156135ae576402540be40064174876e8000190506135e3565b60006135c1670de0b6b3a7640000613e48565b905060006135db82600a60ff166001600a0360ff16613b81565b905080925050505b90565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166136aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b81600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b600080601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154118015613762575080600001544210155b15613898576000613772846128f8565b905081600201548111801561378a5750816001015481115b156138965768010000000000000000826001015402600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508160030160009054906101000a900462ffffff1662ffffff1660018360030160009054906101000a900462ffffff1662ffffff16846000015442038161382d57fe5b040102826000016000828254019250508190555061384a84614f3a565b3373ffffffffffffffffffffffffffffffffffffffff166108fc83600101549081150290604051600060405180830381858888f19350505050158015613894573d6000803e3d6000fd5b505b505b8060000154915050919050565b6000803390506138b481613404565b91505090565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156139505780601f1061392557610100808354040283529160200191613950565b820191906000526020600020905b81548152906001019060200180831161393357829003601f168201915b505050505081565b6000806139e1601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461440f565b90506139ee338583614426565b600191505092915050565b6000806000806000601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260030160009054906101000a900462ffffff1683600201549450945094509450509193509193565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613b39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b6000601060006101000a81548160ff02191690831515021790555050565b600080613b626138a5565b11613b6c57600080fd5b613b77338484614787565b6001905092915050565b6000806000613b9086866132c4565b91509150838110613ba057600080fd5b60008480613baa57fe5b868809905082811115613bbe576001820391505b808303925060008560000386169050808681613bd657fe5b049550808481613be257fe5b0493506001818260000381613bf357fe5b04018302840193506000600190508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808502955050505050509392505050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613d26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b8160019080519060200190613d3c9291906155bd565b505050565b60003390506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115613e4557601160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160006101000a81549062ffffff021916905550508073ffffffffffffffffffffffffffffffffffffffff167f6214dbd07605045f34f5c5c9a7e8cb3a40ed431c434bf262b1d0a9b485abaebe60405160405180910390a25b50565b600080670de0b6b3a7640000830190506000670de0b6b3a7640000600d540190506000670de0b6b3a7640000613ed7670de0b6b3a764000085036402540be400670de0b6b3a76400008681613e9957fe5b046402540be4000264174876e8000103026002670de0b6b3a7640000876002890a0381613ec257fe5b046402540be4000281613ed157fe5b0461440f565b81613ede57fe5b049050809350505050919050565b6000339050600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16613fb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f546869732061646472657373206973206e6f7420616e2061646d696e0000000081525060200191505060405180910390fd5b8160009080519060200190613fc69291906155bd565b505050565b60096020528060005260406000206000915090505481565b6000601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006140746138a5565b1161407e57600080fd5b6000339050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156140cf57600080fd5b600082905060006140df82613e48565b905060006140f86140f086866150e1565b836064613b81565b9050600061411c8261411761410d868661440f565b600a60ff166143f6565b6143da565b9050600061412a848361440f565b9050614138600d548661440f565b600d81905550614187600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548661440f565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600068010000000000000000820286600e540201905080600b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506000600d54111561426057614259600e546142548568010000000000000000600d54613b81565b6143da565b600e819055505b8673ffffffffffffffffffffffffffffffffffffffff167fc4823739c5787d2ca17e404aa47d5569ae71dfb49cbf21b3f6152ed238a311398784604051808381526020018281526020019250505060405180910390a25050505050505050565b60003390506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561431c5761431b8161406a565b5b614324612ea4565b5050565b60008060008060003390506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260030160009054906101000a900462ffffff1683600201549550955095509550505090919293565b6143b233614f3a565b83156143c5576143c48383338461461d565b5b50505050565b6143d633348361168b565b5050565b6000808284019050838110156143ec57fe5b8091505092915050565b60008082848161440257fe5b0490508091505092915050565b60008282111561441b57fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156144ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806156cd6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614532576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806156866022913960400191505060405180910390fd5b80601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b60405180608001604052808562ffffff16420181526020018481526020018281526020018562ffffff16815250601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548162ffffff021916908362ffffff1602179055509050508173ffffffffffffffffffffffffffffffffffffffff167f4bf1c14e646c965eb2b35b7e0d08e65d0044d5d5a1eaf7f80f5f161688c34579601160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154858785604051808581526020018481526020018362ffffff1662ffffff16815260200182815260200194505050505060405180910390a250505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561480d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806156a86025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614893576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806156636023913960400191505060405180910390fd5b601060009054906101000a900460ff161580156148ef5750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111155b6148f857600080fd5b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614943856128f8565b0111156149545761495383614d28565b5b61495e8184615395565b600061496e82600a60ff166143f6565b9050600061497c838361440f565b9050600061498983613e48565b9050614997600d548461440f565b600d819055506149e6600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561440f565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614a72600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836143da565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180606001604052808481526020014281526020016000815250908060018154018082558091505090600182039060005260206000209060030201600090919290919091506000820151816000015560208201518160010155604082015181600201555050506001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000828254019250508190555083600e5402600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600e5402600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550614c70600e54614c6b8368010000000000000000600d54613b81565b6143da565b600e819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050565b60008060026001840181614cf357fe5b0490508291505b81811015614d2257809150600281828581614d1157fe5b040181614d1a57fe5b049050614cfa565b50919050565b6000614d33826128f8565b90506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054820111614d8357600080fd5b680100000000000000008102600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054810190506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008290508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015614eaf573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff167fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc836040518082815260200191505060405180910390a2505050565b600080831415614f165760009050614f34565b6000828402905082848281614f2757fe5b0414614f2f57fe5b809150505b92915050565b6000614f45826128f8565b90506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054820111614f9557600080fd5b680100000000000000008102600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054810190506000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006150848383600061168b565b90508273ffffffffffffffffffffffffffffffffffffffff167fbe339fc14b041c2b0e0f3dd2cd325d0c3668b78378001e53160eab36153264588383604051808381526020018281526020019250505060405180910390a2505050565b6000806150ec6138a5565b116150f657600080fd5b60008090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000154905060008090505b8260010154821161537f576000600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106151a457fe5b9060005260206000209060030201905060006151c88260000154836002015461440f565b905060006151d68a8861440f565b90508082101561527e578187019650615204846151ff6151f9866001015461346d565b85614f03565b6143da565b9350600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020858154811061525057fe5b9060005260206000209060030201600080820160009055600182016000905560028201600090555050615371565b80821161532d576152a48461529f615299866001015461346d565b84614f03565b6143da565b9350600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002085815481106152f057fe5b906000526020600020906003020160008082016000905560018201600090556002820160009055505060018501866000018190555050505061537f565b61534c84615347615341866001015461346d565b84614f03565b6143da565b935080836002016000828254019250508190555084866000018190555050505061537f565b60018501945050505061514d565b61538981886143f6565b94505050505092915050565b60008090506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490505b816001015481116155b6576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061543e57fe5b9060005260206000209060030201905060006154628260000154836002015461440f565b90506000615470888761440f565b9050808210156154f7578186019550600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481106154c957fe5b90600052602060002090600302016000808201600090556001820160009055600282016000905550506155a8565b80821161558557600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020848154811061554857fe5b90600052602060002090600302016000808201600090556001820160009055600282016000905550506001840185600001819055505050506155b6565b8083600201600082825401925050819055508385600001819055505050506155b6565b6001840193505050506153e7565b5050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106155fe57805160ff191683800117855561562c565b8280016001018555821561562c579182015b8281111561562b578251825591602001919060010190615610565b5b509050615639919061563d565b5090565b61565f91905b8082111561565b576000816000905550600101615643565b5090565b9056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a723158202c4790f7928bf9a3a45a9f8993b6a67a03c0e30cb3eae470bc64181e301607b864736f6c634300050f0032

Deployed Bytecode Sourcemap

459:44901:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8790:49;8805:10;8817:9;8836:1;8790:14;:49::i;:::-;;459:44901;16302:339;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16302:339:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16302: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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40192:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40192:148:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40192:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18332:387;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18332:387:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17938:386;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17938:386:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17938:386:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14953:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14953:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18837:809;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18837:809:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18837:809:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35555:305;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35555:305:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35555:305:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40348:361;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40348:361:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40348:361:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12942:200;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12942:200:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12942:200:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6600:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6600:34:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13150:173;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13150:173:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13150:173:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22852:1081;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22852:1081:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22852:1081:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4361:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4361:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13840:244;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13840:244:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;44196:306;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44196:306:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44196:306:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10056:67;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10056:67:0;;;:::i;:::-;;20153:2031;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20153:2031:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20153:2031:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5875:57;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5875:57:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5875:57:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;16911:429;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16911:429:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13511:251;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13511:251:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;19654:411;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19654:411:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19654:411:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4724:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4724:41:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14092:495;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14092:495:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14092: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;:::-;;;;;;;;;;;;;;;;;;;;;;;34136:241;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34136:241:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34136:241:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;15618:375;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15618:375:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15618:375:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5818:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5818:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5818:50:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14777:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14777:109:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6072:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6072:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6072:50:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13331:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13331:172:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13331:172:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16077:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16077:138:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16077:138:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6395:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6395:46:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6395:46:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22276:376;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22276:376:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22276:376:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12389:161;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12389:161:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12389:161:0;;;;;;;;;;;;;;;;;:::i;:::-;;17434:388;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17434:388:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12118:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12118:167:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12118:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36625:1490;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36625:1490:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36625:1490:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15119:151;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15119: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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44588:316;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44588:316:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44588:316:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38907:549;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38907:549:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38907:549:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12010:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12010:100:0;;;:::i;:::-;;40717:223;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40717:223:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40717:223:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34467:640;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34467:640:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34467:640:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12776:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12776:104:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12776:104:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;12776:104:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12776: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;12776: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;;12776:104:0;;;;;;;;;;;;;;;:::i;:::-;;39530:356;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39530:356:0;;;:::i;:::-;;24099:568;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24099:568:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24099:568:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12615:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12615:96:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12615:96:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;12615:96:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12615: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;12615: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;;12615:96:0;;;;;;;;;;;;;;;:::i;:::-;;5978:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5978:51:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5978:51:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40018:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40018:166:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40018:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10187:1626;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10187:1626:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10187:1626:0;;;;;;;;;;;;;;;;;:::i;:::-;;9721:262;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9721:262:0;;;:::i;:::-;;38222:571;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38222:571:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9179:476;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9179:476:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;9179:476:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8981:118;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8981:118:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;24825:3424;25009:7;24981:17;1626:15;;;;;;;;;;;1622:1136;;;1658:24;1685:10;1658:37;;4968: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:4;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;;;;25052:27;25095:45;25108:17;4442:2;25095:45;;:12;:45::i;:::-;25052:88;;25151:22;25176:36;25189:19;25210:1;25176:12;:36::i;:::-;25151:61;;25223:18;25244:49;25257:19;25278:14;25244:12;:49::i;:::-;25223:70;;25304:22;25342:52;25355:17;25374:19;25342:12;:52::i;:::-;25304:90;;25405:23;25431:33;25449:14;25431:17;:33::i;:::-;25405:59;;25475:12;4636:5;25490:10;:22;25475:37;;25565:1;25547:15;:19;:98;;;;;25633:12;;25587:43;25600:15;25617:12;;25587;:43::i;:::-;:58;25547:98;25525:131;;;;;;25760:1;25737:25;;:11;:25;;;;:73;;;;;25794:16;25779:31;;:11;:31;;;;25737:73;:144;;;;;25863:18;;25827:19;:32;25847:11;25827:32;;;;;;;;;;;;;;;;:54;;25737:144;25719:767;;;25978:108;26009:16;:29;26026:11;26009:29;;;;;;;;;;;;;;;;26057:14;25978:12;:108::i;:::-;25946:16;:29;25963:11;25946:29;;;;;;;;;;;;;;;:140;;;;26132:107;26163:15;:28;26179:11;26163:28;;;;;;;;;;;;;;;;26210:14;26132:12;:107::i;:::-;26101:15;:28;26117:11;26101:28;;;;;;;;;;;;;;;:138;;;;25719:767;;;26390:40;26403:10;26415:14;26390:12;:40::i;:::-;26377:53;;4636:5;26452:10;:22;26445:29;;25719:767;26517:1;26502:12;;:16;26498:721;;;26589:43;26602:12;;26616:15;26589:12;:43::i;:::-;26574:12;:58;;;;26821:12;;4636:5;26794:10;:22;26793:41;;;;;;26773:15;;:62;;;;;;;;;;;27089:12;;4636:5;27062:10;:22;27061:41;;;;;;27017:15;:86;26988:4;:116;26963:4;:142;26939:166;;26498:721;;;27192:15;27177:12;:30;;;;26498:721;27347:105;27374:19;:37;27394:16;27374:37;;;;;;;;;;;;;;;;27426:15;27347:12;:105::i;:::-;27307:19;:37;27327:16;27307:37;;;;;;;;;;;;;;;:145;;;;27463:30;:48;27494:16;27463:48;;;;;;;;;;;;;;;27531:55;;;;;;;;27550:15;27531:55;;;;27567:15;27531:55;;;;27584:1;27531:55;;;27463:134;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27463:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27663:1;27608:29;:47;27638:16;27608:47;;;;;;;;;;;;;;;:51;;;:56;;;;;;;;;;;27751:22;27834:4;27816:15;27798;;:33;:40;27751:88;;27882:15;27850:10;:28;27861:16;27850:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;28061:11;27938:145;;27968:16;27938:145;;;27999:17;28031:15;27938:145;;;;;;;;;;;;;;;;;;;;;;;;28149:16;28101:105;;28132:1;28101:105;;;28180:15;28101:105;;;;;;;;;;;;;;;;;;28226:15;28219:22;;;;;;;;;1712:1035;;;2706:5;2688:15;;:23;;;;;;;;;;;;;;;;;;25052:27;25095:45;25108:17;4442:2;25095:45;;:12;:45::i;:::-;25052:88;;25151:22;25176:36;25189:19;25210:1;25176:12;:36::i;:::-;25151:61;;25223:18;25244:49;25257:19;25278:14;25244:12;:49::i;:::-;25223:70;;25304:22;25342:52;25355:17;25374:19;25342:12;:52::i;:::-;25304:90;;25405:23;25431:33;25449:14;25431:17;:33::i;:::-;25405:59;;25475:12;4636:5;25490:10;:22;25475:37;;25565:1;25547:15;:19;:98;;;;;25633:12;;25587:43;25600:15;25617:12;;25587;:43::i;:::-;:58;25547:98;25525:131;;;;;;25760:1;25737:25;;:11;:25;;;;:73;;;;;25794:16;25779:31;;:11;:31;;;;25737:73;:144;;;;;25863:18;;25827:19;:32;25847:11;25827:32;;;;;;;;;;;;;;;;:54;;25737:144;25719:767;;;25978:108;26009:16;:29;26026:11;26009:29;;;;;;;;;;;;;;;;26057:14;25978:12;:108::i;:::-;25946:16;:29;25963:11;25946:29;;;;;;;;;;;;;;;:140;;;;26132:107;26163:15;:28;26179:11;26163:28;;;;;;;;;;;;;;;;26210:14;26132:12;:107::i;:::-;26101:15;:28;26117:11;26101:28;;;;;;;;;;;;;;;:138;;;;25719:767;;;26390:40;26403:10;26415:14;26390:12;:40::i;:::-;26377:53;;4636:5;26452:10;:22;26445:29;;25719:767;26517:1;26502:12;;:16;26498:721;;;26589:43;26602:12;;26616:15;26589:12;:43::i;:::-;26574:12;:58;;;;26821:12;;4636:5;26794:10;:22;26793:41;;;;;;26773:15;;:62;;;;;;;;;;;27089:12;;4636:5;27062:10;:22;27061:41;;;;;;27017:15;:86;26988:4;:116;26963:4;:142;26939:166;;26498:721;;;27192:15;27177:12;:30;;;;26498:721;27347:105;27374:19;:37;27394:16;27374:37;;;;;;;;;;;;;;;;27426:15;27347:12;:105::i;:::-;27307:19;:37;27327:16;27307:37;;;;;;;;;;;;;;;:145;;;;27463:30;:48;27494:16;27463:48;;;;;;;;;;;;;;;27531:55;;;;;;;;27550:15;27531:55;;;;27567:15;27531:55;;;;27584:1;27531:55;;;27463:134;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27463:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27663:1;27608:29;:47;27638:16;27608:47;;;;;;;;;;;;;;;:51;;;:56;;;;;;;;;;;27751:22;27834:4;27816:15;27798;;:33;:40;27751:88;;27882:15;27850:10;:28;27861:16;27850:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;28061:11;27938:145;;27968:16;27938:145;;;27999:17;28031:15;27938:145;;;;;;;;;;;;;;;;;;;;;;;;28149:16;28101:105;;28132:1;28101:105;;;28180:15;28101:105;;;;;;;;;;;;;;;;;;28226:15;28219:22;;;;;;;;;1712:1035;1622:1136;;25052:27;25095:45;25108:17;4442:2;25095:45;;:12;:45::i;:::-;25052:88;;25151:22;25176:36;25189:19;25210:1;25176:12;:36::i;:::-;25151:61;;25223:18;25244:49;25257:19;25278:14;25244:12;:49::i;:::-;25223:70;;25304:22;25342:52;25355:17;25374:19;25342:12;:52::i;:::-;25304:90;;25405:23;25431:33;25449:14;25431:17;:33::i;:::-;25405:59;;25475:12;4636:5;25490:10;:22;25475:37;;25565:1;25547:15;:19;:98;;;;;25633:12;;25587:43;25600:15;25617:12;;25587;:43::i;:::-;:58;25547:98;25525:131;;;;;;25760:1;25737:25;;:11;:25;;;;:73;;;;;25794:16;25779:31;;:11;:31;;;;25737:73;:144;;;;;25863:18;;25827:19;:32;25847:11;25827:32;;;;;;;;;;;;;;;;:54;;25737:144;25719:767;;;25978:108;26009:16;:29;26026:11;26009:29;;;;;;;;;;;;;;;;26057:14;25978:12;:108::i;:::-;25946:16;:29;25963:11;25946:29;;;;;;;;;;;;;;;:140;;;;26132:107;26163:15;:28;26179:11;26163:28;;;;;;;;;;;;;;;;26210:14;26132:12;:107::i;:::-;26101:15;:28;26117:11;26101:28;;;;;;;;;;;;;;;:138;;;;25719:767;;;26390:40;26403:10;26415:14;26390:12;:40::i;:::-;26377:53;;4636:5;26452:10;:22;26445:29;;25719:767;26517:1;26502:12;;:16;26498:721;;;26589:43;26602:12;;26616:15;26589:12;:43::i;:::-;26574:12;:58;;;;26821:12;;4636:5;26794:10;:22;26793:41;;;;;;26773:15;;:62;;;;;;;;;;;27089:12;;4636:5;27062:10;:22;27061:41;;;;;;27017:15;:86;26988:4;:116;26963:4;:142;26939:166;;26498:721;;;27192:15;27177:12;:30;;;;26498:721;27347:105;27374:19;:37;27394:16;27374:37;;;;;;;;;;;;;;;;27426:15;27347:12;:105::i;:::-;27307:19;:37;27327:16;27307:37;;;;;;;;;;;;;;;:145;;;;27463:30;:48;27494:16;27463:48;;;;;;;;;;;;;;;27531:55;;;;;;;;27550:15;27531:55;;;;27567:15;27531:55;;;;27584:1;27531:55;;;27463:134;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;27463:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27663:1;27608:29;:47;27638:16;27608:47;;;;;;;;;;;;;;;:51;;;:56;;;;;;;;;;;27751:22;27834:4;27816:15;27798;;:33;:40;27751:88;;27882:15;27850:10;:28;27861:16;27850:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;28061:11;27938:145;;27968:16;27938:145;;;27999:17;28031:15;27938:145;;;;;;;;;;;;;;;;;;;;;;;;28149:16;28101:105;;28132:1;28101:105;;;28180:15;28101:105;;;;;;;;;;;;;;;;;;28226:15;28219:22;;;;;;;;;24825:3424;;;;;;:::o;16302:339::-;16397:7;4636:5;16578:10;:28;16589:16;16578:28;;;;;;;;;;;;;;;;16519:19;:37;16539:16;16519:37;;;;;;;;;;;;;;;;16501:15;;:55;16470:136;16442:191;;;;;;16422:211;;16302:339;;;:::o;4272:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40192:148::-;40257:4;40274:36;40283:10;40295:7;40304:5;40274:8;:36::i;:::-;40328:4;40321:11;;40192:148;;;;:::o;18332:387::-;18390:7;18410:24;18437:17;18449:4;18437:11;:17::i;:::-;18410:44;;18465:18;18486:44;18499:16;4442:2;18486:44;;:12;:44::i;:::-;18465:65;;18541:22;18566:42;18579:16;18597:10;18566:12;:42::i;:::-;18541:67;;18619:23;18645:33;18663:14;18645:17;:33::i;:::-;18619:59;;18696:15;18689:22;;;;;;18332:387;:::o;17938:386::-;18045:7;18070:18;18091:44;18104:16;4442:2;18091:44;;:12;:44::i;:::-;18070:65;;18146:22;18171:42;18184:16;18202:10;18171:12;:42::i;:::-;18146:67;;18224:23;18250:33;18268:14;18250:17;:33::i;:::-;18224:59;;18301:15;18294:22;;;;;17938:386;;;:::o;14953:91::-;14997:7;15024:12;;15017:19;;14953:91;:::o;18837:809::-;18943:7;18993:12;;18976:13;:29;;18968:38;;;;;;19042:10;:8;:10::i;:::-;19025:13;:27;;19017:36;;;;;;19064:17;19084:32;19102:13;19084:17;:32::i;:::-;19064:52;;19127:24;19154:10;19127:37;;19177:15;19208:146;19233:56;19257:13;19272:16;19233:23;:56::i;:::-;19308:9;19336:3;19208:6;:146::i;:::-;19177:177;;19367:18;19401:132;19432:7;19458:60;19471:32;19484:9;19495:7;19471:12;:32::i;:::-;4442:2;19458:60;;:12;:60::i;:::-;19401:12;:132::i;:::-;19367:166;;19546:22;19571:35;19584:9;19595:10;19571:12;:35::i;:::-;19546:60;;19624:14;19617:21;;;;;;;18837:809;;;:::o;35555:305::-;35708:144;35741:6;35762:19;35796:10;35821:20;35708:18;:144::i;:::-;35555:305;;;:::o;40348:361::-;40471:4;40488:20;40524:53;40537:11;:19;40549:6;40537:19;;;;;;;;;;;;;;;:31;40557:10;40537:31;;;;;;;;;;;;;;;;40570:6;40524:12;:53::i;:::-;40488:89;;40590:36;40600:6;40608:9;40619:6;40590:9;:36::i;:::-;40637:42;40646:6;40654:10;40666:12;40637:8;:42::i;:::-;40697:4;40690:11;;;40348:361;;;;;:::o;12942:200::-;13001:4;13048:8;13018:15;:27;13034:10;13018:27;;;;;;;;;;;;;;;:38;;;;13102:10;13067:22;:32;13090:8;13067:32;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;13130:4;13123:11;;12942:200;;;:::o;6600:34::-;;;;;;;;;;;;;:::o;13150:173::-;13251:7;13283:22;:32;13306:8;13283:32;;;;;;;;;;;;;;;;;;;;;13276:39;;13150:173;;;:::o;22852:1081::-;22946:7;22971:26;23021:4;4498:5;23000:25;22971:54;;23036:23;23877:12;;4574:4;23095:735;23157:590;23707:12;;23649:18;4574:4;23544:1;:65;:123;:175;23504:1;23490:12;;:15;23447:1;4574:4;23421:27;23420:86;23377:4;23365:9;:16;23319:4;4574;23294:29;23252:1;:72;:130;23213:1;23193:18;:21;23192:191;:315;:528;23157:4;:590::i;:::-;23793:18;23095:12;:735::i;:::-;23076:796;;;;;;23075:815;23036:854;;23910:15;23903:22;;;;22852:1081;;;:::o;4361:35::-;4394:2;4361:35;:::o;13840:244::-;13882:7;13891;13911:24;13938:10;13911:37;;13959:21;13983:29;:47;14013:16;13983:47;;;;;;;;;;;;;;;13959:71;;14051:6;:12;;;14065:6;:10;;;14043:33;;;;;;13840:244;;:::o;44196:306::-;44294:4;44316:23;44355:58;44368:11;:23;44380:10;44368:23;;;;;;;;;;;;;;;:32;44392:7;44368:32;;;;;;;;;;;;;;;;44402:10;44355:12;:58::i;:::-;44316:97;;44426:46;44435:10;44447:7;44456:15;44426:8;:46::i;:::-;44490:4;44483:11;;;44196:306;;;;:::o;10056:67::-;10094:21;10104:10;10094:9;:21::i;:::-;10056:67::o;20153:2031::-;20300:7;698:1;685:10;:8;:10::i;:::-;:14;677:23;;;;;;20347:19;:37;20367:16;20347:37;;;;;;;;;;;;;;;;20328:15;:56;;20320:65;;;;;;20398:19;20420:1;20398:23;;20432:30;20478:29;:47;20508:16;20478:47;;;;;;;;;;;;;;;20432:93;;20536:15;20554;:21;;;20536:39;;20586:22;20611:1;20586:26;;20625:1489;20643:15;:19;;;20632:7;:30;20625:1489;;20679:38;20737:30;:48;20768:16;20737:48;;;;;;;;;;;;;;;20786:7;20737:57;;;;;;;;;;;;;;;;;;20679:115;;20809:23;20852:54;20865:11;:17;;;20884:11;:21;;;20852:12;:54::i;:::-;20809:97;;20923:22;20948:42;20961:15;20978:11;20948:12;:42::i;:::-;20923:67;;21029:14;21011:15;:32;21007:1045;;;21079:15;21064:30;;;;21130:235;21165:14;21202:144;21241:40;21259:11;:21;;;21241:17;:40::i;:::-;21308:15;21202:12;:144::i;:::-;21130:12;:235::i;:::-;21113:252;;21007:1045;;;21410:14;21391:15;:33;21387:665;;21462:234;21497:14;21534:143;21573:40;21591:11;:21;;;21573:17;:40::i;:::-;21640:14;21534:12;:143::i;:::-;21462:12;:234::i;:::-;21445:251;;21715:5;;;;;21387:665;21778:234;21813:14;21850:143;21889:40;21907:11;:21;;;21889:17;:40::i;:::-;21956:14;21850:12;:143::i;:::-;21778:12;:234::i;:::-;21761:251;;22031:5;;;;;21007:1045;22078:24;22091:7;22100:1;22078:12;:24::i;:::-;22068:34;;20625:1489;;;;;;22131:45;22144:14;22160:15;22131:12;:45::i;:::-;22124:52;;;;;;20153:2031;;;;:::o;5875:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;16911:429::-;16953:7;16993:1;16977:12;;:17;16973:360;;;4574:4;4498:5;17018:43;17011:50;;;;16973:360;17094:17;17114:23;17132:4;17114:17;:23::i;:::-;17094:43;;17152:18;17173:37;17186:9;4442:2;17173:37;;:12;:37::i;:::-;17152:58;;17225:22;17250:35;17263:9;17274:10;17250:12;:35::i;:::-;17225:60;;17307:14;17300:21;;;;;16911:429;;:::o;13511:251::-;13562:7;13571;13591:24;13618:10;13591:37;;13661:16;:34;13678:16;13661:34;;;;;;;;;;;;;;;;13710:15;:33;13726:16;13710:33;;;;;;;;;;;;;;;;13639:115;;;;;13511:251;;:::o;19654:411::-;19765:7;19817:12;;19798:15;:31;;19790:40;;;;;;19868:10;:8;:10::i;:::-;19849:15;:29;;19841:38;;;;;;19890:17;19910:43;19923:15;4442:2;19910:43;;:12;:43::i;:::-;19890:63;;19964:20;19987:40;20000:15;20017:9;19987:12;:40::i;:::-;19964:63;;20045:12;20038:19;;;;19654:411;;;:::o;4724:41::-;;;;:::o;14092:495::-;14208:7;14230;14252;14287:24;14314:10;14287:37;;14335:38;14389:30;:48;14420:16;14389:48;;;;;;;;;;;;;;;14438:7;14389:57;;;;;;;;;;;;;;;;;;14335:111;;14479:11;:17;;;14511:11;:21;;;14547:11;:21;;;14457:122;;;;;;;;14092:495;;;;;:::o;4801:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;34136:241::-;34223:9;34234;34261:10;34295:2;34274:25;;;;;34284:1;34281;34274:25;34261:38;;34318:1;34314;:5;34310:9;;34339:1;34334:2;:6;34330:10;;34360:1;34355:2;:6;34351:18;;;34368:1;34363:6;;;;34351:18;34136:241;;;;;;:::o;15618:375::-;15715:7;15740:24;15767:10;15740:37;;15808:21;:177;;15956:29;15968:16;15956:11;:29::i;:::-;15808:177;;;15902:16;:34;15919:16;15902:34;;;;;;;;;;;;;;;;15849:29;15861:16;15849:11;:29::i;:::-;:87;15808:177;15788:197;;;15618:375;;;:::o;5818:50::-;;;;;;;;;;;;;;;;;:::o;14777:109::-;14830:7;14857:21;14850:28;;14777:109;:::o;6072:50::-;;;;;;;;;;;;;;;;;:::o;13331:172::-;13435:7;13467:15;:28;13483:11;13467:28;;;;;;;;;;;;;;;;13460:35;;13331:172;;;:::o;16077:138::-;16143:7;16170:19;:37;16190:16;16170:37;;;;;;;;;;;;;;;;16163:44;;16077:138;;;:::o;6395:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;22276:376::-;22370:7;22395:11;22427:9;22409:15;:27;22395:41;;22459:7;22453:3;:13;22449:176;;;22490:1;22483:8;;;;;22449:176;22519:7;22513:3;:13;22509:116;;;22550:2;22543:9;;;;;22509:116;22580:7;22574:3;:13;22570:55;;;22611:2;22604:9;;;;;22570:55;22642:2;22635:9;;;22276:376;;;;:::o;12389:161::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12527:15;12506:18;:36;;;;12389:161;;:::o;17434:388::-;17475:7;17515:1;17499:12;;:17;17495:320;;;4574:4;4498:5;17540:43;17533:50;;;;17495:320;17616:17;17636:23;17654:4;17636:17;:23::i;:::-;17616:43;;17674:22;17716:51;17723:9;4442:2;17716:51;;17764:1;4442:2;17749:16;17716:51;;:6;:51::i;:::-;17674:93;;17789:14;17782:21;;;;17434:388;;:::o;12118:167::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12270:7;12240:14;:27;12255:11;12240:27;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;12118:167;;;:::o;36625:1490::-;36715:7;36740:31;36774:16;:34;36791:16;36774:34;;;;;;;;;;;;;;;36740:68;;36865:1;36839:5;:23;;;:27;:86;;;;;36902:5;:23;;;36883:15;:42;;36839:86;36821:1244;;;36984:18;37005:29;37017:16;37005:11;:29::i;:::-;36984:50;;37222:5;:26;;;37209:10;:39;:98;;;;;37282:5;:25;;;37269:10;:38;37209:98;37187:867;;;4636:5;37468;:25;;;:37;37405:10;:28;37416:16;37405:28;;;;;;;;;;;;;;;;:119;;;;;;;;;;;37780:5;:12;;;;;;;;;;;;37772:21;;37746:1;37729:5;:12;;;;;;;;;;;;37721:21;;37669:5;:23;;;37651:15;:41;37650:92;;;;;;37649:98;37648:145;37600:5;:23;;;:193;;;;;;;;;;;37895:27;37905:16;37895:9;:27::i;:::-;37992:10;:19;;:46;38012:5;:25;;;37992:46;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37992:46:0;37187:867;36821:1244;;38084:5;:23;;;38077:30;;;36625:1490;;;:::o;15119:151::-;15160:7;15180:24;15207:10;15180:37;;15235:27;15245:16;15235:9;:27::i;:::-;15228:34;;;15119:151;:::o;4324:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44588:316::-;44691:4;44713:23;44752:63;44765:11;:23;44777:10;44765:23;;;;;;;;;;;;;;;:32;44789:7;44765:32;;;;;;;;;;;;;;;;44799:15;44752:12;:63::i;:::-;44713:102;;44828:46;44837:10;44849:7;44858:15;44828:8;:46::i;:::-;44892:4;44885:11;;;44588:316;;;;:::o;38907:549::-;39027:7;39049;39071:6;39092:7;39127:44;39187:16;:34;39204:16;39187:34;;;;;;;;;;;;;;;39127:94;;39254:18;:36;;;39305:18;:38;;;39358:18;:25;;;;;;;;;;;;39398:18;:39;;;39232:216;;;;;;;;;38907:549;;;;;:::o;12010:100::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12097:5;12079:15;;:23;;;;;;;;;;;;;;;;;;12010:100;:::o;40717:223::-;40838:4;698:1;685:10;:8;:10::i;:::-;:14;677:23;;;;;;40860:50;40870:10;40882;40894:15;40860:9;:50::i;:::-;40928:4;40921:11;;40717:223;;;;:::o;34467:640::-;34571:7;34592:9;34603;34616:13;34624:1;34627;34616:7;:13::i;:::-;34591:38;;;;34652:1;34648;:5;34640:14;;;;;;34665:10;34691:1;34678:15;;;;;34688:1;34685;34678:15;34665:28;;34713:1;34708:2;:6;34704:18;;;34721:1;34716:6;;;;34704:18;34738:2;34733:7;;;;34751:12;34771:1;34770:2;;34766:1;:6;34751:21;;34788:4;34783:9;;;;;;;;;34808:4;34803:9;;;;;;;;;34850:1;34843:4;34835;34834:5;;34833:14;;;;;;:18;34828:1;:24;34823:29;;;;34863:9;34875:1;34863:13;;34900:1;34896;:5;34892:1;:9;34887:14;;;;34925:1;34921;:5;34917:1;:9;34912:14;;;;34950:1;34946;:5;34942:1;:9;34937:14;;;;34975:1;34971;:5;34967:1;:9;34962:14;;;;35000:1;34996;:5;34992:1;:9;34987:14;;;;35025:1;35021;:5;35017:1;:9;35012:14;;;;35050:1;35046;:5;35042:1;:9;35037:14;;;;35075:1;35071;:5;35067:1;:9;35062:14;;;;35098:1;35094;:5;35087:12;;;;;;;34467:640;;;;;:::o;12776:104::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12865:7;12856:6;:16;;;;;;;;;;;;:::i;:::-;;12776:104;;:::o;39530:356::-;39578:23;39604:10;39578:36;;39683:1;39629:16;:33;39646:15;39629:33;;;;;;;;;;;;;;;:51;;;:55;39625:254;;;39708:16;:33;39725:15;39708:33;;;;;;;;;;;;;;;;39701:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39851:15;39828:39;;;;;;;;;;;;39625:254;39530:356;:::o;24099:568::-;24164:7;24184:15;24213:4;24203:7;:14;24184:34;;24229:20;24268:4;24253:12;;:19;24229:44;;24284:25;24617:4;24326:288;24512:4;24502:7;:14;4574:4;24444;24429:12;:19;;;;;;4574:4;24403:46;4498:5;24360:90;24359:138;24358:159;24598:1;24589:4;24578:7;24574:1;24565:7;:10;:20;24564:29;;;;;;4574:4;24538:56;24537:62;;;;;;24326:12;:288::i;:::-;:295;;;;;;24284:338;;24642:17;24635:24;;;;;24099:568;;;:::o;12615:96::-;1139:24;1166:10;1139:37;;1195:14;:32;1210:16;1195:32;;;;;;;;;;;;;;;;;;;;;;;;;1187:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12698:5;12691:4;:12;;;;;;;;;;;;:::i;:::-;;12615:96;;:::o;5978:51::-;;;;;;;;;;;;;;;;;:::o;40018:166::-;40117:7;40149:11;:18;40161:5;40149:18;;;;;;;;;;;;;;;:27;40168:7;40149:27;;;;;;;;;;;;;;;;40142:34;;40018:166;;;;:::o;10187:1626::-;698:1;685:10;:8;:10::i;:::-;:14;677:23;;;;;;10284:24;10311:10;10284:37;;10359:19;:37;10379:16;10359:37;;;;;;;;;;;;;;;;10340:15;:56;;10332:65;;;;;;10408:15;10426;10408:33;;10452:17;10472:26;10490:7;10472:17;:26::i;:::-;10452:46;;10511:15;10542:224;10567:134;10628:15;10666:16;10567:38;:134::i;:::-;10720:9;10748:3;10542:6;:224::i;:::-;10511:255;;10779:18;10813:132;10844:7;10870:60;10883:32;10896:9;10907:7;10883:12;:32::i;:::-;4442:2;10870:60;;:12;:60::i;:::-;10813:12;:132::i;:::-;10779:166;;10958:22;10983:35;10996:9;11007:10;10983:12;:35::i;:::-;10958:60;;11079:35;11092:12;;11106:7;11079:12;:35::i;:::-;11064:12;:50;;;;11165:97;11192:19;:37;11212:16;11192:37;;;;;;;;;;;;;;;;11244:7;11165:12;:97::i;:::-;11125:19;:37;11145:16;11125:37;;;;;;;;;;;;;;;:137;;;;11312:22;4636:5;11388:14;:26;11377:7;11359:15;;:25;:56;11312:104;;11459:15;11427:10;:28;11438:16;11427:28;;;;;;;;;;;;;;;;:47;;;;;;;;;;;11506:1;11491:12;;:16;11487:247;;;11599:123;11630:15;;11664:43;11671:10;4636:5;11694:12;;11664:6;:43::i;:::-;11599:12;:123::i;:::-;11581:15;:141;;;;11487:247;11763:16;11751:54;;;11781:7;11790:14;11751:54;;;;;;;;;;;;;;;;;;;;;;;;711:1;;;;;;;10187:1626;:::o;9721:262::-;9810:24;9837:10;9810:37;;9858:15;9876:19;:37;9896:16;9876:37;;;;;;;;;;;;;;;;9858:55;;9938:1;9928:7;:11;9924:30;;;9941:13;9946:7;9941:4;:13::i;:::-;9924:30;9965:10;:8;:10::i;:::-;9721:262;;:::o;38222:571::-;38316:7;38338;38360:6;38381:7;38416:24;38443:10;38416:37;;38464:44;38524:16;:34;38541:16;38524:34;;;;;;;;;;;;;;;38464:94;;38591:18;:36;;;38642:18;:38;;;38695:18;:25;;;;;;;;;;;;38735:18;:39;;;38569:216;;;;;;;;;;38222:571;;;;:::o;9179:476::-;9360:21;9370:10;9360:9;:21::i;:::-;9434;9430:218;;;9472:164;9509:6;9534:19;9572:10;9601:20;9472:18;:164::i;:::-;9430:218;9179:476;;;;:::o;8981:118::-;9041:50;9056:10;9068:9;9079:11;9041:14;:50::i;:::-;;8981:118;:::o;46478:147::-;46536:7;46556:9;46572:1;46568;:5;46556:17;;46596:1;46591;:6;;46584:14;;;;46616:1;46609:8;;;46478:147;;;;:::o;45862:288::-;45920:7;46019:9;46035:1;46031;:5;;;;;;46019:17;;46141:1;46134:8;;;45862:288;;;;:::o;46278:123::-;46336:7;46368:1;46363;:6;;46356:14;;;;46392:1;46388;:5;46381:12;;46278:123;;;;:::o;44990:367::-;45134:1;45117:19;;:5;:19;;;;45109:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45215:1;45196:21;;:7;:21;;;;45188:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45297:5;45267:11;:18;45279:5;45267:18;;;;;;;;;;;;;;;:27;45286:7;45267:27;;;;;;;;;;;;;;;:35;;;;45334:7;45318:31;;45327:5;45318:31;;;45343:5;45318:31;;;;;;;;;;;;;;;;;;44990:367;;;:::o;35868:690::-;36094:157;;;;;;;;36144:6;36126:24;;:15;:24;36094:157;;;;36165:19;36094:157;;;;36199:20;36094:157;;;;36234:6;36094:157;;;;;36058:16;:33;36075:15;36058:33;;;;;;;;;;;;;;;:193;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36368:15;36330:220;;;36398:16;:33;36415:15;36398:33;;;;;;;;;;;;;;;:51;;;36464:19;36498:6;36519:20;36330:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35868:690;;;;:::o;41516:2591::-;41710:1;41682:30;;:16;:30;;;;41660:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41832:1;41810:24;;:10;:24;;;;41788:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42095:15;;;;;;;;;;;42094:16;:93;;;;;42150:19;:37;42170:16;42150:37;;;;;;;;;;;;;;;;42131:15;:56;;42094:93;42072:126;;;;;;42364:1;42314:16;:34;42331:16;42314:34;;;;;;;;;;;;;;;;42282:29;42294:16;42282:11;:29::i;:::-;:66;:83;42264:167;;;42392:27;42402:16;42392:9;:27::i;:::-;42264:167;42516:59;42541:15;42558:16;42516:24;:59::i;:::-;42704:17;42724:43;42737:15;4442:2;42724:43;;:12;:43::i;:::-;42704:63;;42780:20;42803:40;42816:15;42833:9;42803:12;:40::i;:::-;42780:63;;42854:18;42875:28;42893:9;42875:17;:28::i;:::-;42854:49;;42963:37;42976:12;;42990:9;42963:12;:37::i;:::-;42948:12;:52;;;;43081:105;43108:19;:37;43128:16;43108:37;;;;;;;;;;;;;;;;43160:15;43081:12;:105::i;:::-;43041:19;:37;43061:16;43041:37;;;;;;;;;;;;;;;:145;;;;43231:96;43258:19;:31;43278:10;43258:31;;;;;;;;;;;;;;;;43304:12;43231;:96::i;:::-;43197:19;:31;43217:10;43197:31;;;;;;;;;;;;;;;:130;;;;43407:30;:42;43438:10;43407:42;;;;;;;;;;;;;;;43469:52;;;;;;;;43488:12;43469:52;;;;43502:15;43469:52;;;;43519:1;43469:52;;;43407:125;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;43407:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43592:1;43543:29;:41;43573:10;43543:41;;;;;;;;;;;;;;;:45;;;:50;;;;;;;;;;;43716:15;43698;;:33;43643:10;:28;43654:16;43643:28;;;;;;;;;;;;;;;;:99;;;;;;;;;;;43806:12;43788:15;;:30;43753:10;:22;43764:10;43753:22;;;;;;;;;;;;;;;;:66;;;;;;;;;;;43895:111;43922:15;;43952:43;43959:10;4636:5;43982:12;;43952:6;:43::i;:::-;43895:12;:111::i;:::-;43877:15;:129;;;;44074:10;44047:52;;44056:16;44047:52;;;44086:12;44047:52;;;;;;;;;;;;;;;;;;41516:2591;;;;;;:::o;33776:207::-;33824:9;33846;33868:1;33863;33859;:5;33858:11;;;;;;33846:23;;33884:1;33880:5;;33896:80;33907:1;33903;:5;33896:80;;;33929:1;33925:5;;33963:1;33958;33954;33950;:5;;;;;;:9;33949:15;;;;;;33945:19;;33896:80;;;33776:207;;;;:::o;28978:748::-;29043:18;29064:29;29076:16;29064:11;:29::i;:::-;29043:50;;29228:1;29191:16;:34;29208:16;29191:34;;;;;;;;;;;;;;;;29178:10;:47;:51;29170:60;;;;;;4636:5;29320:10;:22;29279:10;:28;29290:16;29279:28;;;;;;;;;;;;;;;;:64;;;;;;;;;;;29397:16;:34;29414:16;29397:34;;;;;;;;;;;;;;;;29383:48;;;;29479:1;29442:16;:34;29459:16;29442:34;;;;;;;;;;;;;;;:38;;;;29493:39;29564:16;29493:89;;29593:23;:32;;:44;29626:10;29593:44;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29593:44:0;29689:16;29678:40;;;29707:10;29678:40;;;;;;;;;;;;;;;;;;28978:748;;;:::o;45557:208::-;45615:7;45644:1;45639;:6;45635:47;;;45669:1;45662:8;;;;45635:47;45692:9;45708:1;45704;:5;45692:17;;45736:1;45731;45727;:5;;;;;;:10;45720:18;;;;45756:1;45749:8;;;45557:208;;;;;:::o;28257:713::-;28322:18;28343:29;28355:16;28343:11;:29::i;:::-;28322:50;;28471:1;28434:16;:34;28451:16;28434:34;;;;;;;;;;;;;;;;28421:10;:47;:51;28413:60;;;;;;4636:5;28527:10;:22;28486:10;:28;28497:16;28486:28;;;;;;;;;;;;;;;;:64;;;;;;;;;;;28609:16;:34;28626:16;28609:34;;;;;;;;;;;;;;;;28595:48;;;;28691:1;28654:16;:34;28671:16;28654:34;;;;;;;;;;;;;;;:38;;;;28781:15;28812:56;28827:16;28845:10;28865:1;28812:14;:56::i;:::-;28781:87;;28924:16;28909:53;;;28942:10;28954:7;28909:53;;;;;;;;;;;;;;;;;;;;;;;;28257:713;;;:::o;31364:2404::-;31523:7;698:1;685:10;:8;:10::i;:::-;:14;677:23;;;;;;31594:19;31616:1;31594:23;;31628:30;31674:29;:47;31704:16;31674:47;;;;;;;;;;;;;;;31628:93;;31732:15;31750;:21;;;31732:39;;31782:22;31807:1;31782:26;;31821:1875;31839:15;:19;;;31828:7;:30;31821:1875;;31875:38;31933:30;:48;31964:16;31933:48;;;;;;;;;;;;;;;31982:7;31933:57;;;;;;;;;;;;;;;;;;31875:115;;32005:23;32048:54;32061:11;:17;;;32080:11;:21;;;32048:12;:54::i;:::-;32005:97;;32119:22;32144:42;32157:15;32174:11;32144:12;:42::i;:::-;32119:67;;32225:14;32207:15;:32;32203:1453;;;32275:15;32260:30;;;;32326:235;32361:14;32398:144;32437:40;32455:11;:21;;;32437:17;:40::i;:::-;32504:15;32398:12;:144::i;:::-;32326:12;:235::i;:::-;32309:252;;32587:30;:48;32618:16;32587:48;;;;;;;;;;;;;;;32658:7;32587:97;;;;;;;;;;;;;;;;;;;32580:104;;;;;;;;;;;;;;;;;;;;32203:1453;;;32729:14;32710:15;:33;32706:950;;32781:234;32816:14;32853:143;32892:40;32910:11;:21;;;32892:17;:40::i;:::-;32959:14;32853:12;:143::i;:::-;32781:12;:234::i;:::-;32764:251;;33041:30;:48;33072:16;33041:48;;;;;;;;;;;;;;;33112:7;33041:97;;;;;;;;;;;;;;;;;;;33034:104;;;;;;;;;;;;;;;;;;;;33191:1;33181:7;:11;33157:15;:21;;:35;;;;33211:5;;;;;32706:950;33274:234;33309:14;33346:143;33385:40;33403:11;:21;;;33385:17;:40::i;:::-;33452:14;33346:12;:143::i;:::-;33274:12;:234::i;:::-;33257:251;;33552:14;33527:11;:21;;;:39;;;;;;;;;;;33609:7;33585:15;:21;;:31;;;;33635:5;;;;;32203:1453;33683:1;33672:12;;;;31821:1875;;;;;;33715:45;33728:14;33744:15;33715:12;:45::i;:::-;33708:52;;;;;;31364:2404;;;;:::o;29802:1442::-;29983:19;30005:1;29983:23;;30017:30;30063:29;:47;30093:16;30063:47;;;;;;;;;;;;;;;30017:93;;30121:15;30139;:21;;;30121:39;;30173:1064;30191:15;:19;;;30180:7;:30;30173:1064;;30227:38;30285:30;:48;30316:16;30285:48;;;;;;;;;;;;;;;30334:7;30285:57;;;;;;;;;;;;;;;;;;30227:115;;30357:23;30400:54;30413:11;:17;;;30432:11;:21;;;30400:12;:54::i;:::-;30357:97;;30471:22;30496:42;30509:15;30526:11;30496:12;:42::i;:::-;30471:67;;30577:14;30559:15;:32;30555:644;;;30627:15;30612:30;;;;30670;:48;30701:16;30670:48;;;;;;;;;;;;;;;30741:7;30670:97;;;;;;;;;;;;;;;;;;;30663:104;;;;;;;;;;;;;;;;;;;;30555:644;;;30812:14;30793:15;:33;30789:410;;30854:30;:48;30885:16;30854:48;;;;;;;;;;;;;;;30925:7;30854:97;;;;;;;;;;;;;;;;;;;30847:104;;;;;;;;;;;;;;;;;;;;31004:1;30994:7;:11;30970:15;:21;;:35;;;;31024:5;;;;;30789:410;31095:14;31070:11;:21;;;:39;;;;;;;;;;;31152:7;31128:15;:21;;:31;;;;31178:5;;;;;30555:644;31224:1;31213:12;;;;30173:1064;;;;;;29802:1442;;;;;:::o;459:44901::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://2c4790f7928bf9a3a45a9f8993b6a67a03c0e30cb3eae470bc64181e301607b8

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.