Sponsored:   Ubex.com - Additional 17% of tokens are available for purchase! Trading on exchanges already started.
Contract Overview
Balance: 0.29 Ether
Ether Value: $76.73 (@ $264.58/ETH)
Transactions: 14 txns
Misc
Address Watch: Add To Watch List
Contract Creator: 0x0dc56c180ec7da16e70a2146732895efdd6f4cf3at txn 0x93fbf31723ce77006ce0d1608aa3adf0e725a2d1e0dc1ec1fcc90c379ceefd1c
Token Balances:
 Latest 14 txns

TxHash Age From To Value [TxFee]
0x8bda198df9f6f0b5620ec94206ed519978d1613ee8f3366dac21cd258379b24f141 days 21 hrs ago0xdbf6ae14a34affe7b21618f58511efc5fc02e591  IN   0x006b4425ba57148466c0c54af1c484348a14a8a40.29 Ether0.010036513
0x1785558b162f1f0dde47e0449f3ee53a268f946b79ffad82f63c0ecb8243b566146 days 8 hrs ago0xc3ef96612b2746fcca8eedb004cead892ca5f530  IN   0x006b4425ba57148466c0c54af1c484348a14a8a40 Ether0.000082416
0xfb83baa4255d5d772335aec2402dbab381cfc3da663d766d1f95d4add2276985170 days 21 hrs ago0xa196a71beaab62fb9be77e12282e13db657cfa30  IN   0x006b4425ba57148466c0c54af1c484348a14a8a40.1 Ether0.008391306
0xe6b5e70de6a700da7795beafc0087e4c758d45e7a7404a0e7eabc74a295c03ca177 days 18 hrs ago0x3242cf24b81f866d02cc1d5c25bcfd0ece40a87b  IN   0x006b4425ba57148466c0c54af1c484348a14a8a46.4 Ether0.00199793
0x5fe415e3b79cfa0e835af7d79e550dcd9b9830e9c4b6e0eda8422262baac7a43180 days 3 hrs ago0xf26c2c450cc9de797d03bca514e93a341898eb27  IN   0x006b4425ba57148466c0c54af1c484348a14a8a40.6 Ether0.00399586
0x9c17e5fc414eb336ba74e3b5af4afd3e12019c256a3f87ca181fdd4f29344756181 days 9 hrs ago0x79e7462f26556a48221e87b623cb3cc058a48b64  IN   0x006b4425ba57148466c0c54af1c484348a14a8a40.1 Ether0.010189443
0xe184349a6e569b4c5ae67a306dec929b8cd768a141df7e41b3c127792fc12928181 days 19 hrs ago0xff2f83043e05bf474805b34715b84018ade791c5  IN   0x006b4425ba57148466c0c54af1c484348a14a8a40.1 Ether0.000240082
0x5789ea5b443a34e47e14af928e6105f7668f7c100185f7065ba267a18883103a182 days 21 hrs ago0xff2f83043e05bf474805b34715b84018ade791c5  IN   0x006b4425ba57148466c0c54af1c484348a14a8a40.1 Ether0.000240082
0xf90fc2767f3753d118e8f5095edbf07bb7a95a81b1c6f9a962976254a411d2c2182 days 22 hrs ago0xff2f83043e05bf474805b34715b84018ade791c5  IN   0x006b4425ba57148466c0c54af1c484348a14a8a41 Ether0.00071859
0x8800ed13188523ed3e1488c7774c81b3b3da7d5566abce7d8f4be479929be954183 days 17 hrs ago0x0dc56c180ec7da16e70a2146732895efdd6f4cf3  IN   0x006b4425ba57148466c0c54af1c484348a14a8a40 Ether0.0028111
0x38e653048f4f44411568f06dcb29bce5850c8ea6e6a83b3a67fad753c7e5f556183 days 17 hrs ago0x0dc56c180ec7da16e70a2146732895efdd6f4cf3  IN   0x006b4425ba57148466c0c54af1c484348a14a8a40 Ether0.0341275
0x21cebac27eaf06ee8cb28f197c88b0820a356123b6a6c97295722374c6269a9c183 days 17 hrs ago0x0dc56c180ec7da16e70a2146732895efdd6f4cf3  IN   0x006b4425ba57148466c0c54af1c484348a14a8a40 Ether0.0645177
0xe97e83e4ab90e76ec285d6cf790f568a98470684313c7742d4e94ee757cd4a50183 days 18 hrs ago0x0dc56c180ec7da16e70a2146732895efdd6f4cf3  IN   0x006b4425ba57148466c0c54af1c484348a14a8a40 Ether0.0513372
0x93fbf31723ce77006ce0d1608aa3adf0e725a2d1e0dc1ec1fcc90c379ceefd1c183 days 18 hrs ago0x0dc56c180ec7da16e70a2146732895efdd6f4cf3  IN    Contract Creation0 Ether0.386873
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 2 Internal Transactions

ParentTxHash Block Age From To Value
0x1785558b162f1f0dde47e0449f3ee53a268f946b79ffad82f63c0ecb8243b5665293448146 days 8 hrs ago0x006b4425ba57148466c0c54af1c484348a14a8a40xc3ef96612b2746fcca8eedb004cead892ca5f5301.26 Ether
0x56c53c4217d926f39e6511fd0d95639f7a916d983802bd1b72c40579c076a7a65293229146 days 9 hrs ago0x006b4425ba57148466c0c54af1c484348a14a8a40x2408fb30677dd3579fa0d34e34490b0dd026d2a57.14 Ether
[ Download CSV Export  ] 
Contract Source Code Verified (Exact match)
Contract Name: NUCrowdsale
Compiler Version: v0.4.19+commit.c4cbbb05
Optimization Enabled: No
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.15;

// File: contracts\infrastructure\ITokenRetreiver.sol

/**
 * @title Token retrieve interface
 *
 * Allows tokens to be retrieved from a contract
 *
 * #created 29/09/2017
 * #author Frank Bonnet
 */
contract ITokenRetreiver {

    /**
     * Extracts tokens from the contract
     *
     * @param _tokenContract The address of ERC20 compatible token
     */
    function retreiveTokens(address _tokenContract);
}

// File: contracts\integration\wings\IWingsAdapter.sol

/**
 * @title IWingsAdapter
 *
 * WINGS DAO Price Discovery & Promotion Pre-Beta https://www.wings.ai
 *
 * #created 04/10/2017
 * #author Frank Bonnet
 */
contract IWingsAdapter {


    /**
     * Get the total raised amount of Ether
     *
     * Can only increase, meaning if you withdraw ETH from the wallet, it should be not modified (you can use two fields
     * to keep one with a total accumulated amount) amount of ETH in contract and totalCollected for total amount of ETH collected
     *
     * @return Total raised Ether amount
     */
    function totalCollected() constant returns (uint);
}

// File: contracts\infrastructure\modifier\Owned.sol

contract Owned {

    // The address of the account that is the current owner
    address internal owner;


    /**
     * The publisher is the inital owner
     */
    function Owned() {
        owner = msg.sender;
    }


    /**
     * Access is restricted to the current owner
     */
    modifier only_owner() {
        require(msg.sender == owner);

        _;
    }
}

// File: contracts\source\token\IToken.sol

/**
 * @title ERC20 compatible token interface
 *
 * Implements ERC 20 Token standard: https://github.com/ethereum/EIPs/issues/20
 * - Short address attack fix
 *
 * #created 29/09/2017
 * #author Frank Bonnet
 */
contract IToken {

    /**
     * Get the total supply of tokens
     *
     * @return The total supply
     */
    function totalSupply() constant returns (uint);


    /**
     * Get balance of `_owner`
     *
     * @param _owner The address from which the balance will be retrieved
     * @return The balance
     */
    function balanceOf(address _owner) constant returns (uint);


    /**
     * Send `_value` token to `_to` from `msg.sender`
     *
     * @param _to The address of the recipient
     * @param _value The amount of token to be transferred
     * @return Whether the transfer was successful or not
     */
    function transfer(address _to, uint _value) returns (bool);


    /**
     * Send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
     *
     * @param _from The address of the sender
     * @param _to The address of the recipient
     * @param _value The amount of token to be transferred
     * @return Whether the transfer was successful or not
     */
    function transferFrom(address _from, address _to, uint _value) returns (bool);


    /**
     * `msg.sender` approves `_spender` to spend `_value` tokens
     *
     * @param _spender The address of the account able to transfer the tokens
     * @param _value The amount of tokens to be approved for transfer
     * @return Whether the approval was successful or not
     */
    function approve(address _spender, uint _value) returns (bool);


    /**
     * Get the amount of remaining tokens that `_spender` is allowed to spend from `_owner`
     *
     * @param _owner The address of the account owning tokens
     * @param _spender The address of the account able to transfer the tokens
     * @return Amount of remaining tokens allowed to spent
     */
    function allowance(address _owner, address _spender) constant returns (uint);
}

// File: contracts\source\token\IManagedToken.sol

/**
 * @title ManagedToken interface
 *
 * Adds the following functionallity to the basic ERC20 token
 * - Locking
 * - Issuing
 *
 * #created 29/09/2017
 * #author Frank Bonnet
 */
contract IManagedToken is IToken {

    /**
     * Returns true if the token is locked
     *
     * @return Whether the token is locked
     */
    function isLocked() constant returns (bool);


    /**
     * Unlocks the token so that the transferring of value is enabled
     *
     * @return Whether the unlocking was successful or not
     */
    function unlock() returns (bool);


    /**
     * Issues `_value` new tokens to `_to`
     *
     * @param _to The address to which the tokens will be issued
     * @param _value The amount of new tokens to issue
     * @return Whether the tokens where sucessfully issued or not
     */
    function issue(address _to, uint _value) returns (bool);
}

// File: contracts\source\crowdsale\ICrowdsale.sol

/**
 * @title ICrowdsale
 *
 * Base crowdsale interface to manage the sale of
 * an ERC20 token
 *
 * #created 29/09/2017
 * #author Frank Bonnet
 */
contract ICrowdsale {


    /**
     * Returns true if the contract is currently in the presale phase
     *
     * @return True if in presale phase
     */
    function isInPresalePhase() constant returns (bool);


    /**
     * Returns true if `_beneficiary` has a balance allocated
     *
     * @param _beneficiary The account that the balance is allocated for
     * @param _releaseDate The date after which the balance can be withdrawn
     * @return True if there is a balance that belongs to `_beneficiary`
     */
    function hasBalance(address _beneficiary, uint _releaseDate) constant returns (bool);


    /**
     * Get the allocated token balance of `_owner`
     *
     * @param _owner The address from which the allocated token balance will be retrieved
     * @return The allocated token balance
     */
    function balanceOf(address _owner) constant returns (uint);


    /**
     * Get the allocated eth balance of `_owner`
     *
     * @param _owner The address from which the allocated eth balance will be retrieved
     * @return The allocated eth balance
     */
    function ethBalanceOf(address _owner) constant returns (uint);


    /**
     * Get invested and refundable balance of `_owner` (only contributions during the ICO phase are registered)
     *
     * @param _owner The address from which the refundable balance will be retrieved
     * @return The invested refundable balance
     */
    function refundableEthBalanceOf(address _owner) constant returns (uint);


    /**
     * Returns the rate and bonus release date
     *
     * @param _phase The phase to use while determining the rate
     * @param _volume The amount wei used to determine what volume multiplier to use
     * @return The rate used in `_phase` multiplied by the corresponding volume multiplier
     */
    function getRate(uint _phase, uint _volume) constant returns (uint);


    /**
     * Convert `_wei` to an amount in tokens using
     * the `_rate`
     *
     * @param _wei amount of wei to convert
     * @param _rate rate to use for the conversion
     * @return Amount in tokens
     */
    function toTokens(uint _wei, uint _rate) constant returns (uint);


    /**
     * Withdraw allocated tokens
     */
    function withdrawTokens();


    /**
     * Withdraw allocated ether
     */
    function withdrawEther();


    /**
     * Refund in the case of an unsuccessful crowdsale. The
     * crowdsale is considered unsuccessful if minAmount was
     * not raised before end of the crowdsale
     */
    function refund();


    /**
     * Receive Eth and issue tokens to the sender
     */
    function () payable;
}

// File: contracts\source\crowdsale\Crowdsale.sol

/**
 * @title Crowdsale
 *
 * Abstract base crowdsale contract that manages the sale of
 * an ERC20 token
 *
 * #created 29/09/2017
 * #author Frank Bonnet
 */
contract Crowdsale is ICrowdsale, Owned {

    enum Stages {
        Deploying,
        Deployed,
        InProgress,
        Ended
    }

    struct Balance {
        uint eth;
        uint tokens;
        uint index;
    }

    struct Percentage {
        uint eth;
        uint tokens;
        bool overwriteReleaseDate;
        uint fixedReleaseDate;
        uint index;
    }

    struct Payout {
        uint percentage;
        uint vestingPeriod;
    }

    struct Phase {
        uint rate;
        uint end;
        uint bonusReleaseDate;
        bool useVolumeMultiplier;
    }

    struct VolumeMultiplier {
        uint rateMultiplier;
        uint bonusReleaseDateMultiplier;
    }

    // Crowdsale details
    uint public baseRate;
    uint public minAmount;
    uint public maxAmount;
    uint public minAcceptedAmount;
    uint public minAmountPresale;
    uint public maxAmountPresale;
    uint public minAcceptedAmountPresale;

    // Company address
    address public beneficiary;

    // Denominators
    uint internal percentageDenominator;
    uint internal tokenDenominator;

    // Crowdsale state
    uint public start;
    uint public presaleEnd;
    uint public crowdsaleEnd;
    uint public raised;
    uint public allocatedEth;
    uint public allocatedTokens;
    Stages public stage = Stages.Deploying;

    // Token contract
    IManagedToken public token;

    // Invested balances
    mapping (address => uint) private balances;

    // Alocated balances
    mapping (address => mapping(uint => Balance)) private allocated;
    mapping(address => uint[]) private allocatedIndex;

    // Stakeholders
    mapping (address => Percentage) private stakeholderPercentages;
    address[] private stakeholderPercentagesIndex;
    Payout[] private stakeholdersPayouts;

    // Crowdsale phases
    Phase[] private phases;

    // Volume multipliers
    mapping (uint => VolumeMultiplier) private volumeMultipliers;
    uint[] private volumeMultiplierThresholds;


    /**
     * Throw if at stage other than current stage
     *
     * @param _stage expected stage to test for
     */
    modifier at_stage(Stages _stage) {
        require(stage == _stage);
        _;
    }


    /**
     * Only after crowdsaleEnd plus `_time`
     *
     * @param _time Time to pass
     */
    modifier only_after(uint _time) {
        require(now > crowdsaleEnd + _time);
        _;
    }


    /**
     * Only after crowdsale
     */
    modifier only_after_crowdsale() {
        require(now > crowdsaleEnd);
        _;
    }


    /**
     * Throw if sender is not beneficiary
     */
    modifier only_beneficiary() {
        require(beneficiary == msg.sender);
        _;
    }


    /**
     * Allows the implementing contract to validate a
     * contributing account
     *
     * @param _contributor Address that is being validated
     * @return Wheter the contributor is accepted or not
     */
    function isAcceptedContributor(address _contributor) internal constant returns (bool);


    /**
     * Setup the crowdsale
     *
     * @param _start The timestamp of the start date
     * @param _token The token that is sold
     * @param _tokenDenominator The token amount of decimals that the token uses
     * @param _percentageDenominator The percision of percentages
     * @param _minAmount The min cap for the ICO
     * @param _maxAmount The max cap for the ICO
     * @param _minAcceptedAmount The lowest accepted amount during the ICO phase
     * @param _minAmountPresale The min cap for the presale
     * @param _maxAmountPresale The max cap for the presale
     * @param _minAcceptedAmountPresale The lowest accepted amount during the presale phase
     */
    function Crowdsale(uint _start, address _token, uint _tokenDenominator, uint _percentageDenominator, uint _minAmount, uint _maxAmount, uint _minAcceptedAmount, uint _minAmountPresale, uint _maxAmountPresale, uint _minAcceptedAmountPresale) {
        token = IManagedToken(_token);
        tokenDenominator = _tokenDenominator;
        percentageDenominator = _percentageDenominator;
        start = _start;
        minAmount = _minAmount;
        maxAmount = _maxAmount;
        minAcceptedAmount = _minAcceptedAmount;
        minAmountPresale = _minAmountPresale;
        maxAmountPresale = _maxAmountPresale;
        minAcceptedAmountPresale = _minAcceptedAmountPresale;
    }


    /**
     * Setup rates and phases
     *
     * @param _baseRate The rate without bonus
     * @param _phaseRates The rates for each phase
     * @param _phasePeriods The periods that each phase lasts (first phase is the presale phase)
     * @param _phaseBonusLockupPeriods The lockup period that each phase lasts
     * @param _phaseUsesVolumeMultiplier Wheter or not volume bonusses are used in the respective phase
     */
    function setupPhases(uint _baseRate, uint[] _phaseRates, uint[] _phasePeriods, uint[] _phaseBonusLockupPeriods, bool[] _phaseUsesVolumeMultiplier) public only_owner at_stage(Stages.Deploying) {
        baseRate = _baseRate;
        presaleEnd = start + _phasePeriods[0]; // First phase is expected to be the presale phase
        crowdsaleEnd = start; // Plus the sum of the rate phases

        for (uint i = 0; i < _phaseRates.length; i++) {
            crowdsaleEnd += _phasePeriods[i];
            phases.push(Phase(_phaseRates[i], crowdsaleEnd, 0, _phaseUsesVolumeMultiplier[i]));
        }

        for (uint ii = 0; ii < _phaseRates.length; ii++) {
            if (_phaseBonusLockupPeriods[ii] > 0) {
                phases[ii].bonusReleaseDate = crowdsaleEnd + _phaseBonusLockupPeriods[ii];
            }
        }
    }


    /**
     * Setup stakeholders
     *
     * @param _stakeholders The addresses of the stakeholders (first stakeholder is the beneficiary)
     * @param _stakeholderEthPercentages The eth percentages of the stakeholders
     * @param _stakeholderTokenPercentages The token percentages of the stakeholders
     * @param _stakeholderTokenPayoutOverwriteReleaseDates Wheter the vesting period is overwritten for the respective stakeholder
     * @param _stakeholderTokenPayoutFixedReleaseDates The vesting period after which the whole percentage of the tokens is released to the respective stakeholder
     * @param _stakeholderTokenPayoutPercentages The percentage of the tokens that is released at the respective date
     * @param _stakeholderTokenPayoutVestingPeriods The vesting period after which the respective percentage of the tokens is released
     */
    function setupStakeholders(address[] _stakeholders, uint[] _stakeholderEthPercentages, uint[] _stakeholderTokenPercentages, bool[] _stakeholderTokenPayoutOverwriteReleaseDates, uint[] _stakeholderTokenPayoutFixedReleaseDates, uint[] _stakeholderTokenPayoutPercentages, uint[] _stakeholderTokenPayoutVestingPeriods) public only_owner at_stage(Stages.Deploying) {
        beneficiary = _stakeholders[0]; // First stakeholder is expected to be the beneficiary
        for (uint i = 0; i < _stakeholders.length; i++) {
            stakeholderPercentagesIndex.push(_stakeholders[i]);
            stakeholderPercentages[_stakeholders[i]] = Percentage(
                _stakeholderEthPercentages[i],
                _stakeholderTokenPercentages[i],
                _stakeholderTokenPayoutOverwriteReleaseDates[i],
                _stakeholderTokenPayoutFixedReleaseDates[i], i);
        }

        // Percentages add up to 100
        for (uint ii = 0; ii < _stakeholderTokenPayoutPercentages.length; ii++) {
            stakeholdersPayouts.push(Payout(_stakeholderTokenPayoutPercentages[ii], _stakeholderTokenPayoutVestingPeriods[ii]));
        }
    }


    /**
     * Setup volume multipliers
     *
     * @param _volumeMultiplierRates The rates will be multiplied by this value (denominated by 4)
     * @param _volumeMultiplierLockupPeriods The lockup periods will be multiplied by this value (denominated by 4)
     * @param _volumeMultiplierThresholds The volume thresholds for each respective multiplier
     */
    function setupVolumeMultipliers(uint[] _volumeMultiplierRates, uint[] _volumeMultiplierLockupPeriods, uint[] _volumeMultiplierThresholds) public only_owner at_stage(Stages.Deploying) {
        require(phases.length > 0);
        volumeMultiplierThresholds = _volumeMultiplierThresholds;
        for (uint i = 0; i < volumeMultiplierThresholds.length; i++) {
            volumeMultipliers[volumeMultiplierThresholds[i]] = VolumeMultiplier(_volumeMultiplierRates[i], _volumeMultiplierLockupPeriods[i]);
        }
    }


    /**
     * After calling the deploy function the crowdsale
     * rules become immutable
     */
    function deploy() public only_owner at_stage(Stages.Deploying) {
        require(phases.length > 0);
        require(stakeholderPercentagesIndex.length > 0);
        stage = Stages.Deployed;
    }


    /**
     * Prove that beneficiary is able to sign transactions
     * and start the crowdsale
     */
    function confirmBeneficiary() public only_beneficiary at_stage(Stages.Deployed) {
        stage = Stages.InProgress;
    }


    /**
     * Returns true if the contract is currently in the presale phase
     *
     * @return True if in presale phase
     */
    function isInPresalePhase() public constant returns (bool) {
        return stage == Stages.InProgress && now >= start && now <= presaleEnd;
    }


    /**
     * Returns true if `_beneficiary` has a balance allocated
     *
     * @param _beneficiary The account that the balance is allocated for
     * @param _releaseDate The date after which the balance can be withdrawn
     * @return True if there is a balance that belongs to `_beneficiary`
     */
    function hasBalance(address _beneficiary, uint _releaseDate) public constant returns (bool) {
        return allocatedIndex[_beneficiary].length > 0 && _releaseDate == allocatedIndex[_beneficiary][allocated[_beneficiary][_releaseDate].index];
    }


    /**
     * Get the allocated token balance of `_owner`
     *
     * @param _owner The address from which the allocated token balance will be retrieved
     * @return The allocated token balance
     */
    function balanceOf(address _owner) public constant returns (uint) {
        uint sum = 0;
        for (uint i = 0; i < allocatedIndex[_owner].length; i++) {
            sum += allocated[_owner][allocatedIndex[_owner][i]].tokens;
        }

        return sum;
    }


    /**
     * Get the allocated eth balance of `_owner`
     *
     * @param _owner The address from which the allocated eth balance will be retrieved
     * @return The allocated eth balance
     */
    function ethBalanceOf(address _owner) public constant returns (uint) {
        uint sum = 0;
        for (uint i = 0; i < allocatedIndex[_owner].length; i++) {
            sum += allocated[_owner][allocatedIndex[_owner][i]].eth;
        }

        return sum;
    }


    /**
     * Get invested and refundable balance of `_owner` (only contributions during the ICO phase are registered)
     *
     * @param _owner The address from which the refundable balance will be retrieved
     * @return The invested refundable balance
     */
    function refundableEthBalanceOf(address _owner) public constant returns (uint) {
        return now > crowdsaleEnd && raised < minAmount ? balances[_owner] : 0;
    }


    /**
     * Returns the current phase based on the current time
     *
     * @return The index of the current phase
     */
    function getCurrentPhase() public constant returns (uint) {
        for (uint i = 0; i < phases.length; i++) {
            if (now <= phases[i].end) {
                return i;
                break;
            }
        }

        return phases.length; // Does not exist
    }


    /**
     * Returns the rate and bonus release date
     *
     * @param _phase The phase to use while determining the rate
     * @param _volume The amount wei used to determin what volume multiplier to use
     * @return The rate used in `_phase` multiplied by the corresponding volume multiplier
     */
    function getRate(uint _phase, uint _volume) public constant returns (uint) {
        uint rate = 0;
        if (stage == Stages.InProgress && now >= start) {
            Phase storage phase = phases[_phase];
            rate = phase.rate;

            // Find volume multiplier
            if (phase.useVolumeMultiplier && volumeMultiplierThresholds.length > 0 && _volume >= volumeMultiplierThresholds[0]) {
                for (uint i = volumeMultiplierThresholds.length; i > 0; i--) {
                    if (_volume >= volumeMultiplierThresholds[i - 1]) {
                        VolumeMultiplier storage multiplier = volumeMultipliers[volumeMultiplierThresholds[i - 1]];
                        rate += phase.rate * multiplier.rateMultiplier / percentageDenominator;
                        break;
                    }
                }
            }
        }

        return rate;
    }


    /**
     * Get distribution data based on the current phase and
     * the volume in wei that is being distributed
     *
     * @param _phase The current crowdsale phase
     * @param _volume The amount wei used to determine what volume multiplier to use
     * @return Volumes and corresponding release dates
     */
    function getDistributionData(uint _phase, uint _volume) internal constant returns (uint[], uint[]) {
        Phase storage phase = phases[_phase];
        uint remainingVolume = _volume;

        bool usingMultiplier = false;
        uint[] memory volumes = new uint[](1);
        uint[] memory releaseDates = new uint[](1);

        // Find volume multipliers
        if (phase.useVolumeMultiplier && volumeMultiplierThresholds.length > 0 && _volume >= volumeMultiplierThresholds[0]) {
            uint phaseReleasePeriod = phase.bonusReleaseDate - crowdsaleEnd;
            for (uint i = volumeMultiplierThresholds.length; i > 0; i--) {
                if (_volume >= volumeMultiplierThresholds[i - 1]) {
                    if (!usingMultiplier) {
                        volumes = new uint[](i + 1);
                        releaseDates = new uint[](i + 1);
                        usingMultiplier = true;
                    }

                    VolumeMultiplier storage multiplier = volumeMultipliers[volumeMultiplierThresholds[i - 1]];
                    uint releaseDate = phase.bonusReleaseDate + phaseReleasePeriod * multiplier.bonusReleaseDateMultiplier / percentageDenominator;
                    uint volume = remainingVolume - volumeMultiplierThresholds[i - 1];

                    // Store increment
                    volumes[i] = volume;
                    releaseDates[i] = releaseDate;

                    remainingVolume -= volume;
                }
            }
        }

        // Store increment
        volumes[0] = remainingVolume;
        releaseDates[0] = phase.bonusReleaseDate;

        return (volumes, releaseDates);
    }


    /**
     * Convert `_wei` to an amount in tokens using
     * the `_rate`
     *
     * @param _wei amount of wei to convert
     * @param _rate rate to use for the conversion
     * @return Amount in tokens
     */
    function toTokens(uint _wei, uint _rate) public constant returns (uint) {
        return _wei * _rate * tokenDenominator / 1 ether;
    }


    /**
     * Function to end the crowdsale by setting
     * the stage to Ended
     */
    function endCrowdsale() public at_stage(Stages.InProgress) {
        require(now > crowdsaleEnd || raised >= maxAmount);
        require(raised >= minAmount);
        stage = Stages.Ended;

        // Unlock token
        if (!token.unlock()) {
            revert();
        }

        // Allocate tokens (no allocation can be done after this period)
        uint totalTokenSupply = token.totalSupply() + allocatedTokens;
        for (uint i = 0; i < stakeholdersPayouts.length; i++) {
            Payout storage p = stakeholdersPayouts[i];
            _allocateStakeholdersTokens(totalTokenSupply * p.percentage / percentageDenominator, now + p.vestingPeriod);
        }

        // Allocate remaining ETH
        _allocateStakeholdersEth(this.balance - allocatedEth, 0);
    }


    /**
     * Withdraw allocated tokens
     */
    function withdrawTokens() public {
        uint tokensToSend = 0;
        for (uint i = 0; i < allocatedIndex[msg.sender].length; i++) {
            uint releaseDate = allocatedIndex[msg.sender][i];
            if (releaseDate <= now) {
                Balance storage b = allocated[msg.sender][releaseDate];
                tokensToSend += b.tokens;
                b.tokens = 0;
            }
        }

        if (tokensToSend > 0) {
            allocatedTokens -= tokensToSend;
            if (!token.issue(msg.sender, tokensToSend)) {
                revert();
            }
        }
    }


    /**
     * Withdraw allocated ether
     */
    function withdrawEther() public {
        uint ethToSend = 0;
        for (uint i = 0; i < allocatedIndex[msg.sender].length; i++) {
            uint releaseDate = allocatedIndex[msg.sender][i];
            if (releaseDate <= now) {
                Balance storage b = allocated[msg.sender][releaseDate];
                ethToSend += b.eth;
                b.eth = 0;
            }
        }

        if (ethToSend > 0) {
            allocatedEth -= ethToSend;
            if (!msg.sender.send(ethToSend)) {
                revert();
            }
        }
    }


    /**
     * Refund in the case of an unsuccessful crowdsale. The
     * crowdsale is considered unsuccessful if minAmount was
     * not raised before end of the crowdsale
     */
    function refund() public only_after_crowdsale at_stage(Stages.InProgress) {
        require(raised < minAmount);

        uint receivedAmount = balances[msg.sender];
        balances[msg.sender] = 0;

        if (receivedAmount > 0 && !msg.sender.send(receivedAmount)) {
            balances[msg.sender] = receivedAmount;
        }
    }


    /**
     * Failsafe and clean-up mechanism
     */
    function destroy() public only_beneficiary only_after(2 years) {
        selfdestruct(beneficiary);
    }


    /**
     * Receive Eth and issue tokens to the sender
     */
    function contribute() public payable {
        _handleTransaction(msg.sender, msg.value);
    }


    /**
     * Receive Eth and issue tokens to the sender
     *
     * This function requires that msg.sender is not a contract. This is required because it's
     * not possible for a contract to specify a gas amount when calling the (internal) send()
     * function. Solidity imposes a maximum amount of gas (2300 gas at the time of writing)
     *
     * Contracts can call the contribute() function instead
     */
    function () payable {
        require(msg.sender == tx.origin);
        _handleTransaction(msg.sender, msg.value);
    }


    /**
     * Handle incoming transactions
     *

     */
    function _handleTransaction(address _sender, uint _received) private at_stage(Stages.InProgress) {

        // Crowdsale is active
        require(now >= start && now <= crowdsaleEnd);

        // Whitelist check
        require(isAcceptedContributor(_sender));

        // When in presale phase
        bool presalePhase = isInPresalePhase();
        require(!presalePhase || _received >= minAcceptedAmountPresale);
        require(!presalePhase || raised < maxAmountPresale);

        // When in ico phase
        require(presalePhase || _received >= minAcceptedAmount);
        require(presalePhase || raised >= minAmountPresale);
        require(presalePhase || raised < maxAmount);

        uint acceptedAmount;
        if (presalePhase && raised + _received > maxAmountPresale) {
            acceptedAmount = maxAmountPresale - raised;
        } else if (raised + _received > maxAmount) {
            acceptedAmount = maxAmount - raised;
        } else {
            acceptedAmount = _received;
        }

        raised += acceptedAmount;

        if (presalePhase) {
            // During the presale phase - Non refundable
            _allocateStakeholdersEth(acceptedAmount, 0);
        } else {
            // During the ICO phase - 100% refundable
            balances[_sender] += acceptedAmount;
        }

        // Distribute tokens
        uint tokensToIssue = 0;
        uint phase = getCurrentPhase();
        var rate = getRate(phase, acceptedAmount);
        var (volumes, releaseDates) = getDistributionData(phase, acceptedAmount);

        // Allocate tokens
        for (uint i = 0; i < volumes.length; i++) {
            var tokensAtCurrentRate = toTokens(volumes[i], rate);
            if (rate > baseRate && releaseDates[i] > now) {
                uint bonusTokens = tokensAtCurrentRate / rate * (rate - baseRate);
                _allocateTokens(_sender, bonusTokens, releaseDates[i]);

                tokensToIssue += tokensAtCurrentRate - bonusTokens;
            } else {
                tokensToIssue += tokensAtCurrentRate;
            }
        }

        // Issue tokens
        if (tokensToIssue > 0 && !token.issue(_sender, tokensToIssue)) {
            revert();
        }

        // Refund due to max cap hit
        if (_received - acceptedAmount > 0 && !_sender.send(_received - acceptedAmount)) {
            revert();
        }
    }


    /**
     * Allocate ETH
     *
     * @param _beneficiary The account to alocate the eth for
     * @param _amount The amount of ETH to allocate
     * @param _releaseDate The date after which the eth can be withdrawn
     */
    function _allocateEth(address _beneficiary, uint _amount, uint _releaseDate) private {
        if (hasBalance(_beneficiary, _releaseDate)) {
            allocated[_beneficiary][_releaseDate].eth += _amount;
        } else {
            allocated[_beneficiary][_releaseDate] = Balance(
                _amount, 0, allocatedIndex[_beneficiary].push(_releaseDate) - 1);
        }

        allocatedEth += _amount;
    }


    /**
     * Allocate Tokens
     *
     * @param _beneficiary The account to allocate the tokens for
     * @param _amount The amount of tokens to allocate
     * @param _releaseDate The date after which the tokens can be withdrawn
     */
    function _allocateTokens(address _beneficiary, uint _amount, uint _releaseDate) private {
        if (hasBalance(_beneficiary, _releaseDate)) {
            allocated[_beneficiary][_releaseDate].tokens += _amount;
        } else {
            allocated[_beneficiary][_releaseDate] = Balance(
                0, _amount, allocatedIndex[_beneficiary].push(_releaseDate) - 1);
        }

        allocatedTokens += _amount;
    }


    /**
     * Allocate ETH for stakeholders
     *
     * @param _amount The amount of ETH to allocate
     * @param _releaseDate The date after which the eth can be withdrawn
     */
    function _allocateStakeholdersEth(uint _amount, uint _releaseDate) private {
        for (uint i = 0; i < stakeholderPercentagesIndex.length; i++) {
            Percentage storage p = stakeholderPercentages[stakeholderPercentagesIndex[i]];
            if (p.eth > 0) {
                _allocateEth(stakeholderPercentagesIndex[i], _amount * p.eth / percentageDenominator, _releaseDate);
            }
        }
    }


    /**
     * Allocate Tokens for stakeholders
     *
     * @param _amount The amount of tokens created
     * @param _releaseDate The date after which the tokens can be withdrawn (unless overwitten)
     */
    function _allocateStakeholdersTokens(uint _amount, uint _releaseDate) private {
        for (uint i = 0; i < stakeholderPercentagesIndex.length; i++) {
            Percentage storage p = stakeholderPercentages[stakeholderPercentagesIndex[i]];
            if (p.tokens > 0) {
                _allocateTokens(
                    stakeholderPercentagesIndex[i],
                    _amount * p.tokens / percentageDenominator,
                    p.overwriteReleaseDate ? p.fixedReleaseDate : _releaseDate);
            }
        }
    }
}

// File: contracts\source\NUCrowdsale.sol

/**
 * @title NUCrowdsale
 *
 * Network Units (NU) is a decentralised worldwide collaboration of computing power
 *
 * By allowing gamers and service providers to participate in our unique mining
 * process, we will create an ultra-fast, blockchain controlled multiplayer infrastructure
 * rentable by developers
 *
 * Visit https://networkunits.io/
 *
 * #created 22/10/2017
 * #author Frank Bonnet
 */
contract NUCrowdsale is Crowdsale, ITokenRetreiver, IWingsAdapter {


    /**
     * Setup the crowdsale
     *
     * @param _start The timestamp of the start date
     * @param _token The token that is sold
     * @param _tokenDenominator The token amount of decimals that the token uses
     * @param _percentageDenominator The precision of percentages
     * @param _minAmount The min cap for the ICO
     * @param _maxAmount The max cap for the ICO
     * @param _minAcceptedAmount The lowest accepted amount during the ICO phase
     * @param _minAmountPresale The min cap for the presale
     * @param _maxAmountPresale The max cap for the presale
     * @param _minAcceptedAmountPresale The lowest accepted amount during the presale phase
     */
    function NUCrowdsale(uint _start, address _token, uint _tokenDenominator, uint _percentageDenominator, uint _minAmount, uint _maxAmount, uint _minAcceptedAmount, uint _minAmountPresale, uint _maxAmountPresale, uint _minAcceptedAmountPresale)
        Crowdsale(_start, _token, _tokenDenominator, _percentageDenominator, _minAmount, _maxAmount, _minAcceptedAmount, _minAmountPresale, _maxAmountPresale, _minAcceptedAmountPresale)
        {
    }


    /**
     * Wings integration - Get the total raised amount of Ether
     *
     * Can only increased, means if you withdraw ETH from the wallet, should be not modified (you can use two fields
     * to keep one with a total accumulated amount) amount of ETH in contract and totalCollected for total amount of ETH collected
     *
     * @return Total raised Ether amount
     */
    function totalCollected() public constant returns (uint) {
        return raised;
    }


    /**
     * Allows the implementing contract to validate a
     * contributing account
     *
     * @param _contributor Address that is being validated
     * @return Wheter the contributor is accepted or not
     */
    function isAcceptedContributor(address _contributor) internal constant returns (bool) {
        return _contributor != address(0x0);
    }


    /**
     * Failsafe mechanism
     *
     * Allows beneficary to retreive tokens from the contract
     *
     * @param _tokenContract The address of ERC20 compatible token
     */
    function retreiveTokens(address _tokenContract) public only_beneficiary {
        IToken tokenInstance = IToken(_tokenContract);

        // Retreive tokens from our token contract
        ITokenRetreiver(token).retreiveTokens(_tokenContract);

        // Retreive tokens from crowdsale contract
        uint tokenBalance = tokenInstance.balanceOf(this);
        if (tokenBalance > 0) {
            tokenInstance.transfer(beneficiary, tokenBalance);
        }
    }
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"allocatedTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minAmountPresale","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_phase","type":"uint256"},{"name":"_volume","type":"uint256"}],"name":"getRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"endCrowdsale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"presaleEnd","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_baseRate","type":"uint256"},{"name":"_phaseRates","type":"uint256[]"},{"name":"_phasePeriods","type":"uint256[]"},{"name":"_phaseBonusLockupPeriods","type":"uint256[]"},{"name":"_phaseUsesVolumeMultiplier","type":"bool[]"}],"name":"setupPhases","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"beneficiary","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_wei","type":"uint256"},{"name":"_rate","type":"uint256"}],"name":"toTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"crowdsaleEnd","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"ethBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minAcceptedAmountPresale","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"deploy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_stakeholders","type":"address[]"},{"name":"_stakeholderEthPercentages","type":"uint256[]"},{"name":"_stakeholderTokenPercentages","type":"uint256[]"},{"name":"_stakeholderTokenPayoutOverwriteReleaseDates","type":"bool[]"},{"name":"_stakeholderTokenPayoutFixedReleaseDates","type":"uint256[]"},{"name":"_stakeholderTokenPayoutPercentages","type":"uint256[]"},{"name":"_stakeholderTokenPayoutVestingPeriods","type":"uint256[]"}],"name":"setupStakeholders","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"refundableEthBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenContract","type":"address"}],"name":"retreiveTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_volumeMultiplierRates","type":"uint256[]"},{"name":"_volumeMultiplierLockupPeriods","type":"uint256[]"},{"name":"_volumeMultiplierThresholds","type":"uint256[]"}],"name":"setupVolumeMultipliers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"confirmBeneficiary","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentPhase","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allocatedEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxAmountPresale","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_beneficiary","type":"address"},{"name":"_releaseDate","type":"uint256"}],"name":"hasBalance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"start","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stage","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"contribute","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"totalCollected","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"raised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minAcceptedAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isInPresalePhase","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_start","type":"uint256"},{"name":"_token","type":"address"},{"name":"_tokenDenominator","type":"uint256"},{"name":"_percentageDenominator","type":"uint256"},{"name":"_minAmount","type":"uint256"},{"name":"_maxAmount","type":"uint256"},{"name":"_minAcceptedAmount","type":"uint256"},{"name":"_minAmountPresale","type":"uint256"},{"name":"_maxAmountPresale","type":"uint256"},{"name":"_minAcceptedAmountPresale","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"}]

  Contract Creation Code Switch To Opcodes View
60606040526000601160006101000a81548160ff0219169083600381111561002357fe5b0217905550341561003357600080fd5b604051610140806136058339810160405280805190602001909190805190602001909190805190602001909190805190602001909190805190602001909190805190602001909190805190602001909190805190602001909190805190602001909190805190602001909190505089898989898989898989336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088601160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555087600a819055508660098190555089600b8190555085600281905550846003819055508360048190555082600581905550816006819055508060078190555050505050505050505050505050505050505050506134778061018e6000396000f3006060604052600436106101cc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680622f9569146102125780630d6f849b1461023b5780630d70e7e3146102645780631f68f20a146102a45780632095f2d4146102cd578063229f3e29146102e25780632d92b1c01461030b57806338af3eed1461042e5780634942edf9146104835780634d9aa424146104c3578063590e1ae3146104ec5780635f48f3931461050157806370a082311461052a5780637252bbf2146105775780637362377b146105c457806376c82e92146105d9578063775c300c1461060257806383197ef0146106175780638d8f2adb1461062c5780638ec521a81461064157806392099fdb1461081b57806396a0492514610868578063984c14ac146108a15780639b2cb5d81461097b5780639c5e9023146109a4578063a3a40ea5146109b9578063b19a4540146109e2578063b946fab114610a0b578063bd51d5d014610a34578063be9a655514610a8e578063c040e6b814610ab7578063d7bb99ba14610aee578063e29eb83614610af8578063f0ea4bfc14610b21578063f1d841f114610b4a578063f96c166c14610b73578063fc0c546a14610ba0575b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561020657600080fd5b6102103334610bf5565b005b341561021d57600080fd5b610225610ff9565b6040518082815260200191505060405180910390f35b341561024657600080fd5b61024e610fff565b6040518082815260200191505060405180910390f35b341561026f57600080fd5b61028e6004808035906020019091908035906020019091905050611005565b6040518082815260200191505060405180910390f35b34156102af57600080fd5b6102b7611169565b6040518082815260200191505060405180910390f35b34156102d857600080fd5b6102e061116f565b005b34156102ed57600080fd5b6102f56113ef565b6040518082815260200191505060405180910390f35b341561031657600080fd5b61042c6004808035906020019091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919050506113f5565b005b341561043957600080fd5b610441611642565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048e57600080fd5b6104ad6004808035906020019091908035906020019091905050611668565b6040518082815260200191505060405180910390f35b34156104ce57600080fd5b6104d661168c565b6040518082815260200191505060405180910390f35b34156104f757600080fd5b6104ff611692565b005b341561050c57600080fd5b610514611802565b6040518082815260200191505060405180910390f35b341561053557600080fd5b610561600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611808565b6040518082815260200191505060405180910390f35b341561058257600080fd5b6105ae600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611925565b6040518082815260200191505060405180910390f35b34156105cf57600080fd5b6105d7611a42565b005b34156105e457600080fd5b6105ec611bd1565b6040518082815260200191505060405180910390f35b341561060d57600080fd5b610615611bd7565b005b341561062257600080fd5b61062a611cb6565b005b341561063757600080fd5b61063f611d64565b005b341561064c57600080fd5b610819600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050611fa6565b005b341561082657600080fd5b610852600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506122f8565b6040518082815260200191505060405180910390f35b341561087357600080fd5b61089f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612361565b005b34156108ac57600080fd5b610979600480803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190505061264b565b005b341561098657600080fd5b61098e6127b5565b6040518082815260200191505060405180910390f35b34156109af57600080fd5b6109b76127bb565b005b34156109c457600080fd5b6109cc612873565b6040518082815260200191505060405180910390f35b34156109ed57600080fd5b6109f56128d3565b6040518082815260200191505060405180910390f35b3415610a1657600080fd5b610a1e6128d9565b6040518082815260200191505060405180910390f35b3415610a3f57600080fd5b610a74600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506128df565b604051808215151515815260200191505060405180910390f35b3415610a9957600080fd5b610aa16129e3565b6040518082815260200191505060405180910390f35b3415610ac257600080fd5b610aca6129e9565b60405180826003811115610ada57fe5b60ff16815260200191505060405180910390f35b610af66129fc565b005b3415610b0357600080fd5b610b0b612a08565b6040518082815260200191505060405180910390f35b3415610b2c57600080fd5b610b34612a12565b6040518082815260200191505060405180910390f35b3415610b5557600080fd5b610b5d612a18565b6040518082815260200191505060405180910390f35b3415610b7e57600080fd5b610b86612a1e565b604051808215151515815260200191505060405180910390f35b3415610bab57600080fd5b610bb3612a6a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000806000806000610c0561328f565b610c0d61328f565b60008060006002806003811115610c2057fe5b601160009054906101000a900460ff166003811115610c3b57fe5b141515610c4757600080fd5b600b544210158015610c5b5750600d544211155b1515610c6657600080fd5b610c6f8d612a90565b1515610c7a57600080fd5b610c82612a1e565b9a508a1580610c9357506007548c10155b1515610c9e57600080fd5b8a1580610cae5750600654600e54105b1515610cb957600080fd5b8a80610cc757506004548c10155b1515610cd257600080fd5b8a80610ce25750600554600e5410155b1515610ced57600080fd5b8a80610cfc5750600354600e54105b1515610d0757600080fd5b8a8015610d1957506006548c600e5401115b15610d2c57600e54600654039950610d4d565b6003548c600e54011115610d4857600e54600354039950610d4c565b8b99505b5b89600e600082825401925050819055508a15610d7357610d6e8a6000612ac9565b610dc1565b89601260008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b60009850610dcd612873565b9750610dd9888b611005565b9650610de5888b612bd2565b95509550600093505b8551841015610e9b57610e188685815181101515610e0857fe5b9060200190602002015188611668565b925060015487118015610e415750428585815181101515610e3557fe5b90602001906020020151115b15610e885760015487038784811515610e5657fe5b04029150610e7c8d838787815181101515610e6d57fe5b90602001906020020151612e65565b81830389019850610e8e565b82890198505b8380600101945050610dee565b600089118015610f905750601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663867904b48e8b6000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610f7357600080fd5b6102c65a03f11515610f8457600080fd5b50505060405180519050155b15610f9a57600080fd5b60008a8d03118015610fe057508c73ffffffffffffffffffffffffffffffffffffffff166108fc8b8e039081150290604051600060405180830381858888f19350505050155b15610fea57600080fd5b50505050505050505050505050565b60105481565b60055481565b60008060008060008093506002600381111561101d57fe5b601160009054906101000a900460ff16600381111561103857fe5b1480156110475750600b544210155b1561115c5760188781548110151561105b57fe5b90600052602060002090600402019250826000015493508260030160009054906101000a900460ff16801561109557506000601a80549050115b80156110bc5750601a60008154811015156110ac57fe5b9060005260206000209001548610155b1561115b57601a8054905091505b600082111561115a57601a600183038154811015156110e557fe5b9060005260206000209001548610151561114c5760196000601a6001850381548110151561110f57fe5b90600052602060002090015481526020019081526020016000209050600954816000015484600001540281151561114257fe5b048401935061115a565b8180600190039250506110ca565b5b5b8394505050505092915050565b60015481565b6000806000600280600381111561118257fe5b601160009054906101000a900460ff16600381111561119d57fe5b1415156111a957600080fd5b600d544211806111bd5750600354600e5410155b15156111c857600080fd5b600254600e54101515156111db57600080fd5b6003601160006101000a81548160ff021916908360038111156111fa57fe5b0217905550601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a69df4b56000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561128d57600080fd5b6102c65a03f1151561129e57600080fd5b5050506040518051905015156112b357600080fd5b601054601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318160ddd6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561134457600080fd5b6102c65a03f1151561135557600080fd5b50505060405180519050019350600092505b6017805490508310156113c35760178381548110151561138357fe5b906000526020600020906002020191506113b6600954836000015486028115156113a957fe5b0483600101544201612fe5565b8280600101935050611367565b6113e9600f543073ffffffffffffffffffffffffffffffffffffffff1631036000612ac9565b50505050565b600c5481565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145357600080fd5b600080600381111561146157fe5b601160009054906101000a900460ff16600381111561147c57fe5b14151561148857600080fd5b8760018190555085600081518110151561149e57fe5b90602001906020020151600b5401600c81905550600b54600d81905550600092505b86518310156115bc5785838151811015156114d757fe5b90602001906020020151600d600082825401925050819055506018805480600101828161150491906132a3565b916000526020600020906004020160006080604051908101604052808b8881518110151561152e57fe5b906020019060200201518152602001600d54815260200160008152602001888881518110151561155a57fe5b906020019060200201511515815250909190915060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690831515021790555050505082806001019350506114c0565b600091505b865182101561163857600085838151811015156115da57fe5b90602001906020020151111561162b5784828151811015156115f857fe5b90602001906020020151600d540160188381548110151561161557fe5b9060005260206000209060040201600201819055505b81806001019250506115c1565b5050505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000670de0b6b3a7640000600a548385020281151561168357fe5b04905092915050565b600d5481565b6000600d54421115156116a457600080fd5b60028060038111156116b257fe5b601160009054906101000a900460ff1660038111156116cd57fe5b1415156116d957600080fd5b600254600e541015156116eb57600080fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000821180156117b457503373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050155b156117fe5781601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050565b60035481565b6000806000809150600090505b601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081101561191b57601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811015156118ec57fe5b906000526020600020900154815260200190815260200160002060010154820191508080600101915050611815565b8192505050919050565b6000806000809150600090505b601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015611a3857601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515611a0957fe5b906000526020600020900154815260200190815260200160002060000154820191508080600101915050611932565b8192505050919050565b60008060008060009350600092505b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050831015611b7157601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515611ae757fe5b90600052602060002090015491504282111515611b6457601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000209050806000015484019350600081600001819055505b8280600101935050611a51565b6000841115611bcb5783600f600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f193505050501515611bca57600080fd5b5b50505050565b60075481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3257600080fd5b6000806003811115611c4057fe5b601160009054906101000a900460ff166003811115611c5b57fe5b141515611c6757600080fd5b6000601880549050111515611c7b57600080fd5b6000601680549050111515611c8f57600080fd5b6001601160006101000a81548160ff02191690836003811115611cae57fe5b021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611d1257600080fd5b6303c2670080600d540142111515611d2957600080fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b60008060008060009350600092505b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050831015611e9357601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515611e0957fe5b90600052602060002090015491504282111515611e8657601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000209050806001015484019350600081600101819055505b8280600101935050611d73565b6000841115611fa05783601060008282540392505081905550601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663867904b433866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611f7957600080fd5b6102c65a03f11515611f8a57600080fd5b505050604051805190501515611f9f57600080fd5b5b50505050565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561200457600080fd5b600080600381111561201257fe5b601160009054906101000a900460ff16600381111561202d57fe5b14151561203957600080fd5b89600081518110151561204857fe5b90602001906020020151600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600092505b895183101561224e57601680548060010182816120b491906132d5565b916000526020600020900160008c868151811015156120cf57fe5b90602001906020020151909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060a0604051908101604052808a8581518110151561213457fe5b906020019060200201518152602001898581518110151561215157fe5b906020019060200201518152602001888581518110151561216e57fe5b9060200190602002015115158152602001878581518110151561218d57fe5b90602001906020020151815260200184815250601560008c868151811015156121b257fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555060608201518160030155608082015181600401559050508280600101935050612097565b600091505b84518210156122ec57601780548060010182816122709190613301565b916000526020600020906002020160006040805190810160405280898781518110151561229957fe5b90602001906020020151815260200188878151811015156122b657fe5b90602001906020020151815250909190915060008201518160000155602082015181600101555050508180600101925050612253565b50505050505050505050565b6000600d544211801561230e5750600254600e54105b61231957600061235a565b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b9050919050565b6000803373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156123c057600080fd5b829150601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166396a04925846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b151561247f57600080fd5b6102c65a03f1151561249057600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff166370a08231306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561253657600080fd5b6102c65a03f1151561254757600080fd5b5050506040518051905090506000811115612646578173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561262957600080fd5b6102c65a03f1151561263a57600080fd5b50505060405180519050505b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156126a857600080fd5b60008060038111156126b657fe5b601160009054906101000a900460ff1660038111156126d157fe5b1415156126dd57600080fd5b60006018805490501115156126f157600080fd5b82601a9080519060200190612707929190613333565b50600091505b601a805490508210156127ae576040805190810160405280868481518110151561273357fe5b906020019060200201518152602001858481518110151561275057fe5b9060200190602002015181525060196000601a8581548110151561277057fe5b90600052602060002090015481526020019081526020016000206000820151816000015560208201518160010155905050818060010192505061270d565b5050505050565b60025481565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561281757600080fd5b600180600381111561282557fe5b601160009054906101000a900460ff16600381111561284057fe5b14151561284c57600080fd5b6002601160006101000a81548160ff0219169083600381111561286b57fe5b021790555050565b600080600090505b6018805490508110156128c65760188181548110151561289757fe5b906000526020600020906004020160010154421115156128b9578091506128cf565b808060010191505061287b565b60188054905091505b5090565b600f5481565b60065481565b600080601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490501180156129db5750601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600201548154811015156129cc57fe5b90600052602060002090015482145b905092915050565b600b5481565b601160009054906101000a900460ff1681565b612a063334610bf5565b565b6000600e54905090565b600e5481565b60045481565b600060026003811115612a2d57fe5b601160009054906101000a900460ff166003811115612a4857fe5b148015612a575750600b544210155b8015612a655750600c544211155b905090565b601160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600080600091505b601680549050821015612bcc5760156000601684815481101515612af157fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001541115612bbf57612bbe601683815481101515612b7857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660095483600001548702811515612bb757fe5b048561310f565b5b8180600101925050612ad1565b50505050565b612bda61328f565b612be261328f565b6000806000612bef61328f565b612bf761328f565b600080600080600060188e815481101515612c0e57fe5b906000526020600020906004020199508c9850600097506001604051805910612c345750595b908082528060200260200182016040525096506001604051805910612c565750595b908082528060200260200182016040525095508960030160009054906101000a900460ff168015612c8c57506000601a80549050115b8015612cb35750601a6000815481101515612ca357fe5b9060005260206000209001548d10155b15612e0e57600d548a60020154039450601a8054905093505b6000841115612e0d57601a60018503815481101515612ce757fe5b9060005260206000209001548d101515612dff57871515612d4f5760018401604051805910612d135750595b9080825280602002602001820160405250965060018401604051805910612d375750595b90808252806020026020018201604052509550600197505b60196000601a60018703815481101515612d6557fe5b9060005260206000209001548152602001908152602001600020925060095483600101548602811515612d9457fe5b048a60020154019150601a60018503815481101515612daf57fe5b90600052602060002090015489039050808785815181101515612dce57fe5b9060200190602002018181525050818685815181101515612deb57fe5b906020019060200201818152505080890398505b838060019003945050612ccc565b5b88876000815181101515612e1e57fe5b90602001906020020181815250508960020154866000815181101515612e4057fe5b906020019060200201818152505086869b509b50505050505050505050509250929050565b612e6f83826128df565b15612eda5781601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010160008282540192505081905550612fd0565b606060405190810160405280600081526020018381526020016001601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281612f469190613380565b916000526020600020900160008690919091505503815250601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050505b81601060008282540192505081905550505050565b600080600091505b601680549050821015613109576015600060168481548110151561300d57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816001015411156130fc576130fb60168381548110151561309457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600954836001015487028115156130d357fe5b048360020160009054906101000a900460ff166130f057856130f6565b83600301545b612e65565b5b8180600101925050612fed565b50505050565b61311983826128df565b156131845781601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000016000828254019250508190555061327a565b606060405190810160405280838152602001600081526020016001601460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816131f09190613380565b916000526020600020900160008690919091505503815250601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050505b81600f60008282540192505081905550505050565b602060405190810160405280600081525090565b8154818355818115116132d0576004028160040283600052602060002091820191016132cf91906133ac565b5b505050565b8154818355818115116132fc578183600052602060002091820191016132fb91906133f7565b5b505050565b81548183558181151161332e5760020281600202836000526020600020918201910161332d919061341c565b5b505050565b82805482825590600052602060002090810192821561336f579160200282015b8281111561336e578251825591602001919060010190613353565b5b50905061337c91906133f7565b5090565b8154818355818115116133a7578183600052602060002091820191016133a691906133f7565b5b505050565b6133f491905b808211156133f057600080820160009055600182016000905560028201600090556003820160006101000a81549060ff0219169055506004016133b2565b5090565b90565b61341991905b808211156134155760008160009055506001016133fd565b5090565b90565b61344891905b8082111561344457600080820160009055600182016000905550600201613422565b5090565b905600a165627a7a72305820d08e4877d9c602988bd71cb51eaba0a42074b408e48bb6a1465a7ad1eaea8f3f0029000000000000000000000000000000000000000000000000000000005a818fd0000000000000000000000000d871242910d43a697bcc9f57947777757b7469aa0000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000b4aeaab10258f400000000000000000000000000000000000000000000000004b4a8335ecc4a780000000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000003c3a38e5ab72fc00000000000000000000000000000000000000000000000003ffeba7f7164a200000000000000000000000000000000000000000000000000000016345785d8a0000

    Constructor Arguments (ABI-encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000005a818fd0000000000000000000000000d871242910d43a697bcc9f57947777757b7469aa0000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000b4aeaab10258f400000000000000000000000000000000000000000000000004b4a8335ecc4a780000000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000003c3a38e5ab72fc00000000000000000000000000000000000000000000000003ffeba7f7164a200000000000000000000000000000000000000000000000000000016345785d8a0000

-----Decoded View---------------
Found 10 constructor arguments :
Arg [0] : 000000000000000000000000000000000000000000000000000000005a818fd0
Arg [1] : 000000000000000000000000d871242910d43a697bcc9f57947777757b7469aa
Arg [2] : 0000000000000000000000000000000000000000000000000000000005f5e100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [4] : 0000000000000000000000000000000000000000000000b4aeaab10258f40000
Arg [5] : 0000000000000000000000000000000000000000000004b4a8335ecc4a780000
Arg [6] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [7] : 00000000000000000000000000000000000000000000003c3a38e5ab72fc0000
Arg [8] : 0000000000000000000000000000000000000000000003ffeba7f7164a200000
Arg [9] : 000000000000000000000000000000000000000000000000016345785d8a0000


   Swarm Source:
bzzr://d08e4877d9c602988bd71cb51eaba0a42074b408e48bb6a1465a7ad1eaea8f3f

 

View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.