ETH Price: $3,153.80 (-4.18%)

Contract

0xE9c53852adF6b373DFD8403dB61356bC601E8234
 

Overview

ETH Balance

0.739343390170934439 ETH

Eth Value

$2,331.74 (@ $3,153.80/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw Earning...176554132023-07-09 9:58:59494 days ago1688896739IN
0xE9c53852...C601E8234
0 ETH0.0017356813.3081063
Withdraw Earning...115845192021-01-03 23:30:401410 days ago1609716640IN
0xE9c53852...C601E8234
0 ETH0.04107294230
Withdraw Earning...115845032021-01-03 23:28:011410 days ago1609716481IN
0xE9c53852...C601E8234
0 ETH0.04285872240
Withdraw Earning...115844942021-01-03 23:26:081410 days ago1609716368IN
0xE9c53852...C601E8234
0 ETH0.023230
Withdraw Earning...115844482021-01-03 23:17:021410 days ago1609715822IN
0xE9c53852...C601E8234
0 ETH0.03107257174
Withdraw Earning...115844432021-01-03 23:15:321410 days ago1609715732IN
0xE9c53852...C601E8234
0 ETH0.024240
Withdraw Earning...73328022019-03-09 4:25:202077 days ago1552105520IN
0xE9c53852...C601E8234
0 ETH0.000116913
Withdraw Earning...73328002019-03-09 4:25:102077 days ago1552105510IN
0xE9c53852...C601E8234
0 ETH0.000116913
Withdraw Earning...73328002019-03-09 4:25:102077 days ago1552105510IN
0xE9c53852...C601E8234
0 ETH0.000116913
Withdraw Earning...73327992019-03-09 4:24:482077 days ago1552105488IN
0xE9c53852...C601E8234
0 ETH0.000116913
Withdraw Earning...73327982019-03-09 4:24:432077 days ago1552105483IN
0xE9c53852...C601E8234
0 ETH0.000116913
Withdraw Earning...73327922019-03-09 4:23:082077 days ago1552105388IN
0xE9c53852...C601E8234
0 ETH0.000116913
Withdraw Earning...73327902019-03-09 4:22:092077 days ago1552105329IN
0xE9c53852...C601E8234
0 ETH0.000143213
Withdraw Earning...73327882019-03-09 4:22:022077 days ago1552105322IN
0xE9c53852...C601E8234
0 ETH0.000322083
Reinvest In Carr...73308512019-03-08 20:52:592077 days ago1552078379IN
0xE9c53852...C601E8234
0 ETH0.000501373
Reinvest In Carr...73308462019-03-08 20:51:062077 days ago1552078266IN
0xE9c53852...C601E8234
0 ETH0.000501373
Reinvest In Carr...73308412019-03-08 20:49:332077 days ago1552078173IN
0xE9c53852...C601E8234
0 ETH0.001031343
Register Name73243682019-03-07 20:42:102078 days ago1551991330IN
0xE9c53852...C601E8234
0.02 ETH0.000158192
Name Horse73243532019-03-07 20:38:372078 days ago1551991117IN
0xE9c53852...C601E8234
0.01025865 ETH0.001282193
Buy Carrots62925822018-09-08 6:06:372259 days ago1536386797IN
0xE9c53852...C601E8234
0.0001 ETH0.000598344
Buy Carrots62925822018-09-08 6:06:372259 days ago1536386797IN
0xE9c53852...C601E8234
0.0001 ETH0.001412814
Withdraw Earning...62827182018-09-06 14:21:342261 days ago1536243694IN
0xE9c53852...C601E8234
0 ETH0.000641675
Buy Carrots62792002018-09-06 0:20:552261 days ago1536193255IN
0xE9c53852...C601E8234
0.06009495 ETH0.001993227
Withdraw Earning...62726912018-09-04 22:02:172262 days ago1536098537IN
0xE9c53852...C601E8234
0 ETH0.000358694.4
Buy Carrots62726812018-09-04 21:59:252262 days ago1536098365IN
0xE9c53852...C601E8234
0.00514005 ETH0.000205026.3
View all transactions

Latest 14 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
115845192021-01-03 23:30:401410 days ago1609716640
0xE9c53852...C601E8234
0.10194406 ETH
115845032021-01-03 23:28:011410 days ago1609716481
0xE9c53852...C601E8234
0.06452586 ETH
115844482021-01-03 23:17:021410 days ago1609715822
0xE9c53852...C601E8234
0.08894471 ETH
73327882019-03-09 4:22:022077 days ago1552105322
0xE9c53852...C601E8234
0.01025865 ETH
62827182018-09-06 14:21:342261 days ago1536243694
0xE9c53852...C601E8234
0.00320832 ETH
62726912018-09-04 22:02:172262 days ago1536098537
0xE9c53852...C601E8234
0.00000059 ETH
62726812018-09-04 21:59:252262 days ago1536098365
0xE9c53852...C601E8234
0.00514005 ETH
62665732018-09-03 21:25:362263 days ago1536009936
0xE9c53852...C601E8234
0.04456598 ETH
62642692018-09-03 12:09:422264 days ago1535976582
0xE9c53852...C601E8234
0.0010822 ETH
62642682018-09-03 12:09:362264 days ago1535976576
0xE9c53852...C601E8234
0.12288561 ETH
62637892018-09-03 10:09:312264 days ago1535969371
0xE9c53852...C601E8234
0.01856098 ETH
62628072018-09-03 6:11:502264 days ago1535955110
0xE9c53852...C601E8234
0.6204573 ETH
62628032018-09-03 6:10:402264 days ago1535955040
0xE9c53852...C601E8234
0.52444259 ETH
62618242018-09-03 2:09:302264 days ago1535940570
0xE9c53852...C601E8234
0.54993338 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EtherDerby

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-09-02
*/

pragma solidity 0.4.24;

// _____________________________________________________________
//                  .''
//        ._.-.___.' (`\
//       //(        ( `'
//      '/ )\ ).__. )
//      ' <' `\ ._/'\
// ________`___\_____\__________________________________________
//                                            .''
//     ___ _____ _ __ ___  ___      ._.-.___.' (`\
//    / _//_  _//// // _/ / o |    //(        ( `'
//   / _/  / / / ` // _/ /  ,'    '/ )\ ).__. )
//  /___/ /_/ /_n_//___//_/`_\    ' <' `\ ._/'\
// __________________________________`___\_____\________________
//                                                    .''
//     __   ___  ___   ___  _  __           ._.-.___.' (`\
//    /  \ / _/ / o | / o.)| |/,'          //(        ( `'
//   / o |/ _/ /  ,' / o \ | ,'           '/ )\ ).__. )
//  /__,'/___//_/`_\/___,'/_/             ' <' `\ ._/'\
// __________________________________________`___\_____\________
//                            .''
//                  ._.-.___.' (`\
//                 //(        ( `'
//                '/ )\ ).__. )
//                ' <' `\ ._/'\
// __________________`___\_____\________________________________
//
// This product is protected under license.  Any unauthorized copy, modification, or use without 
// express written consent from the creators is prohibited.
//
contract EtherDerby {
    using SafeMath for *;
    using CalcCarrots for uint256;

    // settings
    string constant public name = "EtherDerby";
    uint256 constant private ROUNDMAX = 4 hours;
    uint256 constant private MULTIPLIER = 2**64;
    uint256 constant private DECIMALS = 18;
    uint256 constant public REGISTERFEE = 20 finney;

    address constant private DEVADDR = 0xC17A40cB38598520bd7C0D5BFF97D441A810a008;

    // horse Identifiers
    uint8 constant private H1 = 1;
    uint8 constant private H2 = 2;
    uint8 constant private H3 = 3;
    uint8 constant private H4 = 4;

    //  ___  _ _  ___   __   _  ___  _
    // |_ _|| U || __| |  \ / \|_ _|/ \
    //  | | |   || _|  | o ) o || || o |
    //  |_| |_n_||___| |__/|_n_||_||_n_|
    //

    struct Round {
        uint8 winner; // horse in the lead
        mapping (uint8 => uint256) eth; // total eth per horse
        mapping (uint8 => uint256) carrots; // total eth per horse
    }

    struct Player {
        address addr; // player address
        bytes32 name; // player name
        uint256 totalWinnings; // player winnings
        uint256 totalReferrals; // player referral bonuses
        int256  dividendPayouts; // running count of payouts player has received (important that it can be negative)

        mapping (uint256 => mapping (uint8 => uint256)) eth; // round -> horse -> eTH invested
        mapping (uint256 => mapping (uint8 => uint256)) carrots; // round -> horse -> carrots purchased
        mapping (uint256 => mapping (uint8 => uint256)) referrals; // round -> horse -> referrals (eth)

        mapping (uint8 => uint256) totalEth; // total carrots invested in each horse by the player
        mapping (uint8 => uint256) totalCarrots; // total carrots invested in each horse by the player

        uint256 totalWithdrawn; // running total of ETH withdrawn by the player
        uint256 totalReinvested; // running total of ETH reinvested by the player

        uint256 roundLastManaged; // round players winnings were last recorded
        uint256 roundLastReferred; // round player was last referred and therefore had its referrals managed
        address lastRef; // address of player who last referred this player
    }

    struct Horse {
        bytes32 name;
        uint256 totalEth;
        uint256 totalCarrots;
        uint256 mostCarrotsOwned;
        address owner;
    }

    uint256 rID_ = 0; // current round number
    mapping (uint256 => Round) public rounds_; // data for each round
    uint256 roundEnds_; // time current round is over
    mapping (address => Player) public players_; // data for each player
    mapping (uint8 => Horse) horses_; // data for each horse
    uint256 private earningsPerCarrot_; // used to keep track of dividends rewarded to carrot holders

    mapping (bytes32 => address) registeredNames_;

    //  ___  _ _  ___  _  _  ___ __
    // | __|| | || __|| \| ||_ _/ _|
    // | _| | V || _| | \\ | | |\_ \
    // |___| \_/ |___||_|\_| |_||__/
    //

    /**
     * @dev fired for every set of carrots purchased or reinvested in
     * @param playerAddress player making the purchase
     * @param playerName players name if they have registered
     * @param roundId round for which carrots were purchased
     * @param horse array of two horses (stack limit hit so we use array)
     *   0 - horse which horse carrots were purchased for
     *   1 - horse now in the lead
     * @param horseName horse name at the time of purchase
     * @param roundEnds round end time
     * @param timestamp block timestamp when purchase occurred
     * @param data contains the following (stack limit hit so we use array)
     *   0 - amount of eth
     *   1 - amount of carrots
     *   2 - horses total eth for the round
     *   3 - horses total carrots for the round
     *   4 - players total eth for the round
     *   5 - players total carrots for the round
     */
    event OnCarrotsPurchased
    (
        address indexed playerAddress,
        bytes32 playerName,
        uint256 roundId,
        uint8[2] horse,
        bytes32 indexed horseName,
        uint256[6] data,
        uint256 roundEnds,
        uint256 timestamp
    );

    /**
     * @dev fired each time a player withdraws ETH
     * @param playerAddress players address
     * @param eth amount withdrawn
     */
    event OnEthWithdrawn
    (
        address indexed playerAddress,
        uint256 eth
    );

    /**
     * @dev fired whenever a horse is given a new name
     * @param playerAddress which player named the horse
     * @param horse number of horse being named
     * @param horseName new name of horse
     * @param mostCarrotsOwned number of carrots by owned to name the horse
     * @param timestamp block timestamp when horse is named
     */
    event OnHorseNamed
    (
      address playerAddress,
      bytes32 playerName,
      uint8 horse,
      bytes32 horseName,
      uint256 mostCarrotsOwned,
      uint256 timestamp
    );

    /**
     * @dev fired whenever a player registers a name
     * @param playerAddress which player registered a name
     * @param playerName name being registered
     * @param ethDonated amount of eth donated with registration
     * @param timestamp block timestamp when name registered
     */
    event OnNameRegistered
    (
        address playerAddress,
        bytes32 playerName,
        uint256 ethDonated,
        uint256 timestamp
    );

    /**
     * @dev fired when a transaction is rejected
     * mainly used to make it easier to write front end code
     * @param playerAddress player making the purchase
     * @param reason why the transaction failed
     */
    event OnTransactionFail
    (
        address indexed playerAddress,
        bytes32 reason
    );

    constructor()
      public
    {
        // start with Round 0 ending before now so that first purchase begins Round 1
        // subtract an hour to make sure the first purchase doesn't go to round 0 (ex. same block)
        roundEnds_ = block.timestamp - 1 hours;

        // default horse names
        horses_[H1].name = "horse1";
        horses_[H2].name = "horse2";
        horses_[H3].name = "horse3";
        horses_[H4].name = "horse4";
    }

    //  _   _  _  __  _  ___  _  ___  ___  __
    // | \_/ |/ \|  \| || __|| || __|| o \/ _|
    // | \_/ ( o ) o ) || _| | || _| |   /\_ \
    // |_| |_|\_/|__/|_||_|  |_||___||_|\\|__/
    //

    /**
     * @dev verifies that a valid horse is provided
     */
    modifier isValidHorse(uint8 _horse) {
        require(_horse == H1 || _horse == H2 || _horse == H3 || _horse == H4, "unknown horse selected");
        _;
    }

    /**
     * @dev prevents smart contracts from interacting with EtherDerby
     */
    modifier isHuman() {
        address addr = msg.sender;
        uint256 codeLength;

        assembly {codeLength := extcodesize(addr)}
        require(codeLength == 0, "Humans only ;)");
        require(msg.sender == tx.origin, "Humans only ;)");
        _;
    }

    /**
     * @dev verifies that all purchases sent include a reasonable amount of ETH
     */
    modifier isWithinLimits(uint256 _eth) {
        require(_eth >= 1000000000, "Not enough eth!");
        require(_eth <= 100000000000000000000000, "Go away whale!");
        _;
    }


    //  ___ _ _  ___ _    _  __   ___  _ _  _  _  __  ___  _  _  _  _  __
    // | o \ | || o ) |  | |/ _| | __|| | || \| |/ _||_ _|| |/ \| \| |/ _|
    // |  _/ U || o \ |_ | ( (_  | _| | U || \\ ( (_  | | | ( o ) \\ |\_ \
    // |_| |___||___/___||_|\__| |_|  |___||_|\_|\__| |_| |_|\_/|_|\_||__/
    //

    /**
     * @dev register a name with Ether Derby to generate a referral link
     * @param _nameStr the name being registered (see NameValidator library below
     * for name requirements)
     */
    function registerName(string _nameStr)
        public
        payable
        isHuman()
    {
        require(msg.value >= REGISTERFEE, "You must pay the partner fee of 20 finney");

        bytes32 nameToRegister = NameValidator.validate(_nameStr);

        require(registeredNames_[nameToRegister] == 0, "Name already in use");

        registeredNames_[nameToRegister] = msg.sender;
        players_[msg.sender].name = nameToRegister;

        // partner fee goes to devs
        players_[DEVADDR].totalReferrals = msg.value.add(players_[DEVADDR].totalReferrals);

        emit OnNameRegistered(msg.sender, nameToRegister, msg.value, block.timestamp);
    }

    /**
     * @dev buy carrots with ETH
     * @param _horse the horse carrots are being purchased for
     * @param _round the round these carrots should be purchased for (send 0 to
     * buy for whatever the current round is)
     * @param _referrerName the player for which to reward referral bonuses to
     */
    function buyCarrots(uint8 _horse, uint256 _round, bytes32 _referrerName)
        public
        payable
        isHuman()
        isWithinLimits(msg.value)
        isValidHorse(_horse)
    {
        if (isInvalidRound(_round)) {
            emit OnTransactionFail(msg.sender, "Invalid round");
            msg.sender.transfer(msg.value);
            return;
        }
        buyCarrotsInternal(_horse, msg.value, _referrerName);
    }

    /**
     * @dev buy carrots with current earnings left in smart contract
     * @param _horse the horse carrots are being purchased for
     * @param _round the round these carrots should be purchased for (send 0 to
     * buy for whatever the current round is)
     * @param _referrerName the player for which to reward referral bonuses to
     */
    function reinvestInCarrots(uint8 _horse, uint256 _round, uint256 _value, bytes32 _referrerName)
        public
        isHuman()
        isWithinLimits(_value)
        isValidHorse(_horse)
    {
        if (isInvalidRound(_round)) {
            emit OnTransactionFail(msg.sender, "Invalid round");
            return;
        }
        if (calcPlayerEarnings() < _value) {
            // Not enough earnings in player vault
            emit OnTransactionFail(msg.sender, "Insufficient funds");
            return;
        }
        players_[msg.sender].totalReinvested = _value.add(players_[msg.sender].totalReinvested);

        buyCarrotsInternal(_horse, _value, _referrerName);
    }

    /**
     * @dev name horse by purchasing enough carrots to become majority holder
     * @param _horse the horse being named
     * @param _nameStr the desired horse name (See NameValidator for requirements)
     * @param _referrerName the player for which to reward referral bonuses to
     */
    function nameHorse(uint8 _horse, string _nameStr, bytes32 _referrerName)
      public
      payable
      isHuman()
      isValidHorse(_horse)
    {
        if ((rounds_[getCurrentRound()].eth[_horse])
            .carrotsReceived(msg.value)
            .add(players_[msg.sender].totalCarrots[_horse]) < 
                horses_[_horse].mostCarrotsOwned) {
            emit OnTransactionFail(msg.sender, "Insufficient funds");
            if (msg.value > 0) {
                msg.sender.transfer(msg.value);
            }
            return;
        }
        if (msg.value > 0) {
            buyCarrotsInternal(_horse, msg.value, _referrerName);    
        }
        horses_[_horse].name = NameValidator.validate(_nameStr);
        if (horses_[_horse].owner != msg.sender) {
            horses_[_horse].owner = msg.sender;
        }
        emit OnHorseNamed(
            msg.sender,
            players_[msg.sender].name,
            _horse,
            horses_[_horse].name,
            horses_[_horse].mostCarrotsOwned,
            block.timestamp
        );
    }

    /**
     * @dev withdraw all earnings made so far. includes winnings, dividends, and referrals
     */
    function withdrawEarnings()
        public
        isHuman()
    {
        managePlayer();
        manageReferrer(msg.sender);

        uint256 earnings = calcPlayerEarnings();
        if (earnings > 0) {
            players_[msg.sender].totalWithdrawn = earnings.add(players_[msg.sender].totalWithdrawn);
            msg.sender.transfer(earnings);
        }
        emit OnEthWithdrawn(msg.sender, earnings);
    }

    /**
     * @dev fallback function puts incoming eth into devs referrals
     */
    function()
        public
        payable
    {
        players_[DEVADDR].totalReferrals = msg.value.add(players_[DEVADDR].totalReferrals);
    }

    //  ___ ___ _  _ _   _  ___  ___   _ _  ___  _    ___ ___  ___  __
    // | o \ o \ || | | / \|_ _|| __| | U || __|| |  | o \ __|| o \/ _|
    // |  _/   / || V || o || | | _|  |   || _| | |_ |  _/ _| |   /\_ \
    // |_| |_|\\_| \_/ |_n_||_| |___| |_n_||___||___||_| |___||_|\\|__/
    //

    /**
     * @dev core helper method for purchasing carrots
     * @param _horse the horse carrots are being purchased for
     * @param _value amount of eth to spend on carrots
     * @param _referrerName the player for which to reward referral bonuses to
     */
    function buyCarrotsInternal(uint8 _horse, uint256 _value, bytes32 _referrerName)
        private
    {
        // check if new round needs started and update horses pending data if necessary
        manageRound();

        // update players winnings and reset pending data if necessary
        managePlayer();

        address referrer = getReferrer(_referrerName);
        // update referrers total referrals and reset pending referrals if necessary
        manageReferrer(referrer);
        if (referrer != DEVADDR) {
            // also manage dev account unless referrer is dev
            manageReferrer(DEVADDR);
        }

        uint256 carrots = (rounds_[rID_].eth[_horse]).carrotsReceived(_value);

        /*******************/
        /*  Update Player  */
        /*******************/

        players_[msg.sender].eth[rID_][_horse] = 
            _value.add(players_[msg.sender].eth[rID_][_horse]);
        players_[msg.sender].carrots[rID_][_horse] = 
            carrots.add(players_[msg.sender].carrots[rID_][_horse]);
        players_[msg.sender].totalEth[_horse] =
            _value.add(players_[msg.sender].totalEth[_horse]);
        players_[msg.sender].totalCarrots[_horse] =
            carrots.add(players_[msg.sender].totalCarrots[_horse]);

        // players don't recieve dividends before buying the carrots
        players_[msg.sender].dividendPayouts += SafeConversions.SafeSigned(earningsPerCarrot_.mul(carrots));

        /*******************/
        /* Update Referrer */
        /*******************/

        players_[referrer].referrals[rID_][_horse] = 
            ninePercent(_value).add(players_[referrer].referrals[rID_][_horse]);
        // one percent to devs
        // reuse referrals since functionality is the same
        players_[DEVADDR].referrals[rID_][_horse] =
            _value.div(100).add(players_[DEVADDR].referrals[rID_][_horse]);

        // check if players new amount of total carrots for this horse is greater than mostCarrotsOwned and update
        if (players_[msg.sender].totalCarrots[_horse] > horses_[_horse].mostCarrotsOwned) {
          horses_[_horse].mostCarrotsOwned = players_[msg.sender].totalCarrots[_horse];
        }

        /*******************/
        /*  Update  Round  */
        /*******************/

        rounds_[rID_].eth[_horse] = _value.add(rounds_[rID_].eth[_horse]);
        rounds_[rID_].carrots[_horse] = carrots.add(rounds_[rID_].carrots[_horse]);

        // if this horses carrots now exceeds current winner, update current winner
        if (rounds_[rID_].winner != _horse &&
            rounds_[rID_].carrots[_horse] > rounds_[rID_].carrots[rounds_[rID_].winner]) {
            rounds_[rID_].winner = _horse;
        }

        /*******************/
        /*  Update  Horse  */
        /*******************/

        horses_[_horse].totalCarrots = carrots.add(horses_[_horse].totalCarrots);
        horses_[_horse].totalEth = _value.add(horses_[_horse].totalEth);

        emit OnCarrotsPurchased(
            msg.sender,
            players_[msg.sender].name,
            rID_,
            [
                _horse,
                rounds_[rID_].winner
            ],
            horses_[_horse].name,
            [
                _value,
                carrots,
                rounds_[rID_].eth[_horse],
                rounds_[rID_].carrots[_horse],
                players_[msg.sender].eth[rID_][_horse],
                players_[msg.sender].carrots[rID_][_horse]
            ],
            roundEnds_,
            block.timestamp
        );
    }

    /**
     * @dev check if now is past current rounds ends time. if so, compute round
     * details and update all storage to start the next round
     */
    function manageRound()
      private
    {
        if (!isRoundOver()) {
            return;
        }
        // round over, update dividends and start next round
        uint256 earningsPerCarrotThisRound = fromEthToDivies(calcRoundLosingHorsesEth(rID_));

        if (earningsPerCarrotThisRound > 0) {
            earningsPerCarrot_ = earningsPerCarrot_.add(earningsPerCarrotThisRound);  
        }

        rID_++;
        roundEnds_ = block.timestamp + ROUNDMAX;
    }

    /**
     * @dev check if a player has winnings from a previous round that have yet to
     * be recorded. this needs to be called before any player interacts with Ether
     * Derby to make sure there data is kept up to date
     */
    function managePlayer()
        private
    {
        uint256 unrecordedWinnings = calcUnrecordedWinnings();
        if (unrecordedWinnings > 0) {
            players_[msg.sender].totalWinnings = unrecordedWinnings.add(players_[msg.sender].totalWinnings);
        }
        // if managePlayer is being called while round is over, calcUnrecordedWinnings will include
        // winnings from the current round. it's important that we store rID_+1 here to make sure
        // users can't double withdraw winnings from current round
        if (players_[msg.sender].roundLastManaged == rID_ && isRoundOver()) {
            players_[msg.sender].roundLastManaged = rID_.add(1);
        }
        else if (players_[msg.sender].roundLastManaged < rID_) {
            players_[msg.sender].roundLastManaged = rID_;
        }
    }

    /**
     * @dev check if a player has referral bonuses from a previous round that have yet 
     * to be recorded
     */
    function manageReferrer(address _referrer)
        private
    {
        uint256 unrecordedRefferals = calcUnrecordedRefferals(_referrer);
        if (unrecordedRefferals > 0) {
            players_[_referrer].totalReferrals =
                unrecordedRefferals.add(players_[_referrer].totalReferrals);
        }

        if (players_[_referrer].roundLastReferred == rID_ && isRoundOver()) {
            players_[_referrer].roundLastReferred = rID_.add(1);
        }
        else if (players_[_referrer].roundLastReferred < rID_) {
            players_[_referrer].roundLastReferred = rID_;
        }
    }

    /**
     * @dev calculate total amount of carrots that have been purchased
     */
    function calcTotalCarrots()
        private
        view
        returns (uint256)
    {
        return horses_[H1].totalCarrots
            .add(horses_[H2].totalCarrots)
            .add(horses_[H3].totalCarrots)
            .add(horses_[H4].totalCarrots);
    }

    /**
     * @dev calculate players total amount of carrots including the unrecorded
     */
    function calcPlayerTotalCarrots()
        private
        view
        returns (uint256)
    {
        return players_[msg.sender].totalCarrots[H1]
            .add(players_[msg.sender].totalCarrots[H2])
            .add(players_[msg.sender].totalCarrots[H3])
            .add(players_[msg.sender].totalCarrots[H4]);
    }

    /**
     * @dev calculate players total amount of eth spent including unrecorded
     */
    function calcPlayerTotalEth()
        private
        view
        returns (uint256)
    {
        return players_[msg.sender].totalEth[H1]
            .add(players_[msg.sender].totalEth[H2])
            .add(players_[msg.sender].totalEth[H3])
            .add(players_[msg.sender].totalEth[H4]);
    }

    /**
     * @dev calculate players total earnings (able to be withdrawn)
     */
    function calcPlayerEarnings()
        private
        view
        returns (uint256)
    {
        return calcPlayerWinnings()
            .add(calcPlayerDividends())
            .add(calcPlayerReferrals())
            .sub(players_[msg.sender].totalWithdrawn)
            .sub(players_[msg.sender].totalReinvested);
    }

    /**
     * @dev calculate players total winning including the unrecorded
     */
    function calcPlayerWinnings()
        private
        view
        returns (uint256)
    {
        return players_[msg.sender].totalWinnings.add(calcUnrecordedWinnings());
    }

    /**
     * @dev calculate players total dividends including the unrecorded
     */
    function calcPlayerDividends()
      private
      view
      returns (uint256)
    {
        uint256 unrecordedDividends = calcUnrecordedDividends();
        uint256 carrotBalance = calcPlayerTotalCarrots();
        int256 totalDividends = SafeConversions.SafeSigned(carrotBalance.mul(earningsPerCarrot_).add(unrecordedDividends));
        return SafeConversions.SafeUnsigned(totalDividends - players_[msg.sender].dividendPayouts).div(MULTIPLIER);
    }

    /**
     * @dev calculate players total referral bonus including the unrecorded
     */
    function calcPlayerReferrals()
        private
        view
        returns (uint256)
    {
        return players_[msg.sender].totalReferrals.add(calcUnrecordedRefferals(msg.sender));
    }

    /**
     * @dev calculate players unrecorded winnings (those not yet in Player.totalWinnings)
     */
    function calcUnrecordedWinnings()
        private
        view
        returns (uint256)
    {
        uint256 round = players_[msg.sender].roundLastManaged;
        if ((round == 0) || (round > rID_) || (round == rID_ && !isRoundOver())) {
            // all winnings have been recorded
            return 0;
        }
        // round is <= rID_, not 0, and if equal then round is over
        // (players eth spent on the winning horse during their last round) +
        // ((players carrots for winning horse during their last round) * 
        // (80% of losing horses eth)) / total carrots purchased for winning horse
        return players_[msg.sender].eth[round][rounds_[round].winner]
            .add((players_[msg.sender].carrots[round][rounds_[round].winner]
            .mul(eightyPercent(calcRoundLosingHorsesEth(round))))
            .div(rounds_[round].carrots[rounds_[round].winner]));
    }

    /**
     * @dev calculate players unrecorded dividends (those not yet reflected in earningsPerCarrot_)
     */
    function calcUnrecordedDividends()
        private
        view
        returns (uint256)
    {
        if (!isRoundOver()) {
            // round is not over
            return 0;
        }
        // round has ended but next round has not yet been started, so
        // dividends from the current round are reflected in earningsPerCarrot_
        return fromEthToDivies(calcRoundLosingHorsesEth(rID_)).mul(calcPlayerTotalCarrots());
    }

    /**
     * @dev calculate players unrecorded referral bonus (those not yet in Player.referrals)
     */
    function calcUnrecordedRefferals(address _player)
        private
        view
        returns (uint256 ret)
    {
        uint256 round = players_[_player].roundLastReferred;
        if (!((round == 0) || (round > rID_) || (round == rID_ && !isRoundOver()))) {
            for (uint8 i = H1; i <= H4; i++) {
                if (rounds_[round].winner != i) {
                    ret = ret.add(players_[_player].referrals[round][i]);
                }
            }
        }
    }

    /**
     * @dev calculate total eth from all horses except the winner
     */
    function calcRoundLosingHorsesEth(uint256 _round)
        private
        view
        returns (uint256 ret)
    {
        for (uint8 i = H1; i <= H4; i++) {
            if (rounds_[_round].winner != i) {
                ret = ret.add(rounds_[_round].eth[i]);
            }
        }
    }

    /**
     * @dev calculate the change in earningsPerCarrot_ based on new eth coming in
     * @param _value amount of ETH being sent out as dividends to all carrot holders
     */
    function fromEthToDivies(uint256 _value)
        private
        view
        returns (uint256)
    {
        // edge case where dividing by 0 would happen
        uint256 totalCarrots = calcTotalCarrots();
        if (totalCarrots == 0) {
            return 0;
        }
        // multiply by MULTIPLIER to prevent integer division from returning 0
        // when totalCarrots > losingHorsesEth
        // divide by 10 because only 10% of losing horses ETH goes to dividends
        return _value.mul(MULTIPLIER).div(10).div(totalCarrots);
    }

    /**
     * @dev convert registered name to an address
     * @param _referrerName name of player that referred current player
     * @return address of referrer if valid, or last person to refer the current player,
     * or the devs as a backup referrer
     */
    function getReferrer(bytes32 _referrerName)
        private
        returns (address)
    {
        address referrer;
        // referrer is not empty, unregistered, or same as buyer
        if (_referrerName != "" && registeredNames_[_referrerName] != 0 && _referrerName != players_[msg.sender].name) {
            referrer = registeredNames_[_referrerName];
        } else if (players_[msg.sender].lastRef != 0) {
            referrer = players_[msg.sender].lastRef;
        } else {
            // fallback to Devs if no referrer provided
            referrer = DEVADDR;
        }
        if (players_[msg.sender].lastRef != referrer) {
            // store last referred to allow partner to continue receiving
            // future purchases from this player
            players_[msg.sender].lastRef = referrer;
        }
        return referrer;
    }

    /**
     * @dev calculate price of buying carrots
     * @param _horse which horse to calculate price for
     * @param _carrots how many carrots desired
     * @return ETH required to purchase X many carrots (in large format)
     */
    function calculateCurrentPrice(uint8 _horse, uint256 _carrots)
        private
        view
        returns(uint256)
    {
        uint256 currTotal = 0;
        if (!isRoundOver()) {
            // Round is ongoing
            currTotal = rounds_[rID_].carrots[_horse];
        }
        return currTotal.add(_carrots).ethReceived(_carrots);
    }

    /**
     * @dev check if a round number is valid to make a purchase for
     * @param _round round to check
     * @return true if _round is current (or next if current is over)
     */
    function isInvalidRound(uint256 _round)
        private
        view
        returns(bool)
    {
        // passing _round as 0 means buy for current round
        return _round != 0 && _round != getCurrentRound();
    }

    /**
     * @dev get current round
     */
    function getCurrentRound()
        private
        view
        returns(uint256)
    {
        if (isRoundOver()) {
            return (rID_ + 1);
        }
        return rID_;
    }

    /**
     * @dev check if current round has ended based on current block timestamp
     * @return true if round is over, false otherwise
     */
    function isRoundOver()
        private
        view
        returns (bool)
    {
        return block.timestamp >= roundEnds_;
    }

    /**
     * @dev compute eighty percent as whats left after subtracting 10%, 1% and 9%
     * @param num_ number to compute 80% of
     */
    function eightyPercent(uint256 num_)
        private
        pure
        returns (uint256)
    {
        // 100% - 9% - 1% - 10% = 80%
        return num_.sub(ninePercent(num_)).sub(num_.div(100)).sub(num_.div(10));
    }

    /**
     * @dev compute eighty percent as whats left after subtracting 10% twice
     * @param num_ number to compute 80% of
     */
    function ninePercent(uint256 num_)
        private
        pure
        returns (uint256)
    {
        return num_.mul(9).div(100);
    }

    //  _____ _____  ___  ___ _  _   _   _     _ _  _   _   _  ___  ___  _ _  _  __  __
    // | __\ V /_ _|| __|| o \ \| | / \ | |   | | || | | \_/ || __||_ _|| U |/ \|  \/ _|
    // | _| ) ( | | | _| |   / \\ || o || |_  | U || | | \_/ || _|  | | |   ( o ) o )_ \
    // |___/_n_\|_| |___||_|\\_|\_||_n_||___| |___||_| |_| |_||___| |_| |_n_|\_/|__/|__/
    //

    /**
     * @dev get stats from current round (or the last round if new has not yet started)
     * @return round id
     * @return round end time
     * @return horse in the lead
     * @return eth for each horse
     * @return carrots for each horse
     * @return eth invested for each horse
     * @return carrots invested for each horse
     * @return horse names
     */
    function getRoundStats()
        public
        view
        returns(uint256, uint256, uint8, uint256[4], uint256[4], uint256[4], uint256[4], bytes32[4])
    {
        return
        (
            rID_,
            roundEnds_,
            rounds_[rID_].winner,
            [
                rounds_[rID_].eth[H1],
                rounds_[rID_].eth[H2],
                rounds_[rID_].eth[H3],
                rounds_[rID_].eth[H4]
            ],
            [
                rounds_[rID_].carrots[H1],
                rounds_[rID_].carrots[H2],
                rounds_[rID_].carrots[H3],
                rounds_[rID_].carrots[H4]
            ],
            [
                players_[msg.sender].eth[rID_][H1],
                players_[msg.sender].eth[rID_][H2],
                players_[msg.sender].eth[rID_][H3],
                players_[msg.sender].eth[rID_][H4]
            ],
            [
                players_[msg.sender].carrots[rID_][H1],
                players_[msg.sender].carrots[rID_][H2],
                players_[msg.sender].carrots[rID_][H3],
                players_[msg.sender].carrots[rID_][H4]
            ],
            [
                horses_[H1].name,
                horses_[H2].name,
                horses_[H3].name,
                horses_[H4].name
            ]
        );
    }

    /**
     * @dev get minimal details about a specific round (returns all 0s if round not over)
     * @param _round which round to query
     * @return horse that won
     * @return eth for each horse
     * @return carrots for each horse
     * @return eth invested for each horse
     * @return carrots invested for each horse
     */
    function getPastRoundStats(uint256 _round) 
        public
        view
        returns(uint8, uint256[4], uint256[4], uint256[4], uint256[4])
    {
        if ((_round == 0) || (_round > rID_) || (_round == rID_ && !isRoundOver())) {
            return;
        }
        return
        (
            rounds_[rID_].winner,
            [
                rounds_[_round].eth[H1],
                rounds_[_round].eth[H2],
                rounds_[_round].eth[H3],
                rounds_[_round].eth[H4]
            ],
            [
                rounds_[_round].carrots[H1],
                rounds_[_round].carrots[H2],
                rounds_[_round].carrots[H3],
                rounds_[_round].carrots[H4]
            ],
            [
                players_[msg.sender].eth[_round][H1],
                players_[msg.sender].eth[_round][H2],
                players_[msg.sender].eth[_round][H3],
                players_[msg.sender].eth[_round][H4]
            ],
            [
                players_[msg.sender].carrots[_round][H1],
                players_[msg.sender].carrots[_round][H2],
                players_[msg.sender].carrots[_round][H3],
                players_[msg.sender].carrots[_round][H4]
            ]
        );
    }

    /**
     * @dev get stats for player
     * @return total winnings
     * @return total dividends
     * @return total referral bonus
     * @return total reinvested
     * @return total withdrawn
     */
    function getPlayerStats()
        public 
        view
        returns(uint256, uint256, uint256, uint256, uint256)
    {
        return
        (
            calcPlayerWinnings(),
            calcPlayerDividends(),
            calcPlayerReferrals(),
            players_[msg.sender].totalReinvested,
            players_[msg.sender].totalWithdrawn
        );
    }

    /**
     * @dev get name of player
     * @return players registered name if there is one
     */
    function getPlayerName()
      public
      view
      returns(bytes32)
    {
        return players_[msg.sender].name;
    }

    /**
     * @dev check if name is available
     * @param _name name to check
     * @return bool whether or not it is available
     */
    function isNameAvailable(bytes32 _name)
      public
      view
      returns(bool)
    {
        return registeredNames_[_name] == 0;
    }

    /**
     * @dev get overall stats for EtherDerby
     * @return total eth for each horse
     * @return total carrots for each horse
     * @return player total eth for each horse
     * @return player total carrots for each horse
     * @return horse names
     */
    function getStats()
        public
        view
        returns(uint256[4], uint256[4], uint256[4], uint256[4], bytes32[4])
    {
        return
        (
            [
                horses_[H1].totalEth,
                horses_[H2].totalEth,
                horses_[H3].totalEth,
                horses_[H4].totalEth
            ],
            [
                horses_[H1].totalCarrots,
                horses_[H2].totalCarrots,
                horses_[H3].totalCarrots,
                horses_[H4].totalCarrots
            ],
            [
                players_[msg.sender].totalEth[H1],
                players_[msg.sender].totalEth[H2],
                players_[msg.sender].totalEth[H3],
                players_[msg.sender].totalEth[H4]
            ],
            [
                players_[msg.sender].totalCarrots[H1],
                players_[msg.sender].totalCarrots[H2],
                players_[msg.sender].totalCarrots[H3],
                players_[msg.sender].totalCarrots[H4]
            ],
            [
                horses_[H1].name,
                horses_[H2].name,
                horses_[H3].name,
                horses_[H4].name
            ]
        );
    }

    /**
     * @dev returns data for past 50 rounds
     * @param roundStart which round to start returning data at (0 means current)
     * @return round number this index in the arrays corresponds to
     * @return winning horses for past 50 finished rounds
     * @return horse1 carrot amounts for past 50 rounds
     * @return horse2 carrot amounts for past 50 rounds
     * @return horse3 carrot amounts for past 50 rounds
     * @return horse4 carrot amounts for past 50 rounds
     * @return horse1 players carrots for past 50 rounds
     * @return horse2 players carrots for past 50 rounds
     * @return horse3 players carrots for past 50 rounds
     * @return horse4 players carrots for past 50 rounds
     * @return horseEth total eth amounts for past 50 rounds
     * @return playerEth total player eth amounts for past 50 rounds
     */
    function getPastRounds(uint256 roundStart)
        public
        view
        returns(
            uint256[50] roundNums,
            uint8[50] winners,
            uint256[50] horse1Carrots,
            uint256[50] horse2Carrots,
            uint256[50] horse3Carrots,
            uint256[50] horse4Carrots,
            uint256[50] horse1PlayerCarrots,
            uint256[50] horse2PlayerCarrots,
            uint256[50] horse3PlayerCarrots,
            uint256[50] horse4PlayerCarrots,
            uint256[50] horseEth,
            uint256[50] playerEth
        )
    {
        uint256 index = 0;
        uint256 round = rID_;
        if (roundStart != 0 && roundStart <= rID_) {
            round = roundStart;
        }
        while (index < 50 && round > 0) {
            if (round == rID_ && !isRoundOver()) {
                round--;
                continue;
            }
            roundNums[index] = round;
            winners[index] = rounds_[round].winner;
            horse1Carrots[index] = rounds_[round].carrots[H1];
            horse2Carrots[index] = rounds_[round].carrots[H2];
            horse3Carrots[index] = rounds_[round].carrots[H3];
            horse4Carrots[index] = rounds_[round].carrots[H4];
            horse1PlayerCarrots[index] = players_[msg.sender].carrots[round][H1];
            horse2PlayerCarrots[index] = players_[msg.sender].carrots[round][H2];
            horse3PlayerCarrots[index] = players_[msg.sender].carrots[round][H3];
            horse4PlayerCarrots[index] = players_[msg.sender].carrots[round][H4];
            horseEth[index] = rounds_[round].eth[H1]
                .add(rounds_[round].eth[H2])
                .add(rounds_[round].eth[H3])
                .add(rounds_[round].eth[H4]);
            playerEth[index] = players_[msg.sender].eth[round][H1]
                .add(players_[msg.sender].eth[round][H2])
                .add(players_[msg.sender].eth[round][H3])
                .add(players_[msg.sender].eth[round][H4]);
            index++;
            round--;
        }
    }

    /**
     * @dev calculate price of buying carrots for a specific horse
     * @param _horse which horse to calculate price for
     * @param _carrots how many carrots desired
     * @return ETH required to purchase X many carrots
     */
    function getPriceOfXCarrots(uint8 _horse, uint256 _carrots)
        public
        view
        isValidHorse(_horse)
        returns(uint256)
    {
        return calculateCurrentPrice(_horse, _carrots.mul(1000000000000000000));
    }

    /**
     * @dev calculate price to become majority carrot holder for a specific horse
     * @param _horse which horse to calculate price for
     * @return carrotsRequired
     * @return ethRequired
     * @return currentMax
     * @return owner
     * @return ownerName
     */
    function getPriceToName(uint8 _horse)
        public
        view
        isValidHorse(_horse)
        returns(
            uint256 carrotsRequired,
            uint256 ethRequired,
            uint256 currentMax,
            address owner,
            bytes32 ownerName
        )
    {
        if (players_[msg.sender].totalCarrots[_horse] < horses_[_horse].mostCarrotsOwned) {
            // player is not already majority holder
            // Have user buy one carrot more than current max
            carrotsRequired = horses_[_horse].mostCarrotsOwned.sub(players_[msg.sender].totalCarrots[_horse]).add(10**DECIMALS);
            ethRequired = calculateCurrentPrice(_horse, carrotsRequired);
        }
        currentMax = horses_[_horse].mostCarrotsOwned;
        owner = horses_[_horse].owner;
        ownerName = players_[horses_[_horse].owner].name;
    }
}


//   __   _   ___ ___  _ ___    __   _   _   __  _ _  _     _  ___ _  ___
//  / _| / \ | o \ o \/ \_ _|  / _| / \ | | / _|| | || |   / \|_ _/ \| o \
// ( (_ | o ||   /   ( o ) |  ( (_ | o || |( (_ | U || |_ | o || ( o )   /
//  \__||_n_||_|\\_|\\\_/|_|   \__||_n_||___\__||___||___||_n_||_|\_/|_|\\
//
library CalcCarrots {
    using SafeMath for *;

    /**
     * @dev calculates number of carrots recieved given X eth
     */
    function carrotsReceived(uint256 _currEth, uint256 _newEth)
        internal
        pure
        returns (uint256)
    {
        return carrots((_currEth).add(_newEth)).sub(carrots(_currEth));
    }

    /**
     * @dev calculates amount of eth received if you sold X carrots
     */
    function ethReceived(uint256 _currCarrots, uint256 _sellCarrots)
        internal
        pure
        returns (uint256)
    {
        return eth(_currCarrots).sub(eth(_currCarrots.sub(_sellCarrots)));
    }

    /**
     * @dev calculates how many carrots for a single horse given an amount
     * of eth spent on that horse
     */
    function carrots(uint256 _eth)
        internal
        pure
        returns (uint256)
    {
        return ((((_eth).mul(62831853072000000000000000000000000000000000000)
            .add(9996858654086510028837239824000000000000000000000000000000000000)).sqrt())
            .sub(99984292036732000000000000000000)) / (31415926536);
    }

    /**
     * @dev calculates how much eth would be in the contract for a single
     * horse given an amount of carrots bought for that horse
     */
    function eth(uint256 _carrots)
        internal
        pure
        returns (uint256)
    {
        return ((15707963268).mul(_carrots.mul(_carrots)).add(((199968584073464)
            .mul(_carrots.mul(1000000000000000000))) / (2))) / (1000000000000000000000000000000000000);
    }
}


//  __  _   ___  ___   _   _   _  ___  _ _
// / _|/ \ | __|| __| | \_/ | / \|_ _|| U |
// \_ \ o || _| | _|  | \_/ || o || | |   |
// |__/_n_||_|  |___| |_| |_||_n_||_| |_n_|
//

/**
 * @title SafeMath library from OpenZeppelin
 * @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 c) {
        // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        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 a / b;
    }

    /**
    * @dev Subtracts 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 c) {
        c = a + b;
        assert(c >= a);
        return c;
    }

    /**
     * @dev Gives square root of given x.
     */
    function sqrt(uint256 x)
        internal
        pure
        returns (uint256 y)
    {
        uint256 z = ((add(x,1)) / 2);
        y = x;
        while (z < y)
        {
            y = z;
            z = ((add((x / z),z)) / 2);
        }
    }
}

library SafeConversions {
    function SafeSigned(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        // If a is too large, the signed version will be negative.
        assert(b >= 0);
        return b;
    }

    function SafeUnsigned(int256 a) internal pure returns (uint256) {
        // Only negative numbers are unsafe to make unsigned.
        assert(a >= 0);
        return uint256(a);
    }
}

library NameValidator {
    /**
     * @dev throws on invalid name
     * -converts uppercase to lower case
     * -cannot contain space
     * -cannot be only numbers
     * -cannot be an address (start with 0x)
     * -restricts characters to A-Z, a-z, 0-9
     * @return validated string in bytes32 format
     */
    function validate(string _input)
        internal
        pure
        returns(bytes32)
    {
        bytes memory temp = bytes(_input);
        uint256 length = temp.length;
        
        // limited to 15 characters
        require (length <= 15 && length > 0, "name must be between 1 and 15 characters");
        // cannot be an address
        if (temp[0] == 0x30) {
            require(temp[1] != 0x78, "name cannot start with 0x");
            require(temp[1] != 0x58, "name cannot start with 0X");
        }
        bool _hasNonNumber;
        for (uint256 i = 0; i < length; i++) {
            // if its uppercase A-Z
            if (temp[i] > 0x40 && temp[i] < 0x5b) {
                // convert to lower case
                temp[i] = byte(uint(temp[i]) + 32);
                // character is non number
                if (_hasNonNumber == false) {
                    _hasNonNumber = true;
                }
            } else {
                // character should be only lowercase a-z or 0-9
                require ((temp[i] > 0x60 && temp[i] < 0x7b) || (temp[i] > 0x2f && temp[i] < 0x3a), "name contains invalid characters");

                // check if character is non number 
                if (_hasNonNumber == false && (temp[i] < 0x30 || temp[i] > 0x39)) {
                    _hasNonNumber = true;    
                }
            }
        }
        require(_hasNonNumber == true, "name cannot be only numbers");
        bytes32 _ret;
        assembly {
            _ret := mload(add(temp, 32))
        }
        return (_ret);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"players_","outputs":[{"name":"addr","type":"address"},{"name":"name","type":"bytes32"},{"name":"totalWinnings","type":"uint256"},{"name":"totalReferrals","type":"uint256"},{"name":"dividendPayouts","type":"int256"},{"name":"totalWithdrawn","type":"uint256"},{"name":"totalReinvested","type":"uint256"},{"name":"roundLastManaged","type":"uint256"},{"name":"roundLastReferred","type":"uint256"},{"name":"lastRef","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nameStr","type":"string"}],"name":"registerName","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_round","type":"uint256"}],"name":"getPastRoundStats","outputs":[{"name":"","type":"uint8"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_horse","type":"uint8"}],"name":"getPriceToName","outputs":[{"name":"carrotsRequired","type":"uint256"},{"name":"ethRequired","type":"uint256"},{"name":"currentMax","type":"uint256"},{"name":"owner","type":"address"},{"name":"ownerName","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_horse","type":"uint8"},{"name":"_carrots","type":"uint256"}],"name":"getPriceOfXCarrots","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_horse","type":"uint8"},{"name":"_round","type":"uint256"},{"name":"_referrerName","type":"bytes32"}],"name":"buyCarrots","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"isNameAvailable","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPlayerStats","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"rounds_","outputs":[{"name":"winner","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"REGISTERFEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPlayerName","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawEarnings","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_horse","type":"uint8"},{"name":"_round","type":"uint256"},{"name":"_value","type":"uint256"},{"name":"_referrerName","type":"bytes32"}],"name":"reinvestInCarrots","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"roundStart","type":"uint256"}],"name":"getPastRounds","outputs":[{"name":"roundNums","type":"uint256[50]"},{"name":"winners","type":"uint8[50]"},{"name":"horse1Carrots","type":"uint256[50]"},{"name":"horse2Carrots","type":"uint256[50]"},{"name":"horse3Carrots","type":"uint256[50]"},{"name":"horse4Carrots","type":"uint256[50]"},{"name":"horse1PlayerCarrots","type":"uint256[50]"},{"name":"horse2PlayerCarrots","type":"uint256[50]"},{"name":"horse3PlayerCarrots","type":"uint256[50]"},{"name":"horse4PlayerCarrots","type":"uint256[50]"},{"name":"horseEth","type":"uint256[50]"},{"name":"playerEth","type":"uint256[50]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStats","outputs":[{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"bytes32[4]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRoundStats","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint8"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"uint256[4]"},{"name":"","type":"bytes32[4]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_horse","type":"uint8"},{"name":"_nameStr","type":"string"},{"name":"_referrerName","type":"bytes32"}],"name":"nameHorse","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"roundId","type":"uint256"},{"indexed":false,"name":"horse","type":"uint8[2]"},{"indexed":true,"name":"horseName","type":"bytes32"},{"indexed":false,"name":"data","type":"uint256[6]"},{"indexed":false,"name":"roundEnds","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"OnCarrotsPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerAddress","type":"address"},{"indexed":false,"name":"eth","type":"uint256"}],"name":"OnEthWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"horse","type":"uint8"},{"indexed":false,"name":"horseName","type":"bytes32"},{"indexed":false,"name":"mostCarrotsOwned","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"OnHorseNamed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethDonated","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"OnNameRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerAddress","type":"address"},{"indexed":false,"name":"reason","type":"bytes32"}],"name":"OnTransactionFail","type":"event"}]

60806040526000805534801561001457600080fd5b50610e0f194201600255600460208190527f686f7273653100000000000000000000000000000000000000000000000000007fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05557f686f7273653200000000000000000000000000000000000000000000000000007f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a7557f686f7273653300000000000000000000000000000000000000000000000000007f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa0556000527f686f7273653400000000000000000000000000000000000000000000000000007f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f556142a9806101436000396000f3006080604052600436106100fb5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166302be5421811461016857806306fdde03146101e75780630830602b146102715780630a48bdbb146102bf57806315e5691b1461039d57806321b42566146103ec5780633a7761081461041c57806341f5947b14610430578063847a5e991461045c57806396f5c1521461049c5780639956587e146104ca578063a69c6597146104df578063b73c6ce9146104f4578063b9f2e1f214610509578063bfda8e8a1461052d578063c59d484714610762578063d015d86f146107b9578063dc996199146108d4575b73c17a40cb38598520bd7c0d5bff97d441a810a008600052600360205260008051602061421e8339815191525461013990349063ffffffff61092a16565b73c17a40cb38598520bd7c0d5bff97d441a810a008600052600360205260008051602061421e83398151915255005b34801561017457600080fd5b50610189600160a060020a036004351661093d565b60408051600160a060020a039b8c168152602081019a909a52898101989098526060890196909652608088019490945260a087019290925260c086015260e08501526101008401529092166101208201529051908190036101400190f35b3480156101f357600080fd5b506101fc61099c565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561023657818101518382015260200161021e565b50505050905090810190601f1680156102635780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805160206004803580820135601f81018490048402850184019095528484526102bd9436949293602493928401919081908401838280828437509497506109d39650505050505050565b005b3480156102cb57600080fd5b506102d7600435610c52565b60405160ff861681526020810185608080838360005b838110156103055781810151838201526020016102ed565b5050505090500184600460200280838360005b83811015610330578181015183820152602001610318565b5050505090500183600460200280838360005b8381101561035b578181015183820152602001610343565b5050505090500182600460200280838360005b8381101561038657818101518382015260200161036e565b505050509050019550505050505060405180910390f35b3480156103a957600080fd5b506103b860ff60043516611161565b60408051958652602086019490945284840192909252600160a060020a031660608401526080830152519081900360a00190f35b3480156103f857600080fd5b5061040a60ff600435166024356112bd565b60408051918252519081900360200190f35b6102bd60ff6004351660243560443561135e565b34801561043c57600080fd5b506104486004356115b7565b604080519115158252519081900360200190f35b34801561046857600080fd5b506104716115d3565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b3480156104a857600080fd5b506104b460043561161e565b6040805160ff9092168252519081900360200190f35b3480156104d657600080fd5b5061040a611633565b3480156104eb57600080fd5b5061040a61163e565b34801561050057600080fd5b506102bd611655565b34801561051557600080fd5b506102bd60ff600435166024356044356064356117a9565b34801561053957600080fd5b50610545600435611a65565b604051808d61064080838360005b8381101561056b578181015183820152602001610553565b505050509050018c603260200280838360005b8381101561059657818101518382015260200161057e565b505050509050018b603260200280838360005b838110156105c15781810151838201526020016105a9565b505050509050018a603260200280838360005b838110156105ec5781810151838201526020016105d4565b5050505090500189603260200280838360005b838110156106175781810151838201526020016105ff565b5050505090500188603260200280838360005b8381101561064257818101518382015260200161062a565b5050505090500187603260200280838360005b8381101561066d578181015183820152602001610655565b5050505090500186603260200280838360005b83811015610698578181015183820152602001610680565b5050505090500185603260200280838360005b838110156106c35781810151838201526020016106ab565b5050505090500184603260200280838360005b838110156106ee5781810151838201526020016106d6565b5050505090500183603260200280838360005b83811015610719578181015183820152602001610701565b5050505090500182603260200280838360005b8381101561074457818101518382015260200161072c565b505050509050019c5050505050505050505050505060405180910390f35b34801561076e57600080fd5b50610777611dfe565b6040518086608080838360005b8381101561079c578181015183820152602001610784565b5050895192909401918252509150869050608080838360206102ed565b3480156107c557600080fd5b506107ce6120bd565b604051808981526020018881526020018760ff1660ff16815260200186600460200280838360005b8381101561080e5781810151838201526020016107f6565b5050505090500185600460200280838360005b83811015610839578181015183820152602001610821565b5050505090500184600460200280838360005b8381101561086457818101518382015260200161084c565b5050505090500183600460200280838360005b8381101561088f578181015183820152602001610877565b5050505090500182600460200280838360005b838110156108ba5781810151838201526020016108a2565b505050509050019850505050505050505060405180910390f35b60408051602060046024803582810135601f81018590048502860185019096528585526102bd95833560ff1695369560449491939091019190819084018382808284375094975050933594506126759350505050565b8181018281101561093757fe5b92915050565b6003602081905260009182526040909120805460018201546002830154938301546004840154600a850154600b860154600c870154600d880154600e90980154600160a060020a0397881699969896979596949593949293919291168a565b60408051808201909152600a81527f4574686572446572627900000000000000000000000000000000000000000000602082015281565b600033803b8015610a1c576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b333214610a61576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b66470de4df820000341015610ae6576040805160e560020a62461bcd02815260206004820152602960248201527f596f75206d757374207061792074686520706172746e657220666565206f662060448201527f32302066696e6e65790000000000000000000000000000000000000000000000606482015290519081900360840190fd5b610aef8461296f565b600081815260066020526040902054909350600160a060020a031615610b5f576040805160e560020a62461bcd02815260206004820152601360248201527f4e616d6520616c726561647920696e2075736500000000000000000000000000604482015290519081900360640190fd5b6000838152600660209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19163390811790915583526003909152812060010184905573c17a40cb38598520bd7c0d5bff97d441a810a008905260008051602061421e83398151915254610bd790349063ffffffff61092a16565b73c17a40cb38598520bd7c0d5bff97d441a810a0086000526003602090815260008051602061421e83398151915291909155604080513381529182018590523482820152426060830152517f9d66d53cbc2eeb6bea75583aa14c2062287bfaa0d9051e72df8499985c8156919181900360800190a150505050565b6000610c5c6141be565b610c646141be565b610c6c6141be565b610c746141be565b851580610c82575060005486115b80610c9e575060005486148015610c9e5750610c9c612f43565b155b15610ca857611158565b600160008054815260200190815260200160002060000160009054906101000a900460ff16608060405190810160405280600160008a81526020019081526020016000206001016000600160ff1660ff168152602001908152602001600020548152602001600160008a81526020019081526020016000206001016000600260ff1660ff168152602001908152602001600020548152602001600160008a81526020019081526020016000206001016000600360ff1660ff168152602001908152602001600020548152602001600160008a81526020019081526020016000206001016000600460ff1660ff16815260200190815260200160002054815250608060405190810160405280600160008b81526020019081526020016000206002016000600160ff1660ff168152602001908152602001600020548152602001600160008b81526020019081526020016000206002016000600260ff1660ff168152602001908152602001600020548152602001600160008b81526020019081526020016000206002016000600360ff1660ff168152602001908152602001600020548152602001600160008b81526020019081526020016000206002016000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600460ff1660ff16815260200190815260200160002054815250945094509450945094505b91939590929450565b6000808080808560ff81166001148061117d575060ff81166002145b8061118b575060ff81166003145b80611199575060ff81166004145b15156111dd576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b60ff87166000818152600460209081526040808320600390810154338552908352818420948452600990940190915290205410156112785733600090815260036020818152604080842060ff8c1685526009018252808420546004909252909220015461126991670de0b6b3a76400009161125d9163ffffffff612f4c16565b9063ffffffff61092a16565b95506112758787612f5e565b94505b5050505060ff9290921660009081526004602081815260408084206003808201549190940154600160a060020a03168086529390925290922060010154929491929091565b60008260ff8116600114806112d5575060ff81166002145b806112e3575060ff81166003145b806112f1575060ff81166004145b1515611335576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b6113568461135185670de0b6b3a764000063ffffffff612fb216565b612f5e565b949350505050565b33803b80156113a5576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b3332146113ea576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b34633b9aca00811015611447576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420656e6f75676820657468210000000000000000000000000000000000604482015290519081900360640190fd5b69152d02c7e14af68000008111156114a9576040805160e560020a62461bcd02815260206004820152600e60248201527f476f2061776179207768616c6521000000000000000000000000000000000000604482015290519081900360640190fd5b8560ff8116600114806114bf575060ff81166002145b806114cd575060ff81166003145b806114db575060ff81166004145b151561151f576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b61152886612fdb565b156115a357604080517f496e76616c696420726f756e64000000000000000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a260405133903480156108fc02916000818181858888f1935050505015801561159d573d6000803e3d6000fd5b506115ae565b6115ae873487612ff8565b50505050505050565b600090815260066020526040902054600160a060020a03161590565b60008060008060006115e3613747565b6115eb613778565b6115f36137f2565b336000908152600360205260409020600b810154600a90910154939992985090965094509092509050565b60016020526000908152604090205460ff1681565b66470de4df82000081565b336000908152600360205260409020600101545b90565b600033803b801561169e576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b3332146116e3576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b6116eb613820565b6116f4336138f7565b6116fc613a08565b9250600083111561176e57336000908152600360205260409020600a015461172b90849063ffffffff61092a16565b33600081815260036020526040808220600a01939093559151909185156108fc02918691818181858888f1935050505015801561176c573d6000803e3d6000fd5b505b60408051848152905133917f4a9a7ce5c41059acd2b3d280e9a9a50325c15c2cdda790f1c5a2d9a89eda9755919081900360200190a2505050565b33803b80156117f0576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b333214611835576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b83633b9aca00811015611892576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420656e6f75676820657468210000000000000000000000000000000000604482015290519081900360640190fd5b69152d02c7e14af68000008111156118f4576040805160e560020a62461bcd02815260206004820152600e60248201527f476f2061776179207768616c6521000000000000000000000000000000000000604482015290519081900360640190fd5b8660ff81166001148061190a575060ff81166002145b80611918575060ff81166003145b80611926575060ff81166004145b151561196a576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b61197387612fdb565b156119c157604080517f496e76616c696420726f756e64000000000000000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a2611a5b565b856119ca613a08565b1015611a1957604080517f496e73756666696369656e742066756e647300000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a2611a5b565b336000908152600360205260409020600b0154611a3d90879063ffffffff61092a16565b336000908152600360205260409020600b0155611a5b888787612ff8565b5050505050505050565b611a6d6141dd565b611a756141dd565b611a7d6141dd565b611a856141dd565b611a8d6141dd565b611a956141dd565b611a9d6141dd565b611aa56141dd565b611aad6141dd565b611ab56141dd565b611abd6141dd565b611ac56141dd565b600080548e15801590611ada57506000548f11155b15611ae257508d5b603282108015611af25750600081115b15611ded5760005481148015611b0d5750611b0b612f43565b155b15611b1b5760001901611ae2565b808e8360328110611b2857fe5b6020908102919091019190915260008281526001909152604090205460ff168d8360328110611b5357fe5b60ff90921660209283029190910152600082815260018083526040808320918352600290910190925220548c8360328110611b8a57fe5b60209081029190910191909152600082815260018252604080822060028084520190925220548b8360328110611bbc57fe5b6020908102919091019190915260008281526001825260408082206003835260020190925220548a8360328110611bef57fe5b602090810291909101919091526000828152600182526040808220600483526002019092522054898360328110611c2257fe5b602090810291909101919091523360009081526003825260408082208483526006018352808220600183529092522054888360328110611c5e57fe5b602090810291909101919091523360009081526003825260408082208483526006018352808220600283529092522054878360328110611c9a57fe5b6020908102919091019190915233600090815260038083526040808320858452600601845280832091835292522054868360328110611cd557fe5b602090810291909101919091523360009081526003825260408082208483526006018352808220600483529092522054858360328110611d1157fe5b6020908102919091019190915260008281526001808352604080832060048452820190935282822054600383528383205460028452848420549284529390922054611d639361125d929091839161092a565b848360328110611d6f57fe5b602090810291909101919091523360009081526003808352604080832085845260050184528083206004845290935282822054908252828220546002835283832054600184529390922054611dcd93919261125d929091839161092a565b838360328110611dd957fe5b602002015260019091019060001901611ae2565b505091939597999b5091939597999b565b611e066141be565b611e0e6141be565b611e166141be565b611e1e6141be565b611e266141be565b505060408051608080820183527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe065482527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a8546020808401919091527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa154838501527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a051054606080850191909152845180840186527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe075481527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a954818401527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa254818701527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a051154818301528551808501875233600090815260038086528882206001808452600882018089528b85205486526002808652818a528c862054878b0152848652818a528c862054878e01526004808752918a528c862054878a01528c51808c018e529286526009909301808a528c86205483529285528289528b852054828a01529284528188528a842054818c0152828452908752898320548187015289519788018a527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe055488527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a754888801527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa05499880199909952908190529093527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f549184019190915292979296509450919250565b60008060006120ca6141be565b6120d26141be565b6120da6141be565b6120e26141be565b6120ea6141be565b600054600254600160008054815260200190815260200160002060000160009054906101000a900460ff1660806040519081016040528060016000805481526020019081526020016000206001016000600160ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206001016000600260ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206001016000600360ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206001016000600460ff1660ff1681526020019081526020016000205481525060806040519081016040528060016000805481526020019081526020016000206002016000600160ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206002016000600260ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206002016000600360ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206002016000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600460ff1660ff1681526020019081526020016000205481525060806040519081016040528060046000600160ff1660ff168152602001908152602001600020600001546000191660001916815260200160046000600260ff1660ff168152602001908152602001600020600001546000191660001916815260200160046000600360ff1660ff168152602001908152602001600020600001546000191660001916815260200160046000600460ff1660ff168152602001908152602001600020600001546000191660001916815250975097509750975097509750975097509091929394959697565b33803b80156126bc576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b333214612701576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b8460ff811660011480612717575060ff81166002145b80612725575060ff81166003145b80612733575060ff81166004145b1515612777576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b60ff8616600081815260046020908152604080832060039081015433855290835281842094845260099094019091528120546127ee9161125d9034906001906127be613a53565b81526020808201929092526040908101600090812060ff8f1682526001019092529020549063ffffffff613a7516565b101561287457604080517f496e73756666696369656e742066756e647300000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a2600034111561286f5760405133903480156108fc02916000818181858888f1935050505015801561286d573d6000803e3d6000fd5b505b612967565b600034111561288857612888863486612ff8565b6128918561296f565b60ff871660009081526004602081905260409091209182550154600160a060020a031633146128ee5760ff8616600090815260046020819052604090912001805473ffffffffffffffffffffffffffffffffffffffff1916331790555b3360008181526003602081815260408084206001015460ff8c168086526004845294829020805494015482519687529286015284810193909352606084019190915260808301524260a0830152517f9e17b52779622ff1f917bf346e699156a067e77d4fb32d5bc004c9afbf6708219181900360c00190a15b505050505050565b80516000908290828080600f841180159061298a5750600084115b1515612a06576040805160e560020a62461bcd02815260206004820152602860248201527f6e616d65206d757374206265206265747765656e203120616e6420313520636860448201527f6172616374657273000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b846000815181101515612a1557fe5b90602001015160f860020a900460f860020a02600160f860020a031916603060f860020a021415612b5857846001815181101515612a4f57fe5b90602001015160f860020a900460f860020a02600160f860020a031916607860f860020a0214151515612acc576040805160e560020a62461bcd02815260206004820152601960248201527f6e616d652063616e6e6f74207374617274207769746820307800000000000000604482015290519081900360640190fd5b846001815181101515612adb57fe5b90602001015160f860020a900460f860020a02600160f860020a031916605860f860020a0214151515612b58576040805160e560020a62461bcd02815260206004820152601960248201527f6e616d652063616e6e6f74207374617274207769746820305800000000000000604482015290519081900360640190fd5b600091505b83821015612edb5784517f400000000000000000000000000000000000000000000000000000000000000090869084908110612b9557fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612c09575084517f5b0000000000000000000000000000000000000000000000000000000000000090869084908110612bea57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b15612c76578482815181101515612c1c57fe5b90602001015160f860020a900460f860020a0260f860020a900460200160f860020a028583815181101515612c4d57fe5b906020010190600160f860020a031916908160001a905350821515612c7157600192505b612ed0565b84517f600000000000000000000000000000000000000000000000000000000000000090869084908110612ca657fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612d1a575084517f7b0000000000000000000000000000000000000000000000000000000000000090869084908110612cfb57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b80612dc4575084517f2f0000000000000000000000000000000000000000000000000000000000000090869084908110612d5057fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612dc4575084517f3a0000000000000000000000000000000000000000000000000000000000000090869084908110612da557fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b1515612e1a576040805160e560020a62461bcd02815260206004820181905260248201527f6e616d6520636f6e7461696e7320696e76616c69642063686172616374657273604482015290519081900360640190fd5b82158015612ec6575084517f300000000000000000000000000000000000000000000000000000000000000090869084908110612e5357fe5b90602001015160f860020a900460f860020a02600160f860020a0319161080612ec6575084517f390000000000000000000000000000000000000000000000000000000000000090869084908110612ea757fe5b90602001015160f860020a900460f860020a02600160f860020a031916115b15612ed057600192505b600190910190612b5d565b600183151514612f35576040805160e560020a62461bcd02815260206004820152601b60248201527f6e616d652063616e6e6f74206265206f6e6c79206e756d626572730000000000604482015290519081900360640190fd5b505050506020015192915050565b60025442101590565b600082821115612f5857fe5b50900390565b600080612f69612f43565b1515612f92575060008054815260016020908152604080832060ff871684526002019091529020545b61135683612fa6838263ffffffff61092a16565b9063ffffffff613aa216565b6000821515612fc357506000610937565b50818102818382811515612fd357fe5b041461093757fe5b600081158015906109375750612fef613a53565b82141592915050565b600080613003613ac8565b61300b613820565b61301483613b26565b915061301f826138f7565b600160a060020a03821673c17a40cb38598520bd7c0d5bff97d441a810a008146130605761306073c17a40cb38598520bd7c0d5bff97d441a810a0086138f7565b60008054815260016020818152604080842060ff8a1685529092019052902054613090908563ffffffff613a7516565b33600090815260036020908152604080832083548452600501825280832060ff8a1684529091529020549091506130ce90859063ffffffff61092a16565b3360009081526003602090815260408083208354845260058101835281842060ff8b1680865290845282852095909555835484526006018252808320938352929052205461312390829063ffffffff61092a16565b3360009081526003602090815260408083208354845260068101835281842060ff8b16855283528184209490945560089093019052205461316590859061092a565b33600090815260036020908152604080832060ff8a1684526008810183528184209490945560099093019052205461319e90829061092a565b33600090815260036020908152604080832060ff8a1684526009019091529020556005546131db906131d6908363ffffffff612fb216565b613c51565b3360009081526003602090815260408083206004018054909401909355600160a060020a038516825282822082548352600701815282822060ff891683529052205461322a9061125d86613c5e565b600160a060020a038316600090815260036020908152604080832083548452600701825280832060ff8a1680855290835281842094909455825483527f0519235f8bb76824fedb09ceb8463c91ba75d601351fa046c29214ea50b71893825280832093835292905220546132a99061125d86606463ffffffff613c7616565b6000805481527f0519235f8bb76824fedb09ceb8463c91ba75d601351fa046c29214ea50b718936020908152604080832060ff8a168085529083528184209490945560048252808320600390810154338552908352818420948452600990940190915290205411156133415733600090815260036020818152604080842060ff8a168552600901825280842054600490925290922001555b60008054815260016020818152604080842060ff8a168552909201905290205461337290859063ffffffff61092a16565b60008054815260016020818152604080842060ff8b1680865290840183528185209590955583548452918152818320938352600290930190925220546133bf90829063ffffffff61092a16565b60008054815260016020818152604080842060ff808c168087526002909201845282862096909655845485529290915290912054909116148015906134315750600080548152600160209081526040808320805460ff9081168552600290910190925280832054918816835290912054115b1561345357600080548152600160205260409020805460ff191660ff87161790555b60ff851660009081526004602052604090206002015461347a90829063ffffffff61092a16565b60ff861660009081526004602052604090206002810191909155600101546134a990859063ffffffff61092a16565b600460008760ff1660ff16815260200190815260200160002060010181905550600460008660ff1660ff168152602001908152602001600020600001546000191633600160a060020a03167f37e922ba04599bac08dd204063b35033a2404af8421bbbfc19e37ae1428d27816003600033600160a060020a0316600160a060020a031681526020019081526020016000206001015460005460408051908101604052808b60ff1660ff168152602001600160008054815260200190815260200160002060000160009054906101000a900460ff1660ff1660ff1681525060c0604051908101604052808b8152602001888152602001600160008054815260200190815260200160002060010160008e60ff1660ff168152602001908152602001600020548152602001600160008054815260200190815260200160002060020160008e60ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008054815260200190815260200160002060008e60ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008054815260200190815260200160002060008e60ff1660ff168152602001908152602001600020548152506002544260405180876000191660001916815260200186815260200185600260200280838360005b838110156136f25781810151838201526020016136da565b5050505090500184600660200280838360005b8381101561371d578181015183820152602001613705565b50505050905001838152602001828152602001965050505050505060405180910390a35050505050565b6000613773613754613c8b565b336000908152600360205260409020600201549063ffffffff61092a16565b905090565b600080600080613786613d92565b9250613790613dcf565b91506137ae6131d68461125d60055486612fb290919063ffffffff16565b336000908152600360205260409020600401549091506137ea9068010000000000000000906137de908403613e17565b9063ffffffff613c7616565b935050505090565b600061377361380033613e23565b33600090815260036020819052604090912001549063ffffffff61092a16565b600061382a613c8b565b9050600081111561386d573360009081526003602052604090206002015461385990829063ffffffff61092a16565b336000908152600360205260409020600201555b6000805433825260036020526040909120600c01541480156138925750613892612f43565b156138c3576000546138ab90600163ffffffff61092a16565b336000908152600360205260409020600c01556138f4565b6000805433825260036020526040909120600c015410156138f4576000805433825260036020526040909120600c01555b50565b600061390282613e23565b9050600081111561395957600160a060020a0382166000908152600360208190526040909120015461393b90829063ffffffff61092a16565b600160a060020a038316600090815260036020819052604090912001555b60008054600160a060020a038416825260036020526040909120600d01541480156139875750613987612f43565b156139c1576000546139a090600163ffffffff61092a16565b600160a060020a0383166000908152600360205260409020600d0155613a04565b60008054600160a060020a038416825260036020526040909120600d01541015613a045760008054600160a060020a038416825260036020526040909120600d01555b5050565b336000908152600360205260408120600b810154600a909101546137739190613a479081613a346137f2565b61125d613a3f613778565b61125d613747565b9063ffffffff612f4c16565b6000613a5d612f43565b15613a6e5750600054600101611652565b5060005490565b6000613a9b613a8384613eef565b613a47613a96868663ffffffff61092a16565b613eef565b9392505050565b6000613a9b613abf613aba858563ffffffff612f4c16565b613f64565b613a4785613f64565b6000613ad2612f43565b1515613add576138f4565b613af0613aeb600054613fd8565b61403e565b90506000811115613b1257600554613b0e908263ffffffff61092a16565b6005555b600080546001019055426138400160025550565b6000808215801590613b4e5750600083815260066020526040902054600160a060020a031615155b8015613b6c5750336000908152600360205260409020600101548314155b15613b8f5750600082815260066020526040902054600160a060020a0316613be9565b336000908152600360205260409020600e0154600160a060020a031615613bd25750336000908152600360205260409020600e0154600160a060020a0316613be9565b5073c17a40cb38598520bd7c0d5bff97d441a810a0085b336000908152600360205260409020600e0154600160a060020a03828116911614613c4757336000908152600360205260409020600e01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b8091505b50919050565b60008181811215613c4757fe5b600061093760646137de84600963ffffffff612fb216565b60008183811515613c8357fe5b049392505050565b336000908152600360205260408120600c0154801580613cac575060005481115b80613cc8575060005481148015613cc85750613cc6612f43565b155b15613cd65760009150613d8e565b6000818152600160209081526040808320805460ff168452600201909152902054613d8b90613d4f906137de613d13613d0e86613fd8565b61407b565b3360009081526003602090815260408083208984526006018252808320600183528184205460ff1684529091529020549063ffffffff612fb216565b3360009081526003602090815260408083208684526005018252808320600183528184205460ff1684529091529020549063ffffffff61092a16565b91505b5090565b6000613d9c612f43565b1515613daa57506000611652565b613773613db5613dcf565b613dc3613aeb600054613fd8565b9063ffffffff612fb216565b33600090815260036020818152604080842060048552600901909152808320549183528083205460028452818420546001855291842054613773939261125d9291839161092a565b600080821215613d8e57fe5b600160a060020a0381166000908152600360205260408120600d015481811580613e4e575060005482115b80613e6a575060005482148015613e6a5750613e68612f43565b155b1515613ee8575060015b600460ff821611613ee85760008281526001602052604090205460ff828116911614613ee057600160a060020a0384166000908152600360209081526040808320858452600701825280832060ff85168452909152902054613edd90849063ffffffff61092a16565b92505b600101613e74565b5050919050565b600064075088ff08613f546d04edfaabeec07f6d844414700000613a47613f4f7a184d0f77425630299fa70407e0e1d45a96ce8e5d21b1000000000061125d88730b017a4cd83664b71dee232edc9bd1000000000063ffffffff612fb216565b6140be565b811515613f5d57fe5b0492915050565b60006ec097ce7bc90715b34b9f1000000000613f546002613fa9613f9686670de0b6b3a764000063ffffffff612fb216565b65b5ded06b80f89063ffffffff612fb216565b811515613fb257fe5b0461125d613fc6868063ffffffff612fb216565b6403a8447f849063ffffffff612fb216565b600060015b600460ff821611613c4b5760008381526001602052604090205460ff82811691161461403657600083815260016020818152604080842060ff86168552909201905290205461403390839063ffffffff61092a16565b91505b600101613fdd565b600080614049614111565b905080151561405b5760009150613c4b565b613a9b816137de600a81876801000000000000000063ffffffff612fb216565b600061093761409183600a63ffffffff613c7616565b613a476140a585606463ffffffff613c7616565b613a476140b187613c5e565b879063ffffffff612f4c16565b60008060026140ce84600161092a565b8115156140d757fe5b0490508291505b81811015613c4b57809150600261410082858115156140f957fe5b048361092a565b81151561410957fe5b0490506140de565b60046020527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a0511547f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa2547f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a954600160009081527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe0754909361377393909261125d92839163ffffffff61092a16565b6080604051908101604052806004906020820280388339509192915050565b61064060405190810160405280603290602082028038833950919291505056007c9cea421c85b153482cc16cc5d3f3c486d5efc921236b82e56302d82cfba5230519235f8bb76824fedb09ceb8463c91ba75d601351fa046c29214ea50b7188f48756d616e73206f6e6c79203b29000000000000000000000000000000000000756e6b6e6f776e20686f7273652073656c656374656400000000000000000000a165627a7a7230582059143cca1f4a30ae88a4d6456817108ad7cec9c70f0eb0d7ec65c55df0f029830029

Deployed Bytecode

0x6080604052600436106100fb5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166302be5421811461016857806306fdde03146101e75780630830602b146102715780630a48bdbb146102bf57806315e5691b1461039d57806321b42566146103ec5780633a7761081461041c57806341f5947b14610430578063847a5e991461045c57806396f5c1521461049c5780639956587e146104ca578063a69c6597146104df578063b73c6ce9146104f4578063b9f2e1f214610509578063bfda8e8a1461052d578063c59d484714610762578063d015d86f146107b9578063dc996199146108d4575b73c17a40cb38598520bd7c0d5bff97d441a810a008600052600360205260008051602061421e8339815191525461013990349063ffffffff61092a16565b73c17a40cb38598520bd7c0d5bff97d441a810a008600052600360205260008051602061421e83398151915255005b34801561017457600080fd5b50610189600160a060020a036004351661093d565b60408051600160a060020a039b8c168152602081019a909a52898101989098526060890196909652608088019490945260a087019290925260c086015260e08501526101008401529092166101208201529051908190036101400190f35b3480156101f357600080fd5b506101fc61099c565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561023657818101518382015260200161021e565b50505050905090810190601f1680156102635780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805160206004803580820135601f81018490048402850184019095528484526102bd9436949293602493928401919081908401838280828437509497506109d39650505050505050565b005b3480156102cb57600080fd5b506102d7600435610c52565b60405160ff861681526020810185608080838360005b838110156103055781810151838201526020016102ed565b5050505090500184600460200280838360005b83811015610330578181015183820152602001610318565b5050505090500183600460200280838360005b8381101561035b578181015183820152602001610343565b5050505090500182600460200280838360005b8381101561038657818101518382015260200161036e565b505050509050019550505050505060405180910390f35b3480156103a957600080fd5b506103b860ff60043516611161565b60408051958652602086019490945284840192909252600160a060020a031660608401526080830152519081900360a00190f35b3480156103f857600080fd5b5061040a60ff600435166024356112bd565b60408051918252519081900360200190f35b6102bd60ff6004351660243560443561135e565b34801561043c57600080fd5b506104486004356115b7565b604080519115158252519081900360200190f35b34801561046857600080fd5b506104716115d3565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b3480156104a857600080fd5b506104b460043561161e565b6040805160ff9092168252519081900360200190f35b3480156104d657600080fd5b5061040a611633565b3480156104eb57600080fd5b5061040a61163e565b34801561050057600080fd5b506102bd611655565b34801561051557600080fd5b506102bd60ff600435166024356044356064356117a9565b34801561053957600080fd5b50610545600435611a65565b604051808d61064080838360005b8381101561056b578181015183820152602001610553565b505050509050018c603260200280838360005b8381101561059657818101518382015260200161057e565b505050509050018b603260200280838360005b838110156105c15781810151838201526020016105a9565b505050509050018a603260200280838360005b838110156105ec5781810151838201526020016105d4565b5050505090500189603260200280838360005b838110156106175781810151838201526020016105ff565b5050505090500188603260200280838360005b8381101561064257818101518382015260200161062a565b5050505090500187603260200280838360005b8381101561066d578181015183820152602001610655565b5050505090500186603260200280838360005b83811015610698578181015183820152602001610680565b5050505090500185603260200280838360005b838110156106c35781810151838201526020016106ab565b5050505090500184603260200280838360005b838110156106ee5781810151838201526020016106d6565b5050505090500183603260200280838360005b83811015610719578181015183820152602001610701565b5050505090500182603260200280838360005b8381101561074457818101518382015260200161072c565b505050509050019c5050505050505050505050505060405180910390f35b34801561076e57600080fd5b50610777611dfe565b6040518086608080838360005b8381101561079c578181015183820152602001610784565b5050895192909401918252509150869050608080838360206102ed565b3480156107c557600080fd5b506107ce6120bd565b604051808981526020018881526020018760ff1660ff16815260200186600460200280838360005b8381101561080e5781810151838201526020016107f6565b5050505090500185600460200280838360005b83811015610839578181015183820152602001610821565b5050505090500184600460200280838360005b8381101561086457818101518382015260200161084c565b5050505090500183600460200280838360005b8381101561088f578181015183820152602001610877565b5050505090500182600460200280838360005b838110156108ba5781810151838201526020016108a2565b505050509050019850505050505050505060405180910390f35b60408051602060046024803582810135601f81018590048502860185019096528585526102bd95833560ff1695369560449491939091019190819084018382808284375094975050933594506126759350505050565b8181018281101561093757fe5b92915050565b6003602081905260009182526040909120805460018201546002830154938301546004840154600a850154600b860154600c870154600d880154600e90980154600160a060020a0397881699969896979596949593949293919291168a565b60408051808201909152600a81527f4574686572446572627900000000000000000000000000000000000000000000602082015281565b600033803b8015610a1c576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b333214610a61576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b66470de4df820000341015610ae6576040805160e560020a62461bcd02815260206004820152602960248201527f596f75206d757374207061792074686520706172746e657220666565206f662060448201527f32302066696e6e65790000000000000000000000000000000000000000000000606482015290519081900360840190fd5b610aef8461296f565b600081815260066020526040902054909350600160a060020a031615610b5f576040805160e560020a62461bcd02815260206004820152601360248201527f4e616d6520616c726561647920696e2075736500000000000000000000000000604482015290519081900360640190fd5b6000838152600660209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19163390811790915583526003909152812060010184905573c17a40cb38598520bd7c0d5bff97d441a810a008905260008051602061421e83398151915254610bd790349063ffffffff61092a16565b73c17a40cb38598520bd7c0d5bff97d441a810a0086000526003602090815260008051602061421e83398151915291909155604080513381529182018590523482820152426060830152517f9d66d53cbc2eeb6bea75583aa14c2062287bfaa0d9051e72df8499985c8156919181900360800190a150505050565b6000610c5c6141be565b610c646141be565b610c6c6141be565b610c746141be565b851580610c82575060005486115b80610c9e575060005486148015610c9e5750610c9c612f43565b155b15610ca857611158565b600160008054815260200190815260200160002060000160009054906101000a900460ff16608060405190810160405280600160008a81526020019081526020016000206001016000600160ff1660ff168152602001908152602001600020548152602001600160008a81526020019081526020016000206001016000600260ff1660ff168152602001908152602001600020548152602001600160008a81526020019081526020016000206001016000600360ff1660ff168152602001908152602001600020548152602001600160008a81526020019081526020016000206001016000600460ff1660ff16815260200190815260200160002054815250608060405190810160405280600160008b81526020019081526020016000206002016000600160ff1660ff168152602001908152602001600020548152602001600160008b81526020019081526020016000206002016000600260ff1660ff168152602001908152602001600020548152602001600160008b81526020019081526020016000206002016000600360ff1660ff168152602001908152602001600020548152602001600160008b81526020019081526020016000206002016000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008c81526020019081526020016000206000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008d81526020019081526020016000206000600460ff1660ff16815260200190815260200160002054815250945094509450945094505b91939590929450565b6000808080808560ff81166001148061117d575060ff81166002145b8061118b575060ff81166003145b80611199575060ff81166004145b15156111dd576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b60ff87166000818152600460209081526040808320600390810154338552908352818420948452600990940190915290205410156112785733600090815260036020818152604080842060ff8c1685526009018252808420546004909252909220015461126991670de0b6b3a76400009161125d9163ffffffff612f4c16565b9063ffffffff61092a16565b95506112758787612f5e565b94505b5050505060ff9290921660009081526004602081815260408084206003808201549190940154600160a060020a03168086529390925290922060010154929491929091565b60008260ff8116600114806112d5575060ff81166002145b806112e3575060ff81166003145b806112f1575060ff81166004145b1515611335576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b6113568461135185670de0b6b3a764000063ffffffff612fb216565b612f5e565b949350505050565b33803b80156113a5576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b3332146113ea576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b34633b9aca00811015611447576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420656e6f75676820657468210000000000000000000000000000000000604482015290519081900360640190fd5b69152d02c7e14af68000008111156114a9576040805160e560020a62461bcd02815260206004820152600e60248201527f476f2061776179207768616c6521000000000000000000000000000000000000604482015290519081900360640190fd5b8560ff8116600114806114bf575060ff81166002145b806114cd575060ff81166003145b806114db575060ff81166004145b151561151f576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b61152886612fdb565b156115a357604080517f496e76616c696420726f756e64000000000000000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a260405133903480156108fc02916000818181858888f1935050505015801561159d573d6000803e3d6000fd5b506115ae565b6115ae873487612ff8565b50505050505050565b600090815260066020526040902054600160a060020a03161590565b60008060008060006115e3613747565b6115eb613778565b6115f36137f2565b336000908152600360205260409020600b810154600a90910154939992985090965094509092509050565b60016020526000908152604090205460ff1681565b66470de4df82000081565b336000908152600360205260409020600101545b90565b600033803b801561169e576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b3332146116e3576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b6116eb613820565b6116f4336138f7565b6116fc613a08565b9250600083111561176e57336000908152600360205260409020600a015461172b90849063ffffffff61092a16565b33600081815260036020526040808220600a01939093559151909185156108fc02918691818181858888f1935050505015801561176c573d6000803e3d6000fd5b505b60408051848152905133917f4a9a7ce5c41059acd2b3d280e9a9a50325c15c2cdda790f1c5a2d9a89eda9755919081900360200190a2505050565b33803b80156117f0576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b333214611835576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b83633b9aca00811015611892576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420656e6f75676820657468210000000000000000000000000000000000604482015290519081900360640190fd5b69152d02c7e14af68000008111156118f4576040805160e560020a62461bcd02815260206004820152600e60248201527f476f2061776179207768616c6521000000000000000000000000000000000000604482015290519081900360640190fd5b8660ff81166001148061190a575060ff81166002145b80611918575060ff81166003145b80611926575060ff81166004145b151561196a576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b61197387612fdb565b156119c157604080517f496e76616c696420726f756e64000000000000000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a2611a5b565b856119ca613a08565b1015611a1957604080517f496e73756666696369656e742066756e647300000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a2611a5b565b336000908152600360205260409020600b0154611a3d90879063ffffffff61092a16565b336000908152600360205260409020600b0155611a5b888787612ff8565b5050505050505050565b611a6d6141dd565b611a756141dd565b611a7d6141dd565b611a856141dd565b611a8d6141dd565b611a956141dd565b611a9d6141dd565b611aa56141dd565b611aad6141dd565b611ab56141dd565b611abd6141dd565b611ac56141dd565b600080548e15801590611ada57506000548f11155b15611ae257508d5b603282108015611af25750600081115b15611ded5760005481148015611b0d5750611b0b612f43565b155b15611b1b5760001901611ae2565b808e8360328110611b2857fe5b6020908102919091019190915260008281526001909152604090205460ff168d8360328110611b5357fe5b60ff90921660209283029190910152600082815260018083526040808320918352600290910190925220548c8360328110611b8a57fe5b60209081029190910191909152600082815260018252604080822060028084520190925220548b8360328110611bbc57fe5b6020908102919091019190915260008281526001825260408082206003835260020190925220548a8360328110611bef57fe5b602090810291909101919091526000828152600182526040808220600483526002019092522054898360328110611c2257fe5b602090810291909101919091523360009081526003825260408082208483526006018352808220600183529092522054888360328110611c5e57fe5b602090810291909101919091523360009081526003825260408082208483526006018352808220600283529092522054878360328110611c9a57fe5b6020908102919091019190915233600090815260038083526040808320858452600601845280832091835292522054868360328110611cd557fe5b602090810291909101919091523360009081526003825260408082208483526006018352808220600483529092522054858360328110611d1157fe5b6020908102919091019190915260008281526001808352604080832060048452820190935282822054600383528383205460028452848420549284529390922054611d639361125d929091839161092a565b848360328110611d6f57fe5b602090810291909101919091523360009081526003808352604080832085845260050184528083206004845290935282822054908252828220546002835283832054600184529390922054611dcd93919261125d929091839161092a565b838360328110611dd957fe5b602002015260019091019060001901611ae2565b505091939597999b5091939597999b565b611e066141be565b611e0e6141be565b611e166141be565b611e1e6141be565b611e266141be565b505060408051608080820183527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe065482527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a8546020808401919091527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa154838501527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a051054606080850191909152845180840186527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe075481527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a954818401527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa254818701527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a051154818301528551808501875233600090815260038086528882206001808452600882018089528b85205486526002808652818a528c862054878b0152848652818a528c862054878e01526004808752918a528c862054878a01528c51808c018e529286526009909301808a528c86205483529285528289528b852054828a01529284528188528a842054818c0152828452908752898320548187015289519788018a527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe055488527f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a754888801527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa05499880199909952908190529093527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f549184019190915292979296509450919250565b60008060006120ca6141be565b6120d26141be565b6120da6141be565b6120e26141be565b6120ea6141be565b600054600254600160008054815260200190815260200160002060000160009054906101000a900460ff1660806040519081016040528060016000805481526020019081526020016000206001016000600160ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206001016000600260ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206001016000600360ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206001016000600460ff1660ff1681526020019081526020016000205481525060806040519081016040528060016000805481526020019081526020016000206002016000600160ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206002016000600260ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206002016000600360ff1660ff16815260200190815260200160002054815260200160016000805481526020019081526020016000206002016000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206005016000805481526020019081526020016000206000600460ff1660ff168152602001908152602001600020548152506080604051908101604052806003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600160ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600260ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600360ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a031681526020019081526020016000206006016000805481526020019081526020016000206000600460ff1660ff1681526020019081526020016000205481525060806040519081016040528060046000600160ff1660ff168152602001908152602001600020600001546000191660001916815260200160046000600260ff1660ff168152602001908152602001600020600001546000191660001916815260200160046000600360ff1660ff168152602001908152602001600020600001546000191660001916815260200160046000600460ff1660ff168152602001908152602001600020600001546000191660001916815250975097509750975097509750975097509091929394959697565b33803b80156126bc576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b333214612701576040805160e560020a62461bcd02815260206004820152600e602482015260008051602061423e833981519152604482015290519081900360640190fd5b8460ff811660011480612717575060ff81166002145b80612725575060ff81166003145b80612733575060ff81166004145b1515612777576040805160e560020a62461bcd028152602060048201526016602482015260008051602061425e833981519152604482015290519081900360640190fd5b60ff8616600081815260046020908152604080832060039081015433855290835281842094845260099094019091528120546127ee9161125d9034906001906127be613a53565b81526020808201929092526040908101600090812060ff8f1682526001019092529020549063ffffffff613a7516565b101561287457604080517f496e73756666696369656e742066756e647300000000000000000000000000008152905133916000805160206141fe833981519152919081900360200190a2600034111561286f5760405133903480156108fc02916000818181858888f1935050505015801561286d573d6000803e3d6000fd5b505b612967565b600034111561288857612888863486612ff8565b6128918561296f565b60ff871660009081526004602081905260409091209182550154600160a060020a031633146128ee5760ff8616600090815260046020819052604090912001805473ffffffffffffffffffffffffffffffffffffffff1916331790555b3360008181526003602081815260408084206001015460ff8c168086526004845294829020805494015482519687529286015284810193909352606084019190915260808301524260a0830152517f9e17b52779622ff1f917bf346e699156a067e77d4fb32d5bc004c9afbf6708219181900360c00190a15b505050505050565b80516000908290828080600f841180159061298a5750600084115b1515612a06576040805160e560020a62461bcd02815260206004820152602860248201527f6e616d65206d757374206265206265747765656e203120616e6420313520636860448201527f6172616374657273000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b846000815181101515612a1557fe5b90602001015160f860020a900460f860020a02600160f860020a031916603060f860020a021415612b5857846001815181101515612a4f57fe5b90602001015160f860020a900460f860020a02600160f860020a031916607860f860020a0214151515612acc576040805160e560020a62461bcd02815260206004820152601960248201527f6e616d652063616e6e6f74207374617274207769746820307800000000000000604482015290519081900360640190fd5b846001815181101515612adb57fe5b90602001015160f860020a900460f860020a02600160f860020a031916605860f860020a0214151515612b58576040805160e560020a62461bcd02815260206004820152601960248201527f6e616d652063616e6e6f74207374617274207769746820305800000000000000604482015290519081900360640190fd5b600091505b83821015612edb5784517f400000000000000000000000000000000000000000000000000000000000000090869084908110612b9557fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612c09575084517f5b0000000000000000000000000000000000000000000000000000000000000090869084908110612bea57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b15612c76578482815181101515612c1c57fe5b90602001015160f860020a900460f860020a0260f860020a900460200160f860020a028583815181101515612c4d57fe5b906020010190600160f860020a031916908160001a905350821515612c7157600192505b612ed0565b84517f600000000000000000000000000000000000000000000000000000000000000090869084908110612ca657fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612d1a575084517f7b0000000000000000000000000000000000000000000000000000000000000090869084908110612cfb57fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b80612dc4575084517f2f0000000000000000000000000000000000000000000000000000000000000090869084908110612d5057fe5b90602001015160f860020a900460f860020a02600160f860020a031916118015612dc4575084517f3a0000000000000000000000000000000000000000000000000000000000000090869084908110612da557fe5b90602001015160f860020a900460f860020a02600160f860020a031916105b1515612e1a576040805160e560020a62461bcd02815260206004820181905260248201527f6e616d6520636f6e7461696e7320696e76616c69642063686172616374657273604482015290519081900360640190fd5b82158015612ec6575084517f300000000000000000000000000000000000000000000000000000000000000090869084908110612e5357fe5b90602001015160f860020a900460f860020a02600160f860020a0319161080612ec6575084517f390000000000000000000000000000000000000000000000000000000000000090869084908110612ea757fe5b90602001015160f860020a900460f860020a02600160f860020a031916115b15612ed057600192505b600190910190612b5d565b600183151514612f35576040805160e560020a62461bcd02815260206004820152601b60248201527f6e616d652063616e6e6f74206265206f6e6c79206e756d626572730000000000604482015290519081900360640190fd5b505050506020015192915050565b60025442101590565b600082821115612f5857fe5b50900390565b600080612f69612f43565b1515612f92575060008054815260016020908152604080832060ff871684526002019091529020545b61135683612fa6838263ffffffff61092a16565b9063ffffffff613aa216565b6000821515612fc357506000610937565b50818102818382811515612fd357fe5b041461093757fe5b600081158015906109375750612fef613a53565b82141592915050565b600080613003613ac8565b61300b613820565b61301483613b26565b915061301f826138f7565b600160a060020a03821673c17a40cb38598520bd7c0d5bff97d441a810a008146130605761306073c17a40cb38598520bd7c0d5bff97d441a810a0086138f7565b60008054815260016020818152604080842060ff8a1685529092019052902054613090908563ffffffff613a7516565b33600090815260036020908152604080832083548452600501825280832060ff8a1684529091529020549091506130ce90859063ffffffff61092a16565b3360009081526003602090815260408083208354845260058101835281842060ff8b1680865290845282852095909555835484526006018252808320938352929052205461312390829063ffffffff61092a16565b3360009081526003602090815260408083208354845260068101835281842060ff8b16855283528184209490945560089093019052205461316590859061092a565b33600090815260036020908152604080832060ff8a1684526008810183528184209490945560099093019052205461319e90829061092a565b33600090815260036020908152604080832060ff8a1684526009019091529020556005546131db906131d6908363ffffffff612fb216565b613c51565b3360009081526003602090815260408083206004018054909401909355600160a060020a038516825282822082548352600701815282822060ff891683529052205461322a9061125d86613c5e565b600160a060020a038316600090815260036020908152604080832083548452600701825280832060ff8a1680855290835281842094909455825483527f0519235f8bb76824fedb09ceb8463c91ba75d601351fa046c29214ea50b71893825280832093835292905220546132a99061125d86606463ffffffff613c7616565b6000805481527f0519235f8bb76824fedb09ceb8463c91ba75d601351fa046c29214ea50b718936020908152604080832060ff8a168085529083528184209490945560048252808320600390810154338552908352818420948452600990940190915290205411156133415733600090815260036020818152604080842060ff8a168552600901825280842054600490925290922001555b60008054815260016020818152604080842060ff8a168552909201905290205461337290859063ffffffff61092a16565b60008054815260016020818152604080842060ff8b1680865290840183528185209590955583548452918152818320938352600290930190925220546133bf90829063ffffffff61092a16565b60008054815260016020818152604080842060ff808c168087526002909201845282862096909655845485529290915290912054909116148015906134315750600080548152600160209081526040808320805460ff9081168552600290910190925280832054918816835290912054115b1561345357600080548152600160205260409020805460ff191660ff87161790555b60ff851660009081526004602052604090206002015461347a90829063ffffffff61092a16565b60ff861660009081526004602052604090206002810191909155600101546134a990859063ffffffff61092a16565b600460008760ff1660ff16815260200190815260200160002060010181905550600460008660ff1660ff168152602001908152602001600020600001546000191633600160a060020a03167f37e922ba04599bac08dd204063b35033a2404af8421bbbfc19e37ae1428d27816003600033600160a060020a0316600160a060020a031681526020019081526020016000206001015460005460408051908101604052808b60ff1660ff168152602001600160008054815260200190815260200160002060000160009054906101000a900460ff1660ff1660ff1681525060c0604051908101604052808b8152602001888152602001600160008054815260200190815260200160002060010160008e60ff1660ff168152602001908152602001600020548152602001600160008054815260200190815260200160002060020160008e60ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060050160008054815260200190815260200160002060008e60ff1660ff1681526020019081526020016000205481526020016003600033600160a060020a0316600160a060020a0316815260200190815260200160002060060160008054815260200190815260200160002060008e60ff1660ff168152602001908152602001600020548152506002544260405180876000191660001916815260200186815260200185600260200280838360005b838110156136f25781810151838201526020016136da565b5050505090500184600660200280838360005b8381101561371d578181015183820152602001613705565b50505050905001838152602001828152602001965050505050505060405180910390a35050505050565b6000613773613754613c8b565b336000908152600360205260409020600201549063ffffffff61092a16565b905090565b600080600080613786613d92565b9250613790613dcf565b91506137ae6131d68461125d60055486612fb290919063ffffffff16565b336000908152600360205260409020600401549091506137ea9068010000000000000000906137de908403613e17565b9063ffffffff613c7616565b935050505090565b600061377361380033613e23565b33600090815260036020819052604090912001549063ffffffff61092a16565b600061382a613c8b565b9050600081111561386d573360009081526003602052604090206002015461385990829063ffffffff61092a16565b336000908152600360205260409020600201555b6000805433825260036020526040909120600c01541480156138925750613892612f43565b156138c3576000546138ab90600163ffffffff61092a16565b336000908152600360205260409020600c01556138f4565b6000805433825260036020526040909120600c015410156138f4576000805433825260036020526040909120600c01555b50565b600061390282613e23565b9050600081111561395957600160a060020a0382166000908152600360208190526040909120015461393b90829063ffffffff61092a16565b600160a060020a038316600090815260036020819052604090912001555b60008054600160a060020a038416825260036020526040909120600d01541480156139875750613987612f43565b156139c1576000546139a090600163ffffffff61092a16565b600160a060020a0383166000908152600360205260409020600d0155613a04565b60008054600160a060020a038416825260036020526040909120600d01541015613a045760008054600160a060020a038416825260036020526040909120600d01555b5050565b336000908152600360205260408120600b810154600a909101546137739190613a479081613a346137f2565b61125d613a3f613778565b61125d613747565b9063ffffffff612f4c16565b6000613a5d612f43565b15613a6e5750600054600101611652565b5060005490565b6000613a9b613a8384613eef565b613a47613a96868663ffffffff61092a16565b613eef565b9392505050565b6000613a9b613abf613aba858563ffffffff612f4c16565b613f64565b613a4785613f64565b6000613ad2612f43565b1515613add576138f4565b613af0613aeb600054613fd8565b61403e565b90506000811115613b1257600554613b0e908263ffffffff61092a16565b6005555b600080546001019055426138400160025550565b6000808215801590613b4e5750600083815260066020526040902054600160a060020a031615155b8015613b6c5750336000908152600360205260409020600101548314155b15613b8f5750600082815260066020526040902054600160a060020a0316613be9565b336000908152600360205260409020600e0154600160a060020a031615613bd25750336000908152600360205260409020600e0154600160a060020a0316613be9565b5073c17a40cb38598520bd7c0d5bff97d441a810a0085b336000908152600360205260409020600e0154600160a060020a03828116911614613c4757336000908152600360205260409020600e01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b8091505b50919050565b60008181811215613c4757fe5b600061093760646137de84600963ffffffff612fb216565b60008183811515613c8357fe5b049392505050565b336000908152600360205260408120600c0154801580613cac575060005481115b80613cc8575060005481148015613cc85750613cc6612f43565b155b15613cd65760009150613d8e565b6000818152600160209081526040808320805460ff168452600201909152902054613d8b90613d4f906137de613d13613d0e86613fd8565b61407b565b3360009081526003602090815260408083208984526006018252808320600183528184205460ff1684529091529020549063ffffffff612fb216565b3360009081526003602090815260408083208684526005018252808320600183528184205460ff1684529091529020549063ffffffff61092a16565b91505b5090565b6000613d9c612f43565b1515613daa57506000611652565b613773613db5613dcf565b613dc3613aeb600054613fd8565b9063ffffffff612fb216565b33600090815260036020818152604080842060048552600901909152808320549183528083205460028452818420546001855291842054613773939261125d9291839161092a565b600080821215613d8e57fe5b600160a060020a0381166000908152600360205260408120600d015481811580613e4e575060005482115b80613e6a575060005482148015613e6a5750613e68612f43565b155b1515613ee8575060015b600460ff821611613ee85760008281526001602052604090205460ff828116911614613ee057600160a060020a0384166000908152600360209081526040808320858452600701825280832060ff85168452909152902054613edd90849063ffffffff61092a16565b92505b600101613e74565b5050919050565b600064075088ff08613f546d04edfaabeec07f6d844414700000613a47613f4f7a184d0f77425630299fa70407e0e1d45a96ce8e5d21b1000000000061125d88730b017a4cd83664b71dee232edc9bd1000000000063ffffffff612fb216565b6140be565b811515613f5d57fe5b0492915050565b60006ec097ce7bc90715b34b9f1000000000613f546002613fa9613f9686670de0b6b3a764000063ffffffff612fb216565b65b5ded06b80f89063ffffffff612fb216565b811515613fb257fe5b0461125d613fc6868063ffffffff612fb216565b6403a8447f849063ffffffff612fb216565b600060015b600460ff821611613c4b5760008381526001602052604090205460ff82811691161461403657600083815260016020818152604080842060ff86168552909201905290205461403390839063ffffffff61092a16565b91505b600101613fdd565b600080614049614111565b905080151561405b5760009150613c4b565b613a9b816137de600a81876801000000000000000063ffffffff612fb216565b600061093761409183600a63ffffffff613c7616565b613a476140a585606463ffffffff613c7616565b613a476140b187613c5e565b879063ffffffff612f4c16565b60008060026140ce84600161092a565b8115156140d757fe5b0490508291505b81811015613c4b57809150600261410082858115156140f957fe5b048361092a565b81151561410957fe5b0490506140de565b60046020527f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a0511547f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa2547f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a954600160009081527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe0754909361377393909261125d92839163ffffffff61092a16565b6080604051908101604052806004906020820280388339509192915050565b61064060405190810160405280603290602082028038833950919291505056007c9cea421c85b153482cc16cc5d3f3c486d5efc921236b82e56302d82cfba5230519235f8bb76824fedb09ceb8463c91ba75d601351fa046c29214ea50b7188f48756d616e73206f6e6c79203b29000000000000000000000000000000000000756e6b6e6f776e20686f7273652073656c656374656400000000000000000000a165627a7a7230582059143cca1f4a30ae88a4d6456817108ad7cec9c70f0eb0d7ec65c55df0f029830029

Swarm Source

bzzr://59143cca1f4a30ae88a4d6456817108ad7cec9c70f0eb0d7ec65c55df0f02983

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.