Contract Overview | Envion
Balance: 2,441.670957359648584628 Ether
Ether Value: $493,022.20 (@ $201.92/ETH)
Transactions: 104049 txns
Token Tracker: Envion (EVN)
Misc:
Address Watch: Add To Watch List
Contract Creator: 0xc068ead86c8f732753d6959a5a4b58b354280480at txn 0x8f25b982c38ac299d5f9edfeefb722df7bbe4dbaf35490b54492c1472431aee0
Token Balance:
 Latest 25 transactions from a total of 104049 transactions
(+2 PendingTxns)

TxHash Age From To Value [TxFee]
0x4a494a80674fb4d2c4c185be6334249c9c925e3b0f18ce8651889b2ebc767efd(pending)0xf95a0a37079fa824806ceb3b49eb177ecb203d53  IN  0xd780ae2bf04cd96e577d3d014762f831d97129d00 Ether(Pending)
0xa085b4a370895550aa289049b388a1f7990970c83f3406c6e1d662664c7afafb(pending)0xbdde149d26fe2abea12be4a4fbb64fd884ed4a03  IN  0xd780ae2bf04cd96e577d3d014762f831d97129d00 Ether(Pending)
0x53e18cc0d8a4e4f7bb43cf758c161a74a6e0be760903e54dcf234fcaa1be4ac3 50 secs ago0xc8247832897730fae73c3fdf90ebc8d473f34f3e  IN   Envion0 Ether0.000137415
0x6b38fd1853f5f14bd856e8a0ea14de88cdd0220b0692d303b9b01c77111c272a5 mins agoHitBTC_2  IN   Envion0 Ether0.00082236
0x35fc76709507cbc31f8219ad7e125e7affe015fff64994d788584202561651ae4 hrs 25 mins ago0xcde4fa727a436658dec434262a75dbca15fe7704  IN   Envion0 Ether0.00064127
0x3fec06b317cf0668a22196d748ad02c165b4a9c7a904efbea39553d60f3181b26 hrs 14 mins ago0xc056b715d2c86687d4d3cea3e5bce8b0cdfd96d4  IN   Envion0 Ether0.000137223
0xc26d4723e3ab7489c450c2663ff3ece03deca8e44e32e575e8618944ee440ff46 hrs 17 mins ago0x206877abb37a68234b7f207debd4e12595723fdf  IN   Envion0 Ether0.00159296
0xbc7688f53b6b049b46be32b4301054638c4d3e7dabebff3dd0b5d2847fe2aa9310 hrs 26 mins ago0x31498f8c2669306d04c103e26de907b3abab3135  IN   Envion0 Ether0.000405632
0xdc75911436f418c6a1aa78e7ec910dec2ae3b1ffc2ddcc555e293d93e9d05c2710 hrs 34 mins ago0x31498f8c2669306d04c103e26de907b3abab3135  IN   Envion0 Ether0.000182708
0xbc721270bba02f19bfd05150d232908125be15079a2f03bc1433b93aafbaf20410 hrs 38 mins ago0x206877abb37a68234b7f207debd4e12595723fdf  IN   Envion0 Ether0.00219296
0x7aea6746079b164c0bdd3012298ec35cab9cea0fe6476d7dfc86f18b940cffc911 hrs 52 mins ago0xc056b715d2c86687d4d3cea3e5bce8b0cdfd96d4  IN   Envion0 Ether0.0001189266
0x079095baef5a8c5fa7da68c754276cb3f63aa387c15b6543218c3a31e54c44c011 hrs 53 mins ago0x206877abb37a68234b7f207debd4e12595723fdf  IN   Envion0 Ether0.00159296
0x91b9e8365396ed41040c949dd259751d0d50db7edd7c25ab2dbd46bdb3aae00013 hrs 6 mins ago0xaf1fac431c10442872ccaf108cf4532215cfd96c  IN   Envion0 Ether0.0002325162
0x8e848f4c4e4703422fb385015c1cfcf7560d4a548e26fd137e102f00cdb67de716 hrs 51 mins ago0xc056b715d2c86687d4d3cea3e5bce8b0cdfd96d4  IN   Envion0 Ether0.000109932
0x888c04b2d8eb4e150b9e721c21eca778fc675d91039f1e61da773a07ad563fbd16 hrs 53 mins ago0x206877abb37a68234b7f207debd4e12595723fdf  IN   Envion0 Ether0.0015904
0x25189bc4491699f6c3798b12c32c41e4dbbe4f58a0e964d48efe4ec835087ff217 hrs 29 mins ago0xc44c2c4074f65247da2be4f2f5ab321bb884ba8c  IN   Envion0 Ether0.0001006302
0x09983da95cc063439d448ce6af1589de5da7a386275964afb6913093fe25ed0421 hrs 24 mins ago0x46e4e478becfcf55f570b2ca2e142abfb80acb9d  IN   Envion0 Ether0.0004952
0xf1e72f952653e743b84cbbf3064037033553bfb559af5a546d1b4c4206ad13f421 hrs 25 mins ago0x5eb5b00e3a0101c7035bed3fc421dd6acc7fb29e  IN   Envion0 Ether0.00012412
0x4b7ee0ddb0e42b048cf71bd86ea097f639b15602014172b08de9836d05af59121 day 26 mins ago0x206877abb37a68234b7f207debd4e12595723fdf  IN   Envion0 Ether0.0015904
0x6f43d22f808a9b4d107b7d93d7a9cf915924da57cad07802ccd562912f29e4c01 day 3 hrs ago0x423aede74b3c169bb31a02ff04e1f58350430cf0  IN   Envion0 Ether0.001006302
0xe7aef0565abf930369c141547ce8a396f334e80facd7dba6de6b42199248b82d1 day 3 hrs ago0x423aede74b3c169bb31a02ff04e1f58350430cf0  IN   Envion0 Ether0.00101475
0x4e83e0be0c47a38cdc42ff99547d4921ee037f5fe931adee2ab5b7fd2133371d1 day 3 hrs ago0x76f301e00ed42d50069eae55a16a83d0f2a88536  IN   Envion0 Ether0.003532478
0xd83ae83ed340301818678575d51aaa9020f69dd96de5c211d102f9b47d0e4f461 day 4 hrs ago0x76c10cdfc9d2ce94a2a3b5a543626e6abb089508  IN   Envion0 Ether0.0001419955
0x8c522213c302fbb64446bab07f33bd40dd1c57ebe0f990906e91686f8be8329c1 day 4 hrs ago0x206877abb37a68234b7f207debd4e12595723fdf  IN   Envion0 Ether0.00159296
0x422626441f0e93507b135b018f5664cd4fb79a614ce04f44009a509d8a13ea911 day 5 hrs ago0x2b00cc80a39005e16552b2660e0884d94e06a322  IN   Envion0 Ether0.00045741
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here To View More View All
ParentTxHash Block Age From To Value
0x25862dd650edc526af190841e27ff244e49691b65ff1163679ff42505f9544d3614075992 days 20 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x29a4819d653c66045793e7a30c1b42613a9d9a4f742 Ether
0x6182cfd6ac2a3cc2865b642a5edac577a9cbc626fd786be12083413b4e4a5fd1614071592 days 20 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x29a4819d653c66045793e7a30c1b42613a9d9a4f8,000 Ether
0x9f6125e2d3a3fd470ad723b68c8df1022a89bf75971ff8c312ed22ca82dccff1614069292 days 20 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x29a4819d653c66045793e7a30c1b42613a9d9a4f1,000 Ether
0xb9c1a62503bfe0023e388cff78564b74fe61ce275ce7705c3f04ca35eea26d26614059492 days 20 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x29a4819d653c66045793e7a30c1b42613a9d9a4f100 Ether
0x2674bddfe13b6fb9f998fadd069cfcdf79ed4f4bcca168318f7461e7a206d798614041292 days 21 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00xf91d6c994333e07b29d103f0cf0f93d86c5243bc1 Ether
0x6b96780434bc27455eec7377192395da0e2ee841f5adf35bca078c13d77824875258963244 days 1 hr ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x5360b7a71db9aa771ffb99ff2640429a9ad52000189.99 Ether
0xd31fe47e51ba1e70bfac6a95dd49685aef8d2b909a5cabcc6258b2c0512d4af95060430277 days 17 hrs ago0x1522900b6dafac587d499a862861c0869be6e4280xd780ae2bf04cd96e577d3d014762f831d97129d00.225 Ether
0xf105a568d9e851afeaf4cffda3f22811a39a52a7cd94aa235331c00cece491585005536286 days 23 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x8bac85953664753a58d3c34287cdf096caa3fbbf34,260.693974360090757049 Ether
0x0af2f3b77ededc5319868c83cad8b68a74184f7a34d9d27672c75475e45113d34928573300 days 1 hr ago0x1522900b6dafac587d499a862861c0869be6e4280xd780ae2bf04cd96e577d3d014762f831d97129d02.3 Ether
0x7bcb3a6e4a5b008ec40ff0a65f529366848349ae9024ba890cf4043d366e95da4914451302 days 14 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xb5a4f2a2c68c230e36bc859b1e0cac0639191ee672cf9805554281d5dbbd7c9d4913591302 days 18 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x1a93d7270095dead3f66d1995cad5380d3af4b88acfee77a7f5f557416bdd24a4910727303 days 7 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x96d67dbb8c45e7204b07bfa83b5e25b97dcf2912cdc72559c6971543fcc464634910486303 days 8 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xed626b61065d0aab13e6ceea030a4eb359d0e974df7d48eaaacd08d5084f17644910238303 days 9 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x8e3ecc28a460e943804c430fefe550e2312ecc32d54f1a3e3b7ad6fd138abb124909994303 days 10 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xb61db4de9af1f48e8fa2a993513bce4a521ddd5e7e2a775a115bb27b97326e0b4909771303 days 11 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xe57392af4782ae67c3407e18fb5448bf1b34b0e4a8fccffcd4bc5c90212aa8b04909556303 days 12 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xc3f82f7db54880c848a6c2ba2c42125bcfc8a2cb3a6530252be3c7929db885bd4907196303 days 22 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xcdde8d26c4e03f9393c73d9ba098bba6d19c9fae01e6d28e685946f98f0305bf4906946303 days 23 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x9b81987f321cc7b76c4aacc521f67036a8e22ea24f1253eda0eb986b4eff53444906721304 days 41 mins ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x2607f6e94d4e54e26c15a8dc6bbc427369999423416f4cbe67a61c1cba42def04906494304 days 1 hr ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xd980fc1aca7d4e9f9c43c4e7452ac424d34f57bd1fa6527debdc5b605bcdff864906200304 days 2 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x92a2c6f83d575fd2ba5b720f8d0670f00049ae72794227d6d80ce1103b842c5c4905948304 days 3 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x2af016925a6eeff3dcecda657a71ad4e0df6c371fb55e1da886516600d9243234905697304 days 4 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x5ed944aafb01f26dfa95efc76eefbb4a8514d47e45a51e3bb00a0775c16910fe4905466304 days 5 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), NestedArrayFunctionCallDecoder (medium-severity), ZeroFunctionSelector (very low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: EVNToken
Compiler Text: v0.4.15+commit.bbb8e64f
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.15;

/**
 * @title Safe math operations that throw error on overflow.
 *
 * Credit: Taking ideas from FirstBlood token
 */
library SafeMath {

    /** 
     * @dev Safely add two numbers.
     *
     * @param x First operant.
     * @param y Second operant.
     * @return The result of x+y.
     */
    function add(uint256 x, uint256 y)
    internal constant
    returns(uint256) {
        uint256 z = x + y;
        assert((z >= x) && (z >= y));
        return z;
    }

    /** 
     * @dev Safely substract two numbers.
     *
     * @param x First operant.
     * @param y Second operant.
     * @return The result of x-y.
     */
    function sub(uint256 x, uint256 y)
    internal constant
    returns(uint256) {
        assert(x >= y);
        uint256 z = x - y;
        return z;
    }

    /** 
     * @dev Safely multiply two numbers.
     *
     * @param x First operant.
     * @param y Second operant.
     * @return The result of x*y.
     */
    function mul(uint256 x, uint256 y)
    internal constant
    returns(uint256) {
        uint256 z = x * y;
        assert((x == 0) || (z/x == y));
        return z;
    }

    /**
    * @dev Parse a floating point number from String to uint, e.g. "250.56" to "25056"
     */
    function parse(string s) 
    internal constant 
    returns (uint256) 
    {
    bytes memory b = bytes(s);
    uint result = 0;
    for (uint i = 0; i < b.length; i++) {
        if (b[i] >= 48 && b[i] <= 57) {
            result = result * 10 + (uint(b[i]) - 48); 
        }
    }
    return result; 
}
}

/**
 * @title The abstract ERC-20 Token Standard definition.
 *
 * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
 */
contract Token {
    /// @dev Returns the total token supply.
    uint256 public totalSupply;

    function balanceOf(address _owner) public constant returns (uint256 balance);
    function transfer(address _to, uint256 _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
    function approve(address _spender, uint256 _value) public returns (bool success);
    function allowance(address _owner, address _spender) public constant returns (uint256 remaining);

    /// @dev MUST trigger when tokens are transferred, including zero value transfers.
    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    /// @dev MUST trigger on any successful call to approve(address _spender, uint256 _value).
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

/**
 * @title Default implementation of the ERC-20 Token Standard.
 */
contract StandardToken is Token {

    mapping (address => uint256) balances;
    mapping (address => mapping (address => uint256)) allowed;

    modifier onlyPayloadSize(uint numwords) {
        assert(msg.data.length == numwords * 32 + 4);
        _;
    }

    /**
     * @dev Transfers _value amount of tokens to address _to, and MUST fire the Transfer event. 
     * @dev The function SHOULD throw if the _from account balance does not have enough tokens to spend.
     *
     * @dev A token contract which creates new tokens SHOULD trigger a Transfer event with the _from address set to 0x0 when tokens are created.
     *
     * Note Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event.
     *
     * @param _to The receiver of the tokens.
     * @param _value The amount of tokens to send.
     * @return True on success, false otherwise.
     */
    function transfer(address _to, uint256 _value)
    public
    returns (bool success) {
        if (balances[msg.sender] >= _value && _value > 0 && balances[_to] + _value > balances[_to]) {
            balances[msg.sender] = SafeMath.sub(balances[msg.sender], _value);
            balances[_to] = SafeMath.add(balances[_to], _value);
            Transfer(msg.sender, _to, _value);
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Transfers _value amount of tokens from address _from to address _to, and MUST fire the Transfer event.
     *
     * @dev The transferFrom method is used for a withdraw workflow, allowing contracts to transfer tokens on your behalf. 
     * @dev This can be used for example to allow a contract to transfer tokens on your behalf and/or to charge fees in 
     * @dev sub-currencies. The function SHOULD throw unless the _from account has deliberately authorized the sender of 
     * @dev the message via some mechanism.
     *
     * Note Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event.
     *
     * @param _from The sender of the tokens.
     * @param _to The receiver of the tokens.
     * @param _value The amount of tokens to send.
     * @return True on success, false otherwise.
     */
    function transferFrom(address _from, address _to, uint256 _value)
    public
    returns (bool success) {
        if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0 && balances[_to] + _value > balances[_to]) {
            balances[_to] = SafeMath.add(balances[_to], _value);
            balances[_from] = SafeMath.sub(balances[_from], _value);
            allowed[_from][msg.sender] = SafeMath.sub(allowed[_from][msg.sender], _value);
            Transfer(_from, _to, _value);
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns the account balance of another account with address _owner.
     *
     * @param _owner The address of the account to check.
     * @return The account balance.
     */
    function balanceOf(address _owner)
    public constant
    returns (uint256 balance) {
        return balances[_owner];
    }

    /**
     * @dev Allows _spender to withdraw from your account multiple times, up to the _value amount. 
     * @dev If this function is called again it overwrites the current allowance with _value.
     *
     * @dev NOTE: To prevent attack vectors like the one described in [1] and discussed in [2], clients 
     * @dev SHOULD make sure to create user interfaces in such a way that they set the allowance first 
     * @dev to 0 before setting it to another value for the same spender. THOUGH The contract itself 
     * @dev shouldn't enforce it, to allow backwards compatilibilty with contracts deployed before.
     * @dev [1] https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/
     * @dev [2] 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.
     * @return True on success, false otherwise.
     */
    function approve(address _spender, uint256 _value)
    public
    onlyPayloadSize(2)
    returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }

    /**
     * @dev Returns the amount which _spender is still allowed to withdraw from _owner.
     *
     * @param _owner The address of the sender.
     * @param _spender The address of the receiver.
     * @return The allowed withdrawal amount.
     */
    function allowance(address _owner, address _spender)
    public constant
    onlyPayloadSize(2)
    returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }
}


// <ORACLIZE_API>
/*
Copyright (c) 2015-2016 Oraclize SRL
Copyright (c) 2016 Oraclize LTD



Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:



The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.



THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/

contract OraclizeI {
    address public cbAddress;
    function query(uint _timestamp, string _datasource, string _arg) payable returns (bytes32 _id);
    function query_withGasLimit(uint _timestamp, string _datasource, string _arg, uint _gaslimit) payable returns (bytes32 _id);
    function query2(uint _timestamp, string _datasource, string _arg1, string _arg2) payable returns (bytes32 _id);
    function query2_withGasLimit(uint _timestamp, string _datasource, string _arg1, string _arg2, uint _gaslimit) payable returns (bytes32 _id);
    function queryN(uint _timestamp, string _datasource, bytes _argN) payable returns (bytes32 _id);
    function queryN_withGasLimit(uint _timestamp, string _datasource, bytes _argN, uint _gaslimit) payable returns (bytes32 _id);
    function getPrice(string _datasource) returns (uint _dsprice);
    function getPrice(string _datasource, uint gaslimit) returns (uint _dsprice);
    function useCoupon(string _coupon);
    function setProofType(byte _proofType);
    function setConfig(bytes32 _config);
    function setCustomGasPrice(uint _gasPrice);
    function randomDS_getSessionPubKeyHash() returns(bytes32);
}
contract OraclizeAddrResolverI {
    function getAddress() returns (address _addr);
}
contract usingOraclize {
    uint constant day = 60*60*24;
    uint constant week = 60*60*24*7;
    uint constant month = 60*60*24*30;
    byte constant proofType_NONE = 0x00;
    byte constant proofType_TLSNotary = 0x10;
    byte constant proofType_Android = 0x20;
    byte constant proofType_Ledger = 0x30;
    byte constant proofType_Native = 0xF0;
    byte constant proofStorage_IPFS = 0x01;
    uint8 constant networkID_auto = 0;
    uint8 constant networkID_mainnet = 1;
    uint8 constant networkID_testnet = 2;
    uint8 constant networkID_morden = 2;
    uint8 constant networkID_consensys = 161;

    OraclizeAddrResolverI OAR;

    OraclizeI oraclize;
    modifier oraclizeAPI {
        if((address(OAR)==0)||(getCodeSize(address(OAR))==0)) oraclize_setNetwork(networkID_auto);
        oraclize = OraclizeI(OAR.getAddress());
        _;
    }
    modifier coupon(string code){
        oraclize = OraclizeI(OAR.getAddress());
        oraclize.useCoupon(code);
        _;
    }

    function oraclize_setNetwork(uint8 networkID) internal returns(bool){
        if (getCodeSize(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed)>0){ //mainnet
            OAR = OraclizeAddrResolverI(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed);
            oraclize_setNetworkName("eth_mainnet");
            return true;
        }
        if (getCodeSize(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1)>0){ //ropsten testnet
            OAR = OraclizeAddrResolverI(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1);
            oraclize_setNetworkName("eth_ropsten3");
            return true;
        }
        if (getCodeSize(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e)>0){ //kovan testnet
            OAR = OraclizeAddrResolverI(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e);
            oraclize_setNetworkName("eth_kovan");
            return true;
        }
        if (getCodeSize(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48)>0){ //rinkeby testnet
            OAR = OraclizeAddrResolverI(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48);
            oraclize_setNetworkName("eth_rinkeby");
            return true;
        }
        if (getCodeSize(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475)>0){ //ethereum-bridge
            OAR = OraclizeAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475);
            return true;
        }
        if (getCodeSize(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF)>0){ //ether.camp ide
            OAR = OraclizeAddrResolverI(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF);
            return true;
        }
        if (getCodeSize(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA)>0){ //browser-solidity
            OAR = OraclizeAddrResolverI(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA);
            return true;
        }
        return false;
    }

    function __callback(bytes32 myid, string result) {
        __callback(myid, result, new bytes(0));
    }
    function __callback(bytes32 myid, string result, bytes proof) {
    }
    
    function oraclize_useCoupon(string code) oraclizeAPI internal {
        oraclize.useCoupon(code);
    }

    function oraclize_getPrice(string datasource) oraclizeAPI internal returns (uint){
        return oraclize.getPrice(datasource);
    }

    function oraclize_getPrice(string datasource, uint gaslimit) oraclizeAPI internal returns (uint){
        return oraclize.getPrice(datasource, gaslimit);
    }
    
    function oraclize_query(string datasource, string arg) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query.value(price)(0, datasource, arg);
    }
    function oraclize_query(uint timestamp, string datasource, string arg) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query.value(price)(timestamp, datasource, arg);
    }
    function oraclize_query(uint timestamp, string datasource, string arg, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query_withGasLimit.value(price)(timestamp, datasource, arg, gaslimit);
    }
    function oraclize_query(string datasource, string arg, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query_withGasLimit.value(price)(0, datasource, arg, gaslimit);
    }
    function oraclize_query(string datasource, string arg1, string arg2) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query2.value(price)(0, datasource, arg1, arg2);
    }
    function oraclize_query(uint timestamp, string datasource, string arg1, string arg2) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query2.value(price)(timestamp, datasource, arg1, arg2);
    }
    function oraclize_query(uint timestamp, string datasource, string arg1, string arg2, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query2_withGasLimit.value(price)(timestamp, datasource, arg1, arg2, gaslimit);
    }
    function oraclize_query(string datasource, string arg1, string arg2, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query2_withGasLimit.value(price)(0, datasource, arg1, arg2, gaslimit);
    }
    function oraclize_query(string datasource, string[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN.value(price)(0, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, string[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN.value(price)(timestamp, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, string[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(timestamp, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, string[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(0, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, string[1] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[1] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];       
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, string[2] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[2] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[3] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[3] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, string[4] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[4] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[5] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[5] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN.value(price)(0, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN.value(price)(timestamp, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(timestamp, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, bytes[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(0, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, bytes[1] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[1] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];       
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, bytes[2] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[2] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[3] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[3] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, bytes[4] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[4] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[5] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[5] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs, gaslimit);
    }

    function oraclize_cbAddress() oraclizeAPI internal returns (address){
        return oraclize.cbAddress();
    }
    function oraclize_setProof(byte proofP) oraclizeAPI internal {
        return oraclize.setProofType(proofP);
    }
    function oraclize_setCustomGasPrice(uint gasPrice) oraclizeAPI internal {
        return oraclize.setCustomGasPrice(gasPrice);
    }
    function oraclize_setConfig(bytes32 config) oraclizeAPI internal {
        return oraclize.setConfig(config);
    }
    
    function oraclize_randomDS_getSessionPubKeyHash() oraclizeAPI internal returns (bytes32){
        return oraclize.randomDS_getSessionPubKeyHash();
    }

    function getCodeSize(address _addr) constant internal returns(uint _size) {
        assembly {
            _size := extcodesize(_addr)
        }
    }

    function parseAddr(string _a) internal returns (address){
        bytes memory tmp = bytes(_a);
        uint160 iaddr = 0;
        uint160 b1;
        uint160 b2;
        for (uint i=2; i<2+2*20; i+=2){
            iaddr *= 256;
            b1 = uint160(tmp[i]);
            b2 = uint160(tmp[i+1]);
            if ((b1 >= 97)&&(b1 <= 102)) b1 -= 87;
            else if ((b1 >= 65)&&(b1 <= 70)) b1 -= 55;
            else if ((b1 >= 48)&&(b1 <= 57)) b1 -= 48;
            if ((b2 >= 97)&&(b2 <= 102)) b2 -= 87;
            else if ((b2 >= 65)&&(b2 <= 70)) b2 -= 55;
            else if ((b2 >= 48)&&(b2 <= 57)) b2 -= 48;
            iaddr += (b1*16+b2);
        }
        return address(iaddr);
    }

    function strCompare(string _a, string _b) internal returns (int) {
        bytes memory a = bytes(_a);
        bytes memory b = bytes(_b);
        uint minLength = a.length;
        if (b.length < minLength) minLength = b.length;
        for (uint i = 0; i < minLength; i ++)
            if (a[i] < b[i])
                return -1;
            else if (a[i] > b[i])
                return 1;
        if (a.length < b.length)
            return -1;
        else if (a.length > b.length)
            return 1;
        else
            return 0;
    }

    function indexOf(string _haystack, string _needle) internal returns (int) {
        bytes memory h = bytes(_haystack);
        bytes memory n = bytes(_needle);
        if(h.length < 1 || n.length < 1 || (n.length > h.length))
            return -1;
        else if(h.length > (2**128 -1))
            return -1;
        else
        {
            uint subindex = 0;
            for (uint i = 0; i < h.length; i ++)
            {
                if (h[i] == n[0])
                {
                    subindex = 1;
                    while(subindex < n.length && (i + subindex) < h.length && h[i + subindex] == n[subindex])
                    {
                        subindex++;
                    }
                    if(subindex == n.length)
                        return int(i);
                }
            }
            return -1;
        }
    }

    function strConcat(string _a, string _b, string _c, string _d, string _e) internal returns (string) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory _bd = bytes(_d);
        bytes memory _be = bytes(_e);
        string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
        bytes memory babcde = bytes(abcde);
        uint k = 0;
        for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
        for (i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
        for (i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
        for (i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
        for (i = 0; i < _be.length; i++) babcde[k++] = _be[i];
        return string(babcde);
    }

    function strConcat(string _a, string _b, string _c, string _d) internal returns (string) {
        return strConcat(_a, _b, _c, _d, "");
    }

    function strConcat(string _a, string _b, string _c) internal returns (string) {
        return strConcat(_a, _b, _c, "", "");
    }

    function strConcat(string _a, string _b) internal returns (string) {
        return strConcat(_a, _b, "", "", "");
    }

    // parseInt
    function parseInt(string _a) internal returns (uint) {
        return parseInt(_a, 0);
    }

    // parseInt(parseFloat*10^_b)
    function parseInt(string _a, uint _b) internal returns (uint) {
        bytes memory bresult = bytes(_a);
        uint mint = 0;
        bool decimals = false;
        for (uint i=0; i<bresult.length; i++){
            if ((bresult[i] >= 48)&&(bresult[i] <= 57)){
                if (decimals){
                   if (_b == 0) break;
                    else _b--;
                }
                mint *= 10;
                mint += uint(bresult[i]) - 48;
            } else if (bresult[i] == 46) decimals = true;
        }
        if (_b > 0) mint *= 10**_b;
        return mint;
    }

    function uint2str(uint i) internal returns (string){
        if (i == 0) return "0";
        uint j = i;
        uint len;
        while (j != 0){
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (i != 0){
            bstr[k--] = byte(48 + i % 10);
            i /= 10;
        }
        return string(bstr);
    }
    
    function stra2cbor(string[] arr) internal returns (bytes) {
            uint arrlen = arr.length;

            // get correct cbor output length
            uint outputlen = 0;
            bytes[] memory elemArray = new bytes[](arrlen);
            for (uint i = 0; i < arrlen; i++) {
                elemArray[i] = (bytes(arr[i]));
                outputlen += elemArray[i].length + (elemArray[i].length - 1)/23 + 3; //+3 accounts for paired identifier types
            }
            uint ctr = 0;
            uint cborlen = arrlen + 0x80;
            outputlen += byte(cborlen).length;
            bytes memory res = new bytes(outputlen);

            while (byte(cborlen).length > ctr) {
                res[ctr] = byte(cborlen)[ctr];
                ctr++;
            }
            for (i = 0; i < arrlen; i++) {
                res[ctr] = 0x5F;
                ctr++;
                for (uint x = 0; x < elemArray[i].length; x++) {
                    // if there's a bug with larger strings, this may be the culprit
                    if (x % 23 == 0) {
                        uint elemcborlen = elemArray[i].length - x >= 24 ? 23 : elemArray[i].length - x;
                        elemcborlen += 0x40;
                        uint lctr = ctr;
                        while (byte(elemcborlen).length > ctr - lctr) {
                            res[ctr] = byte(elemcborlen)[ctr - lctr];
                            ctr++;
                        }
                    }
                    res[ctr] = elemArray[i][x];
                    ctr++;
                }
                res[ctr] = 0xFF;
                ctr++;
            }
            return res;
        }

    function ba2cbor(bytes[] arr) internal returns (bytes) {
            uint arrlen = arr.length;

            // get correct cbor output length
            uint outputlen = 0;
            bytes[] memory elemArray = new bytes[](arrlen);
            for (uint i = 0; i < arrlen; i++) {
                elemArray[i] = (bytes(arr[i]));
                outputlen += elemArray[i].length + (elemArray[i].length - 1)/23 + 3; //+3 accounts for paired identifier types
            }
            uint ctr = 0;
            uint cborlen = arrlen + 0x80;
            outputlen += byte(cborlen).length;
            bytes memory res = new bytes(outputlen);

            while (byte(cborlen).length > ctr) {
                res[ctr] = byte(cborlen)[ctr];
                ctr++;
            }
            for (i = 0; i < arrlen; i++) {
                res[ctr] = 0x5F;
                ctr++;
                for (uint x = 0; x < elemArray[i].length; x++) {
                    // if there's a bug with larger strings, this may be the culprit
                    if (x % 23 == 0) {
                        uint elemcborlen = elemArray[i].length - x >= 24 ? 23 : elemArray[i].length - x;
                        elemcborlen += 0x40;
                        uint lctr = ctr;
                        while (byte(elemcborlen).length > ctr - lctr) {
                            res[ctr] = byte(elemcborlen)[ctr - lctr];
                            ctr++;
                        }
                    }
                    res[ctr] = elemArray[i][x];
                    ctr++;
                }
                res[ctr] = 0xFF;
                ctr++;
            }
            return res;
        }
        
        
    string oraclize_network_name;
    function oraclize_setNetworkName(string _network_name) internal {
        oraclize_network_name = _network_name;
    }
    
    function oraclize_getNetworkName() internal returns (string) {
        return oraclize_network_name;
    }
    
    function oraclize_newRandomDSQuery(uint _delay, uint _nbytes, uint _customGasLimit) internal returns (bytes32){
        if ((_nbytes == 0)||(_nbytes > 32)) throw;
        bytes memory nbytes = new bytes(1);
        nbytes[0] = byte(_nbytes);
        bytes memory unonce = new bytes(32);
        bytes memory sessionKeyHash = new bytes(32);
        bytes32 sessionKeyHash_bytes32 = oraclize_randomDS_getSessionPubKeyHash();
        assembly {
            mstore(unonce, 0x20)
            mstore(add(unonce, 0x20), xor(blockhash(sub(number, 1)), xor(coinbase, timestamp)))
            mstore(sessionKeyHash, 0x20)
            mstore(add(sessionKeyHash, 0x20), sessionKeyHash_bytes32)
        }
        bytes[3] memory args = [unonce, nbytes, sessionKeyHash]; 
        bytes32 queryId = oraclize_query(_delay, "random", args, _customGasLimit);
        oraclize_randomDS_setCommitment(queryId, sha3(bytes8(_delay), args[1], sha256(args[0]), args[2]));
        return queryId;
    }
    
    function oraclize_randomDS_setCommitment(bytes32 queryId, bytes32 commitment) internal {
        oraclize_randomDS_args[queryId] = commitment;
    }
    
    mapping(bytes32=>bytes32) oraclize_randomDS_args;
    mapping(bytes32=>bool) oraclize_randomDS_sessionKeysHashVerified;

    function verifySig(bytes32 tosignh, bytes dersig, bytes pubkey) internal returns (bool){
        bool sigok;
        address signer;
        
        bytes32 sigr;
        bytes32 sigs;
        
        bytes memory sigr_ = new bytes(32);
        uint offset = 4+(uint(dersig[3]) - 0x20);
        sigr_ = copyBytes(dersig, offset, 32, sigr_, 0);
        bytes memory sigs_ = new bytes(32);
        offset += 32 + 2;
        sigs_ = copyBytes(dersig, offset+(uint(dersig[offset-1]) - 0x20), 32, sigs_, 0);

        assembly {
            sigr := mload(add(sigr_, 32))
            sigs := mload(add(sigs_, 32))
        }
        
        
        (sigok, signer) = safer_ecrecover(tosignh, 27, sigr, sigs);
        if (address(sha3(pubkey)) == signer) return true;
        else {
            (sigok, signer) = safer_ecrecover(tosignh, 28, sigr, sigs);
            return (address(sha3(pubkey)) == signer);
        }
    }

    function oraclize_randomDS_proofVerify__sessionKeyValidity(bytes proof, uint sig2offset) internal returns (bool) {
        bool sigok;
        
        // Step 6: verify the attestation signature, APPKEY1 must sign the sessionKey from the correct ledger app (CODEHASH)
        bytes memory sig2 = new bytes(uint(proof[sig2offset+1])+2);
        copyBytes(proof, sig2offset, sig2.length, sig2, 0);
        
        bytes memory appkey1_pubkey = new bytes(64);
        copyBytes(proof, 3+1, 64, appkey1_pubkey, 0);
        
        bytes memory tosign2 = new bytes(1+65+32);
        tosign2[0] = 1; //role
        copyBytes(proof, sig2offset-65, 65, tosign2, 1);
        bytes memory CODEHASH = hex"fd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505c";
        copyBytes(CODEHASH, 0, 32, tosign2, 1+65);
        sigok = verifySig(sha256(tosign2), sig2, appkey1_pubkey);
        
        if (sigok == false) return false;
        
        
        // Step 7: verify the APPKEY1 provenance (must be signed by Ledger)
        bytes memory LEDGERKEY = hex"7fb956469c5c9b89840d55b43537e66a98dd4811ea0a27224272c2e5622911e8537a2f8e86a46baec82864e98dd01e9ccc2f8bc5dfc9cbe5a91a290498dd96e4";
        
        bytes memory tosign3 = new bytes(1+65);
        tosign3[0] = 0xFE;
        copyBytes(proof, 3, 65, tosign3, 1);
        
        bytes memory sig3 = new bytes(uint(proof[3+65+1])+2);
        copyBytes(proof, 3+65, sig3.length, sig3, 0);
        
        sigok = verifySig(sha256(tosign3), sig3, LEDGERKEY);
        
        return sigok;
    }
    
    modifier oraclize_randomDS_proofVerify(bytes32 _queryId, string _result, bytes _proof) {
        // Step 1: the prefix has to match 'LP\x01' (Ledger Proof version 1)
        if ((_proof[0] != "L")||(_proof[1] != "P")||(_proof[2] != 1)) throw;
        
        bool proofVerified = oraclize_randomDS_proofVerify__main(_proof, _queryId, bytes(_result), oraclize_getNetworkName());
        if (proofVerified == false) throw;
        
        _;
    }
    
    function matchBytes32Prefix(bytes32 content, bytes prefix) internal returns (bool){
        bool match_ = true;
        
        for (var i=0; i<prefix.length; i++){
            if (content[i] != prefix[i]) match_ = false;
        }
        
        return match_;
    }

    function oraclize_randomDS_proofVerify__main(bytes proof, bytes32 queryId, bytes result, string context_name) internal returns (bool){
        bool checkok;
        
        
        // Step 2: the unique keyhash has to match with the sha256 of (context name + queryId)
        uint ledgerProofLength = 3+65+(uint(proof[3+65+1])+2)+32;
        bytes memory keyhash = new bytes(32);
        copyBytes(proof, ledgerProofLength, 32, keyhash, 0);
        checkok = (sha3(keyhash) == sha3(sha256(context_name, queryId)));
        if (checkok == false) return false;
        
        bytes memory sig1 = new bytes(uint(proof[ledgerProofLength+(32+8+1+32)+1])+2);
        copyBytes(proof, ledgerProofLength+(32+8+1+32), sig1.length, sig1, 0);
        
        
        // Step 3: we assume sig1 is valid (it will be verified during step 5) and we verify if 'result' is the prefix of sha256(sig1)
        checkok = matchBytes32Prefix(sha256(sig1), result);
        if (checkok == false) return false;
        
        
        // Step 4: commitment match verification, sha3(delay, nbytes, unonce, sessionKeyHash) == commitment in storage.
        // This is to verify that the computed args match with the ones specified in the query.
        bytes memory commitmentSlice1 = new bytes(8+1+32);
        copyBytes(proof, ledgerProofLength+32, 8+1+32, commitmentSlice1, 0);
        
        bytes memory sessionPubkey = new bytes(64);
        uint sig2offset = ledgerProofLength+32+(8+1+32)+sig1.length+65;
        copyBytes(proof, sig2offset-64, 64, sessionPubkey, 0);
        
        bytes32 sessionPubkeyHash = sha256(sessionPubkey);
        if (oraclize_randomDS_args[queryId] == sha3(commitmentSlice1, sessionPubkeyHash)){ //unonce, nbytes and sessionKeyHash match
            delete oraclize_randomDS_args[queryId];
        } else return false;
        
        
        // Step 5: validity verification for sig1 (keyhash and args signed with the sessionKey)
        bytes memory tosign1 = new bytes(32+8+1+32);
        copyBytes(proof, ledgerProofLength, 32+8+1+32, tosign1, 0);
        checkok = verifySig(sha256(tosign1), sig1, sessionPubkey);
        if (checkok == false) return false;
        
        // verify if sessionPubkeyHash was verified already, if not.. let's do it!
        if (oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash] == false){
            oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash] = oraclize_randomDS_proofVerify__sessionKeyValidity(proof, sig2offset);
        }
        
        return oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash];
    }

    
    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    function copyBytes(bytes from, uint fromOffset, uint length, bytes to, uint toOffset) internal returns (bytes) {
        uint minLength = length + toOffset;

        if (to.length < minLength) {
            // Buffer too small
            throw; // Should be a better way?
        }

        // NOTE: the offset 32 is added to skip the `size` field of both bytes variables
        uint i = 32 + fromOffset;
        uint j = 32 + toOffset;

        while (i < (32 + fromOffset + length)) {
            assembly {
                let tmp := mload(add(from, i))
                mstore(add(to, j), tmp)
            }
            i += 32;
            j += 32;
        }

        return to;
    }
    
    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    // Duplicate Solidity's ecrecover, but catching the CALL return value
    function safer_ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal returns (bool, address) {
        // We do our own memory management here. Solidity uses memory offset
        // 0x40 to store the current end of memory. We write past it (as
        // writes are memory extensions), but don't update the offset so
        // Solidity will reuse it. The memory used here is only needed for
        // this context.

        // FIXME: inline assembly can't access return values
        bool ret;
        address addr;

        assembly {
            let size := mload(0x40)
            mstore(size, hash)
            mstore(add(size, 32), v)
            mstore(add(size, 64), r)
            mstore(add(size, 96), s)

            // NOTE: we can reuse the request memory because we deal with
            //       the return code
            ret := call(3000, 1, 0, size, 128, size, 32)
            addr := mload(size)
        }
  
        return (ret, addr);
    }

    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    function ecrecovery(bytes32 hash, bytes sig) internal returns (bool, address) {
        bytes32 r;
        bytes32 s;
        uint8 v;

        if (sig.length != 65)
          return (false, 0);

        // The signature format is a compact form of:
        //   {bytes32 r}{bytes32 s}{uint8 v}
        // Compact means, uint8 is not padded to 32 bytes.
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))

            // Here we are loading the last 32 bytes. We exploit the fact that
            // 'mload' will pad with zeroes if we overread.
            // There is no 'mload8' to do this, but that would be nicer.
            v := byte(0, mload(add(sig, 96)))

            // Alternative solution:
            // 'byte' is not working due to the Solidity parser, so lets
            // use the second best option, 'and'
            // v := and(mload(add(sig, 65)), 255)
        }

        // albeit non-transactional signatures are not specified by the YP, one would expect it
        // to match the YP range of [27, 28]
        //
        // geth uses [0, 1] and some clients have followed. This might change, see:
        //  https://github.com/ethereum/go-ethereum/issues/2053
        if (v < 27)
          v += 27;

        if (v != 27 && v != 28)
            return (false, 0);

        return safer_ecrecover(hash, v, r, s);
    }
        
}
// </ORACLIZE_API>


/**
 * @title The EVNToken Token contract.
 *
 * Credit: Taking ideas from BAT token and NET token
 */
 /*is StandardToken */
contract EVNToken is StandardToken, usingOraclize {

    // Token metadata
    string public constant name = "Envion";
    string public constant symbol = "EVN";
    uint256 public constant decimals = 18;
    string public constant version = "0.9";

    // Fundraising goals: minimums and maximums
    uint256 public constant TOKEN_CREATION_CAP = 130 * (10**6) * 10**decimals; // 130 million EVNs
    uint256 public constant TOKEN_CREATED_MIN = 1 * (10**6) * 10**decimals;    // 1 million EVNs
    uint256 public constant ETH_RECEIVED_CAP = 5333 * (10**2) * 10**decimals;  // 533 300 ETH
    uint256 public constant ETH_RECEIVED_MIN = 1 * (10**3) * 10**decimals;     // 1 000 ETH
    uint256 public constant TOKEN_MIN = 1 * 10**decimals;                      // 1 EVN

    // Discount multipliers
    uint256 public constant TOKEN_FIRST_DISCOUNT_MULTIPLIER  = 142857; // later divided by 10^5 to give users 1,42857 times more tokens per ETH == 30% discount
    uint256 public constant TOKEN_SECOND_DISCOUNT_MULTIPLIER = 125000; // later divided by 10^5 to give users 1,25 more tokens per ETH == 20% discount
    uint256 public constant TOKEN_THIRD_DISCOUNT_MULTIPLIER  = 111111; // later divided by 10^5 to give users 1,11111 more tokens per ETH == 10% discount

    // Fundraising parameters provided when creating the contract
    uint256 public fundingStartBlock; // These two blocks need to be chosen to comply with the
    uint256 public fundingEndBlock;   // start date and 31 day duration requirements
    uint256 public roundTwoBlock;     // block number that triggers the second exchange rate change
    uint256 public roundThreeBlock;   // block number that triggers the third exchange rate change
    uint256 public roundFourBlock;    // block number that triggers the fourth exchange rate change
    uint256 public ccReleaseBlock;    // block number that triggers purchases made by CC be transferable

    address public admin1;      // First administrator for multi-sig mechanism
    address public admin2;      // Second administrator for multi-sig mechanism
    address public tokenVendor; // Account delivering Tokens purchased with credit card

    // Contracts current state (Fundraising, Finalized, Paused) and the saved state (if currently paused)
    ContractState public state;       // Current state of the contract
    ContractState private savedState; // State of the contract before pause

    //@dev Usecase related: Purchasing Tokens with Credit card  
    //@dev Usecase related: Canceling purchases done with credit card
    mapping (string => Purchase) purchases;                 // in case CC payments get charged back, admins shall only be allowed to kill the exact amount of tokens associated with this payment
    mapping (address => uint256) public ccLockedUpBalances; // tracking the total amount of tokens users have bought via CC - locked up until ccReleaseBlock
    string[] public purchaseArray;                          // holding the IDs of all CC purchases

    // Keep track of holders and icoBuyers
    mapping (address => bool) public isHolder; // track if a user is a known token holder to the smart contract - important for payouts later
    address[] public holders;                  // array of all known holders - important for payouts later
    mapping (address => bool) isIcoBuyer;      // for tracking if user has to be kyc verified before being able to transfer tokens

    // ETH balance per user
    // Since we have different exchange rates at different stages, we need to keep track
    // of how much ether each contributed in case that we need to issue a refund
    mapping (address => uint256) private ethBalances;
    mapping (address => uint256) private noKycEthBalances;

    // Total received ETH balances
    // We need to keep track of how much ether have been contributed, since we have a cap for ETH too
    uint256 public allReceivedEth;
    uint256 public allUnKycedEth; // total amount of ETH we have no KYC for yet

    // store the hashes of admins' msg.data
    mapping (address => bytes32) private multiSigHashes;

    // KYC
    mapping (address => bool) public isKycTeam;   // to determine, if a user belongs to the KYC team or not
    mapping (address => bool) public kycVerified; // to check if user has already undergone KYC or not, to lock up his tokens until then

    // to track if team members already got their tokens
    bool public teamTokensDelivered;

    // Current ETH/USD exchange rate
    uint256 public ETH_USD_EXCHANGE_RATE_IN_CENTS; // set by oraclize

    // Everything oraclize related
    event updatedPrice(string price);
    event newOraclizeQuery(string description);
    uint public oraclizeQueryCost;

    // Events used for logging
    event LogRefund(address indexed _to, uint256 _value);
    event LogCreateEVN(address indexed _to, uint256 _value);
    event LogDeliverEVN(address indexed _to, uint256 _value);
    event LogCancelDelivery(address indexed _to, string _id);
    event LogKycRefused(address indexed _user, uint256 _value);
    event LogTeamTokensDelivered(address indexed distributor, uint256 _value);

    // Additional helper structs
    enum ContractState { Fundraising, Finalized, Paused }

    // Credit Card Purchase Parameters
    //@dev Usecase related: Purchase Tokens with Credit card
    //@dev Usecase related: Cancel purchase done with credit card
    struct Purchase {
        address buyer;
        uint256 tokenAmount;
        bool active;
    }

    // Modifiers
    modifier isFinalized() {
        require(state == ContractState.Finalized);
        _;
    }

    modifier isFundraising() {
        require(state == ContractState.Fundraising);
        _;
    }

    modifier isPaused() {
        require(state == ContractState.Paused);
        _;
    }

    modifier notPaused() {
        require(state != ContractState.Paused);
        _;
    }

    modifier isFundraisingIgnorePaused() {
        require(state == ContractState.Fundraising || (state == ContractState.Paused && savedState == ContractState.Fundraising));
        _;
    }

    modifier onlyKycTeam(){
        require(isKycTeam[msg.sender] == true);
        _;
    }

    modifier onlyOwner() {
        // check if transaction sender is admin.
        require (msg.sender == admin1 || msg.sender == admin2);
        // if yes, store his msg.data. 
        multiSigHashes[msg.sender] = keccak256(msg.data);
        // check if his stored msg.data hash equals to the one of the other admin
        if ((multiSigHashes[admin1]) == (multiSigHashes[admin2])) {
            // if yes, both admins agreed - continue.
            _;

            // Reset hashes after successful execution
            multiSigHashes[admin1] = 0x0;
            multiSigHashes[admin2] = 0x0;
        } else {
            // if not (yet), return.
            return;
        }
    }

    modifier onlyVendor() {
        require(msg.sender == tokenVendor);
        _;
    }

    modifier minimumReached() {
        require(allReceivedEth >= ETH_RECEIVED_MIN);
        require(totalSupply >= TOKEN_CREATED_MIN);
        _;
    }

    modifier isKycVerified(address _user) {
        // if token transferring user acquired the tokens through the ICO...
        if (isIcoBuyer[_user] == true) {
            // ...check if user is already unlocked
            require (kycVerified[_user] == true);
        }
        _;
    }

    modifier hasEnoughUnlockedTokens(address _user, uint256 _value) {
        // check if the user was a CC buyer and if the lockup period is not over,
        if (ccLockedUpBalances[_user] > 0 && block.number < ccReleaseBlock) {
            // allow to only transfer the not-locked up tokens
            require ((SafeMath.sub(balances[_user], _value)) >= ccLockedUpBalances[_user]);
        }
        _;
    }

    /**
     * @dev Create a new EVNToken contract.
     *
     *  _fundingStartBlock The starting block of the fundraiser (has to be in the future).
     *  _fundingEndBlock The end block of the fundraiser (has to be after _fundingStartBlock).
     *  _roundTwoBlock The block that changes the discount rate to 20% (has to be between _fundingStartBlock and _roundThreeBlock).
     *  _roundThreeBlock The block that changes the discount rate to 10% (has to be between _roundTwoBlock and _roundFourBlock).
     *  _roundFourBlock The block that changes the discount rate to 0% (has to be between _roundThreeBlock and _fundingEndBlock).
     *  _admin1 The first admin account that owns this contract.
     *  _admin2 The second admin account that owns this contract.
     *  _tokenVendor The account that creates tokens for credit card / fiat contributers.
     */
    function EVNToken(
        uint256 _fundingStartBlock,
        uint256 _fundingEndBlock,
        uint256 _roundTwoBlock, // block number that triggers the first exchange rate change
        uint256 _roundThreeBlock, // block number that triggers the second exchange rate change
        uint256 _roundFourBlock,
        address _admin1,
        address _admin2,
        address _tokenVendor,
        uint256 _ccReleaseBlock)
    payable
    {
        // Check that the parameters make sense

        // The start of the fundraising should happen in the future
        require (block.number <= _fundingStartBlock);

        // The discount rate changes and ending should follow in their subsequent order
        require (_fundingStartBlock < _roundTwoBlock);
        require (_roundTwoBlock < _roundThreeBlock);
        require (_roundThreeBlock < _roundFourBlock);
        require (_roundFourBlock < _fundingEndBlock);

        // block when tokens bought with CC will be released must be in the future
        require (_fundingEndBlock < _ccReleaseBlock);

        // admin1 and admin2 address must be set and must be different
        require (_admin1 != 0x0);
        require (_admin2 != 0x0);
        require (_admin1 != _admin2);

        // tokenVendor must be set and be different from admin1 and admin2
        require (_tokenVendor != 0x0);
        require (_tokenVendor != _admin1);
        require (_tokenVendor != _admin2);

        // provide some ETH for oraclize price feed
        require (msg.value > 0);

        // Init contract state
        state = ContractState.Fundraising;
        savedState = ContractState.Fundraising;
        fundingStartBlock = _fundingStartBlock;
        fundingEndBlock = _fundingEndBlock;
        roundTwoBlock = _roundTwoBlock;
        roundThreeBlock = _roundThreeBlock;
        roundFourBlock = _roundFourBlock;
        ccReleaseBlock = _ccReleaseBlock;

        totalSupply = 0;

        admin1 = _admin1;
        admin2 = _admin2;
        tokenVendor = _tokenVendor;

        //oraclize 
        oraclize_setCustomGasPrice(100000000000 wei); // set the gas price a little bit higher, so the pricefeed definitely works
        updatePrice();
        oraclizeQueryCost = oraclize_getPrice("URL");
    }

    //// oraclize START

    // @dev oraclize is called recursively here - once a callback fetches the newest ETH price, the next callback is scheduled for the next hour again
    function __callback(bytes32 myid, string result) {
        require(msg.sender == oraclize_cbAddress());

        // setting the token price here
        ETH_USD_EXCHANGE_RATE_IN_CENTS = SafeMath.parse(result);
        updatedPrice(result);

        // fetch the next price
        updatePrice();
    }

    function updatePrice() payable {    // can be left public as a way for replenishing contract's ETH balance, just in case
        if (msg.sender != oraclize_cbAddress()) {
            require(msg.value >= 200 finney);
        }
        if (oraclize_getPrice("URL") > this.balance) {
            newOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee");
        } else {
            newOraclizeQuery("Oraclize sent, wait..");
            // Schedule query in 1 hour. Set the gas amount to 220000, as parsing in __callback takes around 70000 - we play it safe.
            oraclize_query(3600, "URL", "json(https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD).USD", 220000);
        }
    }
    //// oraclize END

    // Overridden method to check for end of fundraising before allowing transfer of tokens
    function transfer(address _to, uint256 _value)
    public
    isFinalized // Only allow token transfer after the fundraising has ended
    isKycVerified(msg.sender)
    hasEnoughUnlockedTokens(msg.sender, _value)
    onlyPayloadSize(2)
    returns (bool success)
    {
        bool result = super.transfer(_to, _value);
        if (result) {
            trackHolder(_to); // track the owner for later payouts
        }
        return result;
    }

    // Overridden method to check for end of fundraising before allowing transfer of tokens
    function transferFrom(address _from, address _to, uint256 _value)
    public
    isFinalized // Only allow token transfer after the fundraising has ended
    isKycVerified(msg.sender)
    hasEnoughUnlockedTokens(msg.sender, _value)
    onlyPayloadSize(3)
    returns (bool success)
    {
        bool result = super.transferFrom(_from, _to, _value);
        if (result) {
            trackHolder(_to); // track the owner for later payouts
        }
        return result;
    }

    // Allow for easier balance checking
    function getBalanceOf(address _owner)
    constant
    returns (uint256 _balance)
    {
        return balances[_owner];
    }

     // getting purchase details by ID - workaround, mappings with dynamically sized keys can't be made public yet.
    function getPurchaseById(string _id)
    constant
    returns (address _buyer, uint256 _tokenAmount, bool _active){
        _buyer = purchases[_id].buyer;
        _tokenAmount = purchases[_id].tokenAmount;
        _active = purchases[_id].active;
    }

    // Allows to figure out the amount of known token holders
    function getHolderCount()
    public
    constant
    returns (uint256 _holderCount)
    {
        return holders.length;
    }

    // Allows to figure out the amount of purchases
    function getPurchaseCount()
    public
    constant
    returns (uint256 _purchaseCount)
    {
        return purchaseArray.length;
    }

    // Allows for easier retrieval of holder by array index
    function getHolder(uint256 _index)
    public
    constant
    returns (address _holder)
    {
        return holders[_index];
    }

    function trackHolder(address _to)
    private
    returns (bool success)
    {
        // Check if the recipient is a known token holder
        if (isHolder[_to] == false) {
            // if not, add him to the holders array and mark him as a known holder
            holders.push(_to);
            isHolder[_to] = true;
        }
        return true;
    }


    /// @dev Accepts ether and creates new EVN tokens
    function createTokens()
    payable
    external
    isFundraising
    {
        require(block.number >= fundingStartBlock);
        require(block.number <= fundingEndBlock);
        require(msg.value > 0);

        // First we check the ETH cap: would adding this amount to the total unKYCed eth and the already KYCed eth exceed the eth cap?
        // return the contribution if the cap has been reached already
        uint256 totalKycedAndUnKycEdEth = SafeMath.add(allUnKycedEth, allReceivedEth);
        uint256 checkedReceivedEth = SafeMath.add(totalKycedAndUnKycEdEth, msg.value);
        require(checkedReceivedEth <= ETH_RECEIVED_CAP);

        // If all is fine with the ETH cap, we continue to check the
        // minimum amount of tokens and the cap for how many tokens
        // have been generated so far

        // calculate the token amount
        uint256 tokens = SafeMath.mul(msg.value, ETH_USD_EXCHANGE_RATE_IN_CENTS);

        // divide by 100 to turn ETH_USD_EXCHANGE_RATE_IN_CENTS into full USD
        tokens = tokens / 100;

        // apply discount multiplier
        tokens = safeMulPercentage(tokens, getCurrentDiscountRate());

        require(tokens >= TOKEN_MIN);
        uint256 checkedSupply = SafeMath.add(totalSupply, tokens);
        require(checkedSupply <= TOKEN_CREATION_CAP);

        // Only when all the checks have passed, then we check if the address is already KYCEd and then 
        // update the state (noKycEthBalances, allReceivedEth, totalSupply, and balances) of the contract

        if (kycVerified[msg.sender] == false) {
            // @dev The unKYCed eth balances are moved to ethBalances in unlockKyc()

            noKycEthBalances[msg.sender] = SafeMath.add(noKycEthBalances[msg.sender], msg.value);

            // add the contributed eth to the total unKYCed eth amount
            allUnKycedEth = SafeMath.add(allUnKycedEth, msg.value);
        } else {
            // if buyer is already KYC unlocked...
            ethBalances[msg.sender] = SafeMath.add(ethBalances[msg.sender], msg.value);
            allReceivedEth = SafeMath.add(allReceivedEth, msg.value);
        }

        totalSupply = checkedSupply;
        balances[msg.sender] += tokens;  // safeAdd not needed; bad semantics to use here

        trackHolder(msg.sender);

        // to force the check for KYC Status upon the user when he tries transferring tokens
        // and exclude every later token owner
        isIcoBuyer[msg.sender] = true;

        // Log the creation of these tokens
        LogCreateEVN(msg.sender, tokens);
    }

    //add a user to the KYC team
    function addToKycTeam(address _teamMember)
    onlyOwner
    onlyPayloadSize(1){
        isKycTeam[_teamMember] = true;
    }

    //remove a user from the KYC team
    function removeFromKycTeam(address _teamMember)
    onlyOwner
    onlyPayloadSize(1){
        isKycTeam[_teamMember] = false;
    }

    //called by KYC team 
    function unlockKyc(address _owner)
    external
    onlyKycTeam {
        require(kycVerified[_owner] == false);

        //unlock the owner to allow transfer of tokens
        kycVerified[_owner] = true;

        // we leave the ccLockedUpBalances[_owner] as is, because also KYCed users could cancel their CC payments

        if (noKycEthBalances[_owner] > 0) { // check if the user was an ETH buyer

            // now move the unKYCed eth balance to the regular ethBalance. 
            ethBalances[_owner] = noKycEthBalances[_owner];

            // add the now KYCed eth to the total received eth
            allReceivedEth = SafeMath.add(allReceivedEth, noKycEthBalances[_owner]);

            // subtract the now KYCed eth from total amount of unKYCed eth
            allUnKycedEth = SafeMath.sub(allUnKycedEth, noKycEthBalances[_owner]);

            // and set the user's unKYCed eth balance to 0
            noKycEthBalances[_owner] = 0; // preventing replay attacks
        }
    }

    // Refusing KYC of a user, who only contributed in ETH.
    // We must pay close attention here for the case that a user contributes in ETH AND(!) CC !
    // in this case, he must only kill the tokens he received through ETH, the ones bought in fiat will be
    // killed by canceling his payments and subsequently calling cancelDelivery() with the according payment id.
    function refuseKyc(address _user)
    external
    onlyKycTeam
    {
        // once a user is verified, you can't kick him out.
        require (kycVerified[_user] == false);

        // immediately stop, if a user has none or only CC contributions.
        // we're managing kyc refusing of CC contributors off-chain
        require(noKycEthBalances[_user]>0);

        uint256 EVNVal = balances[_user];
        require(EVNVal > 0);

        uint256 ethVal = noKycEthBalances[_user]; // refund un-KYCd eth
        require(ethVal > 0);

        // Update the state only after all the checks have passed
        allUnKycedEth = SafeMath.sub(allUnKycedEth, noKycEthBalances[_user]); // or if there was any unKYCed Eth, subtract it from the total unKYCed eth balance.
        balances[_user] = ccLockedUpBalances[_user]; // assign user only the token amount he has bought through CC, if there are any.
        noKycEthBalances[_user] = 0;
        totalSupply = SafeMath.sub(totalSupply, EVNVal); // Extra safe

        // Log this refund
        LogKycRefused(_user, ethVal);

        // Send the contributions only after we have updated all the balances
        // If you're using a contract, make sure it works with .transfer() gas limits
        _user.transfer(ethVal);
    }

    // Called in case a buyer cancels his CC payment.
    // @param The payment ID from payment provider
    function cancelDelivery(string _purchaseID)
    external
    onlyKycTeam{
        
        // CC payments are only cancelable until ccReleaseBlock
        require (block.number < ccReleaseBlock);

        // check if the purchase to cancel is still active
        require (purchases[_purchaseID].active == true);

        // now withdraw the canceled purchase's token amount from the user's balance
        balances[purchases[_purchaseID].buyer] = SafeMath.sub(balances[purchases[_purchaseID].buyer], purchases[_purchaseID].tokenAmount);

        // and withdraw the canceled purchase's token amount from the lockedUp token balance
        ccLockedUpBalances[purchases[_purchaseID].buyer] = SafeMath.sub(ccLockedUpBalances[purchases[_purchaseID].buyer], purchases[_purchaseID].tokenAmount);

        // set the purchase's status to inactive
        purchases[_purchaseID].active = false;

        //correct th amount of tokens generated
        totalSupply = SafeMath.sub(totalSupply, purchases[_purchaseID].tokenAmount);

        LogCancelDelivery(purchases[_purchaseID].buyer, _purchaseID);
    }

    // @dev Deliver tokens sold for CC/fiat and BTC
    // @dev param _tokens in Cents, e.g. 1 Token == 1$, passed as 100 cents
    // @dev param _btcBuyer Boolean to determine if the delivered tokens need to be locked (not the case for BTC buyers, their payment is final)
    // @dev discount multipliers are applied off-contract in this case
    function deliverTokens(address _to, uint256 _tokens, string _purchaseId, bool _btcBuyer)
    external
    isFundraising
    onlyVendor
    {
        require(_to != 0x0);
        require(_tokens > 0);
        require(bytes(_purchaseId).length>0);
        require(block.number >= fundingStartBlock);
        require(block.number <= fundingEndBlock + 168000); // allow delivery of tokens sold for fiat for 28 days after end of ICO for safety reasons

        // calculate the total amount of tokens and cut out the extra two decimal units,
        // because _tokens was in cents.
        uint256 tokens = SafeMath.mul(_tokens, (10**(decimals) / 10**2));

        // continue to check for how many tokens
        // have been generated so far
        uint256 checkedSupply = SafeMath.add(totalSupply, tokens);
        require(checkedSupply <= TOKEN_CREATION_CAP);

        // Only when all the checks have passed, then we update the state (totalSupply, and balances) of the contract
        totalSupply = checkedSupply;

        // prevent from adding a delivery multiple times
        require(purchases[_purchaseId].buyer==0x0);

        // Log this information in order to be able to cancel token deliveries (on CC refund) by the payment ID
        purchases[_purchaseId] = Purchase({
            buyer: _to,
            tokenAmount: tokens,
            active: true
        });
        purchaseArray.push(_purchaseId);

        // if tokens were not paid with BTC (but credit card), they need to be locked up 
        if (_btcBuyer == false) {
        ccLockedUpBalances[_to] = SafeMath.add(ccLockedUpBalances[_to], tokens); // update user's locked up token balance
        }

        balances[_to] = SafeMath.add(balances[_to], tokens);                     // safeAdd not needed; bad semantics to use here
        trackHolder(_to);                                                        // log holder's address

        // to force the check for KYC Status upon the user when he tries transferring tokens
        // and exclude every later token owner
        isIcoBuyer[_to] = true;

        // Log the creation of these tokens
        LogDeliverEVN(_to, tokens);
   }

    /// @dev Returns the current token price
    function getCurrentDiscountRate()
    private
    constant
    returns (uint256 currentDiscountRate)
    {
        // determine which discount to apply
        if (block.number < roundTwoBlock) {
            // first round
            return TOKEN_FIRST_DISCOUNT_MULTIPLIER;
        } else if (block.number < roundThreeBlock){
            // second round
            return TOKEN_SECOND_DISCOUNT_MULTIPLIER;
        } else if (block.number < roundFourBlock) {
            // third round
            return TOKEN_THIRD_DISCOUNT_MULTIPLIER;
        } else {
            // fourth round, no discount
            return 100000;
        }
    }

    /// @dev Allows to transfer ether from the contract as soon as the minimum is reached
    function retrieveEth(uint256 _value, address _safe)
    external
    minimumReached
    onlyOwner
    {
        require(SafeMath.sub(this.balance, _value) >= allUnKycedEth); // make sure unKYCed eth cannot be withdrawn
        // make sure a recipient was defined !
        require (_safe != 0x0);

        // send the eth to where admins agree upon
        _safe.transfer(_value);
    }


    /// @dev Ends the fundraising period and sends the ETH to wherever the admins agree upon
    function finalize(address _safe)
    external
    isFundraising
    minimumReached
    onlyOwner  // Only the admins calling this method exactly the same way can finalize the sale.
    {
        // Only allow to finalize the contract before the ending block if we already reached any of the two caps
        require(block.number > fundingEndBlock || totalSupply >= TOKEN_CREATED_MIN || allReceivedEth >= ETH_RECEIVED_MIN);
        // make sure a recipient was defined !
        require (_safe != 0x0);

        // Move the contract to Finalized state
        state = ContractState.Finalized;
        savedState = ContractState.Finalized;

        // Send the KYCed ETH to where admins agree upon.
        _safe.transfer(allReceivedEth);
    }


    /// @dev Pauses the contract
    function pause()
    external
    notPaused   // Prevent the contract getting stuck in the Paused state
    onlyOwner   // Only both admins calling this method can pause the contract
    {
        // Move the contract to Paused state
        savedState = state;
        state = ContractState.Paused;
    }


    /// @dev Proceeds with the contract
    function proceed()
    external
    isPaused
    onlyOwner   // Only both admins calling this method can proceed with the contract
    {
        // Move the contract to the previous state
        state = savedState;
    }

    /// @dev Allows contributors to recover their ether in case the minimum funding goal is not reached
    function refund()
    external
    {
        // Allow refunds only a week after end of funding to give KYC-team time to verify contributors
        // and thereby move un-KYC-ed ETH over into allReceivedEth as well as deliver the tokens paid with CC
        require(block.number > (fundingEndBlock + 42000));

        // No refunds if the minimum has been reached or minimum of 1 Million Tokens have been generated
        require(allReceivedEth < ETH_RECEIVED_MIN || totalSupply < TOKEN_CREATED_MIN);

        // to prevent CC buyers from accidentally calling refund and burning their tokens
        require (ethBalances[msg.sender] > 0 || noKycEthBalances[msg.sender] > 0);

        // Only refund if there are EVN tokens
        uint256 EVNVal = balances[msg.sender];
        require(EVNVal > 0);

        // refunds either KYCed eth or un-KYCd eth
        uint256 ethVal = SafeMath.add(ethBalances[msg.sender], noKycEthBalances[msg.sender]);
        require(ethVal > 0);

        allReceivedEth = SafeMath.sub(allReceivedEth, ethBalances[msg.sender]);    // subtract only the KYCed ETH from allReceivedEth, because the latter is what admins will only be able to withdraw
        allUnKycedEth = SafeMath.sub(allUnKycedEth, noKycEthBalances[msg.sender]); // or if there was any unKYCed Eth, subtract it from the total unKYCed eth balance.

        // Update the state only after all the checks have passed.
        // reset everything to zero, no replay attacks.
        balances[msg.sender] = 0;
        ethBalances[msg.sender] = 0;
        noKycEthBalances[msg.sender] = 0;
        totalSupply = SafeMath.sub(totalSupply, EVNVal); // Extra safe

        // Log this refund
        LogRefund(msg.sender, ethVal);

        // Send the contributions only after we have updated all the balances
        // If you're using a contract, make sure it works with .transfer() gas limits
        msg.sender.transfer(ethVal);
    }

    // @dev Deliver tokens to be distributed to team members
    function deliverTeamTokens(address _to)
    external
    isFinalized
    onlyOwner
    {
        require(teamTokensDelivered == false);
        require(_to != 0x0);

        // allow delivery of tokens for the company and supporters without vesting, team tokens will be supplied like a CC purchase.
        
        // company and supporters gets 7% of a whole final pie, meaning we have to add ~7,5% to the
        // current totalSupply now, basically stretching it and taking 7% from the result, so the 93% that remain equals the amount of tokens created right now.
        // e.g. (93 * x = 100, where x amounts to roughly about 1.07526 and 7 would be the team's part)
        uint256 newTotalSupply = safeMulPercentage(totalSupply, 107526);

        // give company and supporters their 7% 
        uint256 tokens = SafeMath.sub(newTotalSupply, totalSupply);
        balances[_to] = tokens;

        //update state
        teamTokensDelivered = true;
        totalSupply = newTotalSupply;
        trackHolder(_to);

        // Log the creation of these tokens
        LogTeamTokensDelivered(_to, tokens);
    }

    function safeMulPercentage(uint256 value, uint256 percentage)
    internal
    constant
    returns (uint256 resultValue)
    {
        require(percentage >= 100000);
        require(percentage < 200000);

        // Multiply with percentage
        uint256 newValue = SafeMath.mul(value, percentage);
        // Remove the 5 extra decimals
        newValue = newValue / 10**5;
        return newValue;
    }

    // customizing the gas price for oraclize calls during "ICO Rush hours"
    function setOraclizeGas(uint256 _option)
    external
    onlyOwner
    {
        if (_option <= 30) {
            oraclize_setCustomGasPrice(30000000000 wei);
        } else if (_option <= 50) {
            oraclize_setCustomGasPrice(50000000000 wei);
        } else if (_option <= 70) {
            oraclize_setCustomGasPrice(70000000000 wei);
        } else if (_option <= 100) {
            oraclize_setCustomGasPrice(100000000000 wei);
        }
    }
}

    Contract ABI  
[{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_safe","type":"address"}],"name":"retrieveEth","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"admin2","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_teamMember","type":"address"}],"name":"addToKycTeam","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isKycTeam","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"admin1","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ETH_RECEIVED_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_teamMember","type":"address"}],"name":"removeFromKycTeam","outputs":[],"payable":false,"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,"type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"}],"name":"__callback","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"holders","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"proceed","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"ccLockedUpBalances","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"},{"name":"proof","type":"bytes"}],"name":"__callback","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"oraclizeQueryCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokens","type":"uint256"},{"name":"_purchaseId","type":"string"},{"name":"_btcBuyer","type":"bool"}],"name":"deliverTokens","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_safe","type":"address"}],"name":"finalize","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_purchaseID","type":"string"}],"name":"cancelDelivery","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"updatePrice","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getHolderCount","outputs":[{"name":"_holderCount","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"allReceivedEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ccReleaseBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fundingEndBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getBalanceOf","outputs":[{"name":"_balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokenVendor","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"kycVerified","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"allUnKycedEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"string"}],"name":"getPurchaseById","outputs":[{"name":"_buyer","type":"address"},{"name":"_tokenAmount","type":"uint256"},{"name":"_active","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"createTokens","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"purchaseArray","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getPurchaseCount","outputs":[{"name":"_purchaseCount","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"deliverTeamTokens","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"state","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_THIRD_DISCOUNT_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ETH_USD_EXCHANGE_RATE_IN_CENTS","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"}],"name":"refuseKyc","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"teamTokensDelivered","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"roundTwoBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isHolder","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fundingStartBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ETH_RECEIVED_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_FIRST_DISCOUNT_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"roundFourBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getHolder","outputs":[{"name":"_holder","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"roundThreeBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SECOND_DISCOUNT_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_CREATED_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"unlockKyc","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_CREATION_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_option","type":"uint256"}],"name":"setOraclizeGas","outputs":[],"payable":false,"type":"function"},{"inputs":[{"name":"_fundingStartBlock","type":"uint256"},{"name":"_fundingEndBlock","type":"uint256"},{"name":"_roundTwoBlock","type":"uint256"},{"name":"_roundThreeBlock","type":"uint256"},{"name":"_roundFourBlock","type":"uint256"},{"name":"_admin1","type":"address"},{"name":"_admin2","type":"address"},{"name":"_tokenVendor","type":"address"},{"name":"_ccReleaseBlock","type":"uint256"}],"payable":true,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"price","type":"string"}],"name":"updatedPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"description","type":"string"}],"name":"newOraclizeQuery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogRefund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogCreateEVN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogDeliverEVN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_id","type":"string"}],"name":"LogCancelDelivery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_user","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogKycRefused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"distributor","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogTeamTokensDelivered","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"},{"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"}]

  Contract Creation Code Switch To Opcodes View
606060405260405161012080620054f48339810160405280805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519150505b43899011156200006457600080fd5b8689106200007157600080fd5b8587106200007e57600080fd5b8486106200008b57600080fd5b8785106200009857600080fd5b808810620000a557600080fd5b600160a060020a0384161515620000bb57600080fd5b600160a060020a0383161515620000d157600080fd5b600160a060020a038481169084161415620000eb57600080fd5b600160a060020a03821615156200010157600080fd5b600160a060020a0382811690851614156200011b57600080fd5b600160a060020a0382811690841614156200013557600080fd5b600034116200014357600080fd5b601080546000919060a060020a60ff02191674010000000000000000000000000000000000000000835b0217905550601080546000919060a860020a60ff0219167501000000000000000000000000000000000000000000835b021790555060088990556009889055600a879055600b869055600c859055600d81905560008055600e8054600160a060020a03808716600160a060020a031992831617909255600f805486841690831617905560108054928516929091169190911790556200021f64174876e80064010000000062003c086200029682021704565b620002376401000000006200205f6200040082021704565b6200028360408051908101604052600381527f55524c00000000000000000000000000000000000000000000000000000000006020820152640100000000620035d56200067e82021704565b6020555b50505050505050505062001228565b600354600160a060020a03161580620002d15750600354620002cf90600160a060020a031664010000000062003d1a6200086682021704565b155b15620002f357620002f1600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200035557600080fd5b6102c65a03f115156200036757600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063ca6ad1e4826040517c010000000000000000000000000000000000000000000000000000000063ffffffff84160281526004810191909152602401600060405180830381600087803b1515620003e657600080fd5b6102c65a03f11515620003f857600080fd5b5050505b5b50565b620004186401000000006200333062000c6b82021704565b600160a060020a031633600160a060020a031614151562000449576702c68af0bb1400003410156200044957600080fd5b5b30600160a060020a031631620004a160408051908101604052600381527f55524c00000000000000000000000000000000000000000000000000000000006020820152640100000000620035d56200067e82021704565b11156200054e57600080516020620054d48339815191526040516020808252604b908201527f4f7261636c697a6520717565727920776173204e4f542073656e742c20706c656040808301919091527f6173652061646420736f6d652045544820746f20636f76657220666f7220746860608301527f6520717565727920666565000000000000000000000000000000000000000000608083015260a0909101905180910390a16200067b565b600080516020620054d483398151915260405160208082526015908201527f4f7261636c697a652073656e742c20776169742e2e00000000000000000000006040808301919091526060909101905180910390a1620003fc610e106040805190810160405280600381526020017f55524c000000000000000000000000000000000000000000000000000000000081525060806040519081016040908152604982527f6a736f6e2868747470733a2f2f6d696e2d6170692e63727970746f636f6d706160208301527f72652e636f6d2f646174612f70726963653f6673796d3d455448267473796d73908201527f3d555344292e5553440000000000000000000000000000000000000000000000606082015262035b606401000000006200376262000de082021704565b505b5b565b600354600090600160a060020a03161580620006bc5750600354620006ba90600160a060020a031664010000000062003d1a6200086682021704565b155b15620006de57620006dc600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200074057600080fd5b6102c65a03f115156200075257600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063524f3889836000604051602001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620007f55780820151818401525b602001620007da565b50505050905090810190601f168015620008235780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15156200084257600080fd5b6102c65a03f115156200085457600080fd5b50505060405180519150505b5b919050565b803b5b919050565b6000806200089e731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed64010000000062003d1a6200086682021704565b1115620009205760038054600160a060020a031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed1790556200091760408051908101604052600b81527f6574685f6d61696e6e65740000000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b60006200094f73c03a2615d5efaf5f49f60b7bb6583eaec212fdf164010000000062003d1a6200086682021704565b1115620009d15760038054600160a060020a03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf11790556200091760408051908101604052600c81527f6574685f726f707374656e3300000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b600062000a0073b7a07bcf2ba2f2703b24c0691b5278999c59ac7e64010000000062003d1a6200086682021704565b111562000a825760038054600160a060020a03191673b7a07bcf2ba2f2703b24c0691b5278999c59ac7e1790556200091760408051908101604052600981527f6574685f6b6f76616e00000000000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b600062000ab173146500cfd35b22e4a392fe0adc06de1a1368ed4864010000000062003d1a6200086682021704565b111562000b335760038054600160a060020a03191673146500cfd35b22e4a392fe0adc06de1a1368ed481790556200091760408051908101604052600b81527f6574685f72696e6b6562790000000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b600062000b62736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47564010000000062003d1a6200086682021704565b111562000b98575060038054600160a060020a031916736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475179055600162000860565b600062000bc77320e12a1f859b3feae5fb2a0a32c18f5a65555bbf64010000000062003d1a6200086682021704565b111562000bfd575060038054600160a060020a0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf179055600162000860565b600062000c2c7351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa64010000000062003d1a6200086682021704565b111562000c62575060038054600160a060020a0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa179055600162000860565b5060005b919050565b600354600090600160a060020a0316158062000ca9575060035462000ca790600160a060020a031664010000000062003d1a6200086682021704565b155b1562000ccb5762000cc9600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151562000d2d57600080fd5b6102c65a03f1151562000d3f57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063c281d19e6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151562000dbe57600080fd5b6102c65a03f1151562000dd057600080fd5b50505060405180519150505b5b90565b6003546000908190600160a060020a0316158062000e20575060035462000e1e90600160a060020a031664010000000062003d1a6200086682021704565b155b1562000e425762000e40600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151562000ea457600080fd5b6102c65a03f1151562000eb657600080fd5b505050604051805160048054600160a060020a031916600160a060020a039283161790819055169050632ef3accc86856000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101562000f605780820151818401525b60200162000f45565b50505050905090810190601f16801562000f8e5780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b151562000fae57600080fd5b6102c65a03f1151562000fc057600080fd5b5050506040518051915050670de0b6b3a76400003a84020181111562000fea57600091506200115a565b600454600160a060020a031663c51be90f82888888886000604051602001526040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015620010845780820151818401525b60200162001069565b50505050905090810190601f168015620010b25780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b83811015620010eb5780820151818401525b602001620010d0565b50505050905090810190601f168015620011195780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b15156200113b57600080fd5b6125ee5a03f115156200114d57600080fd5b5050505060405180519250505b5b50949350505050565b6005818051620011799291602001906200117e565b505b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620011c157805160ff1916838001178555620011f1565b82800160010185558215620011f1579182015b82811115620011f1578251825591602001919060010190620011d4565b5b506200120092915062001204565b5090565b62000ddc91905b808211156200120057600081556001016200120b565b5090565b90565b61429c80620012386000396000f300606060405236156102b95763ffffffff60e060020a60003504166304deaeb581146102be57806306a8f8a2146102e257806306fdde0314610311578063095ea7b31461039c5780630fb7cb1d146103d2578063108e4bdb146103f3578063115976c414610426578063168213491461045557806318160ddd1461047a5780631f305ec71461049f57806323b872dd146104c057806327dc297e146104fc5780632a11ced0146105545780632a33fec6146105865780632ed196bd1461059b578063313ce567146105cc57806338bbfa50146105f15780633ba864651461068b5780633eeda7d3146106b05780634ef39b75146106e657806354fd4d5014610707578063590e1ae314610792578063611ef452146107a7578063673a7e28146107c757806370a08231146107d15780637136982b1461080257806373a1e7f5146108275780638456cb591461084c5780638a957f151461086157806391b43d131461088657806395d89b41146108ab5780639b96eece146107d1578063a3766f8814610967578063a5410a6614610996578063a9059cbb146109c9578063acc99bb7146109ff578063af580d2c14610a24578063b442726314610aa5578063b8b8587314610aaf578063becd283f14610b3d578063bf5f016914610b62578063c19d93fb14610b83578063c5fc98c914610bba578063cf9a60d414610bdf578063d134295814610c04578063d16be71b14610c25578063d25a13b414610c4c578063d4d7b19a14610c71578063d648a64714610ca4578063d8e3074014610cc9578063da9b90c414610cee578063dd62ed3e14610d13578063e5a284f814610d4a578063e74799b414610d6f578063e8a96b4614610d94578063eec7006f14610dc6578063f4ee82ee14610deb578063f5689a8014610e10578063f8db5d0714610e35578063f9fae4f714610e56578063fbf44a1b14610e7b575b600080fd5b34156102c957600080fd5b6102e0600435600160a060020a0360243516610e93565b005b34156102ed57600080fd5b6102f5610ff4565b604051600160a060020a03909116815260200160405180910390f35b341561031c57600080fd5b610324611003565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103a757600080fd5b6103be600160a060020a036004351660243561103a565b604051901515815260200160405180910390f35b34156103dd57600080fd5b6102e0600160a060020a03600435166110b5565b005b34156103fe57600080fd5b6103be600160a060020a03600435166111aa565b604051901515815260200160405180910390f35b341561043157600080fd5b6102f56111bf565b604051600160a060020a03909116815260200160405180910390f35b341561046057600080fd5b6104686111ce565b60405190815260200160405180910390f35b341561048557600080fd5b6104686111db565b60405190815260200160405180910390f35b34156104aa57600080fd5b6102e0600160a060020a03600435166111e1565b005b34156104cb57600080fd5b6103be600160a060020a03600435811690602435166044356112db565b604051901515815260200160405180910390f35b341561050757600080fd5b6102e0600480359060446024803590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506113ff95505050505050565b005b341561055f57600080fd5b6102f56004356114d8565b604051600160a060020a03909116815260200160405180910390f35b341561059157600080fd5b6102e061150a565b005b34156105a657600080fd5b610468600160a060020a0360043516611643565b60405190815260200160405180910390f35b34156105d757600080fd5b610468611655565b60405190815260200160405180910390f35b34156105fc57600080fd5b6102e0600480359060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061165a95505050505050565b005b341561069657600080fd5b610468611660565b60405190815260200160405180910390f35b34156106bb57600080fd5b6102e060048035600160a060020a03169060248035916044359182019101356064351515611666565b005b34156106f157600080fd5b6102e0600160a060020a0360043516611923565b005b341561071257600080fd5b610324611b3d565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079d57600080fd5b6102e0611b74565b005b34156107b257600080fd5b6102e06004803560248101910135611d6b565b005b6102e061205f565b005b34156107dc57600080fd5b610468600160a060020a03600435166122cc565b60405190815260200160405180910390f35b341561080d57600080fd5b6104686122eb565b60405190815260200160405180910390f35b341561083257600080fd5b6104686122f2565b60405190815260200160405180910390f35b341561085757600080fd5b6102e06122f8565b005b341561086c57600080fd5b61046861246b565b60405190815260200160405180910390f35b341561089157600080fd5b610468612471565b60405190815260200160405180910390f35b34156108b657600080fd5b610324612477565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156107dc57600080fd5b610468600160a060020a03600435166122cc565b60405190815260200160405180910390f35b341561097257600080fd5b6102f56124cd565b604051600160a060020a03909116815260200160405180910390f35b34156109a157600080fd5b6103be600160a060020a03600435166124dc565b604051901515815260200160405180910390f35b34156109d457600080fd5b6103be600160a060020a03600435166024356124f1565b604051901515815260200160405180910390f35b3415610a0a57600080fd5b610468612613565b60405190815260200160405180910390f35b3415610a2f57600080fd5b610a7560046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061261995505050505050565b604051600160a060020a039093168352602083019190915215156040808301919091526060909101905180910390f35b6102e0612775565b005b3415610aba57600080fd5b6103246004356129ab565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610b4857600080fd5b610468612a67565b60405190815260200160405180910390f35b3415610b6d57600080fd5b6102e0600160a060020a0360043516612a6e565b005b3415610b8e57600080fd5b610b96612c1d565b60405180826002811115610ba657fe5b60ff16815260200191505060405180910390f35b3415610bc557600080fd5b610468612c2d565b60405190815260200160405180910390f35b3415610bea57600080fd5b610468612c34565b60405190815260200160405180910390f35b3415610c0f57600080fd5b6102e0600160a060020a0360043516612c3a565b005b3415610c3057600080fd5b6103be612dd5565b604051901515815260200160405180910390f35b3415610c5757600080fd5b610468612dde565b60405190815260200160405180910390f35b3415610c7c57600080fd5b6103be600160a060020a0360043516612de4565b604051901515815260200160405180910390f35b3415610caf57600080fd5b610468612df9565b60405190815260200160405180910390f35b3415610cd457600080fd5b610468612dff565b60405190815260200160405180910390f35b3415610cf957600080fd5b610468612e0d565b60405190815260200160405180910390f35b3415610d1e57600080fd5b610468600160a060020a0360043581169060243516612e14565b60405190815260200160405180910390f35b3415610d5557600080fd5b610468612e53565b60405190815260200160405180910390f35b3415610d7a57600080fd5b610468612e59565b60405190815260200160405180910390f35b3415610d9f57600080fd5b6102f5600435612e65565b604051600160a060020a03909116815260200160405180910390f35b3415610dd157600080fd5b610468612e9e565b60405190815260200160405180910390f35b3415610df657600080fd5b610468612ea4565b60405190815260200160405180910390f35b3415610e1b57600080fd5b610468612eab565b60405190815260200160405180910390f35b3415610e4057600080fd5b6102e0600160a060020a0360043516612eb9565b005b3415610e6157600080fd5b610468612fbc565b60405190815260200160405180910390f35b3415610e8657600080fd5b6102e0600435612fcb565b005b601954683635c9adc5dea00000901015610eac57600080fd5b60005469d3c21bcecceda1000000901015610ec657600080fd5b600e5433600160a060020a0390811691161480610ef15750600f5433600160a060020a039081169116145b1515610efc57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e54909216815291909120541415610fed57601a54610f6e30600160a060020a03163184613102565b1015610f7957600080fd5b600160a060020a0381161515610f8e57600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f193505050501515610fbf57600080fd5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b5b5050565b600f54600160a060020a031681565b60408051908101604052600681527f456e76696f6e0000000000000000000000000000000000000000000000000000602082015281565b600060023660441461104857fe5b600160a060020a03338116600081815260026020908152604080832094891680845294909152908190208690557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259086905190815260200160405180910390a3600191505b5b5092915050565b600e5433600160a060020a03908116911614806110e05750600f5433600160a060020a039081169116145b15156110eb57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a55760013660241461115257fe5b600160a060020a0382166000908152601c60205260409020805460ff191660011790555b5b50600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b50565b601c6020526000908152604090205460ff1681565b600e54600160a060020a031681565b683635c9adc5dea0000081565b60005481565b600e5433600160a060020a039081169116148061120c5750600f5433600160a060020a039081169116145b151561121757600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a55760013660241461127e57fe5b600160a060020a0382166000908152601c60205260409020805460ff191690555b5b50600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b50565b60008060015b60105460a060020a900460ff1660028111156112f957fe5b1461130357600080fd5b600160a060020a033390811660009081526016602052604090205460ff1615156001141561135557600160a060020a0381166000908152601d602052604090205460ff16151560011461135557600080fd5b5b33600160a060020a0381166000908152601260205260408120548691901180156113815750600d5443105b156113c057600160a060020a0382166000908152601260209081526040808320546001909252909120546113b59083613102565b10156113c057600080fd5b5b6003366064146113cd57fe5b6113d889898961311d565b945084156113eb576113e9886132a9565b505b8495505b5b505b50505b505b509392505050565b611407613330565b600160a060020a031633600160a060020a031614151561142657600080fd5b61142f8161344d565b601f557f891acff763972fa7f25226caa78556f59bcb130f6f13fd6ab9b9fef99cff9c698160405160208082528190810183818151815260200191508051906020019080838360005b838110156114915780820151818401525b602001611478565b50505050905090810190601f1680156114be5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1610fed61205f565b5b5050565b60158054829081106114e657fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b60025b60105460a060020a900460ff16600281111561152557fe5b1461152f57600080fd5b600e5433600160a060020a039081169116148061155a5750600f5433600160a060020a039081169116145b151561156557600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e5490921681529190912054141561163e576010805460ff7501000000000000000000000000000000000000000000820416919074ff0000000000000000000000000000000000000000191660a060020a83600281111561160b57fe5b02179055505b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b5b565b60126020526000908152604090205481565b601281565b5b505050565b60205481565b600080805b60105460a060020a900460ff16600281111561168357fe5b1461168d57600080fd5b60105433600160a060020a039081169116146116a857600080fd5b600160a060020a03871615156116bd57600080fd5b600086116116ca57600080fd5b600084116116d757600080fd5b6008544310156116e657600080fd5b60095462029040014311156116fa57600080fd5b611710866064670de0b6b3a76400005b0461357e565b915061171e600054836135ad565b90506a6b88921f0410abc200000081111561173857600080fd5b6000819055601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03161561177757600080fd5b60606040519081016040528088600160a060020a0316815260200183815260200160011515815250601186866040518083838082843782019150509250505090815260200160405190819003902081518154600160a060020a031916600160a060020a0391909116178155602082015181600101556040820151600291909101805460ff19169115159190911790555060138054600181016118198382614079565b916000526020600020900160005b506118339087876140a3565b505082151561187957600160a060020a03871660009081526012602052604090205461185f90836135ad565b600160a060020a0388166000908152601260205260409020555b600160a060020a03871660009081526001602052604090205461189c90836135ad565b600160a060020a0388166000908152600160205260409020556118be876132a9565b50600160a060020a03871660008181526016602052604090819020805460ff191660011790557f1a0e722b7da39e72a59b39f661ef0ce1167fc012eeacb7481feb8b110d7c481e9084905190815260200160405180910390a25b5b5b50505050505050565b60005b60105460a060020a900460ff16600281111561193e57fe5b1461194857600080fd5b601954683635c9adc5dea0000090101561196157600080fd5b60005469d3c21bcecceda100000090101561197b57600080fd5b600e5433600160a060020a03908116911614806119a65750600f5433600160a060020a039081169116145b15156119b157600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a557600954431180611a29575060005469d3c21bcecceda10000009010155b80611a405750601954683635c9adc5dea000009010155b1515611a4b57600080fd5b600160a060020a0381161515611a6057600080fd5b601080546001919074ff0000000000000000000000000000000000000000191660a060020a835b0217905550601080546001919075ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000835b021790555080600160a060020a03166108fc6019549081150290604051600060405180830381858888f193505050501515611b0057600080fd5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b5b5b50565b60408051908101604052600381527f302e390000000000000000000000000000000000000000000000000000000000602082015281565b60008060095461a4100143111515611b8b57600080fd5b601954683635c9adc5dea00000901080611bb1575060005469d3c21bcecceda100000090105b1515611bbc57600080fd5b600160a060020a0333166000908152601760205260408120541180611bf75750600160a060020a033316600090815260186020526040812054115b1515611c0257600080fd5b600160a060020a03331660009081526001602052604081205492508211611c2857600080fd5b600160a060020a033316600090815260176020908152604080832054601890925290912054611c5791906135ad565b905060008111611c6657600080fd5b601954600160a060020a033316600090815260176020526040902054611c8c9190613102565b601955601a54600160a060020a033316600090815260186020526040902054611cb59190613102565b601a55600160a060020a0333166000908152600160209081526040808320839055601782528083208390556018909152812081905554611cf59083613102565b600055600160a060020a0333167fb6c0eca8138e097d71e2dd31e19a1266487f0553f170b7260ffe68bcbe9ff8a78260405190815260200160405180910390a2600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610fed57600080fd5b5b5050565b600160a060020a0333166000908152601c602052604090205460ff161515600114611d9557600080fd5b600d544310611da357600080fd5b60118282604051808383808284378201915050925050509081526020016040519081900390206002015460ff161515600114611dde57600080fd5b611e5860016000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03168152602081019190915260409081016000205490601190859085905180838380828437820191505092505050908152602001604051809103902060010154613102565b60016000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a0316815260208101919091526040908101600090812092909255611f1f9160129160119086908690518083838082843782019150509250505090815260200160405190819003902054600160a060020a03168152602081019190915260409081016000205490601190859085905180838380828437820191505092505050908152602001604051809103902060010154613102565b60126000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a0316815260208101919091526040908101600090812092909255601190849084905180838380828437820191505092505050908152602001604051908190039020600201805460ff1916911515919091179055600054611fd9906011848460405180838380828437820191505092505050908152602001604051809103902060010154613102565b600055601182826040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03167f6e9b134e7c6a5f38a62b3b3344b833bb9bda58d3c5556223978ec5273ff4735383836040516020808252810182905280604081018484808284378201915050935050505060405180910390a25b5b5050565b612067613330565b600160a060020a031633600160a060020a0316141515612096576702c68af0bb14000034101561209657600080fd5b5b30600160a060020a0316316120de60408051908101604052600381527f55524c000000000000000000000000000000000000000000000000000000000060208201526135d5565b111561219a577f46cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a6040516020808252604b908201527f4f7261636c697a6520717565727920776173204e4f542073656e742c20706c656040808301919091527f6173652061646420736f6d652045544820746f20636f76657220666f7220746860608301527f6520717565727920666565000000000000000000000000000000000000000000608083015260a0909101905180910390a161163e565b7f46cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a60405160208082526015908201527f4f7261636c697a652073656e742c20776169742e2e00000000000000000000006040808301919091526060909101905180910390a16111a5610e106040805190810160405280600381526020017f55524c0000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604981526020017f6a736f6e2868747470733a2f2f6d696e2d6170692e63727970746f636f6d706181526020017f72652e636f6d2f646174612f70726963653f6673796d3d455448267473796d7381526020017f3d555344292e555344000000000000000000000000000000000000000000000081525062035b60613762565b505b5b565b600160a060020a0381166000908152600160205260409020545b919050565b6015545b90565b60195481565b60025b60105460a060020a900460ff16600281111561231357fe5b141561231e57600080fd5b600e5433600160a060020a03908116911614806123495750600f5433600160a060020a039081169116145b151561235457600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e5490921681529190912054141561163e576010805460ff60a060020a820416919075ff000000000000000000000000000000000000000000191675010000000000000000000000000000000000000000008360028111156123fb57fe5b0217905550601080546002919074ff0000000000000000000000000000000000000000191660a060020a8361160b565b02179055505b600e54600160a060020a039081166000908152601b6020526040808220829055600f5490921681529081205561163e565b61163e565b5b5b565b600d5481565b60095481565b60408051908101604052600381527f45564e0000000000000000000000000000000000000000000000000000000000602082015281565b600160a060020a0381166000908152600160205260409020545b919050565b601054600160a060020a031681565b601d6020526000908152604090205460ff1681565b60008060015b60105460a060020a900460ff16600281111561250f57fe5b1461251957600080fd5b600160a060020a033390811660009081526016602052604090205460ff1615156001141561256b57600160a060020a0381166000908152601d602052604090205460ff16151560011461256b57600080fd5b5b33600160a060020a0381166000908152601260205260408120548691901180156125975750600d5443105b156125d657600160a060020a0382166000908152601260209081526040808320546001909252909120546125cb9083613102565b10156125d657600080fd5b5b6002366044146125e357fe5b6125ed8888613a68565b94508415612600576125fe886132a9565b505b8495505b5b505b50505b505b5092915050565b601a5481565b60008060006011846040518082805190602001908083835b6020831061265157805182525b601f199092019160209182019101612631565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405190819003902054600160a060020a031692506011846040518082805190602001908083835b602083106126c457805182525b601f1990920191602091820191016126a4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001015491506011846040518082805190602001908083835b6020831061273057805182525b601f199092019160209182019101612710565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040519081900390206002015460ff1690505b9193909250565b6000808080805b60105460a060020a900460ff16600281111561279457fe5b1461279e57600080fd5b6008544310156127ad57600080fd5b6009544311156127bc57600080fd5b600034116127c957600080fd5b6127d7601a546019546135ad565b93506127e384346135ad565b92506970ee403ce780ac5000008311156127fc57600080fd5b61280834601f5461357e565b91506064825b0491506128228261281d613b78565b613bc6565b9150670de0b6b3a764000082101561283957600080fd5b612845600054836135ad565b90506a6b88921f0410abc200000081111561285f57600080fd5b600160a060020a0333166000908152601d602052604090205460ff1615156128d257600160a060020a0333166000908152601860205260409020546128a490346135ad565b600160a060020a033316600090815260186020526040902055601a546128ca90346135ad565b601a5561291f565b600160a060020a0333166000908152601760205260409020546128f590346135ad565b600160a060020a03331660009081526017602052604090205560195461291b90346135ad565b6019555b600081815533600160a060020a03811682526001602052604090912080548401905561294a906132a9565b50600160a060020a03331660008181526016602052604090819020805460ff191660011790557ff531cc636ac07444c260ab8fbec2dfcfb2e69f62697aa04f6429a3b052c413989084905190815260200160405180910390a25b5b50505050565b60138054829081106129b957fe5b906000526020600020900160005b915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a5f5780601f10612a3457610100808354040283529160200191612a5f565b820191906000526020600020905b815481529060010190602001808311612a4257829003601f168201915b505050505081565b6013545b90565b60008060015b60105460a060020a900460ff166002811115612a8c57fe5b14612a9657600080fd5b600e5433600160a060020a0390811691161480612ac15750600f5433600160a060020a039081169116145b1515612acc57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e54909216815291909120541415612c1157601e5460ff1615612b3757600080fd5b600160a060020a0383161515612b4c57600080fd5b612b5b6000546201a406613bc6565b9150612b6982600054613102565b600160a060020a03841660009081526001602081905260408220839055601e805460ff191690911790558390559050612ba1836132a9565b5082600160a060020a03167f74c57fa15425b244ab3400bd258037da3499566fe21038ab6e6db4971d1565fa8260405190815260200160405180910390a25b600e54600160a060020a039081166000908152601b6020526040808220829055600f5490921681529081205561165a565b61165a565b5b5b505050565b60105460a060020a900460ff1681565b6201b20781565b601f5481565b600160a060020a0333166000908152601c6020526040812054819060ff161515600114612c6657600080fd5b600160a060020a0383166000908152601d602052604090205460ff1615612c8c57600080fd5b600160a060020a03831660009081526018602052604081205411612caf57600080fd5b600160a060020a03831660009081526001602052604081205492508211612cd557600080fd5b50600160a060020a038216600090815260186020526040812054908111612cfb57600080fd5b601a54600160a060020a038416600090815260186020526040902054612d219190613102565b601a55600160a060020a03831660009081526012602090815260408083205460018352818420556018909152812081905554612d5d9083613102565b600055600160a060020a0383167fa840617fb151e47d5e92a7fd2b59e2aedb6252c5dd8e5656a789e116f5668f038260405190815260200160405180910390a2600160a060020a03831681156108fc0282604051600060405180830381858888f19350505050151561165a57600080fd5b5b5b505050565b601e5460ff1681565b600a5481565b60146020526000908152604090205460ff1681565b60085481565b6970ee403ce780ac50000081565b62022e0981565b6000600236604414612e2257fe5b600160a060020a0380851660009081526002602090815260408083209387168352929052205491505b5b5092915050565b600c5481565b670de0b6b3a764000081565b6000601582815481101515612e7657fe5b906000526020600020900160005b9054906101000a9004600160a060020a031690505b919050565b600b5481565b6201e84881565b69d3c21bcecceda100000081565b600160a060020a0333166000908152601c602052604090205460ff161515600114612ee357600080fd5b600160a060020a0381166000908152601d602052604090205460ff1615612f0957600080fd5b600160a060020a0381166000908152601d60209081526040808320805460ff19166001179055601890915281205411156111a557600160a060020a038116600090815260186020818152604080842054601783529320839055601954919052612f71916135ad565b601955601a54600160a060020a038216600090815260186020526040902054612f9a9190613102565b601a55600160a060020a0381166000908152601860205260408120555b5b5b50565b6a6b88921f0410abc200000081565b600e5433600160a060020a0390811691161480612ff65750600f5433600160a060020a039081169116145b151561300157600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a557601e8111613077576130726406fc23ac00613c08565b611b00565b6032811161309257613072640ba43b7400613c08565b611b00565b604681116130ad5761307264104c533c00613c08565b611b00565b60648111611b0057611b0064174876e800613c08565b5b5b5b5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b50565b6000808284101561310f57fe5b5050808203805b5092915050565b600160a060020a03831660009081526001602052604081205482901080159061316d5750600160a060020a0380851660009081526002602090815260408083203390941683529290522054829010155b80156131795750600082115b801561319e5750600160a060020a038316600090815260016020526040902054828101115b1561329d57600160a060020a0383166000908152600160205260409020546131c690836135ad565b600160a060020a0380851660009081526001602052604080822093909355908616815220546131f59083613102565b600160a060020a03808616600090815260016020908152604080832094909455600281528382203390931682529190915220546132329083613102565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060016132a1565b5060005b5b9392505050565b600160a060020a03811660009081526014602052604081205460ff1615156133275760158054600181016132dd8382614122565b916000526020600020900160005b8154600160a060020a038087166101009390930a838102910219909116179091556000908152601460205260409020805460ff19166001179055505b5060015b919050565b600354600090600160a060020a0316158061335d575060035461335b90600160a060020a0316613d1a565b155b1561336e5761336c6000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156133b657600080fd5b6102c65a03f115156133c757600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063c281d19e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561342c57600080fd5b6102c65a03f1151561343d57600080fd5b50505060405180519150505b5b90565b600061345761414c565b50816000805b8251811015613572577f300000000000000000000000000000000000000000000000000000000000000083828151811061349357fe5b016020015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015801561353457507f39000000000000000000000000000000000000000000000000000000000000008382815181106134fd57fe5b016020015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b1561356957603083828151811061354757fe5b016020015160f860020a900460f860020a0260f860020a90040382600a020191505b5b60010161345d565b8193505b505050919050565b600082820283158061359a575082848281151561359757fe5b04145b15156135a257fe5b8091505b5092915050565b600082820183811080159061359a5750828110155b15156135a257fe5b8091505b5092915050565b600354600090600160a060020a03161580613602575060035461360090600160a060020a0316613d1a565b155b15613613576136116000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561365b57600080fd5b6102c65a03f1151561366c57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063524f3889836000604051602001526040518263ffffffff1660e060020a0281526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136f45780820151818401525b6020016136db565b50505050905090810190601f1680156137215780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b151561373f57600080fd5b6102c65a03f1151561375057600080fd5b50505060405180519150505b5b919050565b6003546000908190600160a060020a03161580613791575060035461378f90600160a060020a0316613d1a565b155b156137a2576137a06000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156137ea57600080fd5b6102c65a03f115156137fb57600080fd5b505050604051805160048054600160a060020a031916600160a060020a039283161790819055169050632ef3accc86856000604051602001526040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561388a5780820151818401525b602001613871565b50505050905090810190601f1680156138b75780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b15156138d657600080fd5b6102c65a03f115156138e757600080fd5b5050506040518051915050670de0b6b3a76400003a84020181111561390f5760009150613a5e565b600454600160a060020a031663c51be90f82888888886000604051602001526040518663ffffffff1660e060020a028152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101561398e5780820151818401525b602001613975565b50505050905090810190601f1680156139bb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156139f25780820151818401525b6020016139d9565b50505050905090810190601f168015613a1f5780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b1515613a4057600080fd5b6125ee5a03f11515613a5157600080fd5b5050505060405180519250505b5b50949350505050565b600160a060020a033316600090815260016020526040812054829010801590613a915750600082115b8015613ab65750600160a060020a038316600090815260016020526040902054828101115b15613b6d57600160a060020a033316600090815260016020526040902054613ade9083613102565b600160a060020a033381166000908152600160205260408082209390935590851681522054613b0d90836135ad565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3506001613b71565b5060005b5b92915050565b6000600a54431015613b8e575062022e096122ef565b600b54431015613ba257506201e8486122ef565b600c54431015613bb657506201b2076122ef565b50620186a06122ef565b5b5b5b90565b600080620186a0831015613bd957600080fd5b62030d408310613be857600080fd5b613bf2848461357e565b9050620186a0815b0490508091505b5092915050565b600354600160a060020a03161580613c325750600354613c3090600160a060020a0316613d1a565b155b15613c4357613c416000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613c8b57600080fd5b6102c65a03f11515613c9c57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063ca6ad1e48260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515613d0157600080fd5b6102c65a03f115156129a457600080fd5b5050505b5b50565b803b5b919050565b600080613d42731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed613d1a565b1115613db25760038054600160a060020a031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed179055613daa60408051908101604052600b81527f6574685f6d61696e6e65740000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613dd173c03a2615d5efaf5f49f60b7bb6583eaec212fdf1613d1a565b1115613e415760038054600160a060020a03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf1179055613daa60408051908101604052600c81527f6574685f726f707374656e3300000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613e6073b7a07bcf2ba2f2703b24c0691b5278999c59ac7e613d1a565b1115613ed05760038054600160a060020a03191673b7a07bcf2ba2f2703b24c0691b5278999c59ac7e179055613daa60408051908101604052600981527f6574685f6b6f76616e00000000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613eef73146500cfd35b22e4a392fe0adc06de1a1368ed48613d1a565b1115613f5f5760038054600160a060020a03191673146500cfd35b22e4a392fe0adc06de1a1368ed48179055613daa60408051908101604052600b81527f6574685f72696e6b6562790000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613f7e736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475613d1a565b1115613fb2575060038054600160a060020a031916736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47517905560016122e6565b6000613fd17320e12a1f859b3feae5fb2a0a32c18f5a65555bbf613d1a565b1115614005575060038054600160a060020a0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf17905560016122e6565b60006140247351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa613d1a565b1115614058575060038054600160a060020a0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa17905560016122e6565b5060005b919050565b6005818051610fed92916020019061415e565b505b50565b81548183558181151161165a5760008381526020902061165a9181019083016141dd565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106140e45782800160ff19823516178555614111565b82800160010185558215614111579182015b828111156141115782358255916020019190600101906140f6565b5b5061411e929150614207565b5090565b81548183558181151161165a5760008381526020902061165a918101908301614207565b5b505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061419f57805160ff1916838001178555614111565b82800160010185558215614111579182015b828111156141115782518255916020019190600101906141b1565b5b5061411e929150614207565b5090565b6122ef91905b8082111561411e5760006141f78282614228565b506001016141e3565b5090565b90565b6122ef91905b8082111561411e576000815560010161420d565b5090565b90565b50805460018160011615610100020316600290046000825580601f1061424e57506111a5565b601f0160209004906000526020600020908101906111a59190614207565b5b505600a165627a7a72305820988c73333ac173572010ad58d9556df1d1832dc3572d43e4c9c9322dbcb322ed002946cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a00000000000000000000000000000000000000000000000000000000004847d600000000000000000000000000000000000000000000000000000000004b0764000000000000000000000000000000000000000000000000000000000048753a000000000000000000000000000000000000000000000000000000000048b950000000000000000000000000000000000000000000000000000000000049582e0000000000000000000000007e49e51d4e30054915f11bd72c6c02f7423c1f4000000000000000000000000000cc9587a370fc97edcd54c8dcfcc320a56eaa190000000000000000000000002b4c4a1609c367bec8fed57e95df81c1aea5a1100000000000000000000000000000000000000000000000000000000000598613

    Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000004847d600000000000000000000000000000000000000000000000000000000004b0764000000000000000000000000000000000000000000000000000000000048753a000000000000000000000000000000000000000000000000000000000048b950000000000000000000000000000000000000000000000000000000000049582e0000000000000000000000007e49e51d4e30054915f11bd72c6c02f7423c1f4000000000000000000000000000cc9587a370fc97edcd54c8dcfcc320a56eaa190000000000000000000000002b4c4a1609c367bec8fed57e95df81c1aea5a1100000000000000000000000000000000000000000000000000000000000598613

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000004847d6
Arg [1] : 00000000000000000000000000000000000000000000000000000000004b0764
Arg [2] : 000000000000000000000000000000000000000000000000000000000048753a
Arg [3] : 000000000000000000000000000000000000000000000000000000000048b950
Arg [4] : 000000000000000000000000000000000000000000000000000000000049582e
Arg [5] : 0000000000000000000000007e49e51d4e30054915f11bd72c6c02f7423c1f40
Arg [6] : 00000000000000000000000000cc9587a370fc97edcd54c8dcfcc320a56eaa19
Arg [7] : 0000000000000000000000002b4c4a1609c367bec8fed57e95df81c1aea5a110
Arg [8] : 0000000000000000000000000000000000000000000000000000000000598613


   Swarm Source:
bzzr://988c73333ac173572010ad58d9556df1d1832dc3572d43e4c9c9322dbcb322ed

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.