false
true
0

Contract Address Details

0x000BaB4F6b5560d7942AC88cf0233b6028B5B465

Contract Name
ThePoolz
Creator
0x1da18b–607f59 at 0x458b17–300c20
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
26347950
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
ThePoolz




Optimization enabled
false
Compiler version
v0.4.26+commit.4563c3fc




EVM Version
byzantium




Verified at
2026-04-22T01:58:54.642165Z

ThePoolz.sol

pragma solidity ^0.4.24;/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

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

    c = _a * _b;
    assert(c / _a == _b);
    return c;
  }

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

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

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    c = _a + _b;
    assert(c >= _a);
    return c;
  }
}/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * See https://github.com/ethereum/EIPs/issues/179
 */
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);
}/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address _owner, address _spender)
    public view returns (uint256);

  function transferFrom(address _from, address _to, uint256 _value)
    public returns (bool);

  function approve(address _spender, uint256 _value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
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.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  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;
  }
}/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


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

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

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() public onlyOwner whenNotPaused {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() public onlyOwner whenPaused {
    paused = false;
    emit Unpause();
  }
}// SPDX-License-Identifier: MIT





contract TokenList is Pausable {
    bool public IsTokenFilterOn;
    uint256 public NumberOfTokens;
    mapping(address => bool) private _IsAllowed;
    mapping(uint256 => address) private _Tokens;

    constructor() public {
        NumberOfTokens = 0;
        IsTokenFilterOn = false; //true on prod
    }

    function SwapTokenFilter() public onlyOwner {
        IsTokenFilterOn = !IsTokenFilterOn;
    }

    function AddToken(address _address) public onlyOwner {
        require(!_IsAllowed[_address], "This Token in List");
        _IsAllowed[_address] = true;
        _Tokens[NumberOfTokens] = _address;
        NumberOfTokens++;
    }

    function RemoveToken(address _address) public onlyOwner {
        require(_IsAllowed[_address], "This Token not in List");
        _IsAllowed[_address] = false;
    }

    function IsValidToken(address _address) public view returns (bool) {
        return !IsTokenFilterOn || _IsAllowed[_address];
    }
}// SPDX-License-Identifier: MIT







contract ERC20Helper is TokenList {
    event TransferOut(uint256 Amount, address To, address Token);
    event TransferIn(uint256 Amount, address From, address Token);
    modifier TestAllownce(
        address _token,
        address _owner,
        uint256 _amount
    ) {
        require(
            ERC20(_token).allowance(_owner, address(this)) >= _amount,
            "no allowance"
        );
        _;
    }

    function TransferToken(
        address _Token,
        address _Reciver,
        uint256 _Amount
    ) internal {
        uint256 OldBalance = CheckBalance(_Token, address(this));
        emit TransferOut(_Amount, _Reciver, _Token);
        ERC20(_Token).transfer(_Reciver, _Amount);
        require(
            (SafeMath.add(CheckBalance(_Token, address(this)), _Amount)) == OldBalance
                ,
            "recive wrong amount of tokens"
        );
    }

    function CheckBalance(address _Token, address _Subject)
        internal
        view
        returns (uint256)
    {
        return ERC20(_Token).balanceOf(_Subject);
    }

    function TransferInToken(
        address _Token,
        address _Subject,
        uint256 _Amount
    ) internal TestAllownce(_Token, _Subject, _Amount) {
        require(_Amount > 0);
        uint256 OldBalance = CheckBalance(_Token, address(this));
        ERC20(_Token).transferFrom(_Subject, address(this), _Amount);
        emit TransferIn(_Amount, _Subject, _Token);
        require(
            (SafeMath.add(OldBalance, _Amount)) ==
                CheckBalance(_Token, address(this)),
            "recive wrong amount of tokens"
        );
    }
}// SPDX-License-Identifier: MIT



//True POZ Token will have this, 
interface IPOZBenefit {
    function IsPOZHolder(address _Subject) external view returns(bool);
}// SPDX-License-Identifier: MIT






contract PozBenefit is ERC20Helper {
    constructor() public {
        PozFee = 15; // *10000
        PozTimer = 1000; // *10000
        MinPoz = 80; // ^Token.decimals
        POZ_Address = address(0x0);
        POZBenefit_Address = address(0x0);
    }

    uint256 internal PozFee; // the fee for the first part of the pool
    uint256 internal PozTimer; //the timer for the first part fo the pool
    uint256 internal MinPoz; //minimum ammount ofpoz to be part of the discount
    address public POZ_Address; //The address of the POZ Token
    address public POZBenefit_Address; //the address for implementation of IPozBenefit - to get POZ benefit status from other contracts

    modifier PercentCheckOk(uint256 _percent) {
        if (_percent < 10000) _;
        else revert("Not in range");
    }
    modifier LeftIsBigger(uint256 _left, uint256 _right) {
        if (_left > _right) _;
        else revert("Not bigger");
    }

    function GetPozTimer() public view returns (uint256) {
        return PozTimer;
    }

    function SetPozTimer(uint256 _pozTimer)
        public
        onlyOwner
        PercentCheckOk(_pozTimer)
    {
        PozTimer = _pozTimer;
    }

    function GetPOZFee() public view returns (uint256) {
        return PozFee;
    }

    function GetMinPoz() public view returns (uint256) {
        return MinPoz;
    }

    function SetMinPoz(uint256 _MinPoz) public onlyOwner {
        MinPoz = _MinPoz;
    }

    function SetPOZBenefit_Address(address _POZBenefit_Address)
        public
        onlyOwner
    {
        POZBenefit_Address = _POZBenefit_Address;
    }

    function SetPozAdress(address _POZ_Address) public onlyOwner {
        POZ_Address = _POZ_Address;
    }

    function AmIPOZInvestor() public view returns (bool) {
        return IsPOZInvestor(msg.sender);
    }

    //@dev Taken from interface, To join the POZ Benefit club
    function IsPOZInvestor(address _investor) internal view returns (bool) {
        if (POZ_Address == address(0x0) && POZBenefit_Address == address(0x0)) return true; //false; // for testing stage, until got the address
        return ((POZ_Address != address(0x0) &&
            CheckBalance(POZ_Address, _investor) >= MinPoz) ||
            (POZBenefit_Address != address(0x0) &&
                IPOZBenefit(POZBenefit_Address).IsPOZHolder(_investor)));
    }
}// SPDX-License-Identifier: MIT





contract ETHHelper is PozBenefit {
    constructor() public {
        IsPayble = false;
    }

    modifier ReceivETH(uint256 msgValue, address msgSender, uint256 _MinETHInvest) {
        require(msgValue >= _MinETHInvest, "Send ETH to invest");
        emit TransferInETH(msgValue, msgSender);
        _;
    }

    //@dev not/allow contract to receive funds
    function() public payable {
        if (!IsPayble) revert();
    }

    event TransferOutETH(uint256 Amount, address To);
    event TransferInETH(uint256 Amount, address From);

    bool internal IsPayble;
 
    function GetIsPayble() public view returns (bool) {
        return IsPayble;
    }

    function SwitchIsPayble() public onlyOwner {
        IsPayble = !IsPayble;
    }

    function TransferETH(address _Reciver, uint256 _ammount) internal {
        emit TransferOutETH(_ammount, _Reciver);
        uint256 beforeBalance = address(_Reciver).balance;
        _Reciver.transfer(_ammount);
        require(
            SafeMath.add(beforeBalance, _ammount) == address(_Reciver).balance,
            "The transfer did not complite"
        );
    }
 
}// SPDX-License-Identifier: MIT





contract Manageable is ETHHelper {
    constructor() public {
        Fee = 20; // *10000
        MinDuration = 0; //need to set
        PoolPrice = 0; // Price for create a pool
        MaxDuration = 60 * 60 * 24 * 30 * 6; // half year
        MinETHInvest = 10000; // for percent calc
        MaxETHInvest = 100 * 10**18; // 100 eth per wallet
    }

    mapping(address => uint256) FeeMap;
    //@dev for percent use uint16
    uint256 internal Fee; //the fee for the pool
    uint256 internal MinDuration; //the minimum duration of a pool, in seconds
    uint256 internal MaxDuration; //the maximum duration of a pool from the creation, in seconds
    uint256 internal PoolPrice;
    uint256 internal MinETHInvest;
    uint256 internal MaxETHInvest;

    function SetMinMaxETHInvest(uint256 _MinETHInvest, uint256 _MaxETHInvest)
        public
        onlyOwner
    {
        MinETHInvest = _MinETHInvest;
        MaxETHInvest = _MaxETHInvest;
    }
    function GetMinMaxETHInvest() public view returns (uint256 _MinETHInvest, uint256 _MaxETHInvest)
    {
       return (MinETHInvest,MaxETHInvest);
    }

    function GetMinMaxDuration() public view returns (uint256, uint256) {
        return (MinDuration, MaxDuration);
    }

    function SetMinMaxDuration(uint256 _minDuration, uint256 _maxDuration)
        public
        onlyOwner
    {
        MinDuration = _minDuration;
        MaxDuration = _maxDuration;
    }

    function GetPoolPrice() public view returns (uint256) {
        return PoolPrice;
    }

    function SetPoolPrice(uint256 _PoolPrice) public onlyOwner {
        PoolPrice = _PoolPrice;
    }

    function GetFee() public view returns (uint256) {
        return Fee;
    }

    function SetFee(uint256 _fee)
        public
        onlyOwner
        PercentCheckOk(_fee)
        LeftIsBigger(_fee, PozFee)
    {
        Fee = _fee;
    }

    function SetPOZFee(uint256 _fee)
        public
        onlyOwner
        PercentCheckOk(_fee)
        LeftIsBigger(Fee, _fee)
    {
        PozFee = _fee;
    }

    function WithdrawETHFee(address _to) public onlyOwner {
        _to.transfer(address(this).balance); // keeps only fee eth on contract //To Do need to take 16% to burn!!!
    }

    function WithdrawERC20Fee(address _Token, address _to) public onlyOwner {
        uint256 temp = FeeMap[_Token];
        FeeMap[_Token] = 0;
        TransferToken(_Token, _to, temp);
    }
}// SPDX-License-Identifier: MIT





contract MainCoinManager is Manageable {
    event MainCoinAdded (address Token);
    event MainCoinRemoved (address Token);

    mapping(address => bool) public ERC20MainCoins; //when approve new erc20 main coin - it will list here

    function AddERC20Maincoin(address _token) public onlyOwner {
        emit MainCoinAdded(_token);
        ERC20MainCoins[_token] = true;
    }

    function RemoveERC20Maincoin(address _token) public onlyOwner {
        emit MainCoinRemoved(_token);
        ERC20MainCoins[_token] = false;
    }

    function IsERC20Maincoin(address _token) public view returns (bool) {
        return ERC20MainCoins[_token];
    }
}// SPDX-License-Identifier: MIT






contract Pools is MainCoinManager {
    event NewPool(address token, uint256 id);
    event FinishPool(uint256 id);
    event PoolUpdate(uint256 id);

    constructor() public {
        poolsCount = 0; //Start with 0
    }

    uint256 public poolsCount; // the ids of the pool
    mapping(uint256 => Pool) public pools; //the id of the pool with the data
    mapping(address => uint256[]) public poolsMap; //the address and all of the pools id's
    struct Pool {
        address Token; //the address of the erc20 toke for sale
        address Creator; //the project owner
        uint256 FinishTime; //Until what time the pool is active
        uint256 Rate; //for eth Wei, in token, by the decemal. the cost of 1 token
        uint256 POZRate; //the rate for the until OpenForAll, if the same as Rate , OpenForAll = StartTime .
        address Maincoin; // on adress.zero = ETH
        uint256 StartAmount; //The total amount of the tokens for sale
        bool IsLocked; // true - the investors getting the tokens after the FinishTime. false - intant deal
        uint256 Lefttokens; // the ammount of tokens left for sale
        uint256 StartTime; // the time the pool open //TODO Maybe Delete this?
        uint256 OpenForAll; // The Time that all investors can invest
        uint256 UnlockedTokens; //for locked pools
        bool TookLeftOvers; //The Creator took the left overs after the pool finished
        bool Is21DecimalRate; //If true, the rate will be rate*10^-21
    }

    function GetLastPoolId() public view returns (uint256) {
        return poolsCount;
    }
    
     //create a new pool
    function CreatePool(
        address _Token, //token to sell address
        uint256 _FinishTime, //Until what time the pool will work
        uint256 _Rate, //the rate of the trade
        uint256 _POZRate, //the rate for POZ Holders, how much each token = main coin
        uint256 _StartAmount, //Total amount of the tokens to sell in the pool
        bool _IsLocked, //False = DSP or True = TLP
        address _MainCoin, // address(0x0) = ETH, address of main token
        bool _Is21Decimal, //focus the for smaller tokens.
        uint256 _Now //Start Time - can be 0 to not change current flow
    ) public whenNotPaused payable {
        require(msg.value >= PoolPrice, "Need to pay for the pool");
        require(IsValidToken(_Token), "Need Valid ERC20 Token"); //check if _Token is ERC20
        require(
            _MainCoin == address(0x0) || IsERC20Maincoin(_MainCoin),
            "Main coin not in list"
        );
        require(_FinishTime - now < MaxDuration, "Can't be that long pool");
        require(
            _Rate <= _POZRate,
            "POZ holders need to have better price (or the same)"
        );
        require(_POZRate > 0, "It will not work");
        if (_Now < now)
            _Now = now;
        require(
            SafeMath.add(now, MinDuration) <= _FinishTime,
            "Need more then MinDuration"
        ); // check if the time is OK
        TransferInToken(_Token, msg.sender, _StartAmount);
        uint256 Openforall = (_Rate == _POZRate)
            ? _Now
            : SafeMath.add(
                SafeMath.div(
                    SafeMath.mul(
                        SafeMath.sub(_FinishTime, _Now),
                        PozTimer
                    ),
                    10000
                ),
                _Now
            );
        //register the pool
        pools[poolsCount] = Pool(
            _Token,
            msg.sender,
            _FinishTime,
            _Rate,
            _POZRate,
            _MainCoin,
            _StartAmount,
            _IsLocked,
            _StartAmount,
            _Now,
            Openforall,
            0,
            false,
            _Is21Decimal
        );
        poolsMap[msg.sender].push(poolsCount);
        emit NewPool(_Token, poolsCount);
        poolsCount = SafeMath.add(poolsCount, 1); //joke - overflowfrom 0 on int256 = 1.16E77
    }
}// SPDX-License-Identifier: MIT




contract PoolsData is Pools {
    enum PoolStatus {Created, Open,PreMade , OutOfstock, Finished, Close} //the status of the pools

    function GetMyPoolsId() public view returns (uint256[]) {
        return poolsMap[msg.sender];
    }

    function IsReadyWithdrawLeftOvers(uint256 _PoolId)
        public
        view
        returns (bool)
    {
        return
            pools[_PoolId].FinishTime <= now && 
           pools[_PoolId].Lefttokens > 0 && 
            !pools[_PoolId].TookLeftOvers;
    }

    //@dev no use of revert to make sure the loop will work
    function WithdrawLeftOvers(uint256 _PoolId) public returns (bool) {
        //pool is finished + got left overs + did not took them
        if (IsReadyWithdrawLeftOvers(_PoolId)) {
            pools[_PoolId].TookLeftOvers = true;
            TransferToken(
                pools[_PoolId].Token,
                pools[_PoolId].Creator,
                pools[_PoolId].Lefttokens
            );
            return true;
        }
        return false;
    }

    //give the data of the pool, by id
    function GetPoolData(uint256 _id)
        public
        view
        returns (
            PoolStatus,
            address,
            uint256,
            uint256,
            address,
            uint256,
            uint256
        )
    {
        require(_id < poolsCount, "Wrong Id");
        return (
            //check if sender POZ Invester?
            GetPoolStatus(_id),
            pools[_id].Token,
            pools[_id].Rate,
            pools[_id].POZRate,
            pools[_id].Maincoin, //incase of ETH will be address.zero
            pools[_id].StartAmount,
            pools[_id].Lefttokens
        );
    }

    function GetMorePoolData(uint256 _id)
        public
        view
        returns (
            bool,
            uint256,
            uint256,
            uint256,
            address,
            bool
        )
    {
        require(_id < poolsCount, "Wrong Id");
        return (
            pools[_id].IsLocked,
            pools[_id].StartTime,
            pools[_id].FinishTime,
            pools[_id].OpenForAll,
            pools[_id].Creator,
            pools[_id].Is21DecimalRate
        );
    }

    //calculate the status of a pool
    function GetPoolStatus(uint256 _id) public view returns (PoolStatus) {
        require(_id < poolsCount, "Wrong pool id, Can't get Status");
        //Don't like the logic here - ToDo Boolean checks (truth table)
        if (now < pools[_id].StartTime) return PoolStatus.PreMade;
        if (now < pools[_id].OpenForAll && pools[_id].Lefttokens > 0) {
            //got tokens + only poz investors
            return (PoolStatus.Created);
        }
        if (
            now >= pools[_id].OpenForAll &&
            pools[_id].Lefttokens > 0 &&
            now < pools[_id].FinishTime
        ) {
            //got tokens + all investors
            return (PoolStatus.Open);
        }
        if (
            pools[_id].Lefttokens == 0 &&
            pools[_id].IsLocked &&
            now < pools[_id].FinishTime
        ) //no tokens on locked pool, got time
        {
            return (PoolStatus.OutOfstock);
        }
        if (
            pools[_id].Lefttokens == 0 && !pools[_id].IsLocked
        ) //no tokens on direct pool
        {
            return (PoolStatus.Close);
        }
        if (now >= pools[_id].FinishTime && !pools[_id].IsLocked) {
            // After finish time - not locked
            if (pools[_id].TookLeftOvers) return (PoolStatus.Close);
            return (PoolStatus.Finished);
        }
        if (
            (pools[_id].TookLeftOvers || pools[_id].Lefttokens == 0) &&
            (pools[_id].UnlockedTokens + pools[_id].Lefttokens ==
                pools[_id].StartAmount)
        ) return (PoolStatus.Close);
        return (PoolStatus.Finished);
    }
}// SPDX-License-Identifier: MIT





contract Invest is PoolsData {
    event NewInvestorEvent(uint256 Investor_ID, address Investor_Address);

    modifier CheckTime(uint256 _Time) {
        require(now >= _Time, "Pool not open yet");
        _;
    }

    //using SafeMath for uint256;
    constructor() public {
        TotalInvestors = 0;
    }

    //Investorsr Data
    uint256 internal TotalInvestors;
    mapping(uint256 => Investor) Investors;
    mapping(address => uint256[]) InvestorsMap;
    struct Investor {
        uint256 Poolid; //the id of the pool, he got the rate info and the token, check if looked pool
        address InvestorAddress; //
        uint256 MainCoin; //the amount of the main coin invested (eth/dai), calc with rate
        bool IsPozInvestor; //If the blance of the address got > MinPoz, can get discout if got early
        uint256 TokensOwn; //the amount of Tokens the investor needto get from the contract
        uint256 InvestTime; //the time that investment made
    }

    //@dev Send in wei
    function InvestETH(uint256 _PoolId)
        external
        payable
        ReceivETH(msg.value, msg.sender,MinETHInvest)
        whenNotPaused
        CheckTime(pools[_PoolId].StartTime)
    {
        require(_PoolId < poolsCount, "Wrong pool id, InvestETH fail");
        require(pools[_PoolId].Maincoin == address(0x0), "Pool is not for ETH");
        require(msg.value >= MinETHInvest && msg.value <= MaxETHInvest, "Investment amount not valid");
        require(msg.sender == tx.origin && !isContract(msg.sender), "Some thing wrong with the msgSender");
        uint256 ThisInvestor = NewInvestor(msg.sender, msg.value, _PoolId);
        uint256 Tokens = CalcTokens(_PoolId, msg.value, msg.sender);
        if (pools[_PoolId].IsLocked) {
            Investors[ThisInvestor].TokensOwn = SafeMath.add(
                Investors[ThisInvestor].TokensOwn,
                Tokens
            );
        } else {
            // not locked, will transfer the toke
            TransferToken(pools[_PoolId].Token, msg.sender, Tokens);
        }

        uint256 EthMinusFee = SafeMath.div(
            SafeMath.mul(msg.value, SafeMath.sub(10000, CalcFee(_PoolId))),
            10000
        );

        TransferETH(pools[_PoolId].Creator, EthMinusFee); // send money to project owner - the fee stays on contract
        RegisterInvest(_PoolId, Tokens);
    }

    function InvestERC20(uint256 _PoolId, uint256 _Amount)
        external
        whenNotPaused
        CheckTime(pools[_PoolId].StartTime)
    {
        require(_PoolId < poolsCount, "Wrong pool id, InvestERC20 fail");
        require(
            pools[_PoolId].Maincoin != address(0x0),
            "Pool is for ETH, use InvetETH"
        );
        require(_Amount > 10000, "Need invest more then 10000");
        require(msg.sender == tx.origin && !isContract(msg.sender), "Some thing wrong with the msgSender");
        TransferInToken(pools[_PoolId].Maincoin, msg.sender, _Amount);
        uint256 ThisInvestor = NewInvestor(msg.sender, _Amount, _PoolId);
        uint256 Tokens = CalcTokens(_PoolId, _Amount, msg.sender);

        if (pools[_PoolId].IsLocked) {
            Investors[ThisInvestor].TokensOwn = SafeMath.add(
                Investors[ThisInvestor].TokensOwn,
                Tokens
            );
        } else {
            // not locked, will transfer the tokens
            TransferToken(pools[_PoolId].Token, msg.sender, Tokens);
        }

        uint256 RegularFeePay = SafeMath.div(
            SafeMath.mul(_Amount, CalcFee(_PoolId)),
            10000
        );

        uint256 RegularPaymentMinusFee = SafeMath.sub(_Amount, RegularFeePay);
        FeeMap[pools[_PoolId].Maincoin] = SafeMath.add(
            FeeMap[pools[_PoolId].Maincoin],
            RegularFeePay
        );
        TransferToken(
            pools[_PoolId].Maincoin,
            pools[_PoolId].Creator,
            RegularPaymentMinusFee
        ); // send money to project owner - the fee stays on contract
        RegisterInvest(_PoolId, Tokens);
    }

    function RegisterInvest(uint256 _PoolId, uint256 _Tokens) internal {
        require(
            _Tokens <= pools[_PoolId].Lefttokens,
            "Not enough tokens in the pool"
        );
        pools[_PoolId].Lefttokens = SafeMath.sub(
            pools[_PoolId].Lefttokens,
            _Tokens
        );
        if (pools[_PoolId].Lefttokens == 0) emit FinishPool(_PoolId);
        else emit PoolUpdate(_PoolId);
    }

    function NewInvestor(
        address _Sender,
        uint256 _Amount,
        uint256 _Pid
    ) internal returns (uint256) {
        Investors[TotalInvestors] = Investor(
            _Pid,
            _Sender,
            _Amount,
            IsPOZInvestor(_Sender),
            0,
            block.timestamp
        );
        InvestorsMap[msg.sender].push(TotalInvestors);
        emit NewInvestorEvent(TotalInvestors,_Sender);
        TotalInvestors = SafeMath.add(TotalInvestors, 1);
        return SafeMath.sub(TotalInvestors, 1);
    }

    function CalcTokens(
        uint256 _Pid,
        uint256 _Amount,
        address _Sender
    ) internal view returns (uint256) {
        uint256 msgValue = _Amount;
        uint256 result = 0;
        if (GetPoolStatus(_Pid) == PoolStatus.Created) {
            if (!IsPOZInvestor(_Sender)) {
                revert("Need to be POZ Holder to invest");
            }
            result = SafeMath.mul(msgValue, pools[_Pid].POZRate);
        }
        if (GetPoolStatus(_Pid) == PoolStatus.Open) {
            result = SafeMath.mul(msgValue, pools[_Pid].Rate);
        }
        if (result > 10**21) {
            if (pools[_Pid].Is21DecimalRate) {
                result = SafeMath.div(result, 10**21);
            }
            return result;
        }
        revert("Wrong pool status to CalcTokens");
    }

    function CalcFee(uint256 _Pid) internal view returns (uint256) {
        if (GetPoolStatus(_Pid) == PoolStatus.Created) {
            return PozFee;
        }
        if (GetPoolStatus(_Pid) == PoolStatus.Open) {
            return Fee;
        }
        //will not get here, will fail on CalcTokens
        //revert("Wrong pool status to CalcFee");
    }

       //@dev use it with  require(msg.sender == tx.origin)
    function isContract(address _addr) internal view returns (bool) {      
        uint32 size;
        assembly {
            size := extcodesize(_addr)
        }
        return (size > 0);
    }
}// SPDX-License-Identifier: MIT





contract InvestorData is Invest {
    function IsReadyWithdrawInvestment(uint256 _id) public view returns (bool) {
        return
            _id <= TotalInvestors &&
            Investors[_id].TokensOwn > 0 &&
            pools[Investors[_id].Poolid].FinishTime <= now;
    }

    function WithdrawInvestment(uint256 _id) public returns (bool) {
        if (IsReadyWithdrawInvestment(_id)) {
            uint256 temp = Investors[_id].TokensOwn;
            Investors[_id].TokensOwn = 0;
            TransferToken(
                pools[Investors[_id].Poolid].Token,
                Investors[_id].InvestorAddress,
                temp
            );
            pools[Investors[_id].Poolid].UnlockedTokens = SafeMath.add(
                pools[Investors[_id].Poolid].UnlockedTokens,
                temp
            );

            return true;
        }
        return false;
    }

    //Give all the id's of the investment  by sender address
    function GetMyInvestmentIds() public view returns (uint256[]) {
        return InvestorsMap[msg.sender];
    }

    function GetInvestmentData(uint256 _id)
        public
        view
        returns (
            uint256,
            address,
            uint256,
            bool,
            uint256,
            uint256
        )
    {
        require(
            Investors[_id].InvestorAddress == msg.sender || msg.sender == owner,
            "Only for the investor (or Admin)"
        );
        return (
            Investors[_id].Poolid,
            Investors[_id].InvestorAddress,
            Investors[_id].MainCoin,
            Investors[_id].IsPozInvestor,
            Investors[_id].TokensOwn,
            Investors[_id].InvestTime
        );
    }
}// SPDX-License-Identifier: MIT




contract ThePoolz is InvestorData {
    event InvestorsWork(uint256 NewStart, uint256 TotalDone);
    event ProjectOwnerWork(uint256 NewStart, uint256 TotalDone);

    constructor() public {
        StartInvestor = 0;
        StartProjectOwner = 0;
        MinWorkInvestor = 0;
        MinWorkProjectOwner = 0;
    }

    uint256 internal MinWorkInvestor;
    uint256 internal MinWorkProjectOwner;
    uint256 internal StartInvestor;
    uint256 internal StartProjectOwner;

    function SetStartForWork(uint256 _StartInvestor, uint256 _StartProjectOwner)
        public
        onlyOwner
    {
        StartInvestor = _StartInvestor;
        StartProjectOwner = _StartProjectOwner;
    }

    function GetMinWorkInvestor() public view returns (uint256) {
        return MinWorkInvestor;
    }

    function SetMinWorkInvestor(uint256 _MinWorkInvestor) public onlyOwner {
        MinWorkInvestor = _MinWorkInvestor;
    }

    function GetMinWorkProjectOwner() public view returns (uint256) {
        return MinWorkProjectOwner;
    }

    function SetMinWorkProjectOwner(uint256 _MinWorkProjectOwner)
        public
        onlyOwner
    {
        MinWorkProjectOwner = _MinWorkProjectOwner;
    }

    //will revert if less than parameters
    function SafeWork() external returns (uint256, uint256) {
        require(CanWork(), "Need more than minimal work count");
        return DoWork();
    }

    function CanWork() public view returns (bool) {
        uint256 inv;
        uint256 pro;
        (inv, pro) = CountWork();
        return (inv > MinWorkInvestor || pro > MinWorkProjectOwner);
    }

    function DoWork() public returns (uint256, uint256) {
        uint256 pro = WorkForProjectOwner();
        uint256 inv = WorkForInvestors();
        return (inv, pro);
    }

    function CountWork() public view returns (uint256, uint256) {
        uint256 temp_investor_count = 0;
        uint256 temp_projectowner_count = 0;
        for (
            uint256 Investorindex = StartInvestor;
            Investorindex < TotalInvestors;
            Investorindex++
        ) {
            if (IsReadyWithdrawInvestment(Investorindex)) temp_investor_count++;
        }
        for (
            uint256 POindex = StartProjectOwner;
            POindex < poolsCount;
            POindex++
        ) {
            if (IsReadyWithdrawLeftOvers(POindex)) temp_projectowner_count++;
        }
        return (temp_investor_count, temp_projectowner_count);
    }

    function WorkForInvestors() internal returns (uint256) {
        uint256 WorkDone = 0;
        for (uint256 index = StartInvestor; index < TotalInvestors; index++) {
            if (WithdrawInvestment(index)) WorkDone++;
        }
        SetInvestorStart();
        emit InvestorsWork(StartInvestor, WorkDone);
        return WorkDone;
    }

    function SetInvestorStart() internal {
        for (uint256 index = StartInvestor; index < TotalInvestors; index++) {
            if (GetPoolStatus(Investors[index].Poolid) == PoolStatus.Close)
                StartInvestor = index;
            else return;
        }
    }

    function WorkForProjectOwner() internal returns (uint256) {
        uint256 WorkDone = 0;
        bool FixStart = true;
        for (uint256 index = StartProjectOwner; index < poolsCount; index++) {
            if (WithdrawLeftOvers(index)) WorkDone++;
            if (
                FixStart &&
                (pools[index].TookLeftOvers || pools[index].Lefttokens == 0)
            ) {
                StartProjectOwner = index;
            } else {
                FixStart = false;
            }
        }
        emit ProjectOwnerWork(StartProjectOwner, WorkDone);
        return WorkDone;
    }
}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":200,"enabled":false},"libraries":{},"evmVersion":"byzantium","compilationTarget":{"ThePoolz.sol":"ThePoolz"}}
              

Contract ABI

[{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SetFee","inputs":[{"type":"uint256","name":"_fee"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"RemoveERC20Maincoin","inputs":[{"type":"address","name":"_token"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"GetPozTimer","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SwapTokenFilter","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint8","name":""}],"name":"GetPoolStatus","inputs":[{"type":"uint256","name":"_id"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"IsValidToken","inputs":[{"type":"address","name":"_address"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"GetPOZFee","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SetStartForWork","inputs":[{"type":"uint256","name":"_StartInvestor"},{"type":"uint256","name":"_StartProjectOwner"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"POZ_Address","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"ERC20MainCoins","inputs":[{"type":"address","name":""}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SetMinWorkInvestor","inputs":[{"type":"uint256","name":"_MinWorkInvestor"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SetMinMaxETHInvest","inputs":[{"type":"uint256","name":"_MinETHInvest"},{"type":"uint256","name":"_MaxETHInvest"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"unpause","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"GetFee","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"RemoveToken","inputs":[{"type":"address","name":"_address"}],"constant":false},{"type":"function","stateMutability":"payable","payable":true,"outputs":[],"name":"CreatePool","inputs":[{"type":"address","name":"_Token"},{"type":"uint256","name":"_FinishTime"},{"type":"uint256","name":"_Rate"},{"type":"uint256","name":"_POZRate"},{"type":"uint256","name":"_StartAmount"},{"type":"bool","name":"_IsLocked"},{"type":"address","name":"_MainCoin"},{"type":"bool","name":"_Is21Decimal"},{"type":"uint256","name":"_Now"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"poolsMap","inputs":[{"type":"address","name":""},{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"paused","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"IsTokenFilterOn","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SetMinPoz","inputs":[{"type":"uint256","name":"_MinPoz"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""},{"type":"address","name":""},{"type":"uint256","name":""},{"type":"bool","name":""},{"type":"uint256","name":""},{"type":"uint256","name":""}],"name":"GetInvestmentData","inputs":[{"type":"uint256","name":"_id"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"GetIsPayble","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256[]","name":""}],"name":"GetMyPoolsId","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""},{"type":"uint256","name":""},{"type":"uint256","name":""},{"type":"uint256","name":""},{"type":"address","name":""},{"type":"bool","name":""}],"name":"GetMorePoolData","inputs":[{"type":"uint256","name":"_id"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""},{"type":"uint256","name":""}],"name":"CountWork","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"renounceOwnership","inputs":[],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SetPOZBenefit_Address","inputs":[{"type":"address","name":"_POZBenefit_Address"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"CanWork","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"GetMinWorkProjectOwner","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"pause","inputs":[],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"WithdrawInvestment","inputs":[{"type":"uint256","name":"_id"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"poolsCount","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SetMinWorkProjectOwner","inputs":[{"type":"uint256","name":"_MinWorkProjectOwner"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"GetMinWorkInvestor","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256[]","name":""}],"name":"GetMyInvestmentIds","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"NumberOfTokens","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"GetPoolPrice","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":""},{"type":"uint256","name":""}],"name":"DoWork","inputs":[],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"WithdrawETHFee","inputs":[{"type":"address","name":"_to"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"GetMinPoz","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"AddERC20Maincoin","inputs":[{"type":"address","name":"_token"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"IsReadyWithdrawLeftOvers","inputs":[{"type":"uint256","name":"_PoolId"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SetPOZFee","inputs":[{"type":"uint256","name":"_fee"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SwitchIsPayble","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"Token"},{"type":"address","name":"Creator"},{"type":"uint256","name":"FinishTime"},{"type":"uint256","name":"Rate"},{"type":"uint256","name":"POZRate"},{"type":"address","name":"Maincoin"},{"type":"uint256","name":"StartAmount"},{"type":"bool","name":"IsLocked"},{"type":"uint256","name":"Lefttokens"},{"type":"uint256","name":"StartTime"},{"type":"uint256","name":"OpenForAll"},{"type":"uint256","name":"UnlockedTokens"},{"type":"bool","name":"TookLeftOvers"},{"type":"bool","name":"Is21DecimalRate"}],"name":"pools","inputs":[{"type":"uint256","name":""}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SetMinMaxDuration","inputs":[{"type":"uint256","name":"_minDuration"},{"type":"uint256","name":"_maxDuration"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SetPoolPrice","inputs":[{"type":"uint256","name":"_PoolPrice"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"InvestERC20","inputs":[{"type":"uint256","name":"_PoolId"},{"type":"uint256","name":"_Amount"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"GetLastPoolId","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":""},{"type":"uint256","name":""}],"name":"SafeWork","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"AmIPOZInvestor","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"_MinETHInvest"},{"type":"uint256","name":"_MaxETHInvest"}],"name":"GetMinMaxETHInvest","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SetPozAdress","inputs":[{"type":"address","name":"_POZ_Address"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"IsReadyWithdrawInvestment","inputs":[{"type":"uint256","name":"_id"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"AddToken","inputs":[{"type":"address","name":"_address"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"IsERC20Maincoin","inputs":[{"type":"address","name":"_token"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint8","name":""},{"type":"address","name":""},{"type":"uint256","name":""},{"type":"uint256","name":""},{"type":"address","name":""},{"type":"uint256","name":""},{"type":"uint256","name":""}],"name":"GetPoolData","inputs":[{"type":"uint256","name":"_id"}],"constant":true},{"type":"function","stateMutability":"payable","payable":true,"outputs":[],"name":"InvestETH","inputs":[{"type":"uint256","name":"_PoolId"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"_newOwner"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"SetPozTimer","inputs":[{"type":"uint256","name":"_pozTimer"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""},{"type":"uint256","name":""}],"name":"GetMinMaxDuration","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"POZBenefit_Address","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"WithdrawERC20Fee","inputs":[{"type":"address","name":"_Token"},{"type":"address","name":"_to"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"WithdrawLeftOvers","inputs":[{"type":"uint256","name":"_PoolId"}],"constant":false},{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[]},{"type":"fallback","stateMutability":"payable","payable":true},{"type":"event","name":"InvestorsWork","inputs":[{"type":"uint256","name":"NewStart","indexed":false},{"type":"uint256","name":"TotalDone","indexed":false}],"anonymous":false},{"type":"event","name":"ProjectOwnerWork","inputs":[{"type":"uint256","name":"NewStart","indexed":false},{"type":"uint256","name":"TotalDone","indexed":false}],"anonymous":false},{"type":"event","name":"NewInvestorEvent","inputs":[{"type":"uint256","name":"Investor_ID","indexed":false},{"type":"address","name":"Investor_Address","indexed":false}],"anonymous":false},{"type":"event","name":"NewPool","inputs":[{"type":"address","name":"token","indexed":false},{"type":"uint256","name":"id","indexed":false}],"anonymous":false},{"type":"event","name":"FinishPool","inputs":[{"type":"uint256","name":"id","indexed":false}],"anonymous":false},{"type":"event","name":"PoolUpdate","inputs":[{"type":"uint256","name":"id","indexed":false}],"anonymous":false},{"type":"event","name":"MainCoinAdded","inputs":[{"type":"address","name":"Token","indexed":false}],"anonymous":false},{"type":"event","name":"MainCoinRemoved","inputs":[{"type":"address","name":"Token","indexed":false}],"anonymous":false},{"type":"event","name":"TransferOutETH","inputs":[{"type":"uint256","name":"Amount","indexed":false},{"type":"address","name":"To","indexed":false}],"anonymous":false},{"type":"event","name":"TransferInETH","inputs":[{"type":"uint256","name":"Amount","indexed":false},{"type":"address","name":"From","indexed":false}],"anonymous":false},{"type":"event","name":"TransferOut","inputs":[{"type":"uint256","name":"Amount","indexed":false},{"type":"address","name":"To","indexed":false},{"type":"address","name":"Token","indexed":false}],"anonymous":false},{"type":"event","name":"TransferIn","inputs":[{"type":"uint256","name":"Amount","indexed":false},{"type":"address","name":"From","indexed":false},{"type":"address","name":"Token","indexed":false}],"anonymous":false},{"type":"event","name":"Pause","inputs":[],"anonymous":false},{"type":"event","name":"Unpause","inputs":[],"anonymous":false},{"type":"event","name":"OwnershipRenounced","inputs":[{"type":"address","name":"previousOwner","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false}]
              

Contract Creation Code

Verify & Publish
0x608060405260008060146101000a81548160ff02191690831515021790555034801561002a57600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060018190555060008060156101000a81548160ff021916908315150217905550600f6004819055506103e860058190555060506006819055506000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600860146101000a81548160ff0219169083151502179055506014600a819055506000600b819055506000600d8190555062ed4e00600c81905550612710600e8190555068056bc75e2d63100000600f819055506000601181905550600060148190555060006019819055506000601a8190555060006017819055506000601881905550615fc080620001c06000396000f3006080604052600436106102ff576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062172ddf1461031c578062ea921614610349578063014f3aff1461038c57806307b027ed146103b75780630d08caa0146103ce578063114fa9bd1461041d5780631ac8989f146104785780631f2750d4146104a35780632ef680a7146104da5780633037548a1461053157806331ec77e11461058c5780633e90eea7146105b95780633f4ba83a146105f057806348d9614d146106075780634eb129c8146106325780635448a0d51461067557806356793bc7146107155780635c975abb146107765780635cdddc7c146107a55780635ea84ad6146107d457806360f9e80a14610801578063624dea1c1461089557806363552a49146108c457806366b91da9146109305780636e2402d9146109c8578063715018a6146109fa57806377623c5e14610a115780637e06d5f514610a54578063842bac4514610a835780638456cb5914610aae57806387e3c59914610ac55780638c788de014610b0a5780638da5cb5b14610b355780638fc5108b14610b8c578063904d22f514610bb957806391314dde14610be457806396b797ea14610c50578063979fc38c14610c7b57806398399c3e14610ca6578063991e979a14610cd85780639baf390a14610d1b578063a38c654914610d46578063a73ff12814610d89578063a87d2be414610dce578063aac5da5c14610dfb578063ac4afa3814610e12578063b7d9b6f114610f3e578063b977eddf14610f75578063be33a3ec14610fa2578063c5053add14610fd9578063cc19723d14611004578063d151282814611036578063db62ec5914611065578063de5b521d14611097578063e34c7772146110da578063e473c74f1461111f578063e890671614611162578063ea9223a6146111bd578063f04be48b1461128e578063f2fde38b146112ae578063f3188248146112f1578063f31de1fa1461131e578063f65dd7a714611350578063fc1a86ff146113a7578063fd711a551461140a575b600860149054906101000a900460ff16151561031a57600080fd5b005b34801561032857600080fd5b506103476004803603810190808035906020019092919050505061144f565b005b34801561035557600080fd5b5061038a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115b4565b005b34801561039857600080fd5b506103a16116cd565b6040518082815260200191505060405180910390f35b3480156103c357600080fd5b506103cc6116d7565b005b3480156103da57600080fd5b506103f96004803603810190808035906020019092919050505061175e565b6040518082600581111561040957fe5b60ff16815260200191505060405180910390f35b34801561042957600080fd5b5061045e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ab1565b604051808215151515815260200191505060405180910390f35b34801561048457600080fd5b5061048d611b1e565b6040518082815260200191505060405180910390f35b3480156104af57600080fd5b506104d86004803603810190808035906020019092919080359060200190929190505050611b28565b005b3480156104e657600080fd5b506104ef611b95565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053d57600080fd5b50610572600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bbb565b604051808215151515815260200191505060405180910390f35b34801561059857600080fd5b506105b760048036038101908080359060200190929190505050611bdb565b005b3480156105c557600080fd5b506105ee6004803603810190808035906020019092919080359060200190929190505050611c40565b005b3480156105fc57600080fd5b50610605611cad565b005b34801561061357600080fd5b5061061c611d6b565b6040518082815260200191505060405180910390f35b34801561063e57600080fd5b50610673600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d75565b005b610713600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803515159060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919080359060200190929190505050611eec565b005b34801561072157600080fd5b50610760600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061265b565b6040518082815260200191505060405180910390f35b34801561078257600080fd5b5061078b61268b565b604051808215151515815260200191505060405180910390f35b3480156107b157600080fd5b506107ba61269e565b604051808215151515815260200191505060405180910390f35b3480156107e057600080fd5b506107ff600480360381019080803590602001909291905050506126b1565b005b34801561080d57600080fd5b5061082c60048036038101908080359060200190929190505050612716565b604051808781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184151515158152602001838152602001828152602001965050505050505060405180910390f35b3480156108a157600080fd5b506108aa61291b565b604051808215151515815260200191505060405180910390f35b3480156108d057600080fd5b506108d9612932565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561091c578082015181840152602081019050610901565b505050509050019250505060405180910390f35b34801561093c57600080fd5b5061095b600480360381019080803590602001909291905050506129c7565b60405180871515151581526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182151515158152602001965050505050505060405180910390f35b3480156109d457600080fd5b506109dd612b22565b604051808381526020018281526020019250505060405180910390f35b348015610a0657600080fd5b50610a0f612ba9565b005b348015610a1d57600080fd5b50610a52600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cab565b005b348015610a6057600080fd5b50610a69612d4a565b604051808215151515815260200191505060405180910390f35b348015610a8f57600080fd5b50610a98612d77565b6040518082815260200191505060405180910390f35b348015610aba57600080fd5b50610ac3612d81565b005b348015610ad157600080fd5b50610af060048036038101908080359060200190929190505050612e41565b604051808215151515815260200191505060405180910390f35b348015610b1657600080fd5b50610b1f612f8e565b6040518082815260200191505060405180910390f35b348015610b4157600080fd5b50610b4a612f94565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b9857600080fd5b50610bb760048036038101908080359060200190929190505050612fb9565b005b348015610bc557600080fd5b50610bce61301e565b6040518082815260200191505060405180910390f35b348015610bf057600080fd5b50610bf9613028565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c3c578082015181840152602081019050610c21565b505050509050019250505060405180910390f35b348015610c5c57600080fd5b50610c656130bd565b6040518082815260200191505060405180910390f35b348015610c8757600080fd5b50610c906130c3565b6040518082815260200191505060405180910390f35b348015610cb257600080fd5b50610cbb6130cd565b604051808381526020018281526020019250505060405180910390f35b348015610ce457600080fd5b50610d19600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130f3565b005b348015610d2757600080fd5b50610d306131af565b6040518082815260200191505060405180910390f35b348015610d5257600080fd5b50610d87600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131b9565b005b348015610d9557600080fd5b50610db4600480360381019080803590602001909291905050506132d2565b604051808215151515815260200191505060405180910390f35b348015610dda57600080fd5b50610df960048036038101908080359060200190929190505050613344565b005b348015610e0757600080fd5b50610e106134a9565b005b348015610e1e57600080fd5b50610e3d60048036038101908080359060200190929190505050613530565b604051808f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018d81526020018c81526020018b81526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018815151515815260200187815260200186815260200185815260200184815260200183151515158152602001821515151581526020019e50505050505050505050505050505060405180910390f35b348015610f4a57600080fd5b50610f736004803603810190808035906020019092919080359060200190929190505050613623565b005b348015610f8157600080fd5b50610fa060048036038101908080359060200190929190505050613690565b005b348015610fae57600080fd5b50610fd760048036038101908080359060200190929190803590602001909291905050506136f5565b005b348015610fe557600080fd5b50610fee613d00565b6040518082815260200191505060405180910390f35b34801561101057600080fd5b50611019613d0a565b604051808381526020018281526020019250505060405180910390f35b34801561104257600080fd5b5061104b613dbf565b604051808215151515815260200191505060405180910390f35b34801561107157600080fd5b5061107a613dcf565b604051808381526020018281526020019250505060405180910390f35b3480156110a357600080fd5b506110d8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613de0565b005b3480156110e657600080fd5b5061110560048036038101908080359060200190929190505050613e7f565b604051808215151515815260200191505060405180910390f35b34801561112b57600080fd5b50611160600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ee8565b005b34801561116e57600080fd5b506111a3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140c6565b604051808215151515815260200191505060405180910390f35b3480156111c957600080fd5b506111e86004803603810190808035906020019092919050505061411c565b604051808860058111156111f857fe5b60ff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200197505050505050505060405180910390f35b6112ac6004803603810190808035906020019092919050505061428c565b005b3480156112ba57600080fd5b506112ef600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061481c565b005b3480156112fd57600080fd5b5061131c60048036038101908080359060200190929190505050614883565b005b34801561132a57600080fd5b50611333614967565b604051808381526020018281526020019250505060405180910390f35b34801561135c57600080fd5b50611365614978565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156113b357600080fd5b50611408600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061499e565b005b34801561141657600080fd5b5061143560048036038101908080359060200190929190505050614a92565b604051808215151515815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114aa57600080fd5b806127108110156115425781600454808211156114cd5783600a8190555061153b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4e6f74206269676765720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506115b0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420696e2072616e6765000000000000000000000000000000000000000081525060200191505060405180910390fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561160f57600080fd5b7f46e7a65ed7662dc42b119afa3a03fc8474ed27a5a48d664c0b5e8b87b04184cf81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a16000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600554905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173257600080fd5b600060159054906101000a900460ff1615600060156101000a81548160ff021916908315150217905550565b6000601154821015156117d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f57726f6e6720706f6f6c2069642c2043616e277420676574205374617475730081525060200191505060405180910390fd5b60126000838152602001908152602001600020600901544210156118005760029050611aac565b60126000838152602001908152602001600020600a01544210801561183b575060006012600084815260200190815260200160002060080154115b156118495760009050611aac565b60126000838152602001908152602001600020600a01544210158015611885575060006012600084815260200190815260200160002060080154115b80156118a65750601260008381526020019081526020016000206002015442105b156118b45760019050611aac565b600060126000848152602001908152602001600020600801541480156118fa57506012600083815260200190815260200160002060070160009054906101000a900460ff165b801561191b5750601260008381526020019081526020016000206002015442105b156119295760039050611aac565b6000601260008481526020019081526020016000206008015414801561197057506012600083815260200190815260200160002060070160009054906101000a900460ff16155b1561197e5760059050611aac565b601260008381526020019081526020016000206002015442101580156119c557506012600083815260200190815260200160002060070160009054906101000a900460ff16155b15611a055760126000838152602001908152602001600020600c0160009054906101000a900460ff16156119fc5760059050611aac565b60049050611aac565b60126000838152602001908152602001600020600c0160009054906101000a900460ff1680611a4a575060006012600084815260200190815260200160002060080154145b8015611a9957506012600083815260200190815260200160002060060154601260008481526020019081526020016000206008015460126000858152602001908152602001600020600b015401145b15611aa75760059050611aac565b600490505b919050565b60008060159054906101000a900460ff161580611b175750600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b9050919050565b6000600454905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8357600080fd5b8160198190555080601a819055505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3657600080fd5b8060178190555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c9b57600080fd5b81600e8190555080600f819055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d0857600080fd5b600060149054906101000a900460ff161515611d2357600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600a54905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd057600080fd5b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611e91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5468697320546f6b656e206e6f7420696e204c6973740000000000000000000081525060200191505060405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060149054906101000a900460ff16151515611f0957600080fd5b600d543410151515611f83576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e65656420746f2070617920666f722074686520706f6f6c000000000000000081525060200191505060405180910390fd5b611f8c8a611ab1565b1515612000576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4e6565642056616c696420455243323020546f6b656e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612040575061203f846140c6565b5b15156120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d61696e20636f696e206e6f7420696e206c697374000000000000000000000081525060200191505060405180910390fd5b600c54428a0310151561212f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616e27742062652074686174206c6f6e6720706f6f6c00000000000000000081525060200191505060405180910390fd5b8688111515156121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001807f504f5a20686f6c64657273206e65656420746f2068617665206265747465722081526020017f707269636520286f72207468652073616d65290000000000000000000000000081525060400191505060405180910390fd5b600087111515612245576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f49742077696c6c206e6f7420776f726b0000000000000000000000000000000081525060200191505060405180910390fd5b42821015612251574291505b8861225e42600b54614b71565b111515156122d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e656564206d6f7265207468656e204d696e4475726174696f6e00000000000081525060200191505060405180910390fd5b6122df8a3388614b8d565b8688146123145761230f6123096123016122f98c86614f72565b600554614f8b565b612710614fc3565b83614b71565b612316565b815b90506101c0604051908101604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018881526020018573ffffffffffffffffffffffffffffffffffffffff16815260200187815260200186151581526020018781526020018381526020018281526020016000815260200160001515815260200184151581525060126000601154815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015560e08201518160070160006101000a81548160ff0219169083151502179055506101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c0160006101000a81548160ff0219169083151502179055506101a082015181600c0160016101000a81548160ff021916908315150217905550905050601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060115490806001815401808255809150509060018203906000526020600020016000909192909190915055507fbe4222bc407cb12031595fc55b46531e46308d31e4572c9c4360d8ae790e1a318a601154604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16126496011546001614b71565b60118190555050505050505050505050565b60136020528160005260406000208181548110151561267657fe5b90600052602060002001600091509150505481565b600060149054906101000a900460ff1681565b600060159054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561270c57600080fd5b8060068190555050565b6000806000806000803373ffffffffffffffffffffffffffffffffffffffff166015600089815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806127db57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561284f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f6e6c7920666f722074686520696e766573746f7220286f722041646d696e2981525060200191505060405180910390fd5b60156000888152602001908152602001600020600001546015600089815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601560008a815260200190815260200160002060020154601560008b815260200190815260200160002060030160009054906101000a900460ff16601560008c815260200190815260200160002060040154601560008d81526020019081526020016000206005015495509550955095509550955091939550919395565b6000600860149054906101000a900460ff16905090565b6060601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156129bd57602002820191906000526020600020905b8154815260200190600101908083116129a9575b5050505050905090565b60008060008060008060115487101515612a49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260088152602001807f57726f6e6720496400000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6012600088815260200190815260200160002060070160009054906101000a900460ff166012600089815260200190815260200160002060090154601260008a815260200190815260200160002060020154601260008b8152602001908152602001600020600a0154601260008c815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260008d8152602001908152602001600020600c0160019054906101000a900460ff1695509550955095509550955091939550919395565b600080600080600080600093506000925060195491505b601454821015612b6757612b4c82613e7f565b15612b5a5783806001019450505b8180600101925050612b39565b601a5490505b601154811015612b9b57612b80816132d2565b15612b8e5782806001019350505b8080600101915050612b6d565b838395509550505050509091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c0457600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d0657600080fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000612d57612b22565b8092508193505050601754821180612d70575060185481115b9250505090565b6000601854905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ddc57600080fd5b600060149054906101000a900460ff16151515612df857600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600080612e4d83613e7f565b15612f83576015600084815260200190815260200160002060040154905060006015600085815260200190815260200160002060040181905550612f14601260006015600087815260200190815260200160002060000154815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166015600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614fd9565b612f4a6012600060156000878152602001908152602001600020600001548152602001908152602001600020600b015482614b71565b6012600060156000878152602001908152602001600020600001548152602001908152602001600020600b018190555060019150612f88565b600091505b50919050565b60115481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561301457600080fd5b8060188190555050565b6000601754905090565b6060601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156130b357602002820191906000526020600020905b81548152602001906001019080831161309f575b5050505050905090565b60015481565b6000600d54905090565b6000806000806130db6151f4565b91506130e56152e4565b905080829350935050509091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561314e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156131ab573d6000803e3d6000fd5b5050565b6000600654905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561321457600080fd5b7f8b732648ec6304b6125c30b24aa7c51736b4c10b079067109e27cbb1e2e9052581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a16001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600042601260008481526020019081526020016000206002015411158015613310575060006012600084815260200190815260200160002060080154115b801561333d575060126000838152602001908152602001600020600c0160009054906101000a900460ff16155b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561339f57600080fd5b8061271081101561343757600a5482808211156133c25783600481905550613430565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4e6f74206269676765720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506134a5565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420696e2072616e6765000000000000000000000000000000000000000081525060200191505060405180910390fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561350457600080fd5b600860149054906101000a900460ff1615600860146101000a81548160ff021916908315150217905550565b60126020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060154908060070160009054906101000a900460ff169080600801549080600901549080600a01549080600b01549080600c0160009054906101000a900460ff169080600c0160019054906101000a900460ff1690508e565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561367e57600080fd5b81600b8190555080600c819055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156136eb57600080fd5b80600d8190555050565b600080600080600060149054906101000a900460ff1615151561371757600080fd5b60126000878152602001908152602001600020600901548042101515156137a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f506f6f6c206e6f74206f70656e2079657400000000000000000000000000000081525060200191505060405180910390fd5b6011548710151561381f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f57726f6e6720706f6f6c2069642c20496e766573744552433230206661696c0081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166012600089815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156138fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f506f6f6c20697320666f72204554482c2075736520496e76657445544800000081525060200191505060405180910390fd5b61271086111515613973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e65656420696e76657374206d6f7265207468656e203130303030000000000081525060200191505060405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480156139b457506139b233615371565b155b1515613a4e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f536f6d65207468696e672077726f6e67207769746820746865206d736753656e81526020017f646572000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b613a8f6012600089815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163388614b8d565b613a9a33878961538a565b9450613aa7878733615583565b93506012600088815260200190815260200160002060070160009054906101000a900460ff1615613b1157613af2601560008781526020019081526020016000206004015485614b71565b6015600087815260200190815260200160002060040181905550613b53565b613b526012600089815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163386614fd9565b5b613b70613b6887613b638a61576f565b614f8b565b612710614fc3565b9250613b7c8684614f72565b9150613bfd60096000601260008b815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484614b71565b60096000601260008b815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ced6012600089815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260008a815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684614fd9565b613cf787856157d8565b50505050505050565b6000601154905090565b600080613d15612d4a565b1515613daf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4e656564206d6f7265207468616e206d696e696d616c20776f726b20636f756e81526020017f740000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b613db76130cd565b915091509091565b6000613dca33615937565b905090565b600080600e54600f54915091509091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613e3b57600080fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006014548211158015613ea9575060006015600084815260200190815260200160002060040154115b8015613ee157504260126000601560008681526020019081526020016000206000015481526020019081526020016000206002015411155b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613f4357600080fd5b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515614005576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f5468697320546f6b656e20696e204c697374000000000000000000000000000081525060200191505060405180910390fd5b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508060036000600154815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016000815480929190600101919050555050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000806000806000806000601154881015156141a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260088152602001807f57726f6e6720496400000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6141a98861175e565b601260008a815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260008b815260200190815260200160002060030154601260008c815260200190815260200160002060040154601260008d815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260008e815260200190815260200160002060060154601260008f8152602001908152602001600020600801549650965096509650965096509650919395979092949650565b60008060003433600e5480831015151561430e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f53656e642045544820746f20696e76657374000000000000000000000000000081525060200191505060405180910390fd5b7f3a32cdd14cdfd431946dfa0b2aef5ace661340411aaadcaee6aef6738d3023268383604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1600060149054906101000a900460ff1615151561439557600080fd5b6012600088815260200190815260200160002060090154804210151515614424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f506f6f6c206e6f74206f70656e2079657400000000000000000000000000000081525060200191505060405180910390fd5b6011548810151561449d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f57726f6e6720706f6f6c2069642c20496e76657374455448206661696c00000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601260008a815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515614577576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c206973206e6f7420666f72204554480000000000000000000000000081525060200191505060405180910390fd5b600e54341015801561458b5750600f543411155b15156145ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f496e766573746d656e7420616d6f756e74206e6f742076616c6964000000000081525060200191505060405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148015614640575061463e33615371565b155b15156146da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f536f6d65207468696e672077726f6e67207769746820746865206d736753656e81526020017f646572000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6146e533348a61538a565b96506146f2883433615583565b95506012600089815260200190815260200160002060070160009054906101000a900460ff161561475c5761473d601560008981526020019081526020016000206004015487614b71565b601560008981526020019081526020016000206004018190555061479e565b61479d601260008a815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163388614fd9565b5b6147c66147be346147b96127106147b48d61576f565b614f72565b614f8b565b612710614fc3565b9450614808601260008a815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686615be0565b61481288876157d8565b5050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561487757600080fd5b61488081615d4a565b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156148de57600080fd5b806127108110156148f55781600581905550614963565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420696e2072616e6765000000000000000000000000000000000000000081525060200191505060405180910390fd5b5050565b600080600b54600c54915091509091565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156149fb57600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614a8d838383614fd9565b505050565b6000614a9d826132d2565b15614b6757600160126000848152602001908152602001600020600c0160006101000a81548160ff021916908315150217905550614b5e6012600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166012600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166012600086815260200190815260200160002060080154614fd9565b60019050614b6c565b600090505b919050565b60008183019050828110151515614b8457fe5b80905092915050565b6000838383808373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015614c6257600080fd5b505af1158015614c76573d6000803e3d6000fd5b505050506040513d6020811015614c8c57600080fd5b810190808051906020019092919050505010151515614d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6e6f20616c6c6f77616e6365000000000000000000000000000000000000000081525060200191505060405180910390fd5b600085111515614d2257600080fd5b614d2c8730615e44565b93508673ffffffffffffffffffffffffffffffffffffffff166323b872dd8730886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015614e0557600080fd5b505af1158015614e19573d6000803e3d6000fd5b505050506040513d6020811015614e2f57600080fd5b8101908080519060200190929190505050507f1fecf4702e692891a7c2f0d328779b085efb5edd094fa5558bd5cd147a167922858789604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1614eea8730615e44565b614ef48587614b71565b141515614f69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f7265636976652077726f6e6720616d6f756e74206f6620746f6b656e7300000081525060200191505060405180910390fd5b50505050505050565b6000828211151515614f8057fe5b818303905092915050565b600080831415614f9e5760009050614fbd565b8183029050818382811515614faf57fe5b04141515614fb957fe5b8090505b92915050565b60008183811515614fd057fe5b04905092915050565b6000614fe58430615e44565b90507fe4d818e6f992efbd60db553f3edce819a199baec79a784b95c89bc8ee86f2584828486604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a18373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561512957600080fd5b505af115801561513d573d6000803e3d6000fd5b505050506040513d602081101561515357600080fd5b810190808051906020019092919050505050806151796151738630615e44565b84614b71565b1415156151ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f7265636976652077726f6e6720616d6f756e74206f6620746f6b656e7300000081525060200191505060405180910390fd5b50505050565b6000806000806000925060019150601a5490505b60115481101561529a5761521b81614a92565b156152295782806001019350505b818015615277575060126000828152602001908152602001600020600c0160009054906101000a900460ff1680615276575060006012600083815260200190815260200160002060080154145b5b156152885780601a8190555061528d565b600091505b8080600101915050615208565b7f3005a0f763f21b4679f98ce03bd40a15fc21b871f8a6d53f31b178eb48b363a2601a5484604051808381526020018281526020019250505060405180910390a182935050505090565b600080600080915060195490505b6014548110156153205761530581612e41565b156153135781806001019250505b80806001019150506152f2565b615328615f24565b7f0111a2001f659cb316fe4387f5e5c576ce14c1241b33116cfa56777917acf27b60195483604051808381526020018281526020019250505060405180910390a1819250505090565b600080823b905060008163ffffffff1611915050919050565b600060c0604051908101604052808381526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020016153c986615937565b1515815260200160008152602001428152506015600060145481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055506080820151816004015560a08201518160050155905050601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060145490806001815401808255809150509060018203906000526020600020016000909192909190915055507ff4d99203a75a5961a6c1decf46e41b27f411990cda8e317361361339f8dffa5560145485604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a16155676014546001614b71565b60148190555061557a6014546001614f72565b90509392505050565b6000806000849150600090506000600581111561559c57fe5b6155a58761175e565b60058111156155b057fe5b1415615656576155bf84615937565b1515615633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e65656420746f20626520504f5a20486f6c64657220746f20696e766573740081525060200191505060405180910390fd5b615653826012600089815260200190815260200160002060040154614f8b565b90505b6001600581111561566357fe5b61566c8761175e565b600581111561567757fe5b14156156a05761569d826012600089815260200190815260200160002060030154614f8b565b90505b683635c9adc5dea000008111156156f85760126000878152602001908152602001600020600c0160019054906101000a900460ff16156156f0576156ed81683635c9adc5dea00000614fc3565b90505b809250615766565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f57726f6e6720706f6f6c2073746174757320746f2043616c63546f6b656e730081525060200191505060405180910390fd5b50509392505050565b600080600581111561577d57fe5b6157868361175e565b600581111561579157fe5b14156157a15760045490506157d3565b600160058111156157ae57fe5b6157b78361175e565b60058111156157c257fe5b14156157d257600a5490506157d3565b5b919050565b60126000838152602001908152602001600020600801548111151515615866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4e6f7420656e6f75676820746f6b656e7320696e2074686520706f6f6c00000081525060200191505060405180910390fd5b615886601260008481526020019081526020016000206008015482614f72565b60126000848152602001908152602001600020600801819055506000601260008481526020019081526020016000206008015414156158fb577f5aa793a17b0774b891ce2b0dd5dbe8f04132e547df384ab1053d32470050b5fa826040518082815260200191505060405180910390a1615933565b7f46074c56f8b8129e3ada6879521255be1596856f97bf16070e5cdd3a10dc1df7826040518082815260200191505060405180910390a15b5050565b60008073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480156159e45750600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156159f25760019050615bdb565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015615a7e5750600654615a7b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684615e44565b10155b80615bd85750600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015615bd75750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b217bb01836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015615b9b57600080fd5b505af1158015615baf573d6000803e3d6000fd5b505050506040513d6020811015615bc557600080fd5b81019080805190602001909291905050505b5b90505b919050565b60007feca5ae7bd9109b0f7d228f3f8a8cc834a1f995af62df6dc226dc3ab3f38dc7b38284604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a18273ffffffffffffffffffffffffffffffffffffffff163190508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015615cad573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff1631615cd08284614b71565b141515615d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f546865207472616e7366657220646964206e6f7420636f6d706c69746500000081525060200191505060405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515615d8657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015615ee157600080fd5b505af1158015615ef5573d6000803e3d6000fd5b505050506040513d6020811015615f0b57600080fd5b8101908080519060200190929190505050905092915050565b600060195490505b601454811015615f9057600580811115615f4257fe5b615f61601560008481526020019081526020016000206000015461175e565b6005811115615f6c57fe5b1415615f7e5780601981905550615f83565b615f91565b8080600101915050615f2c565b5b505600a165627a7a72305820b1791977417ce47efc6195e442cf1447534c03fa9c6a50781c1e664b7d2e96e70029

Deployed ByteCode

0x6080604052600436106102ff576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062172ddf1461031c578062ea921614610349578063014f3aff1461038c57806307b027ed146103b75780630d08caa0146103ce578063114fa9bd1461041d5780631ac8989f146104785780631f2750d4146104a35780632ef680a7146104da5780633037548a1461053157806331ec77e11461058c5780633e90eea7146105b95780633f4ba83a146105f057806348d9614d146106075780634eb129c8146106325780635448a0d51461067557806356793bc7146107155780635c975abb146107765780635cdddc7c146107a55780635ea84ad6146107d457806360f9e80a14610801578063624dea1c1461089557806363552a49146108c457806366b91da9146109305780636e2402d9146109c8578063715018a6146109fa57806377623c5e14610a115780637e06d5f514610a54578063842bac4514610a835780638456cb5914610aae57806387e3c59914610ac55780638c788de014610b0a5780638da5cb5b14610b355780638fc5108b14610b8c578063904d22f514610bb957806391314dde14610be457806396b797ea14610c50578063979fc38c14610c7b57806398399c3e14610ca6578063991e979a14610cd85780639baf390a14610d1b578063a38c654914610d46578063a73ff12814610d89578063a87d2be414610dce578063aac5da5c14610dfb578063ac4afa3814610e12578063b7d9b6f114610f3e578063b977eddf14610f75578063be33a3ec14610fa2578063c5053add14610fd9578063cc19723d14611004578063d151282814611036578063db62ec5914611065578063de5b521d14611097578063e34c7772146110da578063e473c74f1461111f578063e890671614611162578063ea9223a6146111bd578063f04be48b1461128e578063f2fde38b146112ae578063f3188248146112f1578063f31de1fa1461131e578063f65dd7a714611350578063fc1a86ff146113a7578063fd711a551461140a575b600860149054906101000a900460ff16151561031a57600080fd5b005b34801561032857600080fd5b506103476004803603810190808035906020019092919050505061144f565b005b34801561035557600080fd5b5061038a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115b4565b005b34801561039857600080fd5b506103a16116cd565b6040518082815260200191505060405180910390f35b3480156103c357600080fd5b506103cc6116d7565b005b3480156103da57600080fd5b506103f96004803603810190808035906020019092919050505061175e565b6040518082600581111561040957fe5b60ff16815260200191505060405180910390f35b34801561042957600080fd5b5061045e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ab1565b604051808215151515815260200191505060405180910390f35b34801561048457600080fd5b5061048d611b1e565b6040518082815260200191505060405180910390f35b3480156104af57600080fd5b506104d86004803603810190808035906020019092919080359060200190929190505050611b28565b005b3480156104e657600080fd5b506104ef611b95565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053d57600080fd5b50610572600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bbb565b604051808215151515815260200191505060405180910390f35b34801561059857600080fd5b506105b760048036038101908080359060200190929190505050611bdb565b005b3480156105c557600080fd5b506105ee6004803603810190808035906020019092919080359060200190929190505050611c40565b005b3480156105fc57600080fd5b50610605611cad565b005b34801561061357600080fd5b5061061c611d6b565b6040518082815260200191505060405180910390f35b34801561063e57600080fd5b50610673600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d75565b005b610713600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803515159060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919080359060200190929190505050611eec565b005b34801561072157600080fd5b50610760600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061265b565b6040518082815260200191505060405180910390f35b34801561078257600080fd5b5061078b61268b565b604051808215151515815260200191505060405180910390f35b3480156107b157600080fd5b506107ba61269e565b604051808215151515815260200191505060405180910390f35b3480156107e057600080fd5b506107ff600480360381019080803590602001909291905050506126b1565b005b34801561080d57600080fd5b5061082c60048036038101908080359060200190929190505050612716565b604051808781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184151515158152602001838152602001828152602001965050505050505060405180910390f35b3480156108a157600080fd5b506108aa61291b565b604051808215151515815260200191505060405180910390f35b3480156108d057600080fd5b506108d9612932565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561091c578082015181840152602081019050610901565b505050509050019250505060405180910390f35b34801561093c57600080fd5b5061095b600480360381019080803590602001909291905050506129c7565b60405180871515151581526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182151515158152602001965050505050505060405180910390f35b3480156109d457600080fd5b506109dd612b22565b604051808381526020018281526020019250505060405180910390f35b348015610a0657600080fd5b50610a0f612ba9565b005b348015610a1d57600080fd5b50610a52600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cab565b005b348015610a6057600080fd5b50610a69612d4a565b604051808215151515815260200191505060405180910390f35b348015610a8f57600080fd5b50610a98612d77565b6040518082815260200191505060405180910390f35b348015610aba57600080fd5b50610ac3612d81565b005b348015610ad157600080fd5b50610af060048036038101908080359060200190929190505050612e41565b604051808215151515815260200191505060405180910390f35b348015610b1657600080fd5b50610b1f612f8e565b6040518082815260200191505060405180910390f35b348015610b4157600080fd5b50610b4a612f94565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b9857600080fd5b50610bb760048036038101908080359060200190929190505050612fb9565b005b348015610bc557600080fd5b50610bce61301e565b6040518082815260200191505060405180910390f35b348015610bf057600080fd5b50610bf9613028565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c3c578082015181840152602081019050610c21565b505050509050019250505060405180910390f35b348015610c5c57600080fd5b50610c656130bd565b6040518082815260200191505060405180910390f35b348015610c8757600080fd5b50610c906130c3565b6040518082815260200191505060405180910390f35b348015610cb257600080fd5b50610cbb6130cd565b604051808381526020018281526020019250505060405180910390f35b348015610ce457600080fd5b50610d19600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130f3565b005b348015610d2757600080fd5b50610d306131af565b6040518082815260200191505060405180910390f35b348015610d5257600080fd5b50610d87600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131b9565b005b348015610d9557600080fd5b50610db4600480360381019080803590602001909291905050506132d2565b604051808215151515815260200191505060405180910390f35b348015610dda57600080fd5b50610df960048036038101908080359060200190929190505050613344565b005b348015610e0757600080fd5b50610e106134a9565b005b348015610e1e57600080fd5b50610e3d60048036038101908080359060200190929190505050613530565b604051808f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018d81526020018c81526020018b81526020018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018815151515815260200187815260200186815260200185815260200184815260200183151515158152602001821515151581526020019e50505050505050505050505050505060405180910390f35b348015610f4a57600080fd5b50610f736004803603810190808035906020019092919080359060200190929190505050613623565b005b348015610f8157600080fd5b50610fa060048036038101908080359060200190929190505050613690565b005b348015610fae57600080fd5b50610fd760048036038101908080359060200190929190803590602001909291905050506136f5565b005b348015610fe557600080fd5b50610fee613d00565b6040518082815260200191505060405180910390f35b34801561101057600080fd5b50611019613d0a565b604051808381526020018281526020019250505060405180910390f35b34801561104257600080fd5b5061104b613dbf565b604051808215151515815260200191505060405180910390f35b34801561107157600080fd5b5061107a613dcf565b604051808381526020018281526020019250505060405180910390f35b3480156110a357600080fd5b506110d8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613de0565b005b3480156110e657600080fd5b5061110560048036038101908080359060200190929190505050613e7f565b604051808215151515815260200191505060405180910390f35b34801561112b57600080fd5b50611160600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ee8565b005b34801561116e57600080fd5b506111a3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506140c6565b604051808215151515815260200191505060405180910390f35b3480156111c957600080fd5b506111e86004803603810190808035906020019092919050505061411c565b604051808860058111156111f857fe5b60ff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200197505050505050505060405180910390f35b6112ac6004803603810190808035906020019092919050505061428c565b005b3480156112ba57600080fd5b506112ef600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061481c565b005b3480156112fd57600080fd5b5061131c60048036038101908080359060200190929190505050614883565b005b34801561132a57600080fd5b50611333614967565b604051808381526020018281526020019250505060405180910390f35b34801561135c57600080fd5b50611365614978565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156113b357600080fd5b50611408600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061499e565b005b34801561141657600080fd5b5061143560048036038101908080359060200190929190505050614a92565b604051808215151515815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114aa57600080fd5b806127108110156115425781600454808211156114cd5783600a8190555061153b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4e6f74206269676765720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506115b0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420696e2072616e6765000000000000000000000000000000000000000081525060200191505060405180910390fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561160f57600080fd5b7f46e7a65ed7662dc42b119afa3a03fc8474ed27a5a48d664c0b5e8b87b04184cf81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a16000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600554905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173257600080fd5b600060159054906101000a900460ff1615600060156101000a81548160ff021916908315150217905550565b6000601154821015156117d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f57726f6e6720706f6f6c2069642c2043616e277420676574205374617475730081525060200191505060405180910390fd5b60126000838152602001908152602001600020600901544210156118005760029050611aac565b60126000838152602001908152602001600020600a01544210801561183b575060006012600084815260200190815260200160002060080154115b156118495760009050611aac565b60126000838152602001908152602001600020600a01544210158015611885575060006012600084815260200190815260200160002060080154115b80156118a65750601260008381526020019081526020016000206002015442105b156118b45760019050611aac565b600060126000848152602001908152602001600020600801541480156118fa57506012600083815260200190815260200160002060070160009054906101000a900460ff165b801561191b5750601260008381526020019081526020016000206002015442105b156119295760039050611aac565b6000601260008481526020019081526020016000206008015414801561197057506012600083815260200190815260200160002060070160009054906101000a900460ff16155b1561197e5760059050611aac565b601260008381526020019081526020016000206002015442101580156119c557506012600083815260200190815260200160002060070160009054906101000a900460ff16155b15611a055760126000838152602001908152602001600020600c0160009054906101000a900460ff16156119fc5760059050611aac565b60049050611aac565b60126000838152602001908152602001600020600c0160009054906101000a900460ff1680611a4a575060006012600084815260200190815260200160002060080154145b8015611a9957506012600083815260200190815260200160002060060154601260008481526020019081526020016000206008015460126000858152602001908152602001600020600b015401145b15611aa75760059050611aac565b600490505b919050565b60008060159054906101000a900460ff161580611b175750600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b9050919050565b6000600454905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8357600080fd5b8160198190555080601a819055505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3657600080fd5b8060178190555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c9b57600080fd5b81600e8190555080600f819055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d0857600080fd5b600060149054906101000a900460ff161515611d2357600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600a54905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd057600080fd5b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611e91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5468697320546f6b656e206e6f7420696e204c6973740000000000000000000081525060200191505060405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060149054906101000a900460ff16151515611f0957600080fd5b600d543410151515611f83576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e65656420746f2070617920666f722074686520706f6f6c000000000000000081525060200191505060405180910390fd5b611f8c8a611ab1565b1515612000576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4e6565642056616c696420455243323020546f6b656e0000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612040575061203f846140c6565b5b15156120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4d61696e20636f696e206e6f7420696e206c697374000000000000000000000081525060200191505060405180910390fd5b600c54428a0310151561212f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f43616e27742062652074686174206c6f6e6720706f6f6c00000000000000000081525060200191505060405180910390fd5b8688111515156121cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001807f504f5a20686f6c64657273206e65656420746f2068617665206265747465722081526020017f707269636520286f72207468652073616d65290000000000000000000000000081525060400191505060405180910390fd5b600087111515612245576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f49742077696c6c206e6f7420776f726b0000000000000000000000000000000081525060200191505060405180910390fd5b42821015612251574291505b8861225e42600b54614b71565b111515156122d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e656564206d6f7265207468656e204d696e4475726174696f6e00000000000081525060200191505060405180910390fd5b6122df8a3388614b8d565b8688146123145761230f6123096123016122f98c86614f72565b600554614f8b565b612710614fc3565b83614b71565b612316565b815b90506101c0604051908101604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018881526020018573ffffffffffffffffffffffffffffffffffffffff16815260200187815260200186151581526020018781526020018381526020018281526020016000815260200160001515815260200184151581525060126000601154815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015560e08201518160070160006101000a81548160ff0219169083151502179055506101008201518160080155610120820151816009015561014082015181600a015561016082015181600b015561018082015181600c0160006101000a81548160ff0219169083151502179055506101a082015181600c0160016101000a81548160ff021916908315150217905550905050601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060115490806001815401808255809150509060018203906000526020600020016000909192909190915055507fbe4222bc407cb12031595fc55b46531e46308d31e4572c9c4360d8ae790e1a318a601154604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a16126496011546001614b71565b60118190555050505050505050505050565b60136020528160005260406000208181548110151561267657fe5b90600052602060002001600091509150505481565b600060149054906101000a900460ff1681565b600060159054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561270c57600080fd5b8060068190555050565b6000806000806000803373ffffffffffffffffffffffffffffffffffffffff166015600089815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806127db57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561284f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f6e6c7920666f722074686520696e766573746f7220286f722041646d696e2981525060200191505060405180910390fd5b60156000888152602001908152602001600020600001546015600089815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601560008a815260200190815260200160002060020154601560008b815260200190815260200160002060030160009054906101000a900460ff16601560008c815260200190815260200160002060040154601560008d81526020019081526020016000206005015495509550955095509550955091939550919395565b6000600860149054906101000a900460ff16905090565b6060601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156129bd57602002820191906000526020600020905b8154815260200190600101908083116129a9575b5050505050905090565b60008060008060008060115487101515612a49576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260088152602001807f57726f6e6720496400000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6012600088815260200190815260200160002060070160009054906101000a900460ff166012600089815260200190815260200160002060090154601260008a815260200190815260200160002060020154601260008b8152602001908152602001600020600a0154601260008c815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260008d8152602001908152602001600020600c0160019054906101000a900460ff1695509550955095509550955091939550919395565b600080600080600080600093506000925060195491505b601454821015612b6757612b4c82613e7f565b15612b5a5783806001019450505b8180600101925050612b39565b601a5490505b601154811015612b9b57612b80816132d2565b15612b8e5782806001019350505b8080600101915050612b6d565b838395509550505050509091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c0457600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d0657600080fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000612d57612b22565b8092508193505050601754821180612d70575060185481115b9250505090565b6000601854905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ddc57600080fd5b600060149054906101000a900460ff16151515612df857600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600080612e4d83613e7f565b15612f83576015600084815260200190815260200160002060040154905060006015600085815260200190815260200160002060040181905550612f14601260006015600087815260200190815260200160002060000154815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166015600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683614fd9565b612f4a6012600060156000878152602001908152602001600020600001548152602001908152602001600020600b015482614b71565b6012600060156000878152602001908152602001600020600001548152602001908152602001600020600b018190555060019150612f88565b600091505b50919050565b60115481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561301457600080fd5b8060188190555050565b6000601754905090565b6060601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156130b357602002820191906000526020600020905b81548152602001906001019080831161309f575b5050505050905090565b60015481565b6000600d54905090565b6000806000806130db6151f4565b91506130e56152e4565b905080829350935050509091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561314e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156131ab573d6000803e3d6000fd5b5050565b6000600654905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561321457600080fd5b7f8b732648ec6304b6125c30b24aa7c51736b4c10b079067109e27cbb1e2e9052581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a16001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600042601260008481526020019081526020016000206002015411158015613310575060006012600084815260200190815260200160002060080154115b801561333d575060126000838152602001908152602001600020600c0160009054906101000a900460ff16155b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561339f57600080fd5b8061271081101561343757600a5482808211156133c25783600481905550613430565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4e6f74206269676765720000000000000000000000000000000000000000000081525060200191505060405180910390fd5b50506134a5565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420696e2072616e6765000000000000000000000000000000000000000081525060200191505060405180910390fd5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561350457600080fd5b600860149054906101000a900460ff1615600860146101000a81548160ff021916908315150217905550565b60126020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060154908060070160009054906101000a900460ff169080600801549080600901549080600a01549080600b01549080600c0160009054906101000a900460ff169080600c0160019054906101000a900460ff1690508e565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561367e57600080fd5b81600b8190555080600c819055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156136eb57600080fd5b80600d8190555050565b600080600080600060149054906101000a900460ff1615151561371757600080fd5b60126000878152602001908152602001600020600901548042101515156137a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f506f6f6c206e6f74206f70656e2079657400000000000000000000000000000081525060200191505060405180910390fd5b6011548710151561381f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f57726f6e6720706f6f6c2069642c20496e766573744552433230206661696c0081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166012600089815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156138fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f506f6f6c20697320666f72204554482c2075736520496e76657445544800000081525060200191505060405180910390fd5b61271086111515613973576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e65656420696e76657374206d6f7265207468656e203130303030000000000081525060200191505060405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480156139b457506139b233615371565b155b1515613a4e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f536f6d65207468696e672077726f6e67207769746820746865206d736753656e81526020017f646572000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b613a8f6012600089815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163388614b8d565b613a9a33878961538a565b9450613aa7878733615583565b93506012600088815260200190815260200160002060070160009054906101000a900460ff1615613b1157613af2601560008781526020019081526020016000206004015485614b71565b6015600087815260200190815260200160002060040181905550613b53565b613b526012600089815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163386614fd9565b5b613b70613b6887613b638a61576f565b614f8b565b612710614fc3565b9250613b7c8684614f72565b9150613bfd60096000601260008b815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484614b71565b60096000601260008b815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613ced6012600089815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260008a815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684614fd9565b613cf787856157d8565b50505050505050565b6000601154905090565b600080613d15612d4a565b1515613daf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f4e656564206d6f7265207468616e206d696e696d616c20776f726b20636f756e81526020017f740000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b613db76130cd565b915091509091565b6000613dca33615937565b905090565b600080600e54600f54915091509091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613e3b57600080fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006014548211158015613ea9575060006015600084815260200190815260200160002060040154115b8015613ee157504260126000601560008681526020019081526020016000206000015481526020019081526020016000206002015411155b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613f4357600080fd5b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515614005576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f5468697320546f6b656e20696e204c697374000000000000000000000000000081525060200191505060405180910390fd5b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508060036000600154815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016000815480929190600101919050555050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000806000806000806000601154881015156141a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260088152602001807f57726f6e6720496400000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6141a98861175e565b601260008a815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260008b815260200190815260200160002060030154601260008c815260200190815260200160002060040154601260008d815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260008e815260200190815260200160002060060154601260008f8152602001908152602001600020600801549650965096509650965096509650919395979092949650565b60008060003433600e5480831015151561430e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f53656e642045544820746f20696e76657374000000000000000000000000000081525060200191505060405180910390fd5b7f3a32cdd14cdfd431946dfa0b2aef5ace661340411aaadcaee6aef6738d3023268383604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a1600060149054906101000a900460ff1615151561439557600080fd5b6012600088815260200190815260200160002060090154804210151515614424576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f506f6f6c206e6f74206f70656e2079657400000000000000000000000000000081525060200191505060405180910390fd5b6011548810151561449d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f57726f6e6720706f6f6c2069642c20496e76657374455448206661696c00000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601260008a815260200190815260200160002060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515614577576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f506f6f6c206973206e6f7420666f72204554480000000000000000000000000081525060200191505060405180910390fd5b600e54341015801561458b5750600f543411155b15156145ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f496e766573746d656e7420616d6f756e74206e6f742076616c6964000000000081525060200191505060405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148015614640575061463e33615371565b155b15156146da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f536f6d65207468696e672077726f6e67207769746820746865206d736753656e81526020017f646572000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6146e533348a61538a565b96506146f2883433615583565b95506012600089815260200190815260200160002060070160009054906101000a900460ff161561475c5761473d601560008981526020019081526020016000206004015487614b71565b601560008981526020019081526020016000206004018190555061479e565b61479d601260008a815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163388614fd9565b5b6147c66147be346147b96127106147b48d61576f565b614f72565b614f8b565b612710614fc3565b9450614808601260008a815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686615be0565b61481288876157d8565b5050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561487757600080fd5b61488081615d4a565b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156148de57600080fd5b806127108110156148f55781600581905550614963565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4e6f7420696e2072616e6765000000000000000000000000000000000000000081525060200191505060405180910390fd5b5050565b600080600b54600c54915091509091565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156149fb57600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614a8d838383614fd9565b505050565b6000614a9d826132d2565b15614b6757600160126000848152602001908152602001600020600c0160006101000a81548160ff021916908315150217905550614b5e6012600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166012600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166012600086815260200190815260200160002060080154614fd9565b60019050614b6c565b600090505b919050565b60008183019050828110151515614b8457fe5b80905092915050565b6000838383808373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015614c6257600080fd5b505af1158015614c76573d6000803e3d6000fd5b505050506040513d6020811015614c8c57600080fd5b810190808051906020019092919050505010151515614d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6e6f20616c6c6f77616e6365000000000000000000000000000000000000000081525060200191505060405180910390fd5b600085111515614d2257600080fd5b614d2c8730615e44565b93508673ffffffffffffffffffffffffffffffffffffffff166323b872dd8730886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015614e0557600080fd5b505af1158015614e19573d6000803e3d6000fd5b505050506040513d6020811015614e2f57600080fd5b8101908080519060200190929190505050507f1fecf4702e692891a7c2f0d328779b085efb5edd094fa5558bd5cd147a167922858789604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a1614eea8730615e44565b614ef48587614b71565b141515614f69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f7265636976652077726f6e6720616d6f756e74206f6620746f6b656e7300000081525060200191505060405180910390fd5b50505050505050565b6000828211151515614f8057fe5b818303905092915050565b600080831415614f9e5760009050614fbd565b8183029050818382811515614faf57fe5b04141515614fb957fe5b8090505b92915050565b60008183811515614fd057fe5b04905092915050565b6000614fe58430615e44565b90507fe4d818e6f992efbd60db553f3edce819a199baec79a784b95c89bc8ee86f2584828486604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a18373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561512957600080fd5b505af115801561513d573d6000803e3d6000fd5b505050506040513d602081101561515357600080fd5b810190808051906020019092919050505050806151796151738630615e44565b84614b71565b1415156151ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f7265636976652077726f6e6720616d6f756e74206f6620746f6b656e7300000081525060200191505060405180910390fd5b50505050565b6000806000806000925060019150601a5490505b60115481101561529a5761521b81614a92565b156152295782806001019350505b818015615277575060126000828152602001908152602001600020600c0160009054906101000a900460ff1680615276575060006012600083815260200190815260200160002060080154145b5b156152885780601a8190555061528d565b600091505b8080600101915050615208565b7f3005a0f763f21b4679f98ce03bd40a15fc21b871f8a6d53f31b178eb48b363a2601a5484604051808381526020018281526020019250505060405180910390a182935050505090565b600080600080915060195490505b6014548110156153205761530581612e41565b156153135781806001019250505b80806001019150506152f2565b615328615f24565b7f0111a2001f659cb316fe4387f5e5c576ce14c1241b33116cfa56777917acf27b60195483604051808381526020018281526020019250505060405180910390a1819250505090565b600080823b905060008163ffffffff1611915050919050565b600060c0604051908101604052808381526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018481526020016153c986615937565b1515815260200160008152602001428152506015600060145481526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055506080820151816004015560a08201518160050155905050601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060145490806001815401808255809150509060018203906000526020600020016000909192909190915055507ff4d99203a75a5961a6c1decf46e41b27f411990cda8e317361361339f8dffa5560145485604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a16155676014546001614b71565b60148190555061557a6014546001614f72565b90509392505050565b6000806000849150600090506000600581111561559c57fe5b6155a58761175e565b60058111156155b057fe5b1415615656576155bf84615937565b1515615633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4e65656420746f20626520504f5a20486f6c64657220746f20696e766573740081525060200191505060405180910390fd5b615653826012600089815260200190815260200160002060040154614f8b565b90505b6001600581111561566357fe5b61566c8761175e565b600581111561567757fe5b14156156a05761569d826012600089815260200190815260200160002060030154614f8b565b90505b683635c9adc5dea000008111156156f85760126000878152602001908152602001600020600c0160019054906101000a900460ff16156156f0576156ed81683635c9adc5dea00000614fc3565b90505b809250615766565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f57726f6e6720706f6f6c2073746174757320746f2043616c63546f6b656e730081525060200191505060405180910390fd5b50509392505050565b600080600581111561577d57fe5b6157868361175e565b600581111561579157fe5b14156157a15760045490506157d3565b600160058111156157ae57fe5b6157b78361175e565b60058111156157c257fe5b14156157d257600a5490506157d3565b5b919050565b60126000838152602001908152602001600020600801548111151515615866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4e6f7420656e6f75676820746f6b656e7320696e2074686520706f6f6c00000081525060200191505060405180910390fd5b615886601260008481526020019081526020016000206008015482614f72565b60126000848152602001908152602001600020600801819055506000601260008481526020019081526020016000206008015414156158fb577f5aa793a17b0774b891ce2b0dd5dbe8f04132e547df384ab1053d32470050b5fa826040518082815260200191505060405180910390a1615933565b7f46074c56f8b8129e3ada6879521255be1596856f97bf16070e5cdd3a10dc1df7826040518082815260200191505060405180910390a15b5050565b60008073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480156159e45750600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156159f25760019050615bdb565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015615a7e5750600654615a7b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684615e44565b10155b80615bd85750600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015615bd75750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b217bb01836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015615b9b57600080fd5b505af1158015615baf573d6000803e3d6000fd5b505050506040513d6020811015615bc557600080fd5b81019080805190602001909291905050505b5b90505b919050565b60007feca5ae7bd9109b0f7d228f3f8a8cc834a1f995af62df6dc226dc3ab3f38dc7b38284604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a18273ffffffffffffffffffffffffffffffffffffffff163190508273ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015615cad573d6000803e3d6000fd5b508273ffffffffffffffffffffffffffffffffffffffff1631615cd08284614b71565b141515615d45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f546865207472616e7366657220646964206e6f7420636f6d706c69746500000081525060200191505060405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515615d8657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015615ee157600080fd5b505af1158015615ef5573d6000803e3d6000fd5b505050506040513d6020811015615f0b57600080fd5b8101908080519060200190929190505050905092915050565b600060195490505b601454811015615f9057600580811115615f4257fe5b615f61601560008481526020019081526020016000206000015461175e565b6005811115615f6c57fe5b1415615f7e5780601981905550615f83565b615f91565b8080600101915050615f2c565b5b505600a165627a7a72305820b1791977417ce47efc6195e442cf1447534c03fa9c6a50781c1e664b7d2e96e70029