ETH Price: $3,335.84 (-1.15%)
Gas: 11 Gwei

Contract

0x385Fe0597Fb60c281b54955e7d15C07578cE745b
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve173138942023-05-22 9:17:47435 days ago1684747067IN
0x385Fe059...578cE745b
0 ETH0.0014897132.12117679
Transfer173022612023-05-20 17:56:23436 days ago1684605383IN
0x385Fe059...578cE745b
0 ETH0.0022541435.25676121
Enable Transfer173022322023-05-20 17:50:35436 days ago1684605035IN
0x385Fe059...578cE745b
0 ETH0.0019199840.9011549
Approve121884072021-04-06 20:37:521210 days ago1617741472IN
0x385Fe059...578cE745b
0 ETH0.00590364131
Transfer119792452021-03-05 15:51:321242 days ago1614959492IN
0x385Fe059...578cE745b
0 ETH0.00397354137
Transfer108932252020-09-19 14:31:491409 days ago1600525909IN
0x385Fe059...578cE745b
0 ETH0.0043506150
Transfer98621722020-04-13 5:34:311569 days ago1586756071IN
0x385Fe059...578cE745b
0 ETH0.000028991
Transfer93097202020-01-19 4:53:381654 days ago1579409618IN
0x385Fe059...578cE745b
0 ETH0.000086973
Transfer93096932020-01-19 4:48:211654 days ago1579409301IN
0x385Fe059...578cE745b
0 ETH0.000086973
Transfer93095922020-01-19 4:24:181654 days ago1579407858IN
0x385Fe059...578cE745b
0 ETH0.000173956
Transfer93095732020-01-19 4:20:301654 days ago1579407630IN
0x385Fe059...578cE745b
0 ETH0.000173956
Transfer91202002019-12-17 10:35:411687 days ago1576578941IN
0x385Fe059...578cE745b
0 ETH0.000057982
Transfer87934002019-10-23 0:11:311742 days ago1571789491IN
0x385Fe059...578cE745b
0 ETH0.000047521.8
Transfer83188502019-08-09 21:47:361816 days ago1565387256IN
0x385Fe059...578cE745b
0 ETH0.000095053.6
Transfer82592942019-07-31 15:45:031825 days ago1564587903IN
0x385Fe059...578cE745b
0 ETH0.000211748
Transfer81357002019-07-12 10:18:341845 days ago1562926714IN
0x385Fe059...578cE745b
0 ETH0.0001928
Transfer81356952019-07-12 10:17:081845 days ago1562926628IN
0x385Fe059...578cE745b
0 ETH0.000125
Transfer81347962019-07-12 6:49:311845 days ago1562914171IN
0x385Fe059...578cE745b
0 ETH0.00052521
Transfer81347632019-07-12 6:43:281845 days ago1562913808IN
0x385Fe059...578cE745b
0 ETH0.0005544821
Transfer81322232019-07-11 21:01:561845 days ago1562878916IN
0x385Fe059...578cE745b
0 ETH0.0006072923
Transfer81311732019-07-11 17:13:221845 days ago1562865202IN
0x385Fe059...578cE745b
0 ETH0.0005544821
Transfer81310042019-07-11 16:32:181845 days ago1562862738IN
0x385Fe059...578cE745b
0 ETH0.0005544821
Transfer81100792019-07-08 10:32:531849 days ago1562581973IN
0x385Fe059...578cE745b
0 ETH0.0005544821
Transfer79147752019-06-07 22:51:541879 days ago1559947914IN
0x385Fe059...578cE745b
0 ETH0.000105614
Transfer77239832019-05-09 3:23:311909 days ago1557372211IN
0x385Fe059...578cE745b
0 ETH0.000132025
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
56704652018-05-24 20:09:002258 days ago1527192540
0x385Fe059...578cE745b
3.02248001 ETH
56703812018-05-24 19:45:582258 days ago1527191158
0x385Fe059...578cE745b
5.27696573 ETH
56703662018-05-24 19:41:432258 days ago1527190903
0x385Fe059...578cE745b
80 ETH
56703592018-05-24 19:40:432258 days ago1527190843
0x385Fe059...578cE745b
2.99726802 ETH
56703562018-05-24 19:39:202258 days ago1527190760
0x385Fe059...578cE745b
6.4657413 ETH
56702732018-05-24 19:16:042258 days ago1527189364
0x385Fe059...578cE745b
0.105 ETH
56701212018-05-24 18:41:122258 days ago1527187272
0x385Fe059...578cE745b
10.66566339 ETH
56697392018-05-24 17:02:462258 days ago1527181366
0x385Fe059...578cE745b
0.1 ETH
56696762018-05-24 16:47:262258 days ago1527180446
0x385Fe059...578cE745b
7 ETH
56692822018-05-24 15:07:022258 days ago1527174422
0x385Fe059...578cE745b
0.1 ETH
56689562018-05-24 13:44:462258 days ago1527169486
0x385Fe059...578cE745b
0.115 ETH
56687312018-05-24 12:51:392258 days ago1527166299
0x385Fe059...578cE745b
0.47 ETH
56686112018-05-24 12:21:092259 days ago1527164469
0x385Fe059...578cE745b
0.72925473 ETH
56685922018-05-24 12:16:002259 days ago1527164160
0x385Fe059...578cE745b
8.33057577 ETH
56685522018-05-24 12:02:282259 days ago1527163348
0x385Fe059...578cE745b
0.984 ETH
56685472018-05-24 12:01:212259 days ago1527163281
0x385Fe059...578cE745b
10 ETH
56685032018-05-24 11:49:162259 days ago1527162556
0x385Fe059...578cE745b
5.05593746 ETH
56681352018-05-24 10:08:012259 days ago1527156481
0x385Fe059...578cE745b
1.82 ETH
56679262018-05-24 9:11:032259 days ago1527153063
0x385Fe059...578cE745b
0.1 ETH
56674812018-05-24 7:13:332259 days ago1527146013
0x385Fe059...578cE745b
1 ETH
56654312018-05-23 22:29:502259 days ago1527114590
0x385Fe059...578cE745b
0.1 ETH
56651142018-05-23 21:17:172259 days ago1527110237
0x385Fe059...578cE745b
10 ETH
56643662018-05-23 17:59:412259 days ago1527098381
0x385Fe059...578cE745b
2 ETH
56638362018-05-23 15:50:292259 days ago1527090629
0x385Fe059...578cE745b
0.9 ETH
56635822018-05-23 14:45:502259 days ago1527086750
0x385Fe059...578cE745b
1.506 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Cherrio

Compiler Version
v0.4.23+commit.124ca40d

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-05-15
*/

pragma solidity ^0.4.22;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns(uint256) {
        uint256 c = a * b;
        assert(a == 0 || c / a == b);

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns(uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;

        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns(uint256) {
        assert(b <= a);

        return a - b;
    }

    function add(uint256 a, uint256 b) internal pure returns(uint256) {
        uint256 c = a + b;
        assert(c >= a);

        return c;
    }
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address and
 *      provides basic authorization control functions
 */
contract Ownable {
    // Public properties
    address public owner;

    // Log if ownership has been changed
    event ChangeOwnership(address indexed _owner, address indexed _newOwner);

    // Checks if address is an owner
    modifier OnlyOwner() {
        require(msg.sender == owner);

        _;
    }

    // The Ownable constructor sets the owner address
    function Ownable() public {
        owner = msg.sender;
    }

    // Transfer current ownership to the new account
    function transferOwnership(address _newOwner) public OnlyOwner {
        require(_newOwner != address(0x0));

        owner = _newOwner;

        emit ChangeOwnership(owner, _newOwner);
    }
}

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
    /*
    * @dev Event to notify listeners about pause.
    * @param pauseReason  string Reason the token was paused for.
    */
    event Pause(string pauseReason);
    /*
    * @dev Event to notify listeners about pause.
    * @param unpauseReason  string Reason the token was unpaused for.
    */
    event Unpause(string unpauseReason);

    bool public isPaused;
    string public pauseNotice;

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     */
    modifier IsNotPaused() {
        require(!isPaused);
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     */
    modifier IsPaused() {
        require(isPaused);
        _;
    }

    /**
    * @dev called by the owner to pause, triggers stopped state
    * @param _reason string The reason for the pause.
    */
    function pause(string _reason) OnlyOwner IsNotPaused public {
        isPaused = true;
        pauseNotice = _reason;
        emit Pause(_reason);
    }

    /**
     * @dev called by the owner to unpause, returns to normal state
     * @param _reason string Reason for the un pause.
     */
    function unpause(string _reason) OnlyOwner IsPaused public {
        isPaused = false;
        pauseNotice = _reason;
        emit Unpause(_reason);
    }
}

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
    uint256 public totalSupply;

    function balanceOf(address who) public view returns(uint256 theBalance);
    function transfer(address to, uint256 value) public returns(bool success);

    event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
    function allowance(address owner, address spender) public view returns(uint256 theAllowance);
    function transferFrom(address from, address to, uint256 value) public returns(bool success);
    function approve(address spender, uint256 value) public returns(bool success);

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

/**
 * @title Basic token
 * @dev Basic version of StandardToken without allowances.
 */
contract BasicToken is ERC20Basic {
    using SafeMath for uint256;

    // Balances for each account
    mapping(address => uint256) balances;

    /**
    * @dev Get the token balance for account
    * @param _address The address to query the balance of._address
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address _address) public constant returns(uint256 theBalance){
        return balances[_address];
    }

    /**
    * @dev Transfer the balance from owner's account to another account
    * @param _to The address to transfer to.
    * @param _value The amount to be transferred.
    * @return Returns true if transfer has been successful
    */
    function transfer(address _to, uint256 _value) public returns(bool success){
        require(_to != address(0x0) && _value <= balances[msg.sender]);

        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);

        emit Transfer(msg.sender, _to, _value);

        return true;
    }
}

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 */
contract StandardToken is BasicToken, ERC20 {
    // Owner of account approves the transfer of an amount to another account
    mapping (address => mapping (address => uint256)) allowed;

    /**
     * @dev Returns the amount of tokens approved by the owner that can be transferred to the spender's account
     * @param _owner The address which owns the funds.
     * @param _spender The address which will spend the funds.
     * @return An uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address _owner, address _spender) public constant returns(uint256 theAllowance){
        return allowed[_owner][_spender];
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     *
     * To change the approve amount you first have to reduce the addresses`
     * allowance to zero by calling `approve(_spender, 0)` if it is not
     * already 0 to mitigate the race condition described here:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * @param _spender The address which will spend the funds.
     * @param _value The amount of tokens to be spent.
     */
    function approve(address _spender, uint256 _value) public returns(bool success){
        require(allowed[msg.sender][_spender] == 0 || _value == 0);

        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);

        return true;
    }

    /**
     * Transfer from `from` account to `to` account using allowance in `from` account to the sender
     *
     * @param _from  Origin address
     * @param _to    Destination address
     * @param _value Amount of CHR tokens to send
     */
    function transferFrom(address _from, address _to, uint256 _value) public returns(bool success) {
        require(_to != address(0));
        require(_value <= balances[_from]);
        require(_value <= allowed[_from][msg.sender]);

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);

        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);

        emit Transfer(_from, _to, _value);

        return true;
    }
}

/**
 * @title Burnable Token
 * @dev Token that can be irreversibly burned (destroyed).
 */
contract BurnableToken is BasicToken {
    event Burn(address indexed burner, uint256 value);

    /**
     * @dev Burns a specific amount of tokens.
     * @param _value The amount of token to be burned.
     */
    function burn(uint256 _value) public {
        require(_value <= balances[msg.sender]);

        balances[msg.sender] = balances[msg.sender].sub(_value);
        totalSupply = totalSupply.sub(_value);

        emit Burn(msg.sender, _value);
    }
}

/**
 * CHERR.IO is a standard ERC20 token with some additional functionalities:
 * - Transfers are only enabled after contract owner enables it (after the ICO)
 * - Contract sets 60% of the total supply as allowance for ICO contract
 */
contract Cherrio is StandardToken, BurnableToken, Ownable, Pausable {
    using SafeMath for uint256;

    // Metadata
    string  public constant name = "CHERR.IO";
    string  public constant symbol = "CHR";
    uint8   public constant decimals = 18;

    // Token supplies
    uint256 public constant INITIAL_SUPPLY =  200000000 * (10 ** uint256(decimals));
    uint256 public constant ADMIN_ALLOWANCE =  80000000 * (10 ** uint256(decimals));
    uint256 public constant CONTRACT_ALLOWANCE = INITIAL_SUPPLY - ADMIN_ALLOWANCE;

    // Funding cap in ETH. Change to equal $12M at time of token offering
    uint256 public constant FUNDING_ETH_HARD_CAP = 15000 ether;
    // Minimum cap in ETH. Change to equal $3M at time of token offering
    uint256 public constant MINIMUM_ETH_SOFT_CAP = 3750 ether;
    // Min contribution is 0.1 ether
    uint256 public constant MINIMUM_CONTRIBUTION = 100 finney;
    // Price of the tokens as in tokens per ether
    uint256 public constant RATE = 5333;
    // Price of the tokens in tier 1
    uint256 public constant RATE_TIER1 = 8743;
    // Price of the tokens in tier 2
    uint256 public constant RATE_TIER2 = 7306;
    // Price of the tokens in tier 3
    uint256 public constant RATE_TIER3 = 6584;
    // Price of the tokens in public sale for limited timeline
    uint256 public constant RATE_PUBLIC_SALE = 5926;
    // Maximum cap for tier 1 (60M CHR tokens)
    uint256 public constant TIER1_CAP = 60000000 * (10 ** uint256(decimals));
    // Maximum cap for tier 2 (36M CHR tokens)
    uint256 public constant TIER2_CAP = 36000000 * (10 ** uint256(decimals));

    // Maximum cap for each contributor in tier 1
    uint256 public participantCapTier1;
    // Maximum cap for each contributor in tier 2
    uint256 public participantCapTier2;

    // ETH cap for pool addres only in tier 1
    uint256 public poolAddressCapTier1;
    // ETH cap for pool addres only in tier 2
    uint256 public poolAddressCapTier2;

    // The address of the token admin
    address public adminAddress;
    // The address where ETH funds are collected
    address public beneficiaryAddress;
    // The address of the contract
    address public contractAddress;
    // The address of the pool who can send unlimited ETH to the contract
    address public poolAddress;

    // Enable transfers after conclusion of the token offering
    bool public transferIsEnabled;

    // Amount of raised in Wei
    uint256 public weiRaised;

    // Amount of CHR tokens sent to participant for presale and public sale
    uint256[4] public tokensSent;

    // Start of public pre-sale in timestamp
    uint256 startTimePresale;

    // Start and end time of public sale in timestamp
    uint256 startTime;
    uint256 endTime;

    // Discount period for public sale
    uint256 publicSaleDiscountEndTime;

    // End time limits in timestamp for each tier bonus
    uint256[3] public tierEndTime;

    //Check if contract address is already set
    bool contractAddressIsSet;

    struct Contributor {
        bool canContribute;
        uint8 tier;
        uint256 contributionInWeiTier1;
        uint256 contributionInWeiTier2;
        uint256 contributionInWeiTier3;
        uint256 contributionInWeiPublicSale;
    }

    struct Pool {
        uint256 contributionInWei;
    }

    enum Stages {
        Pending,
        PreSale,
        PublicSale,
        Ended
    }

    // The current stage of the offering
    Stages public stage;

    mapping(address => Contributor) public contributors;
    mapping(address => mapping(uint8 => Pool)) public pool;

    // Check if transfer is enabled
    modifier TransferIsEnabled {
        require(transferIsEnabled || msg.sender == adminAddress || msg.sender == contractAddress);

        _;
    }

    /**
     * @dev Check if address is a valid destination to transfer tokens to
     * - must not be zero address
     * - must not be the token address
     * - must not be the owner's address
     * - must not be the admin's address
     * - must not be the token offering contract address
     * - must not be the beneficiary address
     */
    modifier ValidDestination(address _to) {
        require(_to != address(0x0));
        require(_to != address(this));
        require(_to != owner);
        require(_to != address(adminAddress));
        require(_to != address(contractAddress));
        require(_to != address(beneficiaryAddress));

        _;
    }

    /**
     * Modifier that requires certain stage before executing the main function body
     *
     * @param _expectedStage Value that the current stage is required to match
     */
    modifier AtStage(Stages _expectedStage) {
        require(stage == _expectedStage);

        _;
    }

    // Check if ICO is live
    modifier CheckIfICOIsLive() {
        require(stage != Stages.Pending && stage != Stages.Ended);

        if(stage == Stages.PreSale) {
            require(
                startTimePresale > 0 &&
                now >= startTimePresale &&
                now <= tierEndTime[2]
            );
        }
        else {
            require(
                startTime > 0 &&
                now >= startTime &&
                now <= endTime
            );
        }

        _;
    }

    // Check if participant sent more then miniminum required contribution
    modifier CheckPurchase() {
        require(msg.value >= MINIMUM_CONTRIBUTION);

        _;
    }

    /**
     * Event for token purchase logging
     *
     * @param _purchaser Participant who paid for CHR tokens
     * @param _value     Amount in WEI paid for token
     * @param _tokens    Amount of tokens purchased
     */
    event TokenPurchase(address indexed _purchaser, uint256 _value, uint256 _tokens);

    /**
     * Event when token offering started
     *
     * @param _msg       Message
     * @param _startTime Start time in timestamp
     * @param _endTime   End time in timestamp
     */
    event OfferingOpens(string _msg, uint256 _startTime, uint256 _endTime);

    /**
     * Event when token offering ended and how much has been raised in wei
     *
     * @param _endTime        End time in timestamp
     * @param _totalWeiRaised Total raised funds in wei
     */
    event OfferingCloses(uint256 _endTime, uint256 _totalWeiRaised);

    /**
     * Cherrio constructor
     */
    function Cherrio() public {
        totalSupply = INITIAL_SUPPLY;

        // Mint tokens
        balances[msg.sender] = totalSupply;
        emit Transfer(address(0x0), msg.sender, totalSupply);

        // Aprove an allowance for admin account
        adminAddress = 0xe0509bB3921aacc433108D403f020a7c2f92e936;
        approve(adminAddress, ADMIN_ALLOWANCE);

        participantCapTier1 = 100 ether;
        participantCapTier2 = 100 ether;
        poolAddressCapTier1 = 2000 ether; 
        poolAddressCapTier2 = 2000 ether;

        weiRaised = 0;
        startTimePresale = 0;
        startTime = 0;
        endTime = 0;
        publicSaleDiscountEndTime = 0;
        transferIsEnabled = false;
        contractAddressIsSet = false;
    }

    /**
     * Add approved addresses
     *
     * @param _addresses Array of approved addresses
     * @param _tier      Tier
     */
    function addApprovedAddresses(address[] _addresses, uint8 _tier) external OnlyOwner {
        uint256 length = _addresses.length;

        for(uint256 i = 0; i < length; i++) {
            if(!contributors[_addresses[i]].canContribute) {
                contributors[_addresses[i]].canContribute = true;
                contributors[_addresses[i]].tier = _tier;
                contributors[_addresses[i]].contributionInWeiTier1 = 0;
                contributors[_addresses[i]].contributionInWeiTier2 = 0;
                contributors[_addresses[i]].contributionInWeiTier3 = 0;
                contributors[_addresses[i]].contributionInWeiPublicSale = 0;
            }
        }
    }

    /**
     * Add approved address
     *
     * @param _address Approved address
     * @param _tier    Tier
     */
    function addSingleApprovedAddress(address _address, uint8 _tier) external OnlyOwner {
        if(!contributors[_address].canContribute) {
            contributors[_address].canContribute = true;
            contributors[_address].tier = _tier;
            contributors[_address].contributionInWeiTier1 = 0;
            contributors[_address].contributionInWeiTier2 = 0;
            contributors[_address].contributionInWeiTier3 = 0;
            contributors[_address].contributionInWeiPublicSale = 0;
        }
    }

    /**
     * Set token offering address to approve allowance for offering contract to distribute tokens
     */
    function setTokenOffering() external OnlyOwner{
        require(!contractAddressIsSet);
        require(!transferIsEnabled);

        contractAddress = address(this);
        approve(contractAddress, CONTRACT_ALLOWANCE);

        beneficiaryAddress = 0xAec8c4242c8c2E532c6D6478A7de380263234845;
        poolAddress = 0x1A2C916B640520E1e93A78fEa04A49D8345a5aa9;

        pool[poolAddress][0].contributionInWei = 0;
        pool[poolAddress][1].contributionInWei = 0;
        pool[poolAddress][2].contributionInWei = 0;
        pool[poolAddress][3].contributionInWei = 0;

        tokensSent[0] = 0;
        tokensSent[1] = 0;
        tokensSent[2] = 0;
        tokensSent[3] = 0;

        stage = Stages.Pending;
        contractAddressIsSet = true;
    }

    /**
     * Set when presale starts
     *
     * @param _startTimePresale Start time of presale in timestamp
     */
    function startPresale(uint256 _startTimePresale) external OnlyOwner AtStage(Stages.Pending) {
        if(_startTimePresale == 0) {
            startTimePresale = now;
        }
        else {
            startTimePresale = _startTimePresale;
        }

        setTierEndTime();

        stage = Stages.PreSale;
    }

    /**
     * Set when public sale starts
     *
     * @param _startTime Start time of public sale in timestamp
     */
    function startPublicSale(uint256 _startTime) external OnlyOwner AtStage(Stages.PreSale) {
        if(_startTime == 0) {
            startTime = now;
        }
        else {
            startTime = _startTime;
        }

        endTime = startTime + 15 days;
        publicSaleDiscountEndTime = startTime + 3 days;

        stage = Stages.PublicSale;
    }

    // Fallback function can be used to buy CHR tokens
    function () public payable {
        buy();
    }

    function buy() public payable IsNotPaused CheckIfICOIsLive returns(bool _success) {
        uint8 currentTier = getCurrentTier();

        if(currentTier > 3) {
            revert();
        }

        if(!buyTokens(currentTier)) {
            revert();
        }

        return true;
    }

    /**
     * @param _tier Current Token Sale tier
     */
    function buyTokens(uint8 _tier) internal ValidDestination(msg.sender) CheckPurchase returns(bool _success) {
        if(weiRaised.add(msg.value) > FUNDING_ETH_HARD_CAP) {
            revert();
        }

        uint256 contributionInWei = msg.value;

        if(!checkTierCap(_tier, contributionInWei)) {
            revert();
        }

        uint256 rate = getTierTokens(_tier);
        uint256 tokens = contributionInWei.mul(rate);

        if(msg.sender != poolAddress) {
            if(stage == Stages.PreSale) {
                if(!checkAllowedTier(msg.sender, _tier)) {
                    revert();
                }
            }

            if(!checkAllowedContribution(msg.sender, contributionInWei, _tier)) {
                revert();
            }

            if(!this.transferFrom(owner, msg.sender, tokens)) {
                revert();
            }

            if(stage == Stages.PreSale) {
                if(_tier == 0) {
                    contributors[msg.sender].contributionInWeiTier1 = contributors[msg.sender].contributionInWeiTier1.add(contributionInWei);
                }
                else if(_tier == 1) {
                    contributors[msg.sender].contributionInWeiTier2 = contributors[msg.sender].contributionInWeiTier2.add(contributionInWei);
                }
                else if(_tier == 2) {
                    contributors[msg.sender].contributionInWeiTier3 = contributors[msg.sender].contributionInWeiTier3.add(contributionInWei);
                }
            }
            else {
                contributors[msg.sender].contributionInWeiPublicSale = contributors[msg.sender].contributionInWeiPublicSale.add(contributionInWei);
            }
        }
        else {
            if(!checkPoolAddressTierCap(_tier, contributionInWei)) {
                revert();
            }

            if(!this.transferFrom(owner, msg.sender, tokens)) {
                revert();
            }

            pool[poolAddress][_tier].contributionInWei = pool[poolAddress][_tier].contributionInWei.add(contributionInWei);
        }

        weiRaised = weiRaised.add(contributionInWei);
        tokensSent[_tier] = tokensSent[_tier].add(tokens);

        if(weiRaised >= FUNDING_ETH_HARD_CAP) {
            offeringEnded();
        }

        beneficiaryAddress.transfer(address(this).balance);
        emit TokenPurchase(msg.sender, contributionInWei, tokens);

        return true;
    }

    /**
     * Manually withdraw tokens to private investors
     *
     * @param _to    Address of private investor
     * @param _value The number of tokens to send to private investor
     */
    function withdrawCrowdsaleTokens(address _to, uint256 _value) external OnlyOwner ValidDestination(_to) returns (bool _success) {
        if(!this.transferFrom(owner, _to, _value)) {
            revert();
        }

        return true;
    }

    /**
     * Transfer from sender to another account
     *
     * @param _to    Destination address
     * @param _value Amount of CHR tokens to send
     */
    function transfer(address _to, uint256 _value) public ValidDestination(_to) TransferIsEnabled IsNotPaused returns(bool _success){
         return super.transfer(_to, _value);
    }

    /**
     * Transfer from `from` account to `to` account using allowance in `from` account to the sender
     *
     * @param _from  Origin address
     * @param _to    Destination address
     * @param _value Amount of CHR tokens to send
     */
    function transferFrom(address _from, address _to, uint256 _value) public ValidDestination(_to) TransferIsEnabled IsNotPaused returns(bool _success){
        return super.transferFrom(_from, _to, _value);
    }

    /**
     * Check if participant is allowed to contribute in current tier
     *
     * @param _address Participant address
     * @param _tier    Current tier
     */
    function checkAllowedTier(address _address, uint8 _tier) internal view returns (bool _allowed) {
        if(contributors[_address].tier <= _tier) {
            return true;
        }
        else{
          return false;
        }
    }

    /**
     * Check contribution cap for only tier 1 and 2
     *
     * @param _tier  Current tier
     * @param _value Participant contribution
     */
    function checkTierCap(uint8 _tier, uint256 _value) internal view returns (bool _success) {
        uint256 currentlyTokensSent = tokensSent[_tier];
        bool status = true;

        if(_tier == 0) {
            if(TIER1_CAP < currentlyTokensSent.add(_value)) {
                status = false;
            }
        }
        else if(_tier == 1) {
            if(TIER2_CAP < currentlyTokensSent.add(_value)) {
                status = false;
            }
        }

        return status;
    }
    
    /**
     * Check cap for pool address in tier 1 and 2
     *
     * @param _tier  Current tier
     * @param _value Pool contribution
     */
    function checkPoolAddressTierCap(uint8 _tier, uint256 _value) internal view returns (bool _success) {
        uint256 currentContribution = pool[poolAddress][_tier].contributionInWei;

        if((_tier == 0 && (poolAddressCapTier1 < currentContribution.add(_value))) || (_tier == 1 && (poolAddressCapTier2 < currentContribution.add(_value)))) {
            return false;
        }

        return true;
    }

    /**
     * Check cap for pool address in tier 1 and 2
     *
     * @param _address  Participant address
     * @param _value    Participant contribution
     * @param _tier     Current tier
     */
    function checkAllowedContribution(address _address, uint256 _value, uint8 _tier) internal view returns (bool _success) {
        bool status = false;

        if(contributors[_address].canContribute) {
            if(_tier == 0) {
                if(participantCapTier1 >= contributors[_address].contributionInWeiTier1.add(_value)) {
                    status = true;
                }
            }
            else if(_tier == 1) {
                if(participantCapTier2 >= contributors[_address].contributionInWeiTier2.add(_value)) {
                    status = true;
                }
            }
            else if(_tier == 2) {
                status = true;
            }
            else {
                status = true;
            }
        }

        return status;
    }
    
    /**
     * Get current tier tokens rate
     *
     * @param _tier     Current tier
     */
    function getTierTokens(uint8 _tier) internal view returns(uint256 _tokens) {
        uint256 tokens = RATE_TIER1;

        if(_tier == 1) {
            tokens = RATE_TIER2;
        }
        else if(_tier == 2) {
            tokens = RATE_TIER3;
        }
        else if(_tier == 3) {
            if(now <= publicSaleDiscountEndTime) {
                tokens = RATE_PUBLIC_SALE;
            }
            else {
                tokens = RATE;
            }
        }

        return tokens;
    }

    // Get current tier
    function getCurrentTier() public view returns(uint8 _tier) {
        uint8 currentTier = 3; // 3 is public sale

        if(stage == Stages.PreSale) {
            if(now <= tierEndTime[0]) {
                currentTier = 0;
            }
            else if(now <= tierEndTime[1]) {
                currentTier = 1;
            }
            else if(now <= tierEndTime[2]) {
                currentTier = 2;
            }
        }
        else {
            if(now > endTime) {
                currentTier = 4; // Token offering ended
            }
        }

        return currentTier;
    }

    // Set end time for each tier
    function setTierEndTime() internal AtStage(Stages.Pending) {
        tierEndTime[0] = startTimePresale + 1 days; 
        tierEndTime[1] = tierEndTime[0] + 2 days;   
        tierEndTime[2] = tierEndTime[1] + 6 days;   
    }

    // End the token offering
    function endOffering() public OnlyOwner {
        offeringEnded();
    }

    // Token offering is ended
    function offeringEnded() internal {
        endTime = now;
        stage = Stages.Ended;

        emit OfferingCloses(endTime, weiRaised);
    }

    // Enable transfers, burn unsold tokens & set tokenOfferingAddress to 0
    function enableTransfer() public OnlyOwner returns(bool _success){
        transferIsEnabled = true;
        uint256 tokensToBurn = allowed[msg.sender][contractAddress];

        if(tokensToBurn != 0){
            burn(tokensToBurn);
            approve(contractAddress, 0);
        }

        return true;
    }
    
    /**
     * Extend end time
     *
     * @param _addedTime Addtional time in secods
     */
    function extendEndTime(uint256 _addedTime) external OnlyOwner {
        endTime = endTime + _addedTime;
    }
    
    /**
     * Extend public sale discount time
     *
     * @param _addedPublicSaleDiscountEndTime Addtional time in secods
     */
    function extendPublicSaleDiscountEndTime(uint256 _addedPublicSaleDiscountEndTime) external OnlyOwner {
        publicSaleDiscountEndTime = publicSaleDiscountEndTime + _addedPublicSaleDiscountEndTime;
    }
    
    /**
     * Update pool cap for tier 1
     *
     * @param _poolAddressCapTier1 Tier cap
     */
    function updatePoolAddressCapTier1(uint256 _poolAddressCapTier1) external OnlyOwner {
        poolAddressCapTier1 = _poolAddressCapTier1;
    }
    
    /**
     * Update pool cap for tier 2
     *
     * @param _poolAddressCapTier2 Tier cap
     */
    function updatePoolAddressCapTier2(uint256 _poolAddressCapTier2) external OnlyOwner {
        poolAddressCapTier2 = _poolAddressCapTier2;
    }

    //
    
    /**
     * Update participant cap for tier 1
     *
     * @param _participantCapTier1 Tier cap
     */
    function updateParticipantCapTier1(uint256 _participantCapTier1) external OnlyOwner {
        participantCapTier1 = _participantCapTier1;
    }
    
    /**
     * Update participant cap for tier 2
     *
     * @param _participantCapTier2 Tier cap
     */
    function updateParticipantCapTier2(uint256 _participantCapTier2) external OnlyOwner {
        participantCapTier2 = _participantCapTier2;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"CONTRACT_ALLOWANCE","outputs":[{"name":"","type":"uint256"}],"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":"_participantCapTier1","type":"uint256"}],"name":"updateParticipantCapTier1","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"poolAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"contributors","outputs":[{"name":"canContribute","type":"bool"},{"name":"tier","type":"uint8"},{"name":"contributionInWeiTier1","type":"uint256"},{"name":"contributionInWeiTier2","type":"uint256"},{"name":"contributionInWeiTier3","type":"uint256"},{"name":"contributionInWeiPublicSale","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"poolAddressCapTier1","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"transferIsEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"_success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tierEndTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pauseNotice","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint8"}],"name":"pool","outputs":[{"name":"contributionInWei","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"RATE_TIER3","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addresses","type":"address[]"},{"name":"_tier","type":"uint8"}],"name":"addApprovedAddresses","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"RATE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"participantCapTier2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_reason","type":"string"}],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"balanceOf","outputs":[{"name":"theBalance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokensSent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"setTokenOffering","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTier","outputs":[{"name":"_tier","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_startTime","type":"uint256"}],"name":"startPublicSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"RATE_TIER1","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_participantCapTier2","type":"uint256"}],"name":"updateParticipantCapTier2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addedTime","type":"uint256"}],"name":"extendEndTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MINIMUM_CONTRIBUTION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_tier","type":"uint8"}],"name":"addSingleApprovedAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TIER1_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"poolAddressCapTier2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"endOffering","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_startTimePresale","type":"uint256"}],"name":"startPresale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"buy","outputs":[{"name":"_success","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"_success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isPaused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_poolAddressCapTier2","type":"uint256"}],"name":"updatePoolAddressCapTier2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stage","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TIER2_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"participantCapTier1","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_poolAddressCapTier1","type":"uint256"}],"name":"updatePoolAddressCapTier1","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"beneficiaryAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"theAllowance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FUNDING_ETH_HARD_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"RATE_PUBLIC_SALE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"withdrawCrowdsaleTokens","outputs":[{"name":"_success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_reason","type":"string"}],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"RATE_TIER2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"enableTransfer","outputs":[{"name":"_success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MINIMUM_ETH_SOFT_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ADMIN_ALLOWANCE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"adminAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addedPublicSaleDiscountEndTime","type":"uint256"}],"name":"extendPublicSaleDiscountEndTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_purchaser","type":"address"},{"indexed":false,"name":"_value","type":"uint256"},{"indexed":false,"name":"_tokens","type":"uint256"}],"name":"TokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_msg","type":"string"},{"indexed":false,"name":"_startTime","type":"uint256"},{"indexed":false,"name":"_endTime","type":"uint256"}],"name":"OfferingOpens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_endTime","type":"uint256"},{"indexed":false,"name":"_totalWeiRaised","type":"uint256"}],"name":"OfferingCloses","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"pauseReason","type":"string"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"unpauseReason","type":"string"}],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_newOwner","type":"address"}],"name":"ChangeOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

60806040523480156200001157600080fd5b5033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260ff16600a0a630bebc20002600081905550600054600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6000546040518082815260200191505060405180910390a373e0509bb3921aacc433108d403f020a7c2f92e936600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001b4600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260ff16600a0a6304c4b4000262000259640100000000026401000000009004565b5068056bc75e2d6310000060058190555068056bc75e2d63100000600681905550686c6b935b8bbd400000600781905550686c6b935b8bbd4000006008819055506000600d8190555060006012819055506000601381905550600060148190555060006015819055506000600c60146101000a81548160ff0219169083151502179055506000601960006101000a81548160ff021916908315150217905550620003e2565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480620002e65750600082145b1515620002f257600080fd5b81600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b61506d80620003f26000396000f3006080604052600436106102ca576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063021e7f85146102d557806306fdde0314610300578063090d993a14610390578063095ea7b3146103bd5780631755ff211461042257806318160ddd146104795780631f6d4942146104a4578063205dc0ee146105285780632282d9f21461055357806323b872dd1461058257806328a647ee146106075780632ad0a4e9146106485780632f1c167c146106d85780632ff2e9dc1461073c578063313ce567146107675780634042b66f1461079857806342966c68146107c35780634f961a6b146107f05780635659856c1461081b578063664e970414610863578063672acef01461088e5780636da66355146108b957806370a0823114610922578063716b01ce1461097957806372dd236a146109ba5780637412c223146109d157806374817d9b14610a025780637b283b7114610a2f578063842bfad214610a5a57806388770cb014610a875780638d0bba0314610ab45780638da5cb5b14610adf57806395c3239114610b3657806395d89b4114610b86578063964ad43414610c16578063999dd03e14610c415780639be3b28614610c6c578063a132aad114610c83578063a6f2ae3a14610cb0578063a9059cbb14610cd2578063b187bd2614610d37578063bf2b752414610d66578063c040e6b814610d93578063c7f43b5714610dcc578063d458c52214610df7578063d4ed899014610e22578063d9c4870e14610e4f578063dd62ed3e14610ea6578063e072830c14610f1d578063e2c3f9a814610f48578063e5c6258d14610f73578063e79faa5814610fd8578063ee2127c814611041578063f1b50c1d1461106c578063f206cf741461109b578063f2fde38b146110c6578063f6b4dfb414611109578063fc53f95814611160578063fc6f94681461118b578063fe1829b6146111e2575b6102d261120f565b50005b3480156102e157600080fd5b506102ea611368565b6040518082815260200191505060405180910390f35b34801561030c57600080fd5b50610315611388565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561035557808201518184015260208101905061033a565b50505050905090810190601f1680156103825780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561039c57600080fd5b506103bb600480360381019080803590602001909291905050506113c1565b005b3480156103c957600080fd5b50610408600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611427565b604051808215151515815260200191505060405180910390f35b34801561042e57600080fd5b506104376115ae565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561048557600080fd5b5061048e6115d4565b6040518082815260200191505060405180910390f35b3480156104b057600080fd5b506104e5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115da565b60405180871515151581526020018660ff1660ff168152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b34801561053457600080fd5b5061053d611630565b6040518082815260200191505060405180910390f35b34801561055f57600080fd5b50610568611636565b604051808215151515815260200191505060405180910390f35b34801561058e57600080fd5b506105ed600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611649565b604051808215151515815260200191505060405180910390f35b34801561061357600080fd5b5061063260048036038101908080359060200190929190505050611933565b6040518082815260200191505060405180910390f35b34801561065457600080fd5b5061065d61194d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561069d578082015181840152602081019050610682565b50505050905090810190601f1680156106ca5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156106e457600080fd5b50610726600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291905050506119eb565b6040518082815260200191505060405180910390f35b34801561074857600080fd5b50610751611a16565b6040518082815260200191505060405180910390f35b34801561077357600080fd5b5061077c611a27565b604051808260ff1660ff16815260200191505060405180910390f35b3480156107a457600080fd5b506107ad611a2c565b6040518082815260200191505060405180910390f35b3480156107cf57600080fd5b506107ee60048036038101908080359060200190929190505050611a32565b005b3480156107fc57600080fd5b50610805611b81565b6040518082815260200191505060405180910390f35b34801561082757600080fd5b50610861600480360381019080803590602001908201803590602001919091929391929390803560ff169060200190929190505050611b87565b005b34801561086f57600080fd5b50610878611f60565b6040518082815260200191505060405180910390f35b34801561089a57600080fd5b506108a3611f66565b6040518082815260200191505060405180910390f35b3480156108c557600080fd5b50610920600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611f6c565b005b34801561092e57600080fd5b50610963600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120b5565b6040518082815260200191505060405180910390f35b34801561098557600080fd5b506109a4600480360381019080803590602001909291905050506120fe565b6040518082815260200191505060405180910390f35b3480156109c657600080fd5b506109cf612118565b005b3480156109dd57600080fd5b506109e6612578565b604051808260ff1660ff16815260200191505060405180910390f35b348015610a0e57600080fd5b50610a2d60048036038101908080359060200190929190505050612630565b005b348015610a3b57600080fd5b50610a44612722565b6040518082815260200191505060405180910390f35b348015610a6657600080fd5b50610a8560048036038101908080359060200190929190505050612728565b005b348015610a9357600080fd5b50610ab26004803603810190808035906020019092919050505061278e565b005b348015610ac057600080fd5b50610ac96127f8565b6040518082815260200191505060405180910390f35b348015610aeb57600080fd5b50610af4612804565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b4257600080fd5b50610b84600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff16906020019092919050505061282a565b005b348015610b9257600080fd5b50610b9b612ab7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bdb578082015181840152602081019050610bc0565b50505050905090810190601f168015610c085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c2257600080fd5b50610c2b612af0565b6040518082815260200191505060405180910390f35b348015610c4d57600080fd5b50610c56612b01565b6040518082815260200191505060405180910390f35b348015610c7857600080fd5b50610c81612b07565b005b348015610c8f57600080fd5b50610cae60048036038101908080359060200190929190505050612b6d565b005b610cb861120f565b604051808215151515815260200191505060405180910390f35b348015610cde57600080fd5b50610d1d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c4b565b604051808215151515815260200191505060405180910390f35b348015610d4357600080fd5b50610d4c612f33565b604051808215151515815260200191505060405180910390f35b348015610d7257600080fd5b50610d9160048036038101908080359060200190929190505050612f46565b005b348015610d9f57600080fd5b50610da8612fac565b60405180826003811115610db857fe5b60ff16815260200191505060405180910390f35b348015610dd857600080fd5b50610de1612fbf565b6040518082815260200191505060405180910390f35b348015610e0357600080fd5b50610e0c612fd0565b6040518082815260200191505060405180910390f35b348015610e2e57600080fd5b50610e4d60048036038101908080359060200190929190505050612fd6565b005b348015610e5b57600080fd5b50610e6461303c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610eb257600080fd5b50610f07600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613062565b6040518082815260200191505060405180910390f35b348015610f2957600080fd5b50610f326130e9565b6040518082815260200191505060405180910390f35b348015610f5457600080fd5b50610f5d6130f7565b6040518082815260200191505060405180910390f35b348015610f7f57600080fd5b50610fbe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506130fd565b604051808215151515815260200191505060405180910390f35b348015610fe457600080fd5b5061103f600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613491565b005b34801561104d57600080fd5b506110566135d9565b6040518082815260200191505060405180910390f35b34801561107857600080fd5b506110816135df565b604051808215151515815260200191505060405180910390f35b3480156110a757600080fd5b506110b0613744565b6040518082815260200191505060405180910390f35b3480156110d257600080fd5b50611107600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613751565b005b34801561111557600080fd5b5061111e6138a9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561116c57600080fd5b506111756138cf565b6040518082815260200191505060405180910390f35b34801561119757600080fd5b506111a06138e0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156111ee57600080fd5b5061120d60048036038101908080359060200190929190505050613906565b005b600080600360149054906101000a900460ff1615151561122e57600080fd5b6000600381111561123b57fe5b601960019054906101000a900460ff16600381111561125657fe5b14158015611289575060038081111561126b57fe5b601960019054906101000a900460ff16600381111561128657fe5b14155b151561129457600080fd5b600160038111156112a157fe5b601960019054906101000a900460ff1660038111156112bc57fe5b14156113035760006012541180156112d657506012544210155b80156112f35750601660026003811015156112ed57fe5b01544211155b15156112fe57600080fd5b611331565b600060135411801561131757506013544210155b801561132557506014544211155b151561133057600080fd5b5b611339612578565b905060038160ff16111561134c57600080fd5b61135581613970565b151561136057600080fd5b600191505090565b601260ff16600a0a6304c4b40002601260ff16600a0a630bebc200020381565b6040805190810160405280600881526020017f43484552522e494f00000000000000000000000000000000000000000000000081525081565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561141d57600080fd5b8060058190555050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414806114b35750600082145b15156114be57600080fd5b81600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b601a6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060010154908060020154908060030154908060040154905086565b60075481565b600c60149054906101000a900460ff1681565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561168857600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116c357600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561172057600080fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561177d57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156117da57600080fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561183757600080fd5b600c60149054906101000a900460ff168061189f5750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118f75750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561190257600080fd5b600360149054906101000a900460ff1615151561191e57600080fd5b61192985858561445d565b9150509392505050565b60168160038110151561194257fe5b016000915090505481565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119e35780601f106119b8576101008083540402835291602001916119e3565b820191906000526020600020905b8154815290600101906020018083116119c657829003601f168201915b505050505081565b601b602052816000526040600020602052806000526040600020600091509150508060000154905081565b601260ff16600a0a630bebc2000281565b601281565b600d5481565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111151515611a8057600080fd5b611ad281600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461481c90919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b2a8160005461481c90919063ffffffff16565b6000819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a250565b6119b881565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611be657600080fd5b848490509150600090505b81811015611f5957601a60008686848181101515611c0b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff161515611f4c576001601a60008787858181101515611c8d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff02191690831515021790555082601a60008787858181101515611d1157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160016101000a81548160ff021916908360ff1602179055506000601a60008787858181101515611d9757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000601a60008787858181101515611e0957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506000601a60008787858181101515611e7b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055506000601a60008787858181101515611eed57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055505b8080600101915050611bf1565b5050505050565b6114d581565b60065481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fc857600080fd5b600360149054906101000a900460ff16151515611fe457600080fd5b6001600360146101000a81548160ff0219169083151502179055508060049080519060200190612015929190614f9c565b507f46f81aedb227deef794d5c737014a5414db3c678220a521b747734688cc6a9fe816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561207857808201518184015260208101905061205d565b50505050905090810190601f1680156120a55780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e8160048110151561210d57fe5b016000915090505481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561217457600080fd5b601960009054906101000a900460ff1615151561219057600080fd5b600c60149054906101000a900460ff161515156121ac57600080fd5b30600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612235600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260ff16600a0a6304c4b40002601260ff16600a0a630bebc2000203611427565b5073aec8c4242c8c2e532c6d6478a7de380263234845600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731a2c916b640520e1e93a78fea04a49d8345a5aa9600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008060ff168152602001908152602001600020600001819055506000601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600160ff168152602001908152602001600020600001819055506000601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600260ff168152602001908152602001600020600001819055506000601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600360ff168152602001908152602001600020600001819055506000600e60006004811015156124ed57fe5b01819055506000600e600160048110151561250457fe5b01819055506000600e600260048110151561251b57fe5b01819055506000600e600360048110151561253257fe5b01819055506000601960016101000a81548160ff0219169083600381111561255657fe5b02179055506001601960006101000a81548160ff021916908315150217905550565b600080600390506001600381111561258c57fe5b601960019054906101000a900460ff1660038111156125a757fe5b141561261957601660006003811015156125bd57fe5b0154421115156125d05760009050612614565b601660016003811015156125e057fe5b0154421115156125f35760019050612613565b6016600260038110151561260357fe5b01544211151561261257600290505b5b5b612629565b60145442111561262857600490505b5b8091505090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561268c57600080fd5b600180600381111561269a57fe5b601960019054906101000a900460ff1660038111156126b557fe5b1415156126c157600080fd5b60008214156126d657426013819055506126de565b816013819055505b6213c680601354016014819055506203f480601354016015819055506002601960016101000a81548160ff0219169083600381111561271957fe5b02179055505050565b61222781565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561278457600080fd5b8060068190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127ea57600080fd5b806014540160148190555050565b67016345785d8a000081565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561288657600080fd5b601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff161515612ab3576001601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff02191690831515021790555080601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160016101000a81548160ff021916908360ff1602179055506000601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506000601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055506000601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055505b5050565b6040805190810160405280600381526020017f434852000000000000000000000000000000000000000000000000000000000081525081565b601260ff16600a0a63039387000281565b60085481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b6357600080fd5b612b6b614835565b565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612bc957600080fd5b6000806003811115612bd757fe5b601960019054906101000a900460ff166003811115612bf257fe5b141515612bfe57600080fd5b6000821415612c135742601281905550612c1b565b816012819055505b612c236148a5565b6001601960016101000a81548160ff02191690836003811115612c4257fe5b02179055505050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612c8a57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612cc557600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612d2257600080fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612d7f57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612ddc57600080fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612e3957600080fd5b600c60149054906101000a900460ff1680612ea15750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612ef95750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612f0457600080fd5b600360149054906101000a900460ff16151515612f2057600080fd5b612f2a8484614952565b91505092915050565b600360149054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612fa257600080fd5b8060088190555050565b601960019054906101000a900460ff1681565b601260ff16600a0a63022551000281565b60055481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561303257600080fd5b8060078190555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b69032d26d12e980b60000081565b61172681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561315b57600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561319857600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156131d357600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561323057600080fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561328d57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156132ea57600080fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561334757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff166323b872dd600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561344057600080fd5b505af1158015613454573d6000803e3d6000fd5b505050506040513d602081101561346a57600080fd5b8101908080519060200190929190505050151561348657600080fd5b600191505092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156134ed57600080fd5b600360149054906101000a900460ff16151561350857600080fd5b6000600360146101000a81548160ff0219169083151502179055508060049080519060200190613539929190614f9c565b507fab8f771d320c36af1f739e78861e82b4a21f97b123153ce1657e6904c8645da1816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561359c578082015181840152602081019050613581565b50505050905090810190601f1680156135c95780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b611c8a81565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561363e57600080fd5b6001600c60146101000a81548160ff021916908315150217905550600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114151561373c5761370d81611a32565b61373a600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000611427565b505b600191505090565b68cb49b44ba602d8000081565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156137ad57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156137e957600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fdf73496bb06edd4685dc2027b9d115504a7130d57f4f33dfd66679517060f45760405160405180910390a350565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260ff16600a0a6304c4b4000281565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561396257600080fd5b806015540160158190555050565b60008060008033600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156139b357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156139ee57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613a4b57600080fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613aa857600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613b0557600080fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613b6257600080fd5b67016345785d8a00003410151515613b7957600080fd5b69032d26d12e980b600000613b9934600d54614b7390919063ffffffff16565b1115613ba457600080fd5b349350613bb18685614b91565b1515613bbc57600080fd5b613bc586614c32565b9250613bda8385614c9990919063ffffffff16565b9150600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156140a25760016003811115613c4057fe5b601960019054906101000a900460ff166003811115613c5b57fe5b1415613c7757613c6b3387614ccc565b1515613c7657600080fd5b5b613c82338588614d40565b1515613c8d57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff166323b872dd600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613d8657600080fd5b505af1158015613d9a573d6000803e3d6000fd5b505050506040513d6020811015613db057600080fd5b81019080805190602001909291905050501515613dcc57600080fd5b60016003811115613dd957fe5b601960019054906101000a900460ff166003811115613df457fe5b14156140015760008660ff161415613ea657613e5b84601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154614b7390919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550613ffc565b60018660ff161415613f5257613f0784601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154614b7390919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550613ffb565b60028660ff161415613ffa57613fb384601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154614b7390919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505b5b5b61409d565b61405684601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040154614b7390919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055505b614304565b6140ac8685614eae565b15156140b757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff166323b872dd600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156141b057600080fd5b505af11580156141c4573d6000803e3d6000fd5b505050506040513d60208110156141da57600080fd5b810190808051906020019092919050505015156141f657600080fd5b61428484601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008960ff1660ff16815260200190815260200160002060000154614b7390919063ffffffff16565b601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008860ff1660ff168152602001908152602001600020600001819055505b61431984600d54614b7390919063ffffffff16565b600d8190555061434582600e8860ff1660048110151561433557fe5b0154614b7390919063ffffffff16565b600e8760ff1660048110151561435757fe5b018190555069032d26d12e980b600000600d5410151561437a57614379614835565b5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156143f9573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f8584604051808381526020018281526020019250505060405180910390a26001945050505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561449a57600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156144e857600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561457357600080fd5b6145c582600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461481c90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061465a82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614b7390919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061472c82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461481c90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600082821115151561482a57fe5b818303905092915050565b426014819055506003601960016101000a81548160ff0219169083600381111561485b57fe5b02179055507f02359fdde4491e11fa0985b799db1f730257a9715a67fd4b9ed9956e194025f0601454600d54604051808381526020018281526020019250505060405180910390a1565b60008060038111156148b357fe5b601960019054906101000a900460ff1660038111156148ce57fe5b1415156148da57600080fd5b6201518060125401601660006003811015156148f257fe5b01819055506202a3006016600060038110151561490b57fe5b0154016016600160038110151561491e57fe5b01819055506207e9006016600160038110151561493757fe5b0154016016600260038110151561494a57fe5b018190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156149cf5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211155b15156149da57600080fd5b614a2c82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461481c90919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614ac182600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614b7390919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000808284019050838110151515614b8757fe5b8091505092915050565b6000806000600e8560ff16600481101515614ba857fe5b015491506001905060008560ff161415614bed57614bcf8483614b7390919063ffffffff16565b601260ff16600a0a6303938700021015614be857600090505b614c27565b60018560ff161415614c2657614c0c8483614b7390919063ffffffff16565b601260ff16600a0a6302255100021015614c2557600090505b5b5b809250505092915050565b600080612227905060018360ff161415614c5057611c8a9050614c90565b60028360ff161415614c66576119b89050614c8f565b60038360ff161415614c8e5760155442111515614c87576117269050614c8d565b6114d590505b5b5b5b80915050919050565b60008082840290506000841480614cba5750828482811515614cb757fe5b04145b1515614cc257fe5b8091505092915050565b60008160ff16601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff1660ff16111515614d355760019050614d3a565b600090505b92915050565b60008060009050601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1615614ea35760008360ff161415614e1157614dfd84601a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154614b7390919063ffffffff16565b600554101515614e0c57600190505b614ea2565b60018360ff161415614e8657614e7284601a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154614b7390919063ffffffff16565b600654101515614e8157600190505b614ea1565b60028360ff161415614e9b5760019050614ea0565b600190505b5b5b5b809150509392505050565b600080601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008560ff1660ff16815260200190815260200160002060000154905060008460ff16148015614f555750614f508382614b7390919063ffffffff16565b600754105b80614f82575060018460ff16148015614f815750614f7c8382614b7390919063ffffffff16565b600854105b5b15614f905760009150614f95565b600191505b5092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614fdd57805160ff191683800117855561500b565b8280016001018555821561500b579182015b8281111561500a578251825591602001919060010190614fef565b5b509050615018919061501c565b5090565b61503e91905b8082111561503a576000816000905550600101615022565b5090565b905600a165627a7a7230582022e215f661d78eb641dd83534c19cb916ddbcf51dac40cf0707cdc08cd5ec7db0029

Deployed Bytecode

0x6080604052600436106102ca576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063021e7f85146102d557806306fdde0314610300578063090d993a14610390578063095ea7b3146103bd5780631755ff211461042257806318160ddd146104795780631f6d4942146104a4578063205dc0ee146105285780632282d9f21461055357806323b872dd1461058257806328a647ee146106075780632ad0a4e9146106485780632f1c167c146106d85780632ff2e9dc1461073c578063313ce567146107675780634042b66f1461079857806342966c68146107c35780634f961a6b146107f05780635659856c1461081b578063664e970414610863578063672acef01461088e5780636da66355146108b957806370a0823114610922578063716b01ce1461097957806372dd236a146109ba5780637412c223146109d157806374817d9b14610a025780637b283b7114610a2f578063842bfad214610a5a57806388770cb014610a875780638d0bba0314610ab45780638da5cb5b14610adf57806395c3239114610b3657806395d89b4114610b86578063964ad43414610c16578063999dd03e14610c415780639be3b28614610c6c578063a132aad114610c83578063a6f2ae3a14610cb0578063a9059cbb14610cd2578063b187bd2614610d37578063bf2b752414610d66578063c040e6b814610d93578063c7f43b5714610dcc578063d458c52214610df7578063d4ed899014610e22578063d9c4870e14610e4f578063dd62ed3e14610ea6578063e072830c14610f1d578063e2c3f9a814610f48578063e5c6258d14610f73578063e79faa5814610fd8578063ee2127c814611041578063f1b50c1d1461106c578063f206cf741461109b578063f2fde38b146110c6578063f6b4dfb414611109578063fc53f95814611160578063fc6f94681461118b578063fe1829b6146111e2575b6102d261120f565b50005b3480156102e157600080fd5b506102ea611368565b6040518082815260200191505060405180910390f35b34801561030c57600080fd5b50610315611388565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561035557808201518184015260208101905061033a565b50505050905090810190601f1680156103825780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561039c57600080fd5b506103bb600480360381019080803590602001909291905050506113c1565b005b3480156103c957600080fd5b50610408600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611427565b604051808215151515815260200191505060405180910390f35b34801561042e57600080fd5b506104376115ae565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561048557600080fd5b5061048e6115d4565b6040518082815260200191505060405180910390f35b3480156104b057600080fd5b506104e5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115da565b60405180871515151581526020018660ff1660ff168152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b34801561053457600080fd5b5061053d611630565b6040518082815260200191505060405180910390f35b34801561055f57600080fd5b50610568611636565b604051808215151515815260200191505060405180910390f35b34801561058e57600080fd5b506105ed600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611649565b604051808215151515815260200191505060405180910390f35b34801561061357600080fd5b5061063260048036038101908080359060200190929190505050611933565b6040518082815260200191505060405180910390f35b34801561065457600080fd5b5061065d61194d565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561069d578082015181840152602081019050610682565b50505050905090810190601f1680156106ca5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156106e457600080fd5b50610726600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291905050506119eb565b6040518082815260200191505060405180910390f35b34801561074857600080fd5b50610751611a16565b6040518082815260200191505060405180910390f35b34801561077357600080fd5b5061077c611a27565b604051808260ff1660ff16815260200191505060405180910390f35b3480156107a457600080fd5b506107ad611a2c565b6040518082815260200191505060405180910390f35b3480156107cf57600080fd5b506107ee60048036038101908080359060200190929190505050611a32565b005b3480156107fc57600080fd5b50610805611b81565b6040518082815260200191505060405180910390f35b34801561082757600080fd5b50610861600480360381019080803590602001908201803590602001919091929391929390803560ff169060200190929190505050611b87565b005b34801561086f57600080fd5b50610878611f60565b6040518082815260200191505060405180910390f35b34801561089a57600080fd5b506108a3611f66565b6040518082815260200191505060405180910390f35b3480156108c557600080fd5b50610920600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611f6c565b005b34801561092e57600080fd5b50610963600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120b5565b6040518082815260200191505060405180910390f35b34801561098557600080fd5b506109a4600480360381019080803590602001909291905050506120fe565b6040518082815260200191505060405180910390f35b3480156109c657600080fd5b506109cf612118565b005b3480156109dd57600080fd5b506109e6612578565b604051808260ff1660ff16815260200191505060405180910390f35b348015610a0e57600080fd5b50610a2d60048036038101908080359060200190929190505050612630565b005b348015610a3b57600080fd5b50610a44612722565b6040518082815260200191505060405180910390f35b348015610a6657600080fd5b50610a8560048036038101908080359060200190929190505050612728565b005b348015610a9357600080fd5b50610ab26004803603810190808035906020019092919050505061278e565b005b348015610ac057600080fd5b50610ac96127f8565b6040518082815260200191505060405180910390f35b348015610aeb57600080fd5b50610af4612804565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b4257600080fd5b50610b84600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff16906020019092919050505061282a565b005b348015610b9257600080fd5b50610b9b612ab7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bdb578082015181840152602081019050610bc0565b50505050905090810190601f168015610c085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c2257600080fd5b50610c2b612af0565b6040518082815260200191505060405180910390f35b348015610c4d57600080fd5b50610c56612b01565b6040518082815260200191505060405180910390f35b348015610c7857600080fd5b50610c81612b07565b005b348015610c8f57600080fd5b50610cae60048036038101908080359060200190929190505050612b6d565b005b610cb861120f565b604051808215151515815260200191505060405180910390f35b348015610cde57600080fd5b50610d1d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c4b565b604051808215151515815260200191505060405180910390f35b348015610d4357600080fd5b50610d4c612f33565b604051808215151515815260200191505060405180910390f35b348015610d7257600080fd5b50610d9160048036038101908080359060200190929190505050612f46565b005b348015610d9f57600080fd5b50610da8612fac565b60405180826003811115610db857fe5b60ff16815260200191505060405180910390f35b348015610dd857600080fd5b50610de1612fbf565b6040518082815260200191505060405180910390f35b348015610e0357600080fd5b50610e0c612fd0565b6040518082815260200191505060405180910390f35b348015610e2e57600080fd5b50610e4d60048036038101908080359060200190929190505050612fd6565b005b348015610e5b57600080fd5b50610e6461303c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610eb257600080fd5b50610f07600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613062565b6040518082815260200191505060405180910390f35b348015610f2957600080fd5b50610f326130e9565b6040518082815260200191505060405180910390f35b348015610f5457600080fd5b50610f5d6130f7565b6040518082815260200191505060405180910390f35b348015610f7f57600080fd5b50610fbe600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506130fd565b604051808215151515815260200191505060405180910390f35b348015610fe457600080fd5b5061103f600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613491565b005b34801561104d57600080fd5b506110566135d9565b6040518082815260200191505060405180910390f35b34801561107857600080fd5b506110816135df565b604051808215151515815260200191505060405180910390f35b3480156110a757600080fd5b506110b0613744565b6040518082815260200191505060405180910390f35b3480156110d257600080fd5b50611107600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613751565b005b34801561111557600080fd5b5061111e6138a9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561116c57600080fd5b506111756138cf565b6040518082815260200191505060405180910390f35b34801561119757600080fd5b506111a06138e0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156111ee57600080fd5b5061120d60048036038101908080359060200190929190505050613906565b005b600080600360149054906101000a900460ff1615151561122e57600080fd5b6000600381111561123b57fe5b601960019054906101000a900460ff16600381111561125657fe5b14158015611289575060038081111561126b57fe5b601960019054906101000a900460ff16600381111561128657fe5b14155b151561129457600080fd5b600160038111156112a157fe5b601960019054906101000a900460ff1660038111156112bc57fe5b14156113035760006012541180156112d657506012544210155b80156112f35750601660026003811015156112ed57fe5b01544211155b15156112fe57600080fd5b611331565b600060135411801561131757506013544210155b801561132557506014544211155b151561133057600080fd5b5b611339612578565b905060038160ff16111561134c57600080fd5b61135581613970565b151561136057600080fd5b600191505090565b601260ff16600a0a6304c4b40002601260ff16600a0a630bebc200020381565b6040805190810160405280600881526020017f43484552522e494f00000000000000000000000000000000000000000000000081525081565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561141d57600080fd5b8060058190555050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414806114b35750600082145b15156114be57600080fd5b81600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b601a6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060010154908060020154908060030154908060040154905086565b60075481565b600c60149054906101000a900460ff1681565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561168857600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116c357600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561172057600080fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561177d57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156117da57600080fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561183757600080fd5b600c60149054906101000a900460ff168061189f5750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118f75750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561190257600080fd5b600360149054906101000a900460ff1615151561191e57600080fd5b61192985858561445d565b9150509392505050565b60168160038110151561194257fe5b016000915090505481565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119e35780601f106119b8576101008083540402835291602001916119e3565b820191906000526020600020905b8154815290600101906020018083116119c657829003601f168201915b505050505081565b601b602052816000526040600020602052806000526040600020600091509150508060000154905081565b601260ff16600a0a630bebc2000281565b601281565b600d5481565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111151515611a8057600080fd5b611ad281600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461481c90919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b2a8160005461481c90919063ffffffff16565b6000819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a250565b6119b881565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611be657600080fd5b848490509150600090505b81811015611f5957601a60008686848181101515611c0b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff161515611f4c576001601a60008787858181101515611c8d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff02191690831515021790555082601a60008787858181101515611d1157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160016101000a81548160ff021916908360ff1602179055506000601a60008787858181101515611d9757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000601a60008787858181101515611e0957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506000601a60008787858181101515611e7b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055506000601a60008787858181101515611eed57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055505b8080600101915050611bf1565b5050505050565b6114d581565b60065481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fc857600080fd5b600360149054906101000a900460ff16151515611fe457600080fd5b6001600360146101000a81548160ff0219169083151502179055508060049080519060200190612015929190614f9c565b507f46f81aedb227deef794d5c737014a5414db3c678220a521b747734688cc6a9fe816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561207857808201518184015260208101905061205d565b50505050905090810190601f1680156120a55780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e8160048110151561210d57fe5b016000915090505481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561217457600080fd5b601960009054906101000a900460ff1615151561219057600080fd5b600c60149054906101000a900460ff161515156121ac57600080fd5b30600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612235600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260ff16600a0a6304c4b40002601260ff16600a0a630bebc2000203611427565b5073aec8c4242c8c2e532c6d6478a7de380263234845600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731a2c916b640520e1e93a78fea04a49d8345a5aa9600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008060ff168152602001908152602001600020600001819055506000601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600160ff168152602001908152602001600020600001819055506000601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600260ff168152602001908152602001600020600001819055506000601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600360ff168152602001908152602001600020600001819055506000600e60006004811015156124ed57fe5b01819055506000600e600160048110151561250457fe5b01819055506000600e600260048110151561251b57fe5b01819055506000600e600360048110151561253257fe5b01819055506000601960016101000a81548160ff0219169083600381111561255657fe5b02179055506001601960006101000a81548160ff021916908315150217905550565b600080600390506001600381111561258c57fe5b601960019054906101000a900460ff1660038111156125a757fe5b141561261957601660006003811015156125bd57fe5b0154421115156125d05760009050612614565b601660016003811015156125e057fe5b0154421115156125f35760019050612613565b6016600260038110151561260357fe5b01544211151561261257600290505b5b5b612629565b60145442111561262857600490505b5b8091505090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561268c57600080fd5b600180600381111561269a57fe5b601960019054906101000a900460ff1660038111156126b557fe5b1415156126c157600080fd5b60008214156126d657426013819055506126de565b816013819055505b6213c680601354016014819055506203f480601354016015819055506002601960016101000a81548160ff0219169083600381111561271957fe5b02179055505050565b61222781565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561278457600080fd5b8060068190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127ea57600080fd5b806014540160148190555050565b67016345785d8a000081565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561288657600080fd5b601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff161515612ab3576001601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff02191690831515021790555080601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160016101000a81548160ff021916908360ff1602179055506000601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506000601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055506000601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055505b5050565b6040805190810160405280600381526020017f434852000000000000000000000000000000000000000000000000000000000081525081565b601260ff16600a0a63039387000281565b60085481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b6357600080fd5b612b6b614835565b565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612bc957600080fd5b6000806003811115612bd757fe5b601960019054906101000a900460ff166003811115612bf257fe5b141515612bfe57600080fd5b6000821415612c135742601281905550612c1b565b816012819055505b612c236148a5565b6001601960016101000a81548160ff02191690836003811115612c4257fe5b02179055505050565b600082600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612c8a57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612cc557600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612d2257600080fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612d7f57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612ddc57600080fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612e3957600080fd5b600c60149054906101000a900460ff1680612ea15750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612ef95750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612f0457600080fd5b600360149054906101000a900460ff16151515612f2057600080fd5b612f2a8484614952565b91505092915050565b600360149054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612fa257600080fd5b8060088190555050565b601960019054906101000a900460ff1681565b601260ff16600a0a63022551000281565b60055481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561303257600080fd5b8060078190555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b69032d26d12e980b60000081565b61172681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561315b57600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561319857600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156131d357600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561323057600080fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561328d57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156132ea57600080fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561334757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff166323b872dd600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561344057600080fd5b505af1158015613454573d6000803e3d6000fd5b505050506040513d602081101561346a57600080fd5b8101908080519060200190929190505050151561348657600080fd5b600191505092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156134ed57600080fd5b600360149054906101000a900460ff16151561350857600080fd5b6000600360146101000a81548160ff0219169083151502179055508060049080519060200190613539929190614f9c565b507fab8f771d320c36af1f739e78861e82b4a21f97b123153ce1657e6904c8645da1816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561359c578082015181840152602081019050613581565b50505050905090810190601f1680156135c95780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b611c8a81565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561363e57600080fd5b6001600c60146101000a81548160ff021916908315150217905550600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114151561373c5761370d81611a32565b61373a600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000611427565b505b600191505090565b68cb49b44ba602d8000081565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156137ad57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156137e957600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fdf73496bb06edd4685dc2027b9d115504a7130d57f4f33dfd66679517060f45760405160405180910390a350565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260ff16600a0a6304c4b4000281565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561396257600080fd5b806015540160158190555050565b60008060008033600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156139b357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156139ee57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613a4b57600080fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613aa857600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613b0557600080fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515613b6257600080fd5b67016345785d8a00003410151515613b7957600080fd5b69032d26d12e980b600000613b9934600d54614b7390919063ffffffff16565b1115613ba457600080fd5b349350613bb18685614b91565b1515613bbc57600080fd5b613bc586614c32565b9250613bda8385614c9990919063ffffffff16565b9150600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156140a25760016003811115613c4057fe5b601960019054906101000a900460ff166003811115613c5b57fe5b1415613c7757613c6b3387614ccc565b1515613c7657600080fd5b5b613c82338588614d40565b1515613c8d57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff166323b872dd600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015613d8657600080fd5b505af1158015613d9a573d6000803e3d6000fd5b505050506040513d6020811015613db057600080fd5b81019080805190602001909291905050501515613dcc57600080fd5b60016003811115613dd957fe5b601960019054906101000a900460ff166003811115613df457fe5b14156140015760008660ff161415613ea657613e5b84601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154614b7390919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550613ffc565b60018660ff161415613f5257613f0784601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154614b7390919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550613ffb565b60028660ff161415613ffa57613fb384601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154614b7390919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055505b5b5b61409d565b61405684601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040154614b7390919063ffffffff16565b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055505b614304565b6140ac8685614eae565b15156140b757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff166323b872dd600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156141b057600080fd5b505af11580156141c4573d6000803e3d6000fd5b505050506040513d60208110156141da57600080fd5b810190808051906020019092919050505015156141f657600080fd5b61428484601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008960ff1660ff16815260200190815260200160002060000154614b7390919063ffffffff16565b601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008860ff1660ff168152602001908152602001600020600001819055505b61431984600d54614b7390919063ffffffff16565b600d8190555061434582600e8860ff1660048110151561433557fe5b0154614b7390919063ffffffff16565b600e8760ff1660048110151561435757fe5b018190555069032d26d12e980b600000600d5410151561437a57614379614835565b5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156143f9573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f8584604051808381526020018281526020019250505060405180910390a26001945050505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561449a57600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156144e857600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561457357600080fd5b6145c582600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461481c90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061465a82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614b7390919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061472c82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461481c90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600082821115151561482a57fe5b818303905092915050565b426014819055506003601960016101000a81548160ff0219169083600381111561485b57fe5b02179055507f02359fdde4491e11fa0985b799db1f730257a9715a67fd4b9ed9956e194025f0601454600d54604051808381526020018281526020019250505060405180910390a1565b60008060038111156148b357fe5b601960019054906101000a900460ff1660038111156148ce57fe5b1415156148da57600080fd5b6201518060125401601660006003811015156148f257fe5b01819055506202a3006016600060038110151561490b57fe5b0154016016600160038110151561491e57fe5b01819055506207e9006016600160038110151561493757fe5b0154016016600260038110151561494a57fe5b018190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156149cf5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211155b15156149da57600080fd5b614a2c82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461481c90919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614ac182600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614b7390919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000808284019050838110151515614b8757fe5b8091505092915050565b6000806000600e8560ff16600481101515614ba857fe5b015491506001905060008560ff161415614bed57614bcf8483614b7390919063ffffffff16565b601260ff16600a0a6303938700021015614be857600090505b614c27565b60018560ff161415614c2657614c0c8483614b7390919063ffffffff16565b601260ff16600a0a6302255100021015614c2557600090505b5b5b809250505092915050565b600080612227905060018360ff161415614c5057611c8a9050614c90565b60028360ff161415614c66576119b89050614c8f565b60038360ff161415614c8e5760155442111515614c87576117269050614c8d565b6114d590505b5b5b5b80915050919050565b60008082840290506000841480614cba5750828482811515614cb757fe5b04145b1515614cc257fe5b8091505092915050565b60008160ff16601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160019054906101000a900460ff1660ff16111515614d355760019050614d3a565b600090505b92915050565b60008060009050601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1615614ea35760008360ff161415614e1157614dfd84601a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154614b7390919063ffffffff16565b600554101515614e0c57600190505b614ea2565b60018360ff161415614e8657614e7284601a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154614b7390919063ffffffff16565b600654101515614e8157600190505b614ea1565b60028360ff161415614e9b5760019050614ea0565b600190505b5b5b5b809150509392505050565b600080601b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008560ff1660ff16815260200190815260200160002060000154905060008460ff16148015614f555750614f508382614b7390919063ffffffff16565b600754105b80614f82575060018460ff16148015614f815750614f7c8382614b7390919063ffffffff16565b600854105b5b15614f905760009150614f95565b600191505b5092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614fdd57805160ff191683800117855561500b565b8280016001018555821561500b579182015b8281111561500a578251825591602001919060010190614fef565b5b509050615018919061501c565b5090565b61503e91905b8082111561503a576000816000905550600101615022565b5090565b905600a165627a7a7230582022e215f661d78eb641dd83534c19cb916ddbcf51dac40cf0707cdc08cd5ec7db0029

Swarm Source

bzzr://22e215f661d78eb641dd83534c19cb916ddbcf51dac40cf0707cdc08cd5ec7db

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.