ETH Price: $3,333.26 (-0.47%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Bulk Whitelist I...82190572019-07-25 9:41:221986 days ago1564047682IN
433Token: Token Sale
0 ETH0.000365185
Buy Tokens82185922019-07-25 7:53:031986 days ago1564041183IN
433Token: Token Sale
0.01 ETH0.0022193210
Buy Tokens82185902019-07-25 7:52:311986 days ago1564041151IN
433Token: Token Sale
0.01 ETH0.0023693210
Claim Tokens82149042019-07-24 18:06:311987 days ago1563991591IN
433Token: Token Sale
0 ETH0.0013145620
Buy Tokens82148202019-07-24 17:48:361987 days ago1563990516IN
433Token: Token Sale
2 ETH0.0059386420
Bulk Whitelist I...82076632019-07-23 15:15:301988 days ago1563894930IN
433Token: Token Sale
0 ETH0.000097321
Bulk Whitelist I...82041802019-07-23 2:14:471989 days ago1563848087IN
433Token: Token Sale
0 ETH0.000072971
Buy Tokens81821802019-07-19 16:38:301992 days ago1563554310IN
433Token: Token Sale
0.02513307 ETH0.0005343523.00000051
Transfer81821532019-07-19 16:32:261992 days ago1563553946IN
433Token: Token Sale
0.02561713 ETH0.0004840523.00000051
Bulk Whitelist I...81819052019-07-19 15:36:391992 days ago1563550599IN
433Token: Token Sale
0 ETH0.0087436820
Bulk Whitelist I...81818812019-07-19 15:32:041992 days ago1563550324IN
433Token: Token Sale
0 ETH0.00820
Bulk Whitelist I...81787782019-07-19 3:47:401993 days ago1563508060IN
433Token: Token Sale
0 ETH0.00041
Bulk Whitelist I...81787452019-07-19 3:38:451993 days ago1563507525IN
433Token: Token Sale
0 ETH0.00041
Change Token Rat...81787452019-07-19 3:38:451993 days ago1563507525IN
433Token: Token Sale
0 ETH0.000031051
Set Crowdsale St...81786962019-07-19 3:24:151993 days ago1563506655IN
433Token: Token Sale
0 ETH0.000031171
Set End Date81786962019-07-19 3:24:151993 days ago1563506655IN
433Token: Token Sale
0 ETH0.0000311
Set Min Purchase...81786962019-07-19 3:24:151993 days ago1563506655IN
433Token: Token Sale
0 ETH0.000031611
Buy Tokens79745662019-06-17 7:14:432024 days ago1560755683IN
433Token: Token Sale
0.05 ETH0.0019314810
Set End Date79738512019-06-17 4:32:362025 days ago1560745956IN
433Token: Token Sale
0 ETH0.0000622
Buy Tokens78201292019-05-24 4:06:082049 days ago1558670768IN
433Token: Token Sale
0.001 ETH0.0033340714
Whitelist Invest...78150122019-05-23 8:54:192049 days ago1558601659IN
433Token: Token Sale
0 ETH0.000539510
Change Token Rat...78075832019-05-22 4:43:572051 days ago1558500237IN
433Token: Token Sale
0 ETH0.0003105610
Set Min Purchase...78075732019-05-22 4:42:172051 days ago1558500137IN
433Token: Token Sale
0 ETH0.0003167910
Set End Date78074962019-05-22 4:25:532051 days ago1558499153IN
433Token: Token Sale
0 ETH0.0003100310
Claim Tokens77926052019-05-19 20:13:152053 days ago1558296795IN
433Token: Token Sale
0 ETH0.000080721
View all transactions

Latest 22 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
82185922019-07-25 7:53:031986 days ago1564041183
433Token: Token Sale
0.01 ETH
82185902019-07-25 7:52:311986 days ago1564041151
433Token: Token Sale
0.01 ETH
82148202019-07-24 17:48:361987 days ago1563990516
433Token: Token Sale
2 ETH
79745662019-06-17 7:14:432024 days ago1560755683
433Token: Token Sale
0.05 ETH
78201292019-05-24 4:06:082049 days ago1558670768
433Token: Token Sale
0.001 ETH
69313192018-12-22 7:54:262201 days ago1545465266
433Token: Token Sale
3.414 ETH
69296862018-12-22 1:03:542202 days ago1545440634
433Token: Token Sale
2 ETH
69212642018-12-20 14:38:312203 days ago1545316711
433Token: Token Sale
8 ETH
69033592018-12-17 13:19:592206 days ago1545052799
433Token: Token Sale
2 ETH
68990802018-12-16 19:54:442207 days ago1544990084
433Token: Token Sale
2 ETH
68436562018-12-07 16:45:202216 days ago1544201120
433Token: Token Sale
5.99 ETH
68415762018-12-07 8:20:522216 days ago1544170852
433Token: Token Sale
2.99 ETH
68110182018-12-02 6:50:052222 days ago1543733405
433Token: Token Sale
2.1 ETH
67844402018-11-27 21:36:102226 days ago1543354570
433Token: Token Sale
2 ETH
67807342018-11-27 6:37:392227 days ago1543300659
433Token: Token Sale
4 ETH
67579972018-11-23 13:20:222230 days ago1542979222
433Token: Token Sale
2 ETH
67343342018-11-19 15:45:552234 days ago1542642355
433Token: Token Sale
3 ETH
67149742018-11-16 11:39:352237 days ago1542368375
433Token: Token Sale
2 ETH
67094212018-11-15 14:01:412238 days ago1542290501
433Token: Token Sale
2 ETH
66103972018-10-30 8:38:032254 days ago1540888683
433Token: Token Sale
0.1 ETH
66103972018-10-30 8:38:032254 days ago1540888683
433Token: Token Sale
0.1 ETH
64878162018-10-10 8:12:392274 days ago1539159159
433Token: Token Sale
0.1 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Crowdsale

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

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

pragma solidity ^0.4.13;

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

contract Ownable {
  address public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

contract RBAC {
  using Roles for Roles.Role;

  mapping (string => Roles.Role) private roles;

  event RoleAdded(address addr, string roleName);
  event RoleRemoved(address addr, string roleName);

  /**
   * @dev reverts if addr does not have role
   * @param addr address
   * @param roleName the name of the role
   * // reverts
   */
  function checkRole(address addr, string roleName)
    view
    public
  {
    roles[roleName].check(addr);
  }

  /**
   * @dev determine if addr has role
   * @param addr address
   * @param roleName the name of the role
   * @return bool
   */
  function hasRole(address addr, string roleName)
    view
    public
    returns (bool)
  {
    return roles[roleName].has(addr);
  }

  /**
   * @dev add a role to an address
   * @param addr address
   * @param roleName the name of the role
   */
  function addRole(address addr, string roleName)
    internal
  {
    roles[roleName].add(addr);
    emit RoleAdded(addr, roleName);
  }

  /**
   * @dev remove a role from an address
   * @param addr address
   * @param roleName the name of the role
   */
  function removeRole(address addr, string roleName)
    internal
  {
    roles[roleName].remove(addr);
    emit RoleRemoved(addr, roleName);
  }

  /**
   * @dev modifier to scope access to a single role (uses msg.sender as addr)
   * @param roleName the name of the role
   * // reverts
   */
  modifier onlyRole(string roleName)
  {
    checkRole(msg.sender, roleName);
    _;
  }

  /**
   * @dev modifier to scope access to a set of roles (uses msg.sender as addr)
   * @param roleNames the names of the roles to scope access to
   * // reverts
   *
   * @TODO - when solidity supports dynamic arrays as arguments to modifiers, provide this
   *  see: https://github.com/ethereum/solidity/issues/2467
   */
  // modifier onlyRoles(string[] roleNames) {
  //     bool hasAnyRole = false;
  //     for (uint8 i = 0; i < roleNames.length; i++) {
  //         if (hasRole(msg.sender, roleNames[i])) {
  //             hasAnyRole = true;
  //             break;
  //         }
  //     }

  //     require(hasAnyRole);

  //     _;
  // }
}

library Roles {
  struct Role {
    mapping (address => bool) bearer;
  }

  /**
   * @dev give an address access to this role
   */
  function add(Role storage role, address addr)
    internal
  {
    role.bearer[addr] = true;
  }

  /**
   * @dev remove an address' access to this role
   */
  function remove(Role storage role, address addr)
    internal
  {
    role.bearer[addr] = false;
  }

  /**
   * @dev check if an address has this role
   * // reverts
   */
  function check(Role storage role, address addr)
    view
    internal
  {
    require(has(role, addr));
  }

  /**
   * @dev check if an address has this role
   * @return bool
   */
  function has(Role storage role, address addr)
    view
    internal
    returns (bool)
  {
    return role.bearer[addr];
  }
}

contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

  /**
  * @dev total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256) {
    return balances[_owner];
  }

}

contract BurnableToken is BasicToken {

  event Burn(address indexed burner, uint256 value);

  /**
   * @dev Burns a specific amount of tokens.
   * @param _value The amount of token to be burned.
   */
  function burn(uint256 _value) public {
    _burn(msg.sender, _value);
  }

  function _burn(address _who, uint256 _value) internal {
    require(_value <= balances[_who]);
    // no need to require value <= totalSupply, since that would imply the
    // sender's balance is greater than the totalSupply, which *should* be an assertion failure

    balances[_who] = balances[_who].sub(_value);
    totalSupply_ = totalSupply_.sub(_value);
    emit Burn(_who, _value);
    emit Transfer(_who, address(0), _value);
  }
}

contract Staff is Ownable, RBAC {

	string public constant ROLE_STAFF = "staff";

	function addStaff(address _staff) public onlyOwner {
		addRole(_staff, ROLE_STAFF);
	}

	function removeStaff(address _staff) public onlyOwner {
		removeRole(_staff, ROLE_STAFF);
	}

	function isStaff(address _staff) view public returns (bool) {
		return hasRole(_staff, ROLE_STAFF);
	}
}

contract StaffUtil {
	Staff public staffContract;

	constructor (Staff _staffContract) public {
		require(msg.sender == _staffContract.owner());
		staffContract = _staffContract;
	}

	modifier onlyOwner() {
		require(msg.sender == staffContract.owner());
		_;
	}

	modifier onlyOwnerOrStaff() {
		require(msg.sender == staffContract.owner() || staffContract.isStaff(msg.sender));
		_;
	}
}

contract Crowdsale is StaffUtil {
	using SafeMath for uint256;

	Token tokenContract;
	PromoCodes promoCodesContract;
	DiscountPhases discountPhasesContract;
	DiscountStructs discountStructsContract;

	address ethFundsWallet;
	uint256 referralBonusPercent;
	uint256 startDate;

	uint256 crowdsaleStartDate;
	uint256 endDate;
	uint256 tokenDecimals;
	uint256 tokenRate;
	uint256 tokensForSaleCap;
	uint256 minPurchaseInWei;
	uint256 maxInvestorContributionInWei;
	bool paused;
	bool finalized;
	uint256 weiRaised;
	uint256 soldTokens;
	uint256 bonusTokens;
	uint256 sentTokens;
	uint256 claimedSoldTokens;
	uint256 claimedBonusTokens;
	uint256 claimedSentTokens;
	uint256 purchasedTokensClaimDate;
	uint256 bonusTokensClaimDate;
	mapping(address => Investor) public investors;

	enum InvestorStatus {UNDEFINED, WHITELISTED, BLOCKED}

	struct Investor {
		InvestorStatus status;
		uint256 contributionInWei;
		uint256 purchasedTokens;
		uint256 bonusTokens;
		uint256 referralTokens;
		uint256 receivedTokens;
		TokensPurchase[] tokensPurchases;
		bool isBlockpass;
	}

	struct TokensPurchase {
		uint256 value;
		uint256 amount;
		uint256 bonus;
		address referrer;
		uint256 referrerSentAmount;
	}

	event InvestorWhitelisted(address indexed investor, uint timestamp, address byStaff);
	event InvestorBlocked(address indexed investor, uint timestamp, address byStaff);
	event TokensPurchased(
		address indexed investor,
		uint indexed purchaseId,
		uint256 value,
		uint256 purchasedAmount,
		uint256 promoCodeAmount,
		uint256 discountPhaseAmount,
		uint256 discountStructAmount,
		address indexed referrer,
		uint256 referrerSentAmount,
		uint timestamp
	);
	event TokensPurchaseRefunded(
		address indexed investor,
		uint indexed purchaseId,
		uint256 value,
		uint256 amount,
		uint256 bonus,
		uint timestamp,
		address byStaff
	);
	event Paused(uint timestamp, address byStaff);
	event Resumed(uint timestamp, address byStaff);
	event Finalized(uint timestamp, address byStaff);
	event TokensSent(address indexed investor, uint256 amount, uint timestamp, address byStaff);
	event PurchasedTokensClaimLocked(uint date, uint timestamp, address byStaff);
	event PurchasedTokensClaimUnlocked(uint timestamp, address byStaff);
	event BonusTokensClaimLocked(uint date, uint timestamp, address byStaff);
	event BonusTokensClaimUnlocked(uint timestamp, address byStaff);
	event CrowdsaleStartDateUpdated(uint date, uint timestamp, address byStaff);
	event EndDateUpdated(uint date, uint timestamp, address byStaff);
	event MinPurchaseChanged(uint256 minPurchaseInWei, uint timestamp, address byStaff);
	event MaxInvestorContributionChanged(uint256 maxInvestorContributionInWei, uint timestamp, address byStaff);
	event TokenRateChanged(uint newRate, uint timestamp, address byStaff);
	event TokensClaimed(
		address indexed investor,
		uint256 purchased,
		uint256 bonus,
		uint256 referral,
		uint256 received,
		uint timestamp,
		address byStaff
	);
	event TokensBurned(uint256 amount, uint timestamp, address byStaff);

	constructor (
		uint256[11] uint256Args,
		address[5] addressArgs
	) StaffUtil(Staff(addressArgs[4])) public {

		// uint256 args
		startDate = uint256Args[0];
		crowdsaleStartDate = uint256Args[1];
		endDate = uint256Args[2];
		tokenDecimals = uint256Args[3];
		tokenRate = uint256Args[4];
		tokensForSaleCap = uint256Args[5];
		minPurchaseInWei = uint256Args[6];
		maxInvestorContributionInWei = uint256Args[7];
		purchasedTokensClaimDate = uint256Args[8];
		bonusTokensClaimDate = uint256Args[9];
		referralBonusPercent = uint256Args[10];

		// address args
		ethFundsWallet = addressArgs[0];
		promoCodesContract = PromoCodes(addressArgs[1]);
		discountPhasesContract = DiscountPhases(addressArgs[2]);
		discountStructsContract = DiscountStructs(addressArgs[3]);

		require(startDate < crowdsaleStartDate);
		require(crowdsaleStartDate < endDate);
		require(tokenDecimals > 0);
		require(tokenRate > 0);
		require(tokensForSaleCap > 0);
		require(minPurchaseInWei <= maxInvestorContributionInWei);
		require(ethFundsWallet != address(0));
	}

	function getState() external view returns (bool[2] boolArgs, uint256[18] uint256Args, address[6] addressArgs) {
		boolArgs[0] = paused;
		boolArgs[1] = finalized;
		uint256Args[0] = weiRaised;
		uint256Args[1] = soldTokens;
		uint256Args[2] = bonusTokens;
		uint256Args[3] = sentTokens;
		uint256Args[4] = claimedSoldTokens;
		uint256Args[5] = claimedBonusTokens;
		uint256Args[6] = claimedSentTokens;
		uint256Args[7] = purchasedTokensClaimDate;
		uint256Args[8] = bonusTokensClaimDate;
		uint256Args[9] = startDate;
		uint256Args[10] = crowdsaleStartDate;
		uint256Args[11] = endDate;
		uint256Args[12] = tokenRate;
		uint256Args[13] = tokenDecimals;
		uint256Args[14] = minPurchaseInWei;
		uint256Args[15] = maxInvestorContributionInWei;
		uint256Args[16] = referralBonusPercent;
		uint256Args[17] = getTokensForSaleCap();
		addressArgs[0] = staffContract;
		addressArgs[1] = ethFundsWallet;
		addressArgs[2] = promoCodesContract;
		addressArgs[3] = discountPhasesContract;
		addressArgs[4] = discountStructsContract;
		addressArgs[5] = tokenContract;
	}

	function fitsTokensForSaleCap(uint256 _amount) public view returns (bool) {
		return getDistributedTokens().add(_amount) <= getTokensForSaleCap();
	}

	function getTokensForSaleCap() public view returns (uint256) {
		if (tokenContract != address(0)) {
			return tokenContract.balanceOf(this);
		}
		return tokensForSaleCap;
	}

	function getDistributedTokens() public view returns (uint256) {
		return soldTokens.sub(claimedSoldTokens).add(bonusTokens.sub(claimedBonusTokens)).add(sentTokens.sub(claimedSentTokens));
	}

	function setTokenContract(Token token) external onlyOwner {
		require(token.balanceOf(this) >= 0);
		require(tokenContract == address(0));
		require(token != address(0));
		tokenContract = token;
	}

	function getInvestorClaimedTokens(address _investor) external view returns (uint256) {
		if (tokenContract != address(0)) {
			return tokenContract.balanceOf(_investor);
		}
		return 0;
	}

	function isBlockpassInvestor(address _investor) external constant returns (bool) {
		return investors[_investor].status == InvestorStatus.WHITELISTED && investors[_investor].isBlockpass;
	}

	function whitelistInvestor(address _investor, bool _isBlockpass) external onlyOwnerOrStaff {
		require(_investor != address(0));
		require(investors[_investor].status != InvestorStatus.WHITELISTED);

		investors[_investor].status = InvestorStatus.WHITELISTED;
		investors[_investor].isBlockpass = _isBlockpass;

		emit InvestorWhitelisted(_investor, now, msg.sender);
	}

	function bulkWhitelistInvestor(address[] _investors) external onlyOwnerOrStaff {
		for (uint256 i = 0; i < _investors.length; i++) {
			if (_investors[i] != address(0) && investors[_investors[i]].status != InvestorStatus.WHITELISTED) {
				investors[_investors[i]].status = InvestorStatus.WHITELISTED;
				emit InvestorWhitelisted(_investors[i], now, msg.sender);
			}
		}
	}

	function blockInvestor(address _investor) external onlyOwnerOrStaff {
		require(_investor != address(0));
		require(investors[_investor].status != InvestorStatus.BLOCKED);

		investors[_investor].status = InvestorStatus.BLOCKED;

		emit InvestorBlocked(_investor, now, msg.sender);
	}

	function lockPurchasedTokensClaim(uint256 _date) external onlyOwner {
		require(_date > now);
		purchasedTokensClaimDate = _date;
		emit PurchasedTokensClaimLocked(_date, now, msg.sender);
	}

	function unlockPurchasedTokensClaim() external onlyOwner {
		purchasedTokensClaimDate = now;
		emit PurchasedTokensClaimUnlocked(now, msg.sender);
	}

	function lockBonusTokensClaim(uint256 _date) external onlyOwner {
		require(_date > now);
		bonusTokensClaimDate = _date;
		emit BonusTokensClaimLocked(_date, now, msg.sender);
	}

	function unlockBonusTokensClaim() external onlyOwner {
		bonusTokensClaimDate = now;
		emit BonusTokensClaimUnlocked(now, msg.sender);
	}

	function setCrowdsaleStartDate(uint256 _date) external onlyOwner {
		crowdsaleStartDate = _date;
		emit CrowdsaleStartDateUpdated(_date, now, msg.sender);
	}

	function setEndDate(uint256 _date) external onlyOwner {
		endDate = _date;
		emit EndDateUpdated(_date, now, msg.sender);
	}

	function setMinPurchaseInWei(uint256 _minPurchaseInWei) external onlyOwner {
		minPurchaseInWei = _minPurchaseInWei;
		emit MinPurchaseChanged(_minPurchaseInWei, now, msg.sender);
	}

	function setMaxInvestorContributionInWei(uint256 _maxInvestorContributionInWei) external onlyOwner {
		require(minPurchaseInWei <= _maxInvestorContributionInWei);
		maxInvestorContributionInWei = _maxInvestorContributionInWei;
		emit MaxInvestorContributionChanged(_maxInvestorContributionInWei, now, msg.sender);
	}

	function changeTokenRate(uint256 _tokenRate) external onlyOwner {
		require(_tokenRate > 0);
		tokenRate = _tokenRate;
		emit TokenRateChanged(_tokenRate, now, msg.sender);
	}

	function buyTokens(bytes32 _promoCode, address _referrer) external payable {
		require(!finalized);
		require(!paused);
		require(startDate < now);
		require(investors[msg.sender].status == InvestorStatus.WHITELISTED);
		require(msg.value > 0);
		require(msg.value >= minPurchaseInWei);
		require(investors[msg.sender].contributionInWei.add(msg.value) <= maxInvestorContributionInWei);

		// calculate purchased amount
		uint256 purchasedAmount;
		if (tokenDecimals > 18) {
			purchasedAmount = msg.value.mul(tokenRate).mul(10 ** (tokenDecimals - 18));
		} else if (tokenDecimals < 18) {
			purchasedAmount = msg.value.mul(tokenRate).div(10 ** (18 - tokenDecimals));
		} else {
			purchasedAmount = msg.value.mul(tokenRate);
		}

		// calculate total amount, this includes promo code amount or discount phase amount
		uint256 promoCodeBonusAmount = promoCodesContract.applyBonusAmount(msg.sender, purchasedAmount, _promoCode);
		uint256 discountPhaseBonusAmount = discountPhasesContract.calculateBonusAmount(purchasedAmount);
		uint256 discountStructBonusAmount = discountStructsContract.getBonus(msg.sender, purchasedAmount, msg.value);
		uint256 bonusAmount = promoCodeBonusAmount.add(discountPhaseBonusAmount).add(discountStructBonusAmount);

		// update referrer's referral tokens
		uint256 referrerBonusAmount;
		address referrerAddr;
		if (
			_referrer != address(0)
			&& msg.sender != _referrer
			&& investors[_referrer].status == InvestorStatus.WHITELISTED
		) {
			referrerBonusAmount = purchasedAmount * referralBonusPercent / 100;
			referrerAddr = _referrer;
		}

		// check that calculated tokens will not exceed tokens for sale cap
		require(fitsTokensForSaleCap(purchasedAmount.add(bonusAmount).add(referrerBonusAmount)));

		// update crowdsale total amount of capital raised
		weiRaised = weiRaised.add(msg.value);
		soldTokens = soldTokens.add(purchasedAmount);
		bonusTokens = bonusTokens.add(bonusAmount).add(referrerBonusAmount);

		// update referrer's bonus tokens
		investors[referrerAddr].referralTokens = investors[referrerAddr].referralTokens.add(referrerBonusAmount);

		// update investor's purchased tokens
		investors[msg.sender].purchasedTokens = investors[msg.sender].purchasedTokens.add(purchasedAmount);

		// update investor's bonus tokens
		investors[msg.sender].bonusTokens = investors[msg.sender].bonusTokens.add(bonusAmount);

		// update investor's tokens eth value
		investors[msg.sender].contributionInWei = investors[msg.sender].contributionInWei.add(msg.value);

		// update investor's tokens purchases
		uint tokensPurchasesLength = investors[msg.sender].tokensPurchases.push(TokensPurchase({
			value : msg.value,
			amount : purchasedAmount,
			bonus : bonusAmount,
			referrer : referrerAddr,
			referrerSentAmount : referrerBonusAmount
			})
		);

		// log investor's tokens purchase
		emit TokensPurchased(
			msg.sender,
			tokensPurchasesLength - 1,
			msg.value,
			purchasedAmount,
			promoCodeBonusAmount,
			discountPhaseBonusAmount,
			discountStructBonusAmount,
			referrerAddr,
			referrerBonusAmount,
			now
		);

		// forward eth to funds wallet
		require(ethFundsWallet.call.gas(300000).value(msg.value)());
	}

	function sendTokens(address _investor, uint256 _amount) external onlyOwner {
		require(investors[_investor].status == InvestorStatus.WHITELISTED);
		require(_amount > 0);
		require(fitsTokensForSaleCap(_amount));

		// update crowdsale total amount of capital raised
		sentTokens = sentTokens.add(_amount);

		// update investor's received tokens balance
		investors[_investor].receivedTokens = investors[_investor].receivedTokens.add(_amount);

		// log tokens sent action
		emit TokensSent(
			_investor,
			_amount,
			now,
			msg.sender
		);
	}

	function burnUnsoldTokens() external onlyOwner {
		require(tokenContract != address(0));
		require(finalized);

		uint256 tokensToBurn = tokenContract.balanceOf(this).sub(getDistributedTokens());
		require(tokensToBurn > 0);

		tokenContract.burn(tokensToBurn);

		// log tokens burned action
		emit TokensBurned(tokensToBurn, now, msg.sender);
	}

	function claimTokens() external {
		require(tokenContract != address(0));
		require(!paused);
		require(investors[msg.sender].status == InvestorStatus.WHITELISTED);

		uint256 clPurchasedTokens;
		uint256 clReceivedTokens;
		uint256 clBonusTokens_;
		uint256 clRefTokens;

		require(purchasedTokensClaimDate < now || bonusTokensClaimDate < now);

		{
			uint256 purchasedTokens = investors[msg.sender].purchasedTokens;
			uint256 receivedTokens = investors[msg.sender].receivedTokens;
			if (purchasedTokensClaimDate < now && (purchasedTokens > 0 || receivedTokens > 0)) {
				investors[msg.sender].contributionInWei = 0;
				investors[msg.sender].purchasedTokens = 0;
				investors[msg.sender].receivedTokens = 0;

				claimedSoldTokens = claimedSoldTokens.add(purchasedTokens);
				claimedSentTokens = claimedSentTokens.add(receivedTokens);

				// free up storage used by transaction
				delete (investors[msg.sender].tokensPurchases);

				clPurchasedTokens = purchasedTokens;
				clReceivedTokens = receivedTokens;

				tokenContract.transfer(msg.sender, purchasedTokens.add(receivedTokens));
			}
		}

		{
			uint256 bonusTokens_ = investors[msg.sender].bonusTokens;
			uint256 refTokens = investors[msg.sender].referralTokens;
			if (bonusTokensClaimDate < now && (bonusTokens_ > 0 || refTokens > 0)) {
				investors[msg.sender].bonusTokens = 0;
				investors[msg.sender].referralTokens = 0;

				claimedBonusTokens = claimedBonusTokens.add(bonusTokens_).add(refTokens);

				clBonusTokens_ = bonusTokens_;
				clRefTokens = refTokens;

				tokenContract.transfer(msg.sender, bonusTokens_.add(refTokens));
			}
		}

		require(clPurchasedTokens > 0 || clBonusTokens_ > 0 || clRefTokens > 0 || clReceivedTokens > 0);
		emit TokensClaimed(msg.sender, clPurchasedTokens, clBonusTokens_, clRefTokens, clReceivedTokens, now, msg.sender);
	}

	function refundTokensPurchase(address _investor, uint _purchaseId) external payable onlyOwner {
		require(msg.value > 0);
		require(investors[_investor].tokensPurchases[_purchaseId].value == msg.value);

		_refundTokensPurchase(_investor, _purchaseId);

		// forward eth to investor's wallet address
		_investor.transfer(msg.value);
	}

	function refundAllInvestorTokensPurchases(address _investor) external payable onlyOwner {
		require(msg.value > 0);
		require(investors[_investor].contributionInWei == msg.value);

		for (uint i = 0; i < investors[_investor].tokensPurchases.length; i++) {
			if (investors[_investor].tokensPurchases[i].value == 0) {
				continue;
			}

			_refundTokensPurchase(_investor, i);
		}

		// forward eth to investor's wallet address
		_investor.transfer(msg.value);
	}

	function _refundTokensPurchase(address _investor, uint _purchaseId) private {
		// update referrer's referral tokens
		address referrer = investors[_investor].tokensPurchases[_purchaseId].referrer;
		if (referrer != address(0)) {
			uint256 sentAmount = investors[_investor].tokensPurchases[_purchaseId].referrerSentAmount;
			investors[referrer].referralTokens = investors[referrer].referralTokens.sub(sentAmount);
			bonusTokens = bonusTokens.sub(sentAmount);
		}

		// update investor's eth amount
		uint256 purchaseValue = investors[_investor].tokensPurchases[_purchaseId].value;
		investors[_investor].contributionInWei = investors[_investor].contributionInWei.sub(purchaseValue);

		// update investor's purchased tokens
		uint256 purchaseAmount = investors[_investor].tokensPurchases[_purchaseId].amount;
		investors[_investor].purchasedTokens = investors[_investor].purchasedTokens.sub(purchaseAmount);

		// update investor's bonus tokens
		uint256 bonusAmount = investors[_investor].tokensPurchases[_purchaseId].bonus;
		investors[_investor].bonusTokens = investors[_investor].bonusTokens.sub(bonusAmount);

		// update crowdsale total amount of capital raised
		weiRaised = weiRaised.sub(purchaseValue);
		soldTokens = soldTokens.sub(purchaseAmount);
		bonusTokens = bonusTokens.sub(bonusAmount);

		// free up storage used by transaction
		delete (investors[_investor].tokensPurchases[_purchaseId]);

		// log investor's tokens purchase refund
		emit TokensPurchaseRefunded(_investor, _purchaseId, purchaseValue, purchaseAmount, bonusAmount, now, msg.sender);
	}

	function getInvestorTokensPurchasesLength(address _investor) public constant returns (uint) {
		return investors[_investor].tokensPurchases.length;
	}

	function getInvestorTokensPurchase(
		address _investor,
		uint _purchaseId
	) external constant returns (
		uint256 value,
		uint256 amount,
		uint256 bonus,
		address referrer,
		uint256 referrerSentAmount
	) {
		value = investors[_investor].tokensPurchases[_purchaseId].value;
		amount = investors[_investor].tokensPurchases[_purchaseId].amount;
		bonus = investors[_investor].tokensPurchases[_purchaseId].bonus;
		referrer = investors[_investor].tokensPurchases[_purchaseId].referrer;
		referrerSentAmount = investors[_investor].tokensPurchases[_purchaseId].referrerSentAmount;
	}

	function pause() external onlyOwner {
		require(!paused);

		paused = true;

		emit Paused(now, msg.sender);
	}

	function resume() external onlyOwner {
		require(paused);

		paused = false;

		emit Resumed(now, msg.sender);
	}

	function finalize() external onlyOwner {
		require(!finalized);

		finalized = true;

		emit Finalized(now, msg.sender);
	}
}

contract DiscountPhases is StaffUtil {
	using SafeMath for uint256;

	event DiscountPhaseAdded(uint index, string name, uint8 percent, uint fromDate, uint toDate, uint timestamp, address byStaff);
	event DiscountPhaseRemoved(uint index, uint timestamp, address byStaff);

	struct DiscountPhase {
		uint8 percent;
		uint fromDate;
		uint toDate;
	}

	DiscountPhase[] public discountPhases;

	constructor(Staff _staffContract) StaffUtil(_staffContract) public {
	}

	function calculateBonusAmount(uint256 _purchasedAmount) public constant returns (uint256) {
		for (uint i = 0; i < discountPhases.length; i++) {
			if (now >= discountPhases[i].fromDate && now <= discountPhases[i].toDate) {
				return _purchasedAmount.mul(discountPhases[i].percent).div(100);
			}
		}
	}

	function addDiscountPhase(string _name, uint8 _percent, uint _fromDate, uint _toDate) public onlyOwnerOrStaff {
		require(bytes(_name).length > 0);
		require(_percent > 0 && _percent <= 100);

		if (now > _fromDate) {
			_fromDate = now;
		}
		require(_fromDate < _toDate);

		for (uint i = 0; i < discountPhases.length; i++) {
			require(_fromDate > discountPhases[i].toDate || _toDate < discountPhases[i].fromDate);
		}

		uint index = discountPhases.push(DiscountPhase({percent : _percent, fromDate : _fromDate, toDate : _toDate})) - 1;

		emit DiscountPhaseAdded(index, _name, _percent, _fromDate, _toDate, now, msg.sender);
	}

	function removeDiscountPhase(uint _index) public onlyOwnerOrStaff {
		require(now < discountPhases[_index].toDate);
		delete discountPhases[_index];
		emit DiscountPhaseRemoved(_index, now, msg.sender);
	}
}

contract DiscountStructs is StaffUtil {
	using SafeMath for uint256;

	address public crowdsale;

	event DiscountStructAdded(
		uint index,
		bytes32 name,
		uint256 tokens,
		uint[2] dates,
		uint256[] fromWei,
		uint256[] toWei,
		uint256[] percent,
		uint timestamp,
		address byStaff
	);
	event DiscountStructRemoved(
		uint index,
		uint timestamp,
		address byStaff
	);
	event DiscountStructUsed(
		uint index,
		uint step,
		address investor,
		uint256 tokens,
		uint timestamp
	);

	struct DiscountStruct {
		uint256 availableTokens;
		uint256 distributedTokens;
		uint fromDate;
		uint toDate;
	}

	struct DiscountStep {
		uint256 fromWei;
		uint256 toWei;
		uint256 percent;
	}

	DiscountStruct[] public discountStructs;
	mapping(uint => DiscountStep[]) public discountSteps;

	constructor(Staff _staffContract) StaffUtil(_staffContract) public {
	}

	modifier onlyCrowdsale() {
		require(msg.sender == crowdsale);
		_;
	}

	function setCrowdsale(Crowdsale _crowdsale) external onlyOwner {
		require(crowdsale == address(0));
		require(_crowdsale.staffContract() == staffContract);
		crowdsale = _crowdsale;
	}

	function getBonus(address _investor, uint256 _purchasedAmount, uint256 _purchasedValue) public onlyCrowdsale returns (uint256) {
		for (uint i = 0; i < discountStructs.length; i++) {
			if (now >= discountStructs[i].fromDate && now <= discountStructs[i].toDate) {

				if (discountStructs[i].distributedTokens >= discountStructs[i].availableTokens) {
					return;
				}

				for (uint j = 0; j < discountSteps[i].length; j++) {
					if (_purchasedValue >= discountSteps[i][j].fromWei
						&& (_purchasedValue < discountSteps[i][j].toWei || discountSteps[i][j].toWei == 0)) {
						uint256 bonus = _purchasedAmount.mul(discountSteps[i][j].percent).div(100);
						if (discountStructs[i].distributedTokens.add(bonus) > discountStructs[i].availableTokens) {
							return;
						}
						discountStructs[i].distributedTokens = discountStructs[i].distributedTokens.add(bonus);
						emit DiscountStructUsed(i, j, _investor, bonus, now);
						return bonus;
					}
				}

				return;
			}
		}
	}

	function calculateBonus(uint256 _purchasedAmount, uint256 _purchasedValue) public constant returns (uint256) {
		for (uint i = 0; i < discountStructs.length; i++) {
			if (now >= discountStructs[i].fromDate && now <= discountStructs[i].toDate) {

				if (discountStructs[i].distributedTokens >= discountStructs[i].availableTokens) {
					return;
				}

				for (uint j = 0; j < discountSteps[i].length; j++) {
					if (_purchasedValue >= discountSteps[i][j].fromWei
						&& (_purchasedValue < discountSteps[i][j].toWei || discountSteps[i][j].toWei == 0)) {
						uint256 bonus = _purchasedAmount.mul(discountSteps[i][j].percent).div(100);
						if (discountStructs[i].distributedTokens.add(bonus) > discountStructs[i].availableTokens) {
							return;
						}
						return bonus;
					}
				}

				return;
			}
		}
	}

	function addDiscountStruct(bytes32 _name, uint256 _tokens, uint[2] _dates, uint256[] _fromWei, uint256[] _toWei, uint256[] _percent) external onlyOwnerOrStaff {
		require(_name.length > 0);
		require(_tokens > 0);
		require(_dates[0] < _dates[1]);
		require(_fromWei.length > 0 && _fromWei.length == _toWei.length && _fromWei.length == _percent.length);

		for (uint j = 0; j < discountStructs.length; j++) {
			require(_dates[0] > discountStructs[j].fromDate || _dates[1] < discountStructs[j].toDate);
		}

		DiscountStruct memory ds = DiscountStruct(_tokens, 0, _dates[0], _dates[1]);
		uint index = discountStructs.push(ds) - 1;

		for (uint i = 0; i < _fromWei.length; i++) {
			require(_fromWei[i] > 0 || _toWei[i] > 0);
			if (_fromWei[i] > 0 && _toWei[i] > 0) {
				require(_fromWei[i] < _toWei[i]);
			}
			require(_percent[i] > 0 && _percent[i] <= 100);
			discountSteps[index].push(DiscountStep(_fromWei[i], _toWei[i], _percent[i]));
		}

		emit DiscountStructAdded(index, _name, _tokens, _dates, _fromWei, _toWei, _percent, now, msg.sender);
	}

	function removeDiscountStruct(uint _index) public onlyOwnerOrStaff {
		require(now < discountStructs[_index].toDate);
		delete discountStructs[_index];
		delete discountSteps[_index];
		emit DiscountStructRemoved(_index, now, msg.sender);
	}
}

contract PromoCodes is StaffUtil {
	using SafeMath for uint256;

	address public crowdsale;

	event PromoCodeAdded(bytes32 indexed code, string name, uint8 percent, uint256 maxUses, uint timestamp, address byStaff);
	event PromoCodeRemoved(bytes32 indexed code, uint timestamp, address byStaff);
	event PromoCodeUsed(bytes32 indexed code, address investor, uint timestamp);

	struct PromoCode {
		uint8 percent;
		uint256 uses;
		uint256 maxUses;
		mapping(address => bool) investors;
	}

	mapping(bytes32 => PromoCode) public promoCodes;

	constructor(Staff _staffContract) StaffUtil(_staffContract) public {
	}

	modifier onlyCrowdsale() {
		require(msg.sender == crowdsale);
		_;
	}

	function setCrowdsale(Crowdsale _crowdsale) external onlyOwner {
		require(crowdsale == address(0));
		require(_crowdsale.staffContract() == staffContract);
		crowdsale = _crowdsale;
	}

	function applyBonusAmount(address _investor, uint256 _purchasedAmount, bytes32 _promoCode) public onlyCrowdsale returns (uint256) {
		if (promoCodes[_promoCode].percent == 0
		|| promoCodes[_promoCode].investors[_investor]
		|| promoCodes[_promoCode].uses == promoCodes[_promoCode].maxUses) {
			return 0;
		}
		promoCodes[_promoCode].investors[_investor] = true;
		promoCodes[_promoCode].uses = promoCodes[_promoCode].uses + 1;
		emit PromoCodeUsed(_promoCode, _investor, now);
		return _purchasedAmount.mul(promoCodes[_promoCode].percent).div(100);
	}

	function calculateBonusAmount(address _investor, uint256 _purchasedAmount, bytes32 _promoCode) public constant returns (uint256) {
		if (promoCodes[_promoCode].percent == 0
		|| promoCodes[_promoCode].investors[_investor]
		|| promoCodes[_promoCode].uses == promoCodes[_promoCode].maxUses) {
			return 0;
		}
		return _purchasedAmount.mul(promoCodes[_promoCode].percent).div(100);
	}

	function addPromoCode(string _name, bytes32 _code, uint256 _maxUses, uint8 _percent) public onlyOwnerOrStaff {
		require(bytes(_name).length > 0);
		require(_code[0] != 0);
		require(_percent > 0 && _percent <= 100);
		require(_maxUses > 0);
		require(promoCodes[_code].percent == 0);

		promoCodes[_code].percent = _percent;
		promoCodes[_code].maxUses = _maxUses;

		emit PromoCodeAdded(_code, _name, _percent, _maxUses, now, msg.sender);
	}

	function removePromoCode(bytes32 _code) public onlyOwnerOrStaff {
		delete promoCodes[_code];
		emit PromoCodeRemoved(_code, now, msg.sender);
	}
}

contract Token is BurnableToken {
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[],"name":"resume","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_amount","type":"uint256"}],"name":"sendTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getState","outputs":[{"name":"boolArgs","type":"bool[2]"},{"name":"uint256Args","type":"uint256[18]"},{"name":"addressArgs","type":"address[6]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_investors","type":"address[]"}],"name":"bulkWhitelistInvestor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_investor","type":"address"}],"name":"getInvestorTokensPurchasesLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_purchaseId","type":"uint256"}],"name":"refundTokensPurchase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_date","type":"uint256"}],"name":"setEndDate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unlockBonusTokensClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenRate","type":"uint256"}],"name":"changeTokenRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_date","type":"uint256"}],"name":"setCrowdsaleStartDate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_promoCode","type":"bytes32"},{"name":"_referrer","type":"address"}],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"investors","outputs":[{"name":"status","type":"uint8"},{"name":"contributionInWei","type":"uint256"},{"name":"purchasedTokens","type":"uint256"},{"name":"bonusTokens","type":"uint256"},{"name":"referralTokens","type":"uint256"},{"name":"receivedTokens","type":"uint256"},{"name":"isBlockpass","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_investor","type":"address"}],"name":"isBlockpassInvestor","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_date","type":"uint256"}],"name":"lockPurchasedTokensClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"burnUnsoldTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_date","type":"uint256"}],"name":"lockBonusTokensClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"}],"name":"refundAllInvestorTokensPurchases","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_maxInvestorContributionInWei","type":"uint256"}],"name":"setMaxInvestorContributionInWei","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"setTokenContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"}],"name":"blockInvestor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unlockPurchasedTokensClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTokensForSaleCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_amount","type":"uint256"}],"name":"fitsTokensForSaleCap","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_isBlockpass","type":"bool"}],"name":"whitelistInvestor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getDistributedTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_minPurchaseInWei","type":"uint256"}],"name":"setMinPurchaseInWei","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_investor","type":"address"},{"name":"_purchaseId","type":"uint256"}],"name":"getInvestorTokensPurchase","outputs":[{"name":"value","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"bonus","type":"uint256"},{"name":"referrer","type":"address"},{"name":"referrerSentAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_investor","type":"address"}],"name":"getInvestorClaimedTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"staffContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"uint256Args","type":"uint256[11]"},{"name":"addressArgs","type":"address[5]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"investor","type":"address"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"InvestorWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"investor","type":"address"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"InvestorBlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"investor","type":"address"},{"indexed":true,"name":"purchaseId","type":"uint256"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"purchasedAmount","type":"uint256"},{"indexed":false,"name":"promoCodeAmount","type":"uint256"},{"indexed":false,"name":"discountPhaseAmount","type":"uint256"},{"indexed":false,"name":"discountStructAmount","type":"uint256"},{"indexed":true,"name":"referrer","type":"address"},{"indexed":false,"name":"referrerSentAmount","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"TokensPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"investor","type":"address"},{"indexed":true,"name":"purchaseId","type":"uint256"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"bonus","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"TokensPurchaseRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"Resumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"Finalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"investor","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"TokensSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"date","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"PurchasedTokensClaimLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"PurchasedTokensClaimUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"date","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"BonusTokensClaimLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"BonusTokensClaimUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"date","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"CrowdsaleStartDateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"date","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"EndDateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"minPurchaseInWei","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"MinPurchaseChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"maxInvestorContributionInWei","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"MaxInvestorContributionChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRate","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"TokenRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"investor","type":"address"},{"indexed":false,"name":"purchased","type":"uint256"},{"indexed":false,"name":"bonus","type":"uint256"},{"indexed":false,"name":"referral","type":"uint256"},{"indexed":false,"name":"received","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"byStaff","type":"address"}],"name":"TokensBurned","type":"event"}]

60806040523480156200001157600080fd5b50604051610200806200606b83398101806040528101908091908261016001919050508060046005811015156200004457fe5b60200201518073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620000ae57600080fd5b505af1158015620000c3573d6000803e3d6000fd5b505050506040513d6020811015620000da57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156200012557600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050816000600b811015156200017657fe5b6020020151600781905550816001600b811015156200019157fe5b6020020151600881905550816002600b81101515620001ac57fe5b6020020151600981905550816003600b81101515620001c757fe5b6020020151600a81905550816004600b81101515620001e257fe5b6020020151600b81905550816005600b81101515620001fd57fe5b6020020151600c81905550816006600b811015156200021857fe5b6020020151600d81905550816007600b811015156200023357fe5b6020020151600e81905550816008600b811015156200024e57fe5b6020020151601781905550816009600b811015156200026957fe5b602002015160188190555081600a600b811015156200028457fe5b60200201516006819055508060006005811015156200029f57fe5b6020020151600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806001600581101515620002f457fe5b6020020151600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060026005811015156200034957fe5b6020020151600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060036005811015156200039e57fe5b6020020151600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600854600754101515620003f657600080fd5b6009546008541015156200040957600080fd5b6000600a541115156200041b57600080fd5b6000600b541115156200042d57600080fd5b6000600c541115156200043f57600080fd5b600e54600d54111515156200045357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515620004b257600080fd5b5050615ba780620004c46000396000f300608060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063046f7da21461019b57806305ab421d146101b25780631865c57d146101ff57806319774b86146102b05780631b8689b6146102eb5780632405d03e146103425780633784f00014610382578063402c569c146103af57806348c54b9d146103c65780634bb278f3146103dd5780634fbe30d4146103f457806358892f631461042157806362d176cb1461044e5780636f7bc9be146104925780638456cb5914610525578063849ae5ea1461053c57806388a6cc5314610597578063940bb344146105c45780639c5c53b3146105db5780639f1aa40414610608578063b1afe96b1461063e578063bbcd5bbe1461066b578063bf947852146106ae578063c10b30c0146106f1578063d8788e6814610708578063da1a13ce14610733578063e6dff3b414610778578063f145ff23146107c7578063f77a490d146107f2578063f7b6302e1461081f578063fba52ff1146108c8578063fc28bc8f1461091f575b600080fd5b3480156101a757600080fd5b506101b0610976565b005b3480156101be57600080fd5b506101fd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b12565b005b34801561020b57600080fd5b50610214610de6565b6040518084600260200280838360005b8381101561023f578082015181840152602081019050610224565b5050505090500183601260200280838360005b8381101561026d578082015181840152602081019050610252565b5050505090500182600660200280838360005b8381101561029b578082015181840152602081019050610280565b50505050905001935050505060405180910390f35b3480156102bc57600080fd5b506102e96004803603810190808035906020019082018035906020019190919293919293905050506112bf565b005b3480156102f757600080fd5b5061032c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611711565b6040518082815260200191505060405180910390f35b610380600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611760565b005b34801561038e57600080fd5b506103ad6004803603810190808035906020019092919050505061192b565b005b3480156103bb57600080fd5b506103c4611aa1565b005b3480156103d257600080fd5b506103db611c0e565b005b3480156103e957600080fd5b506103f26123a3565b005b34801561040057600080fd5b5061041f60048036038101908080359060200190929190505050612540565b005b34801561042d57600080fd5b5061044c600480360381019080803590602001909291905050506126c5565b005b6104906004803603810190808035600019169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061283b565b005b34801561049e57600080fd5b506104d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613352565b604051808860028111156104e357fe5b60ff1681526020018781526020018681526020018581526020018481526020018381526020018215151515815260200197505050505050505060405180910390f35b34801561053157600080fd5b5061053a6133ae565b005b34801561054857600080fd5b5061057d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061354b565b604051808215151515815260200191505060405180910390f35b3480156105a357600080fd5b506105c260048036038101908080359060200190929190505050613615565b005b3480156105d057600080fd5b506105d9613799565b005b3480156105e757600080fd5b5061060660048036038101908080359060200190929190505050613b4e565b005b61063c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613cd2565b005b34801561064a57600080fd5b5061066960048036038101908080359060200190929190505050613f4f565b005b34801561067757600080fd5b506106ac600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140d6565b005b3480156106ba57600080fd5b506106ef600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614391565b005b3480156106fd57600080fd5b50610706614721565b005b34801561071457600080fd5b5061071d61488e565b6040518082815260200191505060405180910390f35b34801561073f57600080fd5b5061075e600480360381019080803590602001909291905050506149ef565b604051808215151515815260200191505060405180910390f35b34801561078457600080fd5b506107c5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050614a1c565b005b3480156107d357600080fd5b506107dc614e08565b6040518082815260200191505060405180910390f35b3480156107fe57600080fd5b5061081d60048036038101908080359060200190929190505050614e76565b005b34801561082b57600080fd5b5061086a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614fec565b604051808681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019550505050505060405180910390f35b3480156108d457600080fd5b50610909600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061520d565b6040518082815260200191505060405180910390f35b34801561092b57600080fd5b5061093461536f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156109fb57600080fd5b505af1158015610a0f573d6000803e3d6000fd5b505050506040513d6020811015610a2557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a6f57600080fd5b600f60009054906101000a900460ff161515610a8a57600080fd5b6000600f60006101000a81548160ff0219169083151502179055507f490ab76e218d505b9e8a136d5a870256b54ab04501417ab228038e5bad7b9d7f4233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610b9757600080fd5b505af1158015610bab573d6000803e3d6000fd5b505050506040513d6020811015610bc157600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c0b57600080fd5b60016002811115610c1857fe5b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff166002811115610c7357fe5b141515610c7f57600080fd5b600081111515610c8e57600080fd5b610c97816149ef565b1515610ca257600080fd5b610cb78160135461539490919063ffffffff16565b601381905550610d1281601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005015461539490919063ffffffff16565b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501819055508173ffffffffffffffffffffffffffffffffffffffff167fd3c40054bd326e5fd2b4b12581c795337e5bd017d02ba0ee8d465a1908192f29824233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a25050565b610dee615a88565b610df6615aaa565b610dfe615ace565b600f60009054906101000a900460ff16836000600281101515610e1d57fe5b602002019015159081151581525050600f60019054906101000a900460ff16836001600281101515610e4b57fe5b602002019015159081151581525050601054826000601281101515610e6c57fe5b602002018181525050601154826001601281101515610e8757fe5b602002018181525050601254826002601281101515610ea257fe5b602002018181525050601354826003601281101515610ebd57fe5b602002018181525050601454826004601281101515610ed857fe5b602002018181525050601554826005601281101515610ef357fe5b602002018181525050601654826006601281101515610f0e57fe5b602002018181525050601754826007601281101515610f2957fe5b602002018181525050601854826008601281101515610f4457fe5b602002018181525050600754826009601281101515610f5f57fe5b60200201818152505060085482600a601281101515610f7a57fe5b60200201818152505060095482600b601281101515610f9557fe5b602002018181525050600b5482600c601281101515610fb057fe5b602002018181525050600a5482600d601281101515610fcb57fe5b602002018181525050600d5482600e601281101515610fe657fe5b602002018181525050600e5482600f60128110151561100157fe5b60200201818152505060065482601060128110151561101c57fe5b60200201818152505061102d61488e565b82601160128110151561103c57fe5b6020020181815250506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600060068110151561107657fe5b602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160016006811015156110df57fe5b602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600260068110151561114857fe5b602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160036006811015156111b157fe5b602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600460068110151561121a57fe5b602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600560068110151561128357fe5b602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050909192565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561134657600080fd5b505af115801561135a573d6000803e3d6000fd5b505050506040513d602081101561137057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114ad57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb510e97336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561147157600080fd5b505af1158015611485573d6000803e3d6000fd5b505050506040513d602081101561149b57600080fd5b81019080805190602001909291905050505b15156114b857600080fd5b600090505b8282905081101561170c57600073ffffffffffffffffffffffffffffffffffffffff1683838381811015156114ee57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156115bf57506001600281111561153757fe5b60196000858585818110151561154957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660028111156115bc57fe5b14155b156116ff5760016019600085858581811015156115d857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff0219169083600281111561164d57fe5b0217905550828282818110151561166057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f3509177794e00c65265df4c5b6a0c5cf142d9e3021a0a397a5620a73414e2f7a4233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a25b80806001019150506114bd565b505050565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601805490509050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156117e557600080fd5b505af11580156117f9573d6000803e3d6000fd5b505050506040513d602081101561180f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185957600080fd5b60003411151561186857600080fd5b34601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601828154811015156118b857fe5b9060005260206000209060050201600001541415156118d657600080fd5b6118e082826153b0565b8173ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611926573d6000803e3d6000fd5b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050506040513d60208110156119da57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a2457600080fd5b806009819055507fe28cfe2e1b94373136608c61f70b8e8203e14619c7a19792a5fe49da626e1fe2814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611b2657600080fd5b505af1158015611b3a573d6000803e3d6000fd5b505050506040513d6020811015611b5057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b9a57600080fd5b426018819055507f3d89cb8147c619804a6060c308dbd3435963a2f6380e97e07924b08686ee045b4233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1565b600080600080600080600080600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611c7857600080fd5b600f60009054906101000a900460ff16151515611c9457600080fd5b60016002811115611ca157fe5b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff166002811115611cfc57fe5b141515611d0857600080fd5b426017541080611d19575042601854105b1515611d2457600080fd5b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549350601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050154925042601754108015611dca57506000841180611dc95750600083115b5b15612045576000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050181905550611ebc8460145461539490919063ffffffff16565b601481905550611ed78360165461539490919063ffffffff16565b601681905550601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206006016000611f2b9190615af1565b839750829650600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33611f83868861539490919063ffffffff16565b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561200857600080fd5b505af115801561201c573d6000803e3d6000fd5b505050506040513d602081101561203257600080fd5b8101908080519060200190929190505050505b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301549150601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401549050426018541080156120eb575060008211806120ea5750600081115b5b156122c7576000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055506000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055506121a7816121998460155461539490919063ffffffff16565b61539490919063ffffffff16565b601581905550819550809450600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33612205848661539490919063ffffffff16565b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561228a57600080fd5b505af115801561229e573d6000803e3d6000fd5b505050506040513d60208110156122b457600080fd5b8101908080519060200190929190505050505b60008811806122d65750600086115b806122e15750600085115b806122ec5750600087115b15156122f757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f672f8e810c868df9db1220f2ddbce74c6f083daaf154571adf351b96c7f39f1c8988888b4233604051808781526020018681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001965050505050505060405180910390a25050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561242857600080fd5b505af115801561243c573d6000803e3d6000fd5b505050506040513d602081101561245257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561249c57600080fd5b600f60019054906101000a900460ff161515156124b857600080fd5b6001600f60016101000a81548160ff0219169083151502179055507f7b1990f6546bb8c366883c6dbadda7cbb52114d60570d3f7ab226e6a59f35bf24233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156125c557600080fd5b505af11580156125d9573d6000803e3d6000fd5b505050506040513d60208110156125ef57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561263957600080fd5b60008111151561264857600080fd5b80600b819055507f4af0eec0abbd1182ad9447250b6ee4cf8c99a957f0633f741d3404b12445e793814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561274a57600080fd5b505af115801561275e573d6000803e3d6000fd5b505050506040513d602081101561277457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127be57600080fd5b806008819055507fbe1ecb35a50c219fe6a31c598812ef3aa097498ab1139d73f926eed4485ed74e814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b600080600080600080600080600f60019054906101000a900460ff1615151561286357600080fd5b600f60009054906101000a900460ff1615151561287f57600080fd5b4260075410151561288f57600080fd5b6001600281111561289c57fe5b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660028111156128f757fe5b14151561290357600080fd5b60003411151561291257600080fd5b600d54341015151561292357600080fd5b600e5461297b34601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461539490919063ffffffff16565b1115151561298857600080fd5b6012600a5411156129c9576129c26012600a5403600a0a6129b4600b5434615a2190919063ffffffff16565b615a2190919063ffffffff16565b9750612a23565b6012600a541015612a0a57612a03600a54601203600a0a6129f5600b5434615a2190919063ffffffff16565b615a5990919063ffffffff16565b9750612a22565b612a1f600b5434615a2190919063ffffffff16565b97505b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f60bb7c338a8d6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182600019166000191681526020019350505050602060405180830381600087803b158015612af857600080fd5b505af1158015612b0c573d6000803e3d6000fd5b505050506040513d6020811015612b2257600080fd5b81019080805190602001909291905050509650600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166381807a07896040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015612bc657600080fd5b505af1158015612bda573d6000803e3d6000fd5b505050506040513d6020811015612bf057600080fd5b81019080805190602001909291905050509550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379544754338a346040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050602060405180830381600087803b158015612cd057600080fd5b505af1158015612ce4573d6000803e3d6000fd5b505050506040513d6020811015612cfa57600080fd5b81019080805190602001909291905050509450612d3285612d24888a61539490919063ffffffff16565b61539490919063ffffffff16565b9350600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614158015612d9d57508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b8015612e0e575060016002811115612db157fe5b601960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff166002811115612e0c57fe5b145b15612e2a5760646006548902811515612e2357fe5b0492508891505b612e57612e5284612e44878c61539490919063ffffffff16565b61539490919063ffffffff16565b6149ef565b1515612e6257600080fd5b612e773460105461539490919063ffffffff16565b601081905550612e928860115461539490919063ffffffff16565b601181905550612ebf83612eb18660125461539490919063ffffffff16565b61539490919063ffffffff16565b601281905550612f1a83601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004015461539490919063ffffffff16565b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550612fb588601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461539490919063ffffffff16565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555061305084601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015461539490919063ffffffff16565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055506130eb34601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461539490919063ffffffff16565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060160a0604051908101604052803481526020018a81526020018681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001858152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040155505090508173ffffffffffffffffffffffffffffffffffffffff16600182033373ffffffffffffffffffffffffffffffffffffffff167fef3d6d6d0ea8ba9300747aa0f361a2992894dc03d65ac83213c717e72e27a1ef348c8c8c8c8b426040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390a4600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620493e034604051600060405180830381858888f19350505050151561334657600080fd5b50505050505050505050565b60196020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154908060050154908060070160009054906101000a900460ff16905087565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561343357600080fd5b505af1158015613447573d6000803e3d6000fd5b505050506040513d602081101561345d57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156134a757600080fd5b600f60009054906101000a900460ff161515156134c357600080fd5b6001600f60006101000a81548160ff0219169083151502179055507fabdb1c9133626eb4f8c5f2ec7e3c60a969a2fb148a0c341a3cf6597242c8f8f54233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1565b60006001600281111561355a57fe5b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660028111156135b557fe5b14801561360e5750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060070160009054906101000a900460ff165b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561369a57600080fd5b505af11580156136ae573d6000803e3d6000fd5b505050506040513d60208110156136c457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561370e57600080fd5b428111151561371c57600080fd5b806017819055507f7648ba44639b7ab89cdbb62e628e221704d6aa3ff587a7deab59c9498416e8b8814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561382057600080fd5b505af1158015613834573d6000803e3d6000fd5b505050506040513d602081101561384a57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561389457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156138f257600080fd5b600f60019054906101000a900460ff16151561390d57600080fd5b613a1e613918614e08565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156139d557600080fd5b505af11580156139e9573d6000803e3d6000fd5b505050506040513d60208110156139ff57600080fd5b8101908080519060200190929190505050615a6f90919063ffffffff16565b9050600081111515613a2f57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015613ac057600080fd5b505af1158015613ad4573d6000803e3d6000fd5b505050507f8b70448d0d143d815676e1088155bf2ff4436b50d76b30ff3a1fe29290892702814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015613bd357600080fd5b505af1158015613be7573d6000803e3d6000fd5b505050506040513d6020811015613bfd57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613c4757600080fd5b4281111515613c5557600080fd5b806018819055507fa667cd41d8e409b2374eebb8f825d13697caa4a36ca428d4a7e90629264cc55d814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015613d5957600080fd5b505af1158015613d6d573d6000803e3d6000fd5b505050506040513d6020811015613d8357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613dcd57600080fd5b600034111515613ddc57600080fd5b34601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154141515613e2c57600080fd5b600090505b601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060180549050811015613f04576000601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060182815481101515613ecf57fe5b9060005260206000209060050201600001541415613eec57613ef7565b613ef682826153b0565b5b8080600101915050613e31565b8173ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015613f4a573d6000803e3d6000fd5b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015613fd457600080fd5b505af1158015613fe8573d6000803e3d6000fd5b505050506040513d6020811015613ffe57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561404857600080fd5b80600d541115151561405957600080fd5b80600e819055507ff3349592c7075475a7bfac0ff983fd3578ba58576163a6d9efbb076c8cdca5c3814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561415b57600080fd5b505af115801561416f573d6000803e3d6000fd5b505050506040513d602081101561418557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156141cf57600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561426c57600080fd5b505af1158015614280573d6000803e3d6000fd5b505050506040513d602081101561429657600080fd5b8101908080519060200190929190505050101515156142b457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561431157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561434d57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561441657600080fd5b505af115801561442a573d6000803e3d6000fd5b505050506040513d602081101561444057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061457d57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb510e97336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561454157600080fd5b505af1158015614555573d6000803e3d6000fd5b505050506040513d602081101561456b57600080fd5b81019080805190602001909291905050505b151561458857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156145c457600080fd5b6002808111156145d057fe5b601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16600281111561462b57fe5b1415151561463857600080fd5b6002601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff0219169083600281111561469757fe5b02179055508073ffffffffffffffffffffffffffffffffffffffff167f76e0fccc7f70bf85fadd5ab0f16d5abb18e41895621f9dd690f4b119972a549c4233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156147a657600080fd5b505af11580156147ba573d6000803e3d6000fd5b505050506040513d60208110156147d057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561481a57600080fd5b426017819055507f482d291cc9bcc4fe712bd6259a0b4589012ac8ede2f1ad9bb06ecfcb81d453ed4233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1565b60008073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156149e657600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156149a457600080fd5b505af11580156149b8573d6000803e3d6000fd5b505050506040513d60208110156149ce57600080fd5b810190808051906020019092919050505090506149ec565b600c5490505b90565b60006149f961488e565b614a1383614a05614e08565b61539490919063ffffffff16565b11159050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015614aa157600080fd5b505af1158015614ab5573d6000803e3d6000fd5b505050506040513d6020811015614acb57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614c0857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb510e97336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015614bcc57600080fd5b505af1158015614be0573d6000803e3d6000fd5b505050506040513d6020811015614bf657600080fd5b81019080805190602001909291905050505b1515614c1357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614c4f57600080fd5b60016002811115614c5c57fe5b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff166002811115614cb757fe5b14151515614cc457600080fd5b6001601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff02191690836002811115614d2357fe5b021790555080601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060070160006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f3509177794e00c65265df4c5b6a0c5cf142d9e3021a0a397a5620a73414e2f7a4233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a25050565b6000614e71614e24601654601354615a6f90919063ffffffff16565b614e63614e3e601554601254615a6f90919063ffffffff16565b614e55601454601154615a6f90919063ffffffff16565b61539490919063ffffffff16565b61539490919063ffffffff16565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015614efb57600080fd5b505af1158015614f0f573d6000803e3d6000fd5b505050506040513d6020811015614f2557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614f6f57600080fd5b80600d819055507fa59af5a909ead6260a2d961d1c53f1895d9dceb6133740eedb4d7a3ea2e16f5d814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b6000806000806000601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206006018681548110151561504357fe5b9060005260206000209060050201600001549450601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601868154811015156150a657fe5b9060005260206000209060050201600101549350601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206006018681548110151561510957fe5b9060005260206000209060050201600201549250601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206006018681548110151561516c57fe5b906000526020600020906005020160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601868154811015156151ef57fe5b90600052602060002090600502016004015490509295509295909350565b60008073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561536557600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561532357600080fd5b505af1158015615337573d6000803e3d6000fd5b505050506040513d602081101561534d57600080fd5b8101908080519060200190929190505050905061536a565b600090505b919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081830190508281101515156153a757fe5b80905092915050565b6000806000806000601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206006018681548110151561540757fe5b906000526020600020906005020160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169450600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614151561558b57601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601868154811015156154c057fe5b906000526020600020906005020160040154935061552984601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040154615a6f90919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004018190555061558484601254615a6f90919063ffffffff16565b6012819055505b601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601868154811015156155da57fe5b906000526020600020906005020160000154925061564383601960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154615a6f90919063ffffffff16565b601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601868154811015156156d857fe5b906000526020600020906005020160010154915061574182601960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154615a6f90919063ffffffff16565b601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601868154811015156157d657fe5b906000526020600020906005020160020154905061583f81601960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154615a6f90919063ffffffff16565b601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018190555061589a83601054615a6f90919063ffffffff16565b6010819055506158b582601154615a6f90919063ffffffff16565b6011819055506158d081601254615a6f90919063ffffffff16565b601281905550601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206006018681548110151561592557fe5b9060005260206000209060050201600080820160009055600182016000905560028201600090556003820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560048201600090555050858773ffffffffffffffffffffffffffffffffffffffff167f522643e7c0d923fb5b41ba10ddd84d7c7e895d6dc89a4b62831989ff97edb1ab8585854233604051808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a350505050505050565b600080831415615a345760009050615a53565b8183029050818382811515615a4557fe5b04141515615a4f57fe5b8090505b92915050565b60008183811515615a6657fe5b04905092915050565b6000828211151515615a7d57fe5b818303905092915050565b6040805190810160405280600290602082028038833980820191505090505090565b61024060405190810160405280601290602082028038833980820191505090505090565b60c060405190810160405280600690602082028038833980820191505090505090565b5080546000825560050290600052602060002090810190615b129190615b15565b50565b615b7891905b80821115615b7457600080820160009055600182016000905560028201600090556003820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600482016000905550600501615b1b565b5090565b905600a165627a7a7230582067cea39879a7251a16ca0a7290955d7129c4c454a363ce6bb8a887737d32823c0029000000000000000000000000000000000000000000000000000000005bb1637f000000000000000000000000000000000000000000000000000000005bb16380000000000000000000000000000000000000000000000000000000005d929700000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000033b2e3c9fd0803ce8000000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000b4851a245d522b2562a0562162fc4a57f419a7e900000000000000000000000065732d6e88a83a38a4b803b0181b3a03a416537300000000000000000000000037cbd2e72c9ba7909ca198bb839c119917cba05c000000000000000000000000ae2148f680e14cfeffbd067fe574e9825a6ddb610000000000000000000000003525ac6cc8c673d74bcd94a4c005c9301fad135b

Deployed Bytecode

0x608060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063046f7da21461019b57806305ab421d146101b25780631865c57d146101ff57806319774b86146102b05780631b8689b6146102eb5780632405d03e146103425780633784f00014610382578063402c569c146103af57806348c54b9d146103c65780634bb278f3146103dd5780634fbe30d4146103f457806358892f631461042157806362d176cb1461044e5780636f7bc9be146104925780638456cb5914610525578063849ae5ea1461053c57806388a6cc5314610597578063940bb344146105c45780639c5c53b3146105db5780639f1aa40414610608578063b1afe96b1461063e578063bbcd5bbe1461066b578063bf947852146106ae578063c10b30c0146106f1578063d8788e6814610708578063da1a13ce14610733578063e6dff3b414610778578063f145ff23146107c7578063f77a490d146107f2578063f7b6302e1461081f578063fba52ff1146108c8578063fc28bc8f1461091f575b600080fd5b3480156101a757600080fd5b506101b0610976565b005b3480156101be57600080fd5b506101fd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b12565b005b34801561020b57600080fd5b50610214610de6565b6040518084600260200280838360005b8381101561023f578082015181840152602081019050610224565b5050505090500183601260200280838360005b8381101561026d578082015181840152602081019050610252565b5050505090500182600660200280838360005b8381101561029b578082015181840152602081019050610280565b50505050905001935050505060405180910390f35b3480156102bc57600080fd5b506102e96004803603810190808035906020019082018035906020019190919293919293905050506112bf565b005b3480156102f757600080fd5b5061032c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611711565b6040518082815260200191505060405180910390f35b610380600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611760565b005b34801561038e57600080fd5b506103ad6004803603810190808035906020019092919050505061192b565b005b3480156103bb57600080fd5b506103c4611aa1565b005b3480156103d257600080fd5b506103db611c0e565b005b3480156103e957600080fd5b506103f26123a3565b005b34801561040057600080fd5b5061041f60048036038101908080359060200190929190505050612540565b005b34801561042d57600080fd5b5061044c600480360381019080803590602001909291905050506126c5565b005b6104906004803603810190808035600019169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061283b565b005b34801561049e57600080fd5b506104d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613352565b604051808860028111156104e357fe5b60ff1681526020018781526020018681526020018581526020018481526020018381526020018215151515815260200197505050505050505060405180910390f35b34801561053157600080fd5b5061053a6133ae565b005b34801561054857600080fd5b5061057d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061354b565b604051808215151515815260200191505060405180910390f35b3480156105a357600080fd5b506105c260048036038101908080359060200190929190505050613615565b005b3480156105d057600080fd5b506105d9613799565b005b3480156105e757600080fd5b5061060660048036038101908080359060200190929190505050613b4e565b005b61063c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613cd2565b005b34801561064a57600080fd5b5061066960048036038101908080359060200190929190505050613f4f565b005b34801561067757600080fd5b506106ac600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140d6565b005b3480156106ba57600080fd5b506106ef600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614391565b005b3480156106fd57600080fd5b50610706614721565b005b34801561071457600080fd5b5061071d61488e565b6040518082815260200191505060405180910390f35b34801561073f57600080fd5b5061075e600480360381019080803590602001909291905050506149ef565b604051808215151515815260200191505060405180910390f35b34801561078457600080fd5b506107c5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050614a1c565b005b3480156107d357600080fd5b506107dc614e08565b6040518082815260200191505060405180910390f35b3480156107fe57600080fd5b5061081d60048036038101908080359060200190929190505050614e76565b005b34801561082b57600080fd5b5061086a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614fec565b604051808681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019550505050505060405180910390f35b3480156108d457600080fd5b50610909600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061520d565b6040518082815260200191505060405180910390f35b34801561092b57600080fd5b5061093461536f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156109fb57600080fd5b505af1158015610a0f573d6000803e3d6000fd5b505050506040513d6020811015610a2557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a6f57600080fd5b600f60009054906101000a900460ff161515610a8a57600080fd5b6000600f60006101000a81548160ff0219169083151502179055507f490ab76e218d505b9e8a136d5a870256b54ab04501417ab228038e5bad7b9d7f4233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610b9757600080fd5b505af1158015610bab573d6000803e3d6000fd5b505050506040513d6020811015610bc157600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c0b57600080fd5b60016002811115610c1857fe5b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff166002811115610c7357fe5b141515610c7f57600080fd5b600081111515610c8e57600080fd5b610c97816149ef565b1515610ca257600080fd5b610cb78160135461539490919063ffffffff16565b601381905550610d1281601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005015461539490919063ffffffff16565b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600501819055508173ffffffffffffffffffffffffffffffffffffffff167fd3c40054bd326e5fd2b4b12581c795337e5bd017d02ba0ee8d465a1908192f29824233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a25050565b610dee615a88565b610df6615aaa565b610dfe615ace565b600f60009054906101000a900460ff16836000600281101515610e1d57fe5b602002019015159081151581525050600f60019054906101000a900460ff16836001600281101515610e4b57fe5b602002019015159081151581525050601054826000601281101515610e6c57fe5b602002018181525050601154826001601281101515610e8757fe5b602002018181525050601254826002601281101515610ea257fe5b602002018181525050601354826003601281101515610ebd57fe5b602002018181525050601454826004601281101515610ed857fe5b602002018181525050601554826005601281101515610ef357fe5b602002018181525050601654826006601281101515610f0e57fe5b602002018181525050601754826007601281101515610f2957fe5b602002018181525050601854826008601281101515610f4457fe5b602002018181525050600754826009601281101515610f5f57fe5b60200201818152505060085482600a601281101515610f7a57fe5b60200201818152505060095482600b601281101515610f9557fe5b602002018181525050600b5482600c601281101515610fb057fe5b602002018181525050600a5482600d601281101515610fcb57fe5b602002018181525050600d5482600e601281101515610fe657fe5b602002018181525050600e5482600f60128110151561100157fe5b60200201818152505060065482601060128110151561101c57fe5b60200201818152505061102d61488e565b82601160128110151561103c57fe5b6020020181815250506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600060068110151561107657fe5b602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160016006811015156110df57fe5b602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600260068110151561114857fe5b602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160036006811015156111b157fe5b602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600460068110151561121a57fe5b602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600560068110151561128357fe5b602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050909192565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561134657600080fd5b505af115801561135a573d6000803e3d6000fd5b505050506040513d602081101561137057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114ad57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb510e97336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561147157600080fd5b505af1158015611485573d6000803e3d6000fd5b505050506040513d602081101561149b57600080fd5b81019080805190602001909291905050505b15156114b857600080fd5b600090505b8282905081101561170c57600073ffffffffffffffffffffffffffffffffffffffff1683838381811015156114ee57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156115bf57506001600281111561153757fe5b60196000858585818110151561154957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660028111156115bc57fe5b14155b156116ff5760016019600085858581811015156115d857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff0219169083600281111561164d57fe5b0217905550828282818110151561166057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f3509177794e00c65265df4c5b6a0c5cf142d9e3021a0a397a5620a73414e2f7a4233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a25b80806001019150506114bd565b505050565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601805490509050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156117e557600080fd5b505af11580156117f9573d6000803e3d6000fd5b505050506040513d602081101561180f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185957600080fd5b60003411151561186857600080fd5b34601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601828154811015156118b857fe5b9060005260206000209060050201600001541415156118d657600080fd5b6118e082826153b0565b8173ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611926573d6000803e3d6000fd5b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050506040513d60208110156119da57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a2457600080fd5b806009819055507fe28cfe2e1b94373136608c61f70b8e8203e14619c7a19792a5fe49da626e1fe2814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611b2657600080fd5b505af1158015611b3a573d6000803e3d6000fd5b505050506040513d6020811015611b5057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b9a57600080fd5b426018819055507f3d89cb8147c619804a6060c308dbd3435963a2f6380e97e07924b08686ee045b4233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1565b600080600080600080600080600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611c7857600080fd5b600f60009054906101000a900460ff16151515611c9457600080fd5b60016002811115611ca157fe5b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff166002811115611cfc57fe5b141515611d0857600080fd5b426017541080611d19575042601854105b1515611d2457600080fd5b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549350601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050154925042601754108015611dca57506000841180611dc95750600083115b5b15612045576000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050181905550611ebc8460145461539490919063ffffffff16565b601481905550611ed78360165461539490919063ffffffff16565b601681905550601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206006016000611f2b9190615af1565b839750829650600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33611f83868861539490919063ffffffff16565b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561200857600080fd5b505af115801561201c573d6000803e3d6000fd5b505050506040513d602081101561203257600080fd5b8101908080519060200190929190505050505b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301549150601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401549050426018541080156120eb575060008211806120ea5750600081115b5b156122c7576000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055506000601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600401819055506121a7816121998460155461539490919063ffffffff16565b61539490919063ffffffff16565b601581905550819550809450600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33612205848661539490919063ffffffff16565b6040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561228a57600080fd5b505af115801561229e573d6000803e3d6000fd5b505050506040513d60208110156122b457600080fd5b8101908080519060200190929190505050505b60008811806122d65750600086115b806122e15750600085115b806122ec5750600087115b15156122f757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f672f8e810c868df9db1220f2ddbce74c6f083daaf154571adf351b96c7f39f1c8988888b4233604051808781526020018681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001965050505050505060405180910390a25050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561242857600080fd5b505af115801561243c573d6000803e3d6000fd5b505050506040513d602081101561245257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561249c57600080fd5b600f60019054906101000a900460ff161515156124b857600080fd5b6001600f60016101000a81548160ff0219169083151502179055507f7b1990f6546bb8c366883c6dbadda7cbb52114d60570d3f7ab226e6a59f35bf24233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156125c557600080fd5b505af11580156125d9573d6000803e3d6000fd5b505050506040513d60208110156125ef57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561263957600080fd5b60008111151561264857600080fd5b80600b819055507f4af0eec0abbd1182ad9447250b6ee4cf8c99a957f0633f741d3404b12445e793814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561274a57600080fd5b505af115801561275e573d6000803e3d6000fd5b505050506040513d602081101561277457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127be57600080fd5b806008819055507fbe1ecb35a50c219fe6a31c598812ef3aa097498ab1139d73f926eed4485ed74e814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b600080600080600080600080600f60019054906101000a900460ff1615151561286357600080fd5b600f60009054906101000a900460ff1615151561287f57600080fd5b4260075410151561288f57600080fd5b6001600281111561289c57fe5b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660028111156128f757fe5b14151561290357600080fd5b60003411151561291257600080fd5b600d54341015151561292357600080fd5b600e5461297b34601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461539490919063ffffffff16565b1115151561298857600080fd5b6012600a5411156129c9576129c26012600a5403600a0a6129b4600b5434615a2190919063ffffffff16565b615a2190919063ffffffff16565b9750612a23565b6012600a541015612a0a57612a03600a54601203600a0a6129f5600b5434615a2190919063ffffffff16565b615a5990919063ffffffff16565b9750612a22565b612a1f600b5434615a2190919063ffffffff16565b97505b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637f60bb7c338a8d6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182600019166000191681526020019350505050602060405180830381600087803b158015612af857600080fd5b505af1158015612b0c573d6000803e3d6000fd5b505050506040513d6020811015612b2257600080fd5b81019080805190602001909291905050509650600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166381807a07896040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015612bc657600080fd5b505af1158015612bda573d6000803e3d6000fd5b505050506040513d6020811015612bf057600080fd5b81019080805190602001909291905050509550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379544754338a346040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050602060405180830381600087803b158015612cd057600080fd5b505af1158015612ce4573d6000803e3d6000fd5b505050506040513d6020811015612cfa57600080fd5b81019080805190602001909291905050509450612d3285612d24888a61539490919063ffffffff16565b61539490919063ffffffff16565b9350600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614158015612d9d57508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b8015612e0e575060016002811115612db157fe5b601960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff166002811115612e0c57fe5b145b15612e2a5760646006548902811515612e2357fe5b0492508891505b612e57612e5284612e44878c61539490919063ffffffff16565b61539490919063ffffffff16565b6149ef565b1515612e6257600080fd5b612e773460105461539490919063ffffffff16565b601081905550612e928860115461539490919063ffffffff16565b601181905550612ebf83612eb18660125461539490919063ffffffff16565b61539490919063ffffffff16565b601281905550612f1a83601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004015461539490919063ffffffff16565b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040181905550612fb588601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461539490919063ffffffff16565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555061305084601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015461539490919063ffffffff16565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055506130eb34601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015461539490919063ffffffff16565b601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060160a0604051908101604052803481526020018a81526020018681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001858152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060808201518160040155505090508173ffffffffffffffffffffffffffffffffffffffff16600182033373ffffffffffffffffffffffffffffffffffffffff167fef3d6d6d0ea8ba9300747aa0f361a2992894dc03d65ac83213c717e72e27a1ef348c8c8c8c8b426040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390a4600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620493e034604051600060405180830381858888f19350505050151561334657600080fd5b50505050505050505050565b60196020528060005260406000206000915090508060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154908060050154908060070160009054906101000a900460ff16905087565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561343357600080fd5b505af1158015613447573d6000803e3d6000fd5b505050506040513d602081101561345d57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156134a757600080fd5b600f60009054906101000a900460ff161515156134c357600080fd5b6001600f60006101000a81548160ff0219169083151502179055507fabdb1c9133626eb4f8c5f2ec7e3c60a969a2fb148a0c341a3cf6597242c8f8f54233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1565b60006001600281111561355a57fe5b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff1660028111156135b557fe5b14801561360e5750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060070160009054906101000a900460ff165b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561369a57600080fd5b505af11580156136ae573d6000803e3d6000fd5b505050506040513d60208110156136c457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561370e57600080fd5b428111151561371c57600080fd5b806017819055507f7648ba44639b7ab89cdbb62e628e221704d6aa3ff587a7deab59c9498416e8b8814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561382057600080fd5b505af1158015613834573d6000803e3d6000fd5b505050506040513d602081101561384a57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561389457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156138f257600080fd5b600f60019054906101000a900460ff16151561390d57600080fd5b613a1e613918614e08565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156139d557600080fd5b505af11580156139e9573d6000803e3d6000fd5b505050506040513d60208110156139ff57600080fd5b8101908080519060200190929190505050615a6f90919063ffffffff16565b9050600081111515613a2f57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68826040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015613ac057600080fd5b505af1158015613ad4573d6000803e3d6000fd5b505050507f8b70448d0d143d815676e1088155bf2ff4436b50d76b30ff3a1fe29290892702814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015613bd357600080fd5b505af1158015613be7573d6000803e3d6000fd5b505050506040513d6020811015613bfd57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613c4757600080fd5b4281111515613c5557600080fd5b806018819055507fa667cd41d8e409b2374eebb8f825d13697caa4a36ca428d4a7e90629264cc55d814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015613d5957600080fd5b505af1158015613d6d573d6000803e3d6000fd5b505050506040513d6020811015613d8357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613dcd57600080fd5b600034111515613ddc57600080fd5b34601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154141515613e2c57600080fd5b600090505b601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060180549050811015613f04576000601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060182815481101515613ecf57fe5b9060005260206000209060050201600001541415613eec57613ef7565b613ef682826153b0565b5b8080600101915050613e31565b8173ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015613f4a573d6000803e3d6000fd5b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015613fd457600080fd5b505af1158015613fe8573d6000803e3d6000fd5b505050506040513d6020811015613ffe57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561404857600080fd5b80600d541115151561405957600080fd5b80600e819055507ff3349592c7075475a7bfac0ff983fd3578ba58576163a6d9efbb076c8cdca5c3814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561415b57600080fd5b505af115801561416f573d6000803e3d6000fd5b505050506040513d602081101561418557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156141cf57600080fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561426c57600080fd5b505af1158015614280573d6000803e3d6000fd5b505050506040513d602081101561429657600080fd5b8101908080519060200190929190505050101515156142b457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561431157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561434d57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561441657600080fd5b505af115801561442a573d6000803e3d6000fd5b505050506040513d602081101561444057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061457d57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb510e97336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561454157600080fd5b505af1158015614555573d6000803e3d6000fd5b505050506040513d602081101561456b57600080fd5b81019080805190602001909291905050505b151561458857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156145c457600080fd5b6002808111156145d057fe5b601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff16600281111561462b57fe5b1415151561463857600080fd5b6002601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff0219169083600281111561469757fe5b02179055508073ffffffffffffffffffffffffffffffffffffffff167f76e0fccc7f70bf85fadd5ab0f16d5abb18e41895621f9dd690f4b119972a549c4233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156147a657600080fd5b505af11580156147ba573d6000803e3d6000fd5b505050506040513d60208110156147d057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561481a57600080fd5b426017819055507f482d291cc9bcc4fe712bd6259a0b4589012ac8ede2f1ad9bb06ecfcb81d453ed4233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1565b60008073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156149e657600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156149a457600080fd5b505af11580156149b8573d6000803e3d6000fd5b505050506040513d60208110156149ce57600080fd5b810190808051906020019092919050505090506149ec565b600c5490505b90565b60006149f961488e565b614a1383614a05614e08565b61539490919063ffffffff16565b11159050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015614aa157600080fd5b505af1158015614ab5573d6000803e3d6000fd5b505050506040513d6020811015614acb57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614c0857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb510e97336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015614bcc57600080fd5b505af1158015614be0573d6000803e3d6000fd5b505050506040513d6020811015614bf657600080fd5b81019080805190602001909291905050505b1515614c1357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614c4f57600080fd5b60016002811115614c5c57fe5b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900460ff166002811115614cb757fe5b14151515614cc457600080fd5b6001601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548160ff02191690836002811115614d2357fe5b021790555080601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060070160006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f3509177794e00c65265df4c5b6a0c5cf142d9e3021a0a397a5620a73414e2f7a4233604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a25050565b6000614e71614e24601654601354615a6f90919063ffffffff16565b614e63614e3e601554601254615a6f90919063ffffffff16565b614e55601454601154615a6f90919063ffffffff16565b61539490919063ffffffff16565b61539490919063ffffffff16565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015614efb57600080fd5b505af1158015614f0f573d6000803e3d6000fd5b505050506040513d6020811015614f2557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614f6f57600080fd5b80600d819055507fa59af5a909ead6260a2d961d1c53f1895d9dceb6133740eedb4d7a3ea2e16f5d814233604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a150565b6000806000806000601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206006018681548110151561504357fe5b9060005260206000209060050201600001549450601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601868154811015156150a657fe5b9060005260206000209060050201600101549350601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206006018681548110151561510957fe5b9060005260206000209060050201600201549250601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206006018681548110151561516c57fe5b906000526020600020906005020160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601868154811015156151ef57fe5b90600052602060002090600502016004015490509295509295909350565b60008073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561536557600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561532357600080fd5b505af1158015615337573d6000803e3d6000fd5b505050506040513d602081101561534d57600080fd5b8101908080519060200190929190505050905061536a565b600090505b919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600081830190508281101515156153a757fe5b80905092915050565b6000806000806000601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206006018681548110151561540757fe5b906000526020600020906005020160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169450600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614151561558b57601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601868154811015156154c057fe5b906000526020600020906005020160040154935061552984601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040154615a6f90919063ffffffff16565b601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206004018190555061558484601254615a6f90919063ffffffff16565b6012819055505b601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601868154811015156155da57fe5b906000526020600020906005020160000154925061564383601960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154615a6f90919063ffffffff16565b601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601868154811015156156d857fe5b906000526020600020906005020160010154915061574182601960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154615a6f90919063ffffffff16565b601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601868154811015156157d657fe5b906000526020600020906005020160020154905061583f81601960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030154615a6f90919063ffffffff16565b601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018190555061589a83601054615a6f90919063ffffffff16565b6010819055506158b582601154615a6f90919063ffffffff16565b6011819055506158d081601254615a6f90919063ffffffff16565b601281905550601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206006018681548110151561592557fe5b9060005260206000209060050201600080820160009055600182016000905560028201600090556003820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560048201600090555050858773ffffffffffffffffffffffffffffffffffffffff167f522643e7c0d923fb5b41ba10ddd84d7c7e895d6dc89a4b62831989ff97edb1ab8585854233604051808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a350505050505050565b600080831415615a345760009050615a53565b8183029050818382811515615a4557fe5b04141515615a4f57fe5b8090505b92915050565b60008183811515615a6657fe5b04905092915050565b6000828211151515615a7d57fe5b818303905092915050565b6040805190810160405280600290602082028038833980820191505090505090565b61024060405190810160405280601290602082028038833980820191505090505090565b60c060405190810160405280600690602082028038833980820191505090505090565b5080546000825560050290600052602060002090810190615b129190615b15565b50565b615b7891905b80821115615b7457600080820160009055600182016000905560028201600090556003820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600482016000905550600501615b1b565b5090565b905600a165627a7a7230582067cea39879a7251a16ca0a7290955d7129c4c454a363ce6bb8a887737d32823c0029

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

000000000000000000000000000000000000000000000000000000005bb1637f000000000000000000000000000000000000000000000000000000005bb16380000000000000000000000000000000000000000000000000000000005d929700000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000033b2e3c9fd0803ce8000000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000008ac7230489e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000b4851a245d522b2562a0562162fc4a57f419a7e900000000000000000000000065732d6e88a83a38a4b803b0181b3a03a416537300000000000000000000000037cbd2e72c9ba7909ca198bb839c119917cba05c000000000000000000000000ae2148f680e14cfeffbd067fe574e9825a6ddb610000000000000000000000003525ac6cc8c673d74bcd94a4c005c9301fad135b

-----Decoded View---------------
Arg [0] : uint256Args (uint256[11]): 1538351999,1538352000,1569888000,18,10000,1000000000000000000000000000,100000000000000000,10000000000000000000,0,0,5
Arg [1] : addressArgs (address[5]): 0xB4851A245D522B2562a0562162fc4A57F419a7e9,0x65732D6E88A83a38A4b803B0181B3a03A4165373,0x37cbD2e72c9ba7909cA198BB839C119917Cba05c,0xae2148f680e14CfEFfBd067fe574E9825a6DDb61,0x3525Ac6cC8c673d74bCd94a4C005c9301Fad135B

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000005bb1637f
Arg [1] : 000000000000000000000000000000000000000000000000000000005bb16380
Arg [2] : 000000000000000000000000000000000000000000000000000000005d929700
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [4] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [5] : 0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000
Arg [6] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [7] : 0000000000000000000000000000000000000000000000008ac7230489e80000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [11] : 000000000000000000000000b4851a245d522b2562a0562162fc4a57f419a7e9
Arg [12] : 00000000000000000000000065732d6e88a83a38a4b803b0181b3a03a4165373
Arg [13] : 00000000000000000000000037cbd2e72c9ba7909ca198bb839c119917cba05c
Arg [14] : 000000000000000000000000ae2148f680e14cfeffbd067fe574e9825a6ddb61
Arg [15] : 0000000000000000000000003525ac6cc8c673d74bcd94a4c005c9301fad135b


Swarm Source

bzzr://67cea39879a7251a16ca0a7290955d7129c4c454a363ce6bb8a887737d32823c

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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