ETH Price: $3,680.13 (-5.23%)

Contract

0xDfe6bECa1E3CB35F051276d713e420dE5DE58577
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Name66727472018-11-09 14:00:042231 days ago1541772004IN
0xDfe6bECa...E5DE58577
0 ETH0.000147265
Set Name66727162018-11-09 13:53:002231 days ago1541771580IN
0xDfe6bECa...E5DE58577
0 ETH0.000147585
Set Name66727132018-11-09 13:52:182231 days ago1541771538IN
0xDfe6bECa...E5DE58577
0 ETH0.000147265
Set Name66727082018-11-09 13:50:562231 days ago1541771456IN
0xDfe6bECa...E5DE58577
0 ETH0.000147585
Set Name61717772018-08-18 21:30:512314 days ago1534627851IN
0xDfe6bECa...E5DE58577
0 ETH0.000043791.5
Set Name61717742018-08-18 21:30:312314 days ago1534627831IN
0xDfe6bECa...E5DE58577
0 ETH0.000043791.5
Set Name61717632018-08-18 21:27:492314 days ago1534627669IN
0xDfe6bECa...E5DE58577
0 ETH0.000043311.5
Set Name61717612018-08-18 21:27:122314 days ago1534627632IN
0xDfe6bECa...E5DE58577
0 ETH0.00004361.5
Set Name61717612018-08-18 21:27:122314 days ago1534627632IN
0xDfe6bECa...E5DE58577
0 ETH0.000043411.5
Set Name61717582018-08-18 21:26:452314 days ago1534627605IN
0xDfe6bECa...E5DE58577
0 ETH0.000043411.5
Set Name61717562018-08-18 21:26:322314 days ago1534627592IN
0xDfe6bECa...E5DE58577
0 ETH0.000043411.5
Set Name61717472018-08-18 21:24:522314 days ago1534627492IN
0xDfe6bECa...E5DE58577
0 ETH0.000043411.5
Set Name61717212018-08-18 21:19:222314 days ago1534627162IN
0xDfe6bECa...E5DE58577
0 ETH0.000043411.5
Set Name61717192018-08-18 21:19:142314 days ago1534627154IN
0xDfe6bECa...E5DE58577
0 ETH0.000043411.5
Set Name61716402018-08-18 20:59:482314 days ago1534625988IN
0xDfe6bECa...E5DE58577
0 ETH0.000043411.5
Set Name61716282018-08-18 20:56:192314 days ago1534625779IN
0xDfe6bECa...E5DE58577
0 ETH0.00004361.5
Set Name61716182018-08-18 20:54:102314 days ago1534625650IN
0xDfe6bECa...E5DE58577
0 ETH0.00004361.5
Set Name61716172018-08-18 20:54:072314 days ago1534625647IN
0xDfe6bECa...E5DE58577
0 ETH0.00004361.5
Set Name61715372018-08-18 20:34:332314 days ago1534624473IN
0xDfe6bECa...E5DE58577
0 ETH0.000043411.5
Set Name61671722018-08-18 2:50:362314 days ago1534560636IN
0xDfe6bECa...E5DE58577
0 ETH0.000043411.5
Set Name61539992018-08-15 21:04:242317 days ago1534367064IN
0xDfe6bECa...E5DE58577
0 ETH0.000043411.5
Set Name61407632018-08-13 15:45:082319 days ago1534175108IN
0xDfe6bECa...E5DE58577
0 ETH0.000144385
Set Name61071842018-08-07 23:22:312324 days ago1533684151IN
0xDfe6bECa...E5DE58577
0 ETH0.00004361.5
Set Name61071212018-08-07 23:08:112324 days ago1533683291IN
0xDfe6bECa...E5DE58577
0 ETH0.00004361.5
Set Name61032892018-08-07 7:22:382325 days ago1533626558IN
0xDfe6bECa...E5DE58577
0 ETH0.000043411.5
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CastleToken

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-07-25
*/

pragma solidity ^0.4.24;

/**
 * @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.
   */
  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() onlyOwner whenNotPaused public {
    paused = true;
    emit Pause();
  }

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

/**
 * @title Claimable
 * @dev Extension for the Ownable contract, where the ownership needs to be claimed.
 * This allows the new owner to accept the transfer.
 */
contract Claimable is Ownable {
  address public pendingOwner;

  /**
   * @dev Modifier throws if called by any account other than the pendingOwner.
   */
  modifier onlyPendingOwner() {
    require(msg.sender == pendingOwner);
    _;
  }

  /**
   * @dev Allows the current owner to set the pendingOwner address.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) onlyOwner public {
    pendingOwner = newOwner;
  }

  /**
   * @dev Allows the pendingOwner address to finalize the transfer.
   */
  function claimOwnership() onlyPendingOwner public {
    emit OwnershipTransferred(owner, pendingOwner);
    owner = pendingOwner;
    pendingOwner = address(0);
  }
}

contract AccessByGame is Pausable, Claimable {
  mapping(address => bool) internal contractAccess;

  modifier onlyAccessByGame {
    require(!paused && (msg.sender == owner || contractAccess[msg.sender] == true));
    _;
  }

  function grantAccess(address _address)
    onlyOwner
    public
  {
    contractAccess[_address] = true;
  }

  function revokeAccess(address _address)
    onlyOwner
    public
  {
    contractAccess[_address] = false;
  }
}

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev 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 ERC827 interface, an extension of ERC20 token standard
 *
 * @dev Interface of a ERC827 token, following the ERC20 standard with extra
 * @dev methods to transfer value and data and execute calls in transfers and
 * @dev approvals.
 */
contract ERC827 is ERC20 {
  function approveAndCall(
    address _spender,
    uint256 _value,
    bytes _data
  )
    public
    payable
    returns (bool);

  function transferAndCall(
    address _to,
    uint256 _value,
    bytes _data
  )
    public
    payable
    returns (bool);

  function transferFromAndCall(
    address _from,
    address _to,
    uint256 _value,
    bytes _data
  )
    public
    payable
    returns (bool);
}

/**
 * @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 Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

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

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

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

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

}

/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {

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


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _value
  )
    public
    returns (bool)
  {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

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

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(
    address _owner,
    address _spender
   )
    public
    view
    returns (uint256)
  {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(
    address _spender,
    uint _addedValue
  )
    public
    returns (bool)
  {
    allowed[msg.sender][_spender] = (
      allowed[msg.sender][_spender].add(_addedValue));
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseApproval(
    address _spender,
    uint _subtractedValue
  )
    public
    returns (bool)
  {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

contract ERC827Caller {
  function makeCall(address _target, bytes _data) external payable returns (bool) {
    // solium-disable-next-line security/no-call-value
    return _target.call.value(msg.value)(_data);
  }
}

/**
 * @title ERC827, an extension of ERC20 token standard
 *
 * @dev Implementation the ERC827, following the ERC20 standard with extra
 * @dev methods to transfer value and data and execute calls in transfers and
 * @dev approvals.
 *
 * @dev Uses OpenZeppelin StandardToken.
 */
contract ERC827Token is ERC827, StandardToken {
  ERC827Caller internal caller_;

  constructor() public {
    caller_ = new ERC827Caller();
  }

  /**
   * @dev Addition to ERC20 token methods. It allows to
   * @dev approve the transfer of value and execute a call with the sent data.
   *
   * @dev Beware that changing an allowance with this method brings the risk that
   * @dev someone may use both the old and the new allowance by unfortunate
   * @dev transaction ordering. One possible solution to mitigate this race condition
   * @dev is to first reduce the spender's allowance to 0 and set the desired value
   * @dev afterwards:
   * @dev https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * @param _spender The address that will spend the funds.
   * @param _value The amount of tokens to be spent.
   * @param _data ABI-encoded contract call to call `_to` address.
   *
   * @return true if the call function was executed successfully
   */
  function approveAndCall(
    address _spender,
    uint256 _value,
    bytes _data
  )
    public
    payable
    returns (bool)
  {
    require(_spender != address(this));

    super.approve(_spender, _value);

    // solium-disable-next-line security/no-call-value
    require(caller_.makeCall.value(msg.value)(_spender, _data));

    return true;
  }

  /**
   * @dev Addition to ERC20 token methods. Transfer tokens to a specified
   * @dev address and execute a call with the sent data on the same transaction
   *
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amout of tokens to be transfered
   * @param _data ABI-encoded contract call to call `_to` address.
   *
   * @return true if the call function was executed successfully
   */
  function transferAndCall(
    address _to,
    uint256 _value,
    bytes _data
  )
    public
    payable
    returns (bool)
  {
    require(_to != address(this));

    super.transfer(_to, _value);

    // solium-disable-next-line security/no-call-value
    require(caller_.makeCall.value(msg.value)(_to, _data));
    return true;
  }

  /**
   * @dev Addition to ERC20 token methods. Transfer tokens from one address to
   * @dev another and make a contract call on the same transaction
   *
   * @param _from The address which you want to send tokens from
   * @param _to The address which you want to transfer to
   * @param _value The amout of tokens to be transferred
   * @param _data ABI-encoded contract call to call `_to` address.
   *
   * @return true if the call function was executed successfully
   */
  function transferFromAndCall(
    address _from,
    address _to,
    uint256 _value,
    bytes _data
  )
    public payable returns (bool)
  {
    require(_to != address(this));

    super.transferFrom(_from, _to, _value);

    // solium-disable-next-line security/no-call-value
    require(caller_.makeCall.value(msg.value)(_to, _data));
    return true;
  }

  /**
   * @dev Addition to StandardToken methods. Increase the amount of tokens that
   * @dev an owner allowed to a spender and execute a call with the sent data.
   *
   * @dev approve should be called when allowed[_spender] == 0. To increment
   * @dev allowed value is better to use this function to avoid 2 calls (and wait until
   * @dev the first transaction is mined)
   * @dev From MonolithDAO Token.sol
   *
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   * @param _data ABI-encoded contract call to call `_spender` address.
   */
  function increaseApprovalAndCall(
    address _spender,
    uint _addedValue,
    bytes _data
  )
    public
    payable
    returns (bool)
  {
    require(_spender != address(this));

    super.increaseApproval(_spender, _addedValue);

    // solium-disable-next-line security/no-call-value
    require(caller_.makeCall.value(msg.value)(_spender, _data));

    return true;
  }

  /**
   * @dev Addition to StandardToken methods. Decrease the amount of tokens that
   * @dev an owner allowed to a spender and execute a call with the sent data.
   *
   * @dev approve should be called when allowed[_spender] == 0. To decrement
   * @dev allowed value is better to use this function to avoid 2 calls (and wait until
   * @dev the first transaction is mined)
   * @dev From MonolithDAO Token.sol
   *
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   * @param _data ABI-encoded contract call to call `_spender` address.
   */
  function decreaseApprovalAndCall(
    address _spender,
    uint _subtractedValue,
    bytes _data
  )
    public
    payable
    returns (bool)
  {
    require(_spender != address(this));

    super.decreaseApproval(_spender, _subtractedValue);

    // solium-disable-next-line security/no-call-value
    require(caller_.makeCall.value(msg.value)(_spender, _data));

    return true;
  }

}

/**
 * @title Mintable token
 * @dev Simple ERC20 Token example, with mintable token creation
 * @dev Issue: * https://github.com/OpenZeppelin/openzeppelin-solidity/issues/120
 * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
 */
contract MintableToken is StandardToken, Ownable {
  event Mint(address indexed to, uint256 amount);
  event MintFinished();

  bool public mintingFinished = false;


  modifier canMint() {
    require(!mintingFinished);
    _;
  }

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

  /**
   * @dev Function to mint tokens
   * @param _to The address that will receive the minted tokens.
   * @param _amount The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function mint(
    address _to,
    uint256 _amount
  )
    hasMintPermission
    canMint
    public
    returns (bool)
  {
    totalSupply_ = totalSupply_.add(_amount);
    balances[_to] = balances[_to].add(_amount);
    emit Mint(_to, _amount);
    emit Transfer(address(0), _to, _amount);
    return true;
  }

  /**
   * @dev Function to stop minting new tokens.
   * @return True if the operation was successful.
   */
  function finishMinting() onlyOwner canMint public returns (bool) {
    mintingFinished = true;
    emit MintFinished();
    return true;
  }
}

/// @title EverGold
/// @dev ERC827 Token for games.
contract EverGold is ERC827Token, MintableToken, AccessByGame {
  string public constant name = "Ever Gold";
  string public constant symbol = "EG";
  uint8 public constant decimals = 0;

/**
   * @dev Function to mint tokens
   * @param _to The address that will receive the minted tokens.
   * @param _amount The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function mint(
    address _to,
    uint256 _amount
  )
    onlyAccessByGame
    canMint
    public
    returns (bool)
  {
    totalSupply_ = totalSupply_.add(_amount);
    balances[_to] = balances[_to].add(_amount);
    emit Mint(_to, _amount);
    emit Transfer(address(0), _to, _amount);
    return true;
  }
  function transfer(address _to, uint256 _value)
    public
    whenNotPaused
    returns (bool)
  {
    return super.transfer(_to, _value);
  }

  function transferFrom(address _from, address _to, uint256 _value)
    public
    whenNotPaused
    returns (bool)
  {
    return super.transferFrom(_from, _to, _value);
  }

  function approve(address _spender, uint256 _value)
    public
    whenNotPaused
    returns (bool)
  {
    return super.approve(_spender, _value);
  }

  function approveAndCall(
    address _spender,
    uint256 _value,
    bytes _data
  )
    public
    payable
    whenNotPaused
    returns (bool)
  {
    return super.approveAndCall(_spender, _value, _data);
  }

  function transferAndCall(
    address _to,
    uint256 _value,
    bytes _data
  )
    public
    payable
    whenNotPaused
    returns (bool)
  {
    return super.transferAndCall(_to, _value, _data);
  }

  function transferFromAndCall(
    address _from,
    address _to,
    uint256 _value,
    bytes _data
  )
    public
    payable
    whenNotPaused
    returns (bool)
  {
    return super.transferFromAndCall(_from, _to, _value, _data);
  }

  function increaseApprovalAndCall(
    address _spender,
    uint _addedValue,
    bytes _data
  )
    public
    payable
    whenNotPaused
    returns (bool)
  {
    return super.increaseApprovalAndCall(_spender, _addedValue, _data);
  }

  function decreaseApprovalAndCall(
    address _spender,
    uint _subtractedValue,
    bytes _data
  )
    public
    payable
    whenNotPaused
    returns (bool)
  {
    return super.decreaseApprovalAndCall(_spender, _subtractedValue, _data);
  }
}

library StringLib {
  function generateName(bytes16 _s, uint256 _len, uint256 _n)
    public
    pure
    returns (bytes16 ret)
  {
    uint256 v = _n;
    bytes16 num = 0;
    while (v > 0) {
      num = bytes16(uint(num) / (2 ** 8));
      num |= bytes16(((v % 10) + 48) * 2 ** (8 * 15));
      v /= 10;
    }
    ret = _s | bytes16(uint(num) / (2 ** (8 * _len)));
    return ret;
  }
}

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Basic {
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 _tokenId
  );
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 _tokenId
  );
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function exists(uint256 _tokenId) public view returns (bool _exists);

  function approve(address _to, uint256 _tokenId) public;
  function getApproved(uint256 _tokenId)
    public view returns (address _operator);

  function setApprovalForAll(address _operator, bool _approved) public;
  function isApprovedForAll(address _owner, address _operator)
    public view returns (bool);

  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function safeTransferFrom(address _from, address _to, uint256 _tokenId)
    public;

  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    public;
}

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Enumerable is ERC721Basic {
  function totalSupply() public view returns (uint256);
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    public
    view
    returns (uint256 _tokenId);

  function tokenByIndex(uint256 _index) public view returns (uint256);
}


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Metadata is ERC721Basic {
  function name() public view returns (string _name);
  function symbol() public view returns (string _symbol);
  function tokenURI(uint256 _tokenId) public view returns (string);
}


/**
 * @title ERC-721 Non-Fungible Token Standard, full implementation interface
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata {
}

/**
 * Utility library of inline functions on addresses
 */
library AddressUtils {

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   *  as the code is not actually created until after the constructor finishes.
   * @param addr address to check
   * @return whether the target address is a contract
   */
  function isContract(address addr) internal view returns (bool) {
    uint256 size;
    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(addr) }
    return size > 0;
  }

}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 *  from ERC721 asset contracts.
 */
contract ERC721Receiver {
  /**
   * @dev Magic value to be returned upon successful reception of an NFT
   *  Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`,
   *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
   */
  bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;

  /**
   * @notice Handle the receipt of an NFT
   * @dev The ERC721 smart contract calls this function on the recipient
   *  after a `safetransfer`. This function MAY throw to revert and reject the
   *  transfer. This function MUST use 50,000 gas or less. Return of other
   *  than the magic value MUST result in the transaction being reverted.
   *  Note: the contract address is always the message sender.
   * @param _from The sending address
   * @param _tokenId The NFT identifier which is being transfered
   * @param _data Additional data with no specified format
   * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
   */
  function onERC721Received(
    address _from,
    uint256 _tokenId,
    bytes _data
  )
    public
    returns(bytes4);
}

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721BasicToken is ERC721Basic {
  using SafeMath for uint256;
  using AddressUtils for address;

  // Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
  // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
  bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;

  // Mapping from token ID to owner
  mapping (uint256 => address) internal tokenOwner;

  // Mapping from token ID to approved address
  mapping (uint256 => address) internal tokenApprovals;

  // Mapping from owner to number of owned token
  mapping (address => uint256) internal ownedTokensCount;

  // Mapping from owner to operator approvals
  mapping (address => mapping (address => bool)) internal operatorApprovals;

  /**
   * @dev Guarantees msg.sender is owner of the given token
   * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
   */
  modifier onlyOwnerOf(uint256 _tokenId) {
    require(ownerOf(_tokenId) == msg.sender);
    _;
  }

  /**
   * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
   * @param _tokenId uint256 ID of the token to validate
   */
  modifier canTransfer(uint256 _tokenId) {
    require(isApprovedOrOwner(msg.sender, _tokenId));
    _;
  }

  /**
   * @dev Gets the balance of the specified address
   * @param _owner address to query the balance of
   * @return uint256 representing the amount owned by the passed address
   */
  function balanceOf(address _owner) public view returns (uint256) {
    require(_owner != address(0));
    return ownedTokensCount[_owner];
  }

  /**
   * @dev Gets the owner of the specified token ID
   * @param _tokenId uint256 ID of the token to query the owner of
   * @return owner address currently marked as the owner of the given token ID
   */
  function ownerOf(uint256 _tokenId) public view returns (address) {
    address owner = tokenOwner[_tokenId];
    require(owner != address(0));
    return owner;
  }

  /**
   * @dev Returns whether the specified token exists
   * @param _tokenId uint256 ID of the token to query the existence of
   * @return whether the token exists
   */
  function exists(uint256 _tokenId) public view returns (bool) {
    address owner = tokenOwner[_tokenId];
    return owner != address(0);
  }

  /**
   * @dev Approves another address to transfer the given token ID
   * @dev The zero address indicates there is no approved address.
   * @dev There can only be one approved address per token at a given time.
   * @dev Can only be called by the token owner or an approved operator.
   * @param _to address to be approved for the given token ID
   * @param _tokenId uint256 ID of the token to be approved
   */
  function approve(address _to, uint256 _tokenId) public {
    address owner = ownerOf(_tokenId);
    require(_to != owner);
    require(msg.sender == owner || isApprovedForAll(owner, msg.sender));

    if (getApproved(_tokenId) != address(0) || _to != address(0)) {
      tokenApprovals[_tokenId] = _to;
      emit Approval(owner, _to, _tokenId);
    }
  }

  /**
   * @dev Gets the approved address for a token ID, or zero if no address set
   * @param _tokenId uint256 ID of the token to query the approval of
   * @return address currently approved for the given token ID
   */
  function getApproved(uint256 _tokenId) public view returns (address) {
    return tokenApprovals[_tokenId];
  }

  /**
   * @dev Sets or unsets the approval of a given operator
   * @dev An operator is allowed to transfer all tokens of the sender on their behalf
   * @param _to operator address to set the approval
   * @param _approved representing the status of the approval to be set
   */
  function setApprovalForAll(address _to, bool _approved) public {
    require(_to != msg.sender);
    operatorApprovals[msg.sender][_to] = _approved;
    emit ApprovalForAll(msg.sender, _to, _approved);
  }

  /**
   * @dev Tells whether an operator is approved by a given owner
   * @param _owner owner address which you want to query the approval of
   * @param _operator operator address which you want to query the approval of
   * @return bool whether the given operator is approved by the given owner
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    public
    view
    returns (bool)
  {
    return operatorApprovals[_owner][_operator];
  }

  /**
   * @dev Transfers the ownership of a given token ID to another address
   * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
   * @dev Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
  */
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    public
    canTransfer(_tokenId)
  {
    require(_from != address(0));
    require(_to != address(0));

    clearApproval(_from, _tokenId);
    removeTokenFrom(_from, _tokenId);
    addTokenTo(_to, _tokenId);

    emit Transfer(_from, _to, _tokenId);
  }

  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * @dev If the target address is a contract, it must implement `onERC721Received`,
   *  which is called upon a safe transfer, and return the magic value
   *  `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
   *  the transfer is reverted.
   * @dev Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
  */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  )
    public
    canTransfer(_tokenId)
  {
    // solium-disable-next-line arg-overflow
    safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @dev Safely transfers the ownership of a given token ID to another address
   * @dev If the target address is a contract, it must implement `onERC721Received`,
   *  which is called upon a safe transfer, and return the magic value
   *  `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
   *  the transfer is reverted.
   * @dev Requires the msg sender to be the owner, approved, or operator
   * @param _from current owner of the token
   * @param _to address to receive the ownership of the given token ID
   * @param _tokenId uint256 ID of the token to be transferred
   * @param _data bytes data to send along with a safe transfer check
   */
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    public
    canTransfer(_tokenId)
  {
    transferFrom(_from, _to, _tokenId);
    // solium-disable-next-line arg-overflow
    require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));
  }

  /**
   * @dev Returns whether the given spender can transfer a given token ID
   * @param _spender address of the spender to query
   * @param _tokenId uint256 ID of the token to be transferred
   * @return bool whether the msg.sender is approved for the given token ID,
   *  is an operator of the owner, or is the owner of the token
   */
  function isApprovedOrOwner(
    address _spender,
    uint256 _tokenId
  )
    internal
    view
    returns (bool)
  {
    address owner = ownerOf(_tokenId);
    // Disable solium check because of
    // https://github.com/duaraghav8/Solium/issues/175
    // solium-disable-next-line operator-whitespace
    return (
      _spender == owner ||
      getApproved(_tokenId) == _spender ||
      isApprovedForAll(owner, _spender)
    );
  }

  /**
   * @dev Internal function to mint a new token
   * @dev Reverts if the given token ID already exists
   * @param _to The address that will own the minted token
   * @param _tokenId uint256 ID of the token to be minted by the msg.sender
   */
  function _mint(address _to, uint256 _tokenId) internal {
    require(_to != address(0));
    addTokenTo(_to, _tokenId);
    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @dev Internal function to burn a specific token
   * @dev Reverts if the token does not exist
   * @param _tokenId uint256 ID of the token being burned by the msg.sender
   */
  function _burn(address _owner, uint256 _tokenId) internal {
    clearApproval(_owner, _tokenId);
    removeTokenFrom(_owner, _tokenId);
    emit Transfer(_owner, address(0), _tokenId);
  }

  /**
   * @dev Internal function to clear current approval of a given token ID
   * @dev Reverts if the given address is not indeed the owner of the token
   * @param _owner owner of the token
   * @param _tokenId uint256 ID of the token to be transferred
   */
  function clearApproval(address _owner, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _owner);
    if (tokenApprovals[_tokenId] != address(0)) {
      tokenApprovals[_tokenId] = address(0);
      emit Approval(_owner, address(0), _tokenId);
    }
  }

  /**
   * @dev Internal function to add a token ID to the list of a given address
   * @param _to address representing the new owner of the given token ID
   * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function addTokenTo(address _to, uint256 _tokenId) internal {
    require(tokenOwner[_tokenId] == address(0));
    tokenOwner[_tokenId] = _to;
    ownedTokensCount[_to] = ownedTokensCount[_to].add(1);
  }

  /**
   * @dev Internal function to remove a token ID from the list of a given address
   * @param _from address representing the previous owner of the given token ID
   * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function removeTokenFrom(address _from, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _from);
    ownedTokensCount[_from] = ownedTokensCount[_from].sub(1);
    tokenOwner[_tokenId] = address(0);
  }

  /**
   * @dev Internal function to invoke `onERC721Received` on a target address
   * @dev The call is not executed if the target address is not a contract
   * @param _from address representing the previous owner of the given token ID
   * @param _to target address that will receive the tokens
   * @param _tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return whether the call correctly returned the expected magic value
   */
  function checkAndCallSafeTransfer(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    internal
    returns (bool)
  {
    if (!_to.isContract()) {
      return true;
    }
    bytes4 retval = ERC721Receiver(_to).onERC721Received(
      _from, _tokenId, _data);
    return (retval == ERC721_RECEIVED);
  }
}

/**
 * @title Full ERC721 Token
 * This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Token is ERC721, ERC721BasicToken {
  // Token name
  string internal name_;

  // Token symbol
  string internal symbol_;

  // Mapping from owner to list of owned token IDs
  mapping(address => uint256[]) internal ownedTokens;

  // Mapping from token ID to index of the owner tokens list
  mapping(uint256 => uint256) internal ownedTokensIndex;

  // Array with all token ids, used for enumeration
  uint256[] internal allTokens;

  // Mapping from token id to position in the allTokens array
  mapping(uint256 => uint256) internal allTokensIndex;

  // Optional mapping for token URIs
  mapping(uint256 => string) internal tokenURIs;

  /**
   * @dev Constructor function
   */
  constructor(string _name, string _symbol) public {
    name_ = _name;
    symbol_ = _symbol;
  }

  /**
   * @dev Gets the token name
   * @return string representing the token name
   */
  function name() public view returns (string) {
    return name_;
  }

  /**
   * @dev Gets the token symbol
   * @return string representing the token symbol
   */
  function symbol() public view returns (string) {
    return symbol_;
  }

  /**
   * @dev Returns an URI for a given token ID
   * @dev Throws if the token ID does not exist. May return an empty string.
   * @param _tokenId uint256 ID of the token to query
   */
  function tokenURI(uint256 _tokenId) public view returns (string) {
    require(exists(_tokenId));
    return tokenURIs[_tokenId];
  }

  /**
   * @dev Gets the token ID at a given index of the tokens list of the requested owner
   * @param _owner address owning the tokens list to be accessed
   * @param _index uint256 representing the index to be accessed of the requested tokens list
   * @return uint256 token ID at the given index of the tokens list owned by the requested address
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    public
    view
    returns (uint256)
  {
    require(_index < balanceOf(_owner));
    return ownedTokens[_owner][_index];
  }

  /**
   * @dev Gets the total amount of tokens stored by the contract
   * @return uint256 representing the total amount of tokens
   */
  function totalSupply() public view returns (uint256) {
    return allTokens.length;
  }

  /**
   * @dev Gets the token ID at a given index of all the tokens in this contract
   * @dev Reverts if the index is greater or equal to the total number of tokens
   * @param _index uint256 representing the index to be accessed of the tokens list
   * @return uint256 token ID at the given index of the tokens list
   */
  function tokenByIndex(uint256 _index) public view returns (uint256) {
    require(_index < totalSupply());
    return allTokens[_index];
  }

  /**
   * @dev Internal function to set the token URI for a given token
   * @dev Reverts if the token ID does not exist
   * @param _tokenId uint256 ID of the token to set its URI
   * @param _uri string URI to assign
   */
  function _setTokenURI(uint256 _tokenId, string _uri) internal {
    require(exists(_tokenId));
    tokenURIs[_tokenId] = _uri;
  }

  /**
   * @dev Internal function to add a token ID to the list of a given address
   * @param _to address representing the new owner of the given token ID
   * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function addTokenTo(address _to, uint256 _tokenId) internal {
    super.addTokenTo(_to, _tokenId);
    uint256 length = ownedTokens[_to].length;
    ownedTokens[_to].push(_tokenId);
    ownedTokensIndex[_tokenId] = length;
  }

  /**
   * @dev Internal function to remove a token ID from the list of a given address
   * @param _from address representing the previous owner of the given token ID
   * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function removeTokenFrom(address _from, uint256 _tokenId) internal {
    super.removeTokenFrom(_from, _tokenId);

    uint256 tokenIndex = ownedTokensIndex[_tokenId];
    uint256 lastTokenIndex = ownedTokens[_from].length.sub(1);
    uint256 lastToken = ownedTokens[_from][lastTokenIndex];

    ownedTokens[_from][tokenIndex] = lastToken;
    ownedTokens[_from][lastTokenIndex] = 0;
    // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to
    // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping
    // the lastToken to the first position, and then dropping the element placed in the last position of the list

    ownedTokens[_from].length--;
    ownedTokensIndex[_tokenId] = 0;
    ownedTokensIndex[lastToken] = tokenIndex;
  }

  /**
   * @dev Internal function to mint a new token
   * @dev Reverts if the given token ID already exists
   * @param _to address the beneficiary that will own the minted token
   * @param _tokenId uint256 ID of the token to be minted by the msg.sender
   */
  function _mint(address _to, uint256 _tokenId) internal {
    super._mint(_to, _tokenId);

    allTokensIndex[_tokenId] = allTokens.length;
    allTokens.push(_tokenId);
  }

  /**
   * @dev Internal function to burn a specific token
   * @dev Reverts if the token does not exist
   * @param _owner owner of the token to burn
   * @param _tokenId uint256 ID of the token being burned by the msg.sender
   */
  function _burn(address _owner, uint256 _tokenId) internal {
    super._burn(_owner, _tokenId);

    // Clear metadata (if any)
    if (bytes(tokenURIs[_tokenId]).length != 0) {
      delete tokenURIs[_tokenId];
    }

    // Reorg all tokens array
    uint256 tokenIndex = allTokensIndex[_tokenId];
    uint256 lastTokenIndex = allTokens.length.sub(1);
    uint256 lastToken = allTokens[lastTokenIndex];

    allTokens[tokenIndex] = lastToken;
    allTokens[lastTokenIndex] = 0;

    allTokens.length--;
    allTokensIndex[_tokenId] = 0;
    allTokensIndex[lastToken] = tokenIndex;
  }

}

contract CastleToken is ERC721Token, AccessByGame {
  string constant NAME = "Crypto Ninja Game Castle";
  string constant SYMBOL = "CNC";

  uint256 constant MAX_WIDTH = 10;

  uint8 constant LOG_SET = 0;
  uint8 constant LOG_RESET = 1;
  uint8 constant LOG_WIN = 2;
  uint8 constant LOG_LOSS = 3;

  struct Castle {
    bytes16 name;
    uint16 level;
    uint32 exp;
    uint8 width;
    uint8 depth;
    uint32 readyTime;
    uint16 tryCount;
    uint16 winCount;
    uint16 lossCount;
    uint8 levelPoint;
    uint16 reward;
  }

  mapping (uint256 => bytes) internal traps;
  mapping (uint256 => bytes32[]) internal logs;

  EverGold internal goldToken;

  uint8 public initWidth = 5;
  uint8 public initDepth = 8;

  uint256 public itemsPerPage = 10;

  uint8 internal expOnSuccess = 3;
  uint8 internal expOnFault = 1;
  uint8 internal leveupExp = 10;

  uint256 internal cooldownTime = 5 minutes;

  Castle[] internal castles;

  uint16 public price = 1000;

  event NewCastle(uint256 castleid, uint256 width, uint256 depth);
  event SetTraps(uint256 castleid);
  event ResetTraps(uint256 castleid);
  event UseTrap(uint256 castleid, uint256 path, uint256 trapIndex, uint256 power);

  event AddLog(uint8 id, uint32 datetime, uint256 castleid, uint256 ninjaid, uint8 x, uint8 y, bool win);

  /// @dev Constructor
  constructor()
    public
    ERC721Token(NAME, SYMBOL)
  {
    castles.push(Castle({
      name: "DUMMY", level: 0, exp: 0,
      width: 0, depth: 0,
      readyTime: 0,
      tryCount: 0, winCount: 0, lossCount: 0,
      levelPoint: 0,
      reward: 0}));
  }

  function mint(address _beneficiary)
    public
    whenNotPaused
    onlyAccessByGame
    returns (bool)
  {
    require(_beneficiary != address(0));
    return _create(_beneficiary, initWidth, initDepth);
  }

  function setTraps(
    uint256 _castleid,
    uint16 _reward,
    bytes _traps)
    public
    whenNotPaused()
    onlyAccessByGame
    returns (bool)
  {
    require((_castleid > 0) && (_castleid < castles.length));
    require(_reward > 0);
    Castle storage castle = castles[_castleid];
    castle.reward = _reward;
    traps[_castleid] = _traps;

    logs[_castleid].push(_generateLog(uint32(now), LOG_SET, 0, 0, 0, 0));

    emit SetTraps(_castleid);

    return true;
  }

  function resetTraps(uint256 _castleid)
    public
    onlyAccessByGame
    returns (bool)
  {
    require((_castleid > 0) && (_castleid < castles.length));
    Castle storage castle = castles[_castleid];
    for (uint256 i = 0; i < castle.width * castle.depth; i++) {
      traps[_castleid][i] = byte(0);
    }
    castle.reward = 0;
    logs[_castleid].push(_generateLog(uint32(now), LOG_RESET, 0, 0, 0, 0));

    emit ResetTraps(_castleid);

    return true;
  }

  function win(
    uint256 _castleid, uint256 _ninjaid, uint256 _path, bytes _steps, uint256 _count)
    public
    onlyAccessByGame
    returns (bool)
  {
    require((_castleid > 0) && (_castleid < castles.length));
    uint8 width = getWidth(_castleid);
    for (uint256 i = 0; i < _count; i++) {
      traps[_castleid][uint256(_steps[i])] = byte(0);
    }
    Castle storage castle = castles[_castleid];
    castle.winCount++;
    castle.exp += expOnSuccess;
    castle.levelPoint += expOnSuccess;
    _levelUp(castle);
    logs[_castleid].push(
      _generateLog(
        uint32(now), LOG_WIN, uint32(_ninjaid),
        uint8(_path % width), uint8(_path / width), 1
      )
    );

    _triggerCooldown(_castleid);

    return true;
  }

  function lost(uint256 _castleid, uint256 _ninjaid)
    public
    onlyAccessByGame
    returns (bool)
  {
    require((_castleid > 0) && (_castleid < castles.length));
    Castle storage castle = castles[_castleid];
    castle.reward = 0;
    castle.lossCount++;
    castle.exp += expOnFault;
    castle.levelPoint += expOnFault;
    _levelUp(castle);

    logs[_castleid].push(_generateLog(uint32(now), LOG_LOSS, uint32(_ninjaid), 0, 0, 0));

    resetTraps(_castleid);

    _triggerCooldown(_castleid);

    return true;
  }

  function setName(uint256 _castleid, bytes16 _newName)
    external
    onlyOwnerOf(_castleid)
  {
    castles[_castleid].name = _newName;
  }

  function setGoldContract(address _goldTokenAddress)
    public
    onlyOwner
  {
    require(_goldTokenAddress != address(0));

    goldToken = EverGold(_goldTokenAddress);
  }

  function setFee(uint16 _price)
    external
    onlyOwner
  {
    price = _price;
  }

  function setItemPerPage(uint16 _amount)
    external
    onlyOwner
  {
    itemsPerPage = _amount;
  }

  function setMaxCoordinate(uint256 _cooldownTime)
    public
    onlyOwner
  {
    cooldownTime = _cooldownTime;
  }

  function _create(address _beneficiary, uint8 _width, uint8 _depth)
    internal
    onlyAccessByGame
    returns (bool)
  {
    require(_beneficiary != address(0));
    require((_width > 0) && (_depth > 0));
    uint256 tokenid = castles.length;
    bytes16 name = StringLib.generateName("CASTLE#", 7, tokenid);

    uint256 id = castles.push(Castle({
      name: name, level: 1, exp: 0,
      width: _width, depth: _depth,
      readyTime: uint32(now + cooldownTime),
      tryCount: 0, winCount: 0, lossCount: 0,
      levelPoint: 0,
      reward: 0})) - 1;

    traps[id] = new bytes(_width * _depth);
    _mint(_beneficiary, id);
    emit NewCastle(id, _width, _depth);

    return true;
  }

  function _levelUp(Castle storage _castle)
    internal
    onlyAccessByGame
  {
    if (_castle.levelPoint >= leveupExp) {
      // 10回ごとにレベルアップする。
      _castle.levelPoint -= leveupExp;
      _castle.level++;
    }
  }

  function _triggerCooldown(uint256 _castleid)
    internal
    onlyAccessByGame
  {
    require((_castleid > 0) && (_castleid < castles.length));
    Castle storage castle = castles[_castleid];
    castle.readyTime = uint32(now + cooldownTime);
  }

  function getAll()
    external
    view
    returns (uint256[] result)
  {
    return allTokens;
  }

  function getOpen(uint256 _startIndex)
    external
    view
    returns (uint256[] result)
  {
    uint256 n = 0;
    uint256 i = 0;
    for (i = _startIndex; i < castles.length; i++) {
      Castle storage castle = castles[i];
      if ((castle.reward > 0) &&
          (ownerOf(i) != msg.sender)) {
        n++;
        if (n >= _startIndex) {
          break;
        }
      }
    }
    uint256[] memory castleids = new uint256[](itemsPerPage + 1);
    n = 0;
    while (i < castles.length) {
      castle = castles[i];
      if ((castle.reward > 0) &&
          (ownerOf(i) != msg.sender)) {
        castleids[n++] = i;
        if (n > itemsPerPage) {
          break;
        }
      }
      i++;
    }
    return castleids;
  }

  function getByOwner(address _owner)
    external
    view
    returns (uint256[] result)
  {
    return ownedTokens[_owner];
  }

  function getInfo(uint256 _castleid)
    external
    view
    returns (bytes16, uint16, uint32,
      uint8, uint8, uint16, uint16,
      uint16)
  {
    require((_castleid > 0) && (_castleid < castles.length));
    Castle storage castle = castles[_castleid];
    return (
      castle.name,
      castle.level,
      castle.exp,
      castle.width,
      castle.depth,
      castle.winCount,
      castle.lossCount,
      castle.reward);
  }

  function getLevel(uint256 _castleid)
    external
    view
    returns (uint16)
  {
    Castle storage castle = castles[_castleid];
    return castle.level;
  }

  function getLogs(uint256 _castleid)
    external
    view
    returns (bytes32[])
  {
    require((_castleid > 0) && (_castleid < castles.length));
    return logs[_castleid];
  }

  function getTrapInfo(uint256 _castleid)
    external
    view
    returns (bytes)
  {
    require((ownerOf(_castleid) == msg.sender) || (contractAccess[msg.sender] == true));
    return traps[_castleid];
  }

  function isReady(uint256 _castleid)
    public
    view
    returns (bool)
  {
    require((_castleid > 0) && (_castleid < castles.length));
    Castle storage castle = castles[_castleid];
    return (castle.readyTime <= now);
  }

  function getReward(uint256 _castleid)
    public
    view
    returns (uint16)
  {
    require((_castleid > 0) && (_castleid < castles.length));
    Castle storage castle = castles[_castleid];
    return castle.reward;
  }

  function getWidth(uint256 _castleid)
    public
    view
    returns (uint8)
  {
    require((_castleid > 0) && (_castleid < castles.length));
    Castle storage castle = castles[_castleid];
    return castle.width;
  }

  function getTrapid(uint256 _castleid, uint8 _path)
    public
    onlyAccessByGame
    view
    returns (uint8)
  {
    return uint8(traps[_castleid][_path]);
  }

  function getPrice()
    public
    view
    returns (uint256)
  {
    return price;
  }

  function _generateLog(
    uint32 _datetime,
    uint8 _id,
    uint32 _ninjaid,
    uint8 _x,
    uint8 _y,
    uint8 _win)
    internal
    pure
    returns (bytes32)
  {
    return
      bytes32(
        (uint256(_datetime) * (2 ** (8 * 28))) |
        (uint256(_id) * (2 ** (8 * 24))) |
        (uint256(_ninjaid) * (2 ** (8 * 20))) |
        (uint256(_x) * (2 ** (8 * 16))) |
        (uint256(_y) * (2 ** (8 * 12))) |
        (uint256(_win) * (2 ** (8 * 8))));
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"grantAccess","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_castleid","type":"uint256"}],"name":"getLogs","outputs":[{"name":"","type":"bytes32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_castleid","type":"uint256"}],"name":"getInfo","outputs":[{"name":"","type":"bytes16"},{"name":"","type":"uint16"},{"name":"","type":"uint32"},{"name":"","type":"uint8"},{"name":"","type":"uint8"},{"name":"","type":"uint16"},{"name":"","type":"uint16"},{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_castleid","type":"uint256"}],"name":"getReward","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_castleid","type":"uint256"}],"name":"resetTraps","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_goldTokenAddress","type":"address"}],"name":"setGoldContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getByOwner","outputs":[{"name":"result","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_castleid","type":"uint256"},{"name":"_reward","type":"uint16"},{"name":"_traps","type":"bytes"}],"name":"setTraps","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_castleid","type":"uint256"}],"name":"isReady","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAll","outputs":[{"name":"result","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initDepth","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"itemsPerPage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_startIndex","type":"uint256"}],"name":"getOpen","outputs":[{"name":"result","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_castleid","type":"uint256"},{"name":"_newName","type":"bytes16"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"revokeAccess","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_castleid","type":"uint256"}],"name":"getLevel","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_price","type":"uint16"}],"name":"setFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_castleid","type":"uint256"}],"name":"getTrapInfo","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_castleid","type":"uint256"}],"name":"getWidth","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initWidth","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_castleid","type":"uint256"},{"name":"_ninjaid","type":"uint256"}],"name":"lost","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_castleid","type":"uint256"},{"name":"_ninjaid","type":"uint256"},{"name":"_path","type":"uint256"},{"name":"_steps","type":"bytes"},{"name":"_count","type":"uint256"}],"name":"win","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_cooldownTime","type":"uint256"}],"name":"setMaxCoordinate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint16"}],"name":"setItemPerPage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_castleid","type":"uint256"},{"name":"_path","type":"uint8"}],"name":"getTrapid","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"castleid","type":"uint256"},{"indexed":false,"name":"width","type":"uint256"},{"indexed":false,"name":"depth","type":"uint256"}],"name":"NewCastle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"castleid","type":"uint256"}],"name":"SetTraps","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"castleid","type":"uint256"}],"name":"ResetTraps","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"castleid","type":"uint256"},{"indexed":false,"name":"path","type":"uint256"},{"indexed":false,"name":"trapIndex","type":"uint256"},{"indexed":false,"name":"power","type":"uint256"}],"name":"UseTrap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint8"},{"indexed":false,"name":"datetime","type":"uint32"},{"indexed":false,"name":"castleid","type":"uint256"},{"indexed":false,"name":"ninjaid","type":"uint256"},{"indexed":false,"name":"x","type":"uint8"},{"indexed":false,"name":"y","type":"uint8"},{"indexed":false,"name":"win","type":"bool"}],"name":"AddLog","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

60806040526000600b60146101000a81548160ff0219169083151502179055506005601060146101000a81548160ff021916908360ff1602179055506008601060156101000a81548160ff021916908360ff160217905550600a6011556003601260006101000a81548160ff021916908360ff1602179055506001601260016101000a81548160ff021916908360ff160217905550600a601260026101000a81548160ff021916908360ff16021790555061012c6013556103e8601560006101000a81548161ffff021916908361ffff160217905550348015620000e257600080fd5b506040805190810160405280601881526020017f43727970746f204e696e6a612047616d6520436173746c6500000000000000008152506040805190810160405280600381526020017f434e43000000000000000000000000000000000000000000000000000000000081525081600490805190602001906200016792919062000451565b5080600590805190602001906200018092919062000451565b50505033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506014610160604051908101604052807f44554d4d590000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff19168152602001600061ffff168152602001600063ffffffff168152602001600060ff168152602001600060ff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600061ffff168152509080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060208201518160000160106101000a81548161ffff021916908361ffff16021790555060408201518160000160126101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600001601c6101000a81548161ffff021916908361ffff16021790555060e082015181600001601e6101000a81548161ffff021916908361ffff1602179055506101008201518160010160006101000a81548161ffff021916908361ffff1602179055506101208201518160010160026101000a81548160ff021916908360ff1602179055506101408201518160010160036101000a81548161ffff021916908361ffff16021790555050505062000500565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200049457805160ff1916838001178555620004c5565b82800160010185558215620004c5579182015b82811115620004c4578251825591602001919060010190620004a7565b5b509050620004d49190620004d8565b5090565b620004fd91905b80821115620004f9576000816000905550600101620004df565b5090565b90565b6150c480620005106000396000f300608060405260043610610272576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde0314610277578063081812fc14610307578063095ea7b3146103745780630ae5e739146103c15780631124c05a1461040457806318160ddd146104865780631a3cd59a146104b15780631c4b774b1461058157806323b872dd146105ca5780632671e253146106375780632f745c591461067c57806333771860146106dd578063379c5131146107205780633f4ba83a146107b857806342842e0e146107cf5780634c207ac81461083c5780634e71e0c8146108d55780634f558e79146108ec5780634f6ccce71461093157806350df8f711461097257806353ed5143146109b757806359c21fd814610a235780635c975abb14610a545780636352211e14610a835780636a62784214610af057806370a0823114610b4b578063715018a614610ba257806372b614af14610bb957806375321c4a14610be457806381b890fc14610c665780638456cb5914610cb057806385e6853114610cc757806386481d4014610d0a5780638da5cb5b14610d535780638e00555314610daa5780638f50fb0614610ddb5780639419fd2914610e8157806395d89b4114610ec857806398d5fdca14610f58578063a035b1fe14610f83578063a22cb46514610fb6578063b88d4fde14611005578063c365d4f0146110b8578063c87b56dd146110e9578063c9dfa7311461118f578063ce8775a4146111de578063d2bafbe614611287578063e30c3978146112b4578063e59de2951461130b578063e985e9c51461133c578063f2fde38b146113b7578063f80eba7c146113fa575b600080fd5b34801561028357600080fd5b5061028c61144e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102cc5780820151818401526020810190506102b1565b50505050905090810190601f1680156102f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031357600080fd5b50610332600480360381019080803590602001909291905050506114f0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561038057600080fd5b506103bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061152d565b005b3480156103cd57600080fd5b50610402600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116f3565b005b34801561041057600080fd5b5061042f600480360381019080803590602001909291905050506117aa565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610472578082015181840152602081019050610457565b505050509050019250505060405180910390f35b34801561049257600080fd5b5061049b611838565b6040518082815260200191505060405180910390f35b3480156104bd57600080fd5b506104dc60048036038101908080359060200190929190505050611845565b60405180896fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020018861ffff1661ffff1681526020018763ffffffff1663ffffffff1681526020018660ff1660ff1681526020018560ff1660ff1681526020018461ffff1661ffff1681526020018361ffff1661ffff1681526020018261ffff1661ffff1681526020019850505050505050505060405180910390f35b34801561058d57600080fd5b506105ac60048036038101908080359060200190929190505050611953565b604051808261ffff1661ffff16815260200191505060405180910390f35b3480156105d657600080fd5b50610635600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119af565b005b34801561064357600080fd5b5061066260048036038101908080359060200190929190505050611ac6565b604051808215151515815260200191505060405180910390f35b34801561068857600080fd5b506106c7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d7b565b6040518082815260200191505060405180910390f35b3480156106e957600080fd5b5061071e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611df2565b005b34801561072c57600080fd5b50610761600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ece565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107a4578082015181840152602081019050610789565b505050509050019250505060405180910390f35b3480156107c457600080fd5b506107cd611f65565b005b3480156107db57600080fd5b5061083a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612025565b005b34801561084857600080fd5b506108bb60048036038101908080359060200190929190803561ffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061205d565b604051808215151515815260200191505060405180910390f35b3480156108e157600080fd5b506108ea61227a565b005b3480156108f857600080fd5b506109176004803603810190808035906020019092919050505061241b565b604051808215151515815260200191505060405180910390f35b34801561093d57600080fd5b5061095c6004803603810190808035906020019092919050505061248c565b6040518082815260200191505060405180910390f35b34801561097e57600080fd5b5061099d600480360381019080803590602001909291905050506124c4565b604051808215151515815260200191505060405180910390f35b3480156109c357600080fd5b506109cc61252b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610a0f5780820151818401526020810190506109f4565b505050509050019250505060405180910390f35b348015610a2f57600080fd5b50610a38612583565b604051808260ff1660ff16815260200191505060405180910390f35b348015610a6057600080fd5b50610a69612596565b604051808215151515815260200191505060405180910390f35b348015610a8f57600080fd5b50610aae600480360381019080803590602001909291905050506125a9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610afc57600080fd5b50610b31600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612626565b604051808215151515815260200191505060405180910390f35b348015610b5757600080fd5b50610b8c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612780565b6040518082815260200191505060405180910390f35b348015610bae57600080fd5b50610bb7612804565b005b348015610bc557600080fd5b50610bce612909565b6040518082815260200191505060405180910390f35b348015610bf057600080fd5b50610c0f6004803603810190808035906020019092919050505061290f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c52578082015181840152602081019050610c37565b505050509050019250505060405180910390f35b348015610c7257600080fd5b50610cae6004803603810190808035906020019092919080356fffffffffffffffffffffffffffffffff19169060200190929190505050612ae6565b005b348015610cbc57600080fd5b50610cc5612b87565b005b348015610cd357600080fd5b50610d08600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c48565b005b348015610d1657600080fd5b50610d3560048036038101908080359060200190929190505050612cff565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610d5f57600080fd5b50610d68612d3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610db657600080fd5b50610dd9600480360381019080803561ffff169060200190929190505050612d62565b005b348015610de757600080fd5b50610e0660048036038101908080359060200190929190505050612dde565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e46578082015181840152602081019050610e2b565b50505050905090810190601f168015610e735780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e8d57600080fd5b50610eac60048036038101908080359060200190929190505050612f30565b604051808260ff1660ff16815260200191505060405180910390f35b348015610ed457600080fd5b50610edd612f8b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f1d578082015181840152602081019050610f02565b50505050905090810190601f168015610f4a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610f6457600080fd5b50610f6d61302d565b6040518082815260200191505060405180910390f35b348015610f8f57600080fd5b50610f98613049565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610fc257600080fd5b50611003600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061305d565b005b34801561101157600080fd5b506110b6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613199565b005b3480156110c457600080fd5b506110cd6131d8565b604051808260ff1660ff16815260200191505060405180910390f35b3480156110f557600080fd5b50611114600480360381019080803590602001909291905050506131eb565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611154578082015181840152602081019050611139565b50505050905090810190601f1680156111815780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561119b57600080fd5b506111c460048036038101908080359060200190929190803590602001909291905050506132b4565b604051808215151515815260200191505060405180910390f35b3480156111ea57600080fd5b5061126d600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192908035906020019092919050505061351e565b604051808215151515815260200191505060405180910390f35b34801561129357600080fd5b506112b2600480360381019080803590602001909291905050506138cd565b005b3480156112c057600080fd5b506112c9613933565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561131757600080fd5b5061133a600480360381019080803561ffff169060200190929190505050613959565b005b34801561134857600080fd5b5061139d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139c3565b604051808215151515815260200191505060405180910390f35b3480156113c357600080fd5b506113f8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613a57565b005b34801561140657600080fd5b5061143260048036038101908080359060200190929190803560ff169060200190929190505050613af7565b604051808260ff1660ff16815260200191505060405180910390f35b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114e65780601f106114bb576101008083540402835291602001916114e6565b820191906000526020600020905b8154815290600101906020018083116114c957829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000611538826125a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561157557600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115b557506115b481336139c3565b5b15156115c057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166115e1836114f0565b73ffffffffffffffffffffffffffffffffffffffff161415806116315750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156116ee57826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561174f57600080fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60606000821180156117c0575060148054905082105b15156117cb57600080fd5b600f600083815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561182c57602002820191906000526020600020905b81546000191681526020019060010190808311611814575b50505050509050919050565b6000600880549050905090565b6000806000806000806000806000808a11801561186657506014805490508a105b151561187157600080fd5b60148a81548110151561188057fe5b906000526020600020906002020190508060000160009054906101000a9004700100000000000000000000000000000000028160000160109054906101000a900461ffff168260000160129054906101000a900463ffffffff168360000160169054906101000a900460ff168460000160179054906101000a900460ff1685600001601e9054906101000a900461ffff168660010160009054906101000a900461ffff168760010160039054906101000a900461ffff169850985098509850985098509850985050919395975091939597565b60008060008311801561196a575060148054905083105b151561197557600080fd5b60148381548110151561198457fe5b906000526020600020906002020190508060010160039054906101000a900461ffff16915050919050565b806119ba3382613c6d565b15156119c557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515611a0157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611a3d57600080fd5b611a478483613d02565b611a518483613e6b565b611a5b8383614083565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000806000600b60149054906101000a900460ff16158015611b905750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b8f575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515611b9b57600080fd5b600084118015611baf575060148054905084105b1515611bba57600080fd5b601484815481101515611bc957fe5b90600052602060002090600202019150600090505b8160000160179054906101000a900460ff168260000160169054906101000a900460ff160260ff16811015611cc65760007f010000000000000000000000000000000000000000000000000000000000000002600e6000868152602001908152602001600020828154600181600116156101000203166002900481101515611c6257fe5b815460011615611c815790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508080600101915050611bde565b60008260010160036101000a81548161ffff021916908361ffff160217905550600f6000858152602001908152602001600020611d0a42600160008060008061415a565b90806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055507fb151dd09a2d98f317bcb24f032fb1c489342f6f906c6b827ba3a72d6cab1401e846040518082815260200191505060405180910390a1600192505050919050565b6000611d8683612780565b82101515611d9357600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611ddf57fe5b9060005260206000200154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e4e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e8a57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611f5957602002820191906000526020600020905b815481526020019060010190808311611f45575b50505050509050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fc157600080fd5b600b60149054906101000a900460ff161515611fdc57600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b806120303382613c6d565b151561203b57600080fd5b6120578484846020604051908101604052806000815250613199565b50505050565b600080600b60149054906101000a900460ff1615151561207c57600080fd5b600b60149054906101000a900460ff161580156121415750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612140575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561214c57600080fd5b600085118015612160575060148054905085105b151561216b57600080fd5b60008461ffff1611151561217e57600080fd5b60148581548110151561218d57fe5b90600052602060002090600202019050838160010160036101000a81548161ffff021916908361ffff16021790555082600e600087815260200190815260200160002090805190602001906121e3929190614fc7565b50600f600086815260200190815260200160002061220842600080600080600061415a565b90806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055507ffaac92082460b3da200bee42b6863b57652aed78ef0a5e8548761e24f9757604856040518082815260200191505060405180910390a160019150509392505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156122d657600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000612496611838565b821015156124a357600080fd5b6008828154811015156124b257fe5b90600052602060002001549050919050565b6000806000831180156124db575060148054905083105b15156124e657600080fd5b6014838154811015156124f557fe5b90600052602060002090600202019050428160000160189054906101000a900463ffffffff1663ffffffff161115915050919050565b6060600880548060200260200160405190810160405280929190818152602001828054801561257957602002820191906000526020600020905b815481526020019060010190808311612565575b5050505050905090565b601060159054906101000a900460ff1681565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561261d57600080fd5b80915050919050565b6000600b60149054906101000a900460ff1615151561264457600080fd5b600b60149054906101000a900460ff161580156127095750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612708575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561271457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561275057600080fd5b61277982601060149054906101000a900460ff16601060159054906101000a900460ff1661420c565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156127bd57600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561286057600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60115481565b60606000806000606060009350600092508592505b6014805490508310156129d35760148381548110151561294057fe5b9060005260206000209060020201915060008260010160039054906101000a900461ffff1661ffff161180156129aa57503373ffffffffffffffffffffffffffffffffffffffff16612991846125a9565b73ffffffffffffffffffffffffffffffffffffffff1614155b156129c657838060010194505085841015156129c5576129d3565b5b8280600101935050612924565b600160115401604051908082528060200260200182016040528015612a075781602001602082028038833980820191505090505b509050600093505b601480549050831015612ada57601483815481101515612a2b57fe5b9060005260206000209060020201915060008260010160039054906101000a900461ffff1661ffff16118015612a9557503373ffffffffffffffffffffffffffffffffffffffff16612a7c846125a9565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612acd57828185806001019650815181101515612aaf57fe5b9060200190602002018181525050601154841115612acc57612ada565b5b8280600101935050612a0f565b80945050505050919050565b813373ffffffffffffffffffffffffffffffffffffffff16612b07826125a9565b73ffffffffffffffffffffffffffffffffffffffff16141515612b2957600080fd5b81601484815481101515612b3957fe5b906000526020600020906002020160000160006101000a8154816fffffffffffffffffffffffffffffffff021916908370010000000000000000000000000000000090040217905550505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612be357600080fd5b600b60149054906101000a900460ff16151515612bff57600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ca457600080fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080601483815481101515612d1157fe5b906000526020600020906002020190508060000160109054906101000a900461ffff16915050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612dbe57600080fd5b80601560006101000a81548161ffff021916908361ffff16021790555050565b60603373ffffffffffffffffffffffffffffffffffffffff16612e00836125a9565b73ffffffffffffffffffffffffffffffffffffffff161480612e72575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b1515612e7d57600080fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612f245780601f10612ef957610100808354040283529160200191612f24565b820191906000526020600020905b815481529060010190602001808311612f0757829003601f168201915b50505050509050919050565b600080600083118015612f47575060148054905083105b1515612f5257600080fd5b601483815481101515612f6157fe5b906000526020600020906002020190508060000160169054906101000a900460ff16915050919050565b606060058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130235780601f10612ff857610100808354040283529160200191613023565b820191906000526020600020905b81548152906001019060200180831161300657829003601f168201915b5050505050905090565b6000601560009054906101000a900461ffff1661ffff16905090565b601560009054906101000a900461ffff1681565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561309857600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b816131a43382613c6d565b15156131af57600080fd5b6131ba8585856119af565b6131c685858585614751565b15156131d157600080fd5b5050505050565b601060149054906101000a900460ff1681565b60606131f68261241b565b151561320157600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156132a85780601f1061327d576101008083540402835291602001916132a8565b820191906000526020600020905b81548152906001019060200180831161328b57829003601f168201915b50505050509050919050565b600080600b60149054906101000a900460ff1615801561337c5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061337b575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561338757600080fd5b60008411801561339b575060148054905084105b15156133a657600080fd5b6014848154811015156133b557fe5b9060005260206000209060020201905060008160010160036101000a81548161ffff021916908361ffff16021790555080600101600081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050601260019054906101000a900460ff1660ff168160000160128282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601260019054906101000a900460ff168160010160028282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506134ad8161493f565b600f60008581526020019081526020016000206134d142600386600080600061415a565b908060018154018082558091505090600182039060005260206000200160009091929091909150906000191690555061350984611ac6565b5061351384614ab7565b600191505092915050565b600080600080600b60149054906101000a900460ff161580156135e95750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806135e8575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156135f457600080fd5b600089118015613608575060148054905089105b151561361357600080fd5b61361c89612f30565b9250600091505b8482101561375f5760007f010000000000000000000000000000000000000000000000000000000000000002600e60008b8152602001908152602001600020878481518110151561367057fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900481546001816001161561010002031660029004811015156136fb57fe5b81546001161561371a5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508180600101925050613623565b60148981548110151561376e57fe5b9060005260206000209060020201905080600001601e81819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050601260009054906101000a900460ff1660ff168160000160128282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601260009054906101000a900460ff168160010160028282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506138468161493f565b600f60008a81526020019081526020016000206138854260028b8760ff168c81151561386e57fe5b068860ff168d81151561387d57fe5b04600161415a565b90806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055506138bd89614ab7565b6001935050505095945050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561392957600080fd5b8060138190555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156139b557600080fd5b8061ffff1660118190555050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613ab357600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60149054906101000a900460ff16158015613bbe5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480613bbd575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515613bc957600080fd5b600e60008481526020019081526020016000208260ff168154600181600116156101000203166002900481101515613bfd57fe5b815460011615613c1c5790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004905092915050565b600080613c79836125a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613ce857508373ffffffffffffffffffffffffffffffffffffffff16613cd0846114f0565b73ffffffffffffffffffffffffffffffffffffffff16145b80613cf95750613cf881856139c3565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff16613d22826125a9565b73ffffffffffffffffffffffffffffffffffffffff16141515613d4457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613e675760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000613e7a8585614bf2565b60076000858152602001908152602001600020549250613ee66001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050614d2090919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515613f3457fe5b9060005260206000200154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515613f8e57fe5b90600052602060002001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515613fea57fe5b9060005260206000200181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548091906001900361404a9190615047565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b600061408f8383614d39565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050906001820390600052602060002001600090919290919091505550806007600084815260200190815260200160002081905550505050565b6000680100000000000000008260ff16026c010000000000000000000000008460ff16027001000000000000000000000000000000008660ff1602740100000000000000000000000000000000000000008863ffffffff160278010000000000000000000000000000000000000000000000008a60ff16027c01000000000000000000000000000000000000000000000000000000008c63ffffffff1602171717171760010290509695505050505050565b600080600080600b60149054906101000a900460ff161580156142d75750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806142d6575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156142e257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415151561431e57600080fd5b60008660ff16118015614334575060008560ff16115b151561433f57600080fd5b6014805490509250737a3471c362b1b3274d6b3f254e57185ffe94788a63206b64b46007856040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180807f434153544c4523000000000000000000000000000000000000000000000000008152506020018381526020018281526020019250505060206040518083038186803b1580156143e357600080fd5b505af41580156143f7573d6000803e3d6000fd5b505050506040513d602081101561440d57600080fd5b810190808051906020019092919050505091506001601461016060405190810160405280856fffffffffffffffffffffffffffffffff19168152602001600161ffff168152602001600063ffffffff1681526020018960ff1681526020018860ff168152602001601354420163ffffffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600061ffff168152509080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060208201518160000160106101000a81548161ffff021916908361ffff16021790555060408201518160000160126101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600001601c6101000a81548161ffff021916908361ffff16021790555060e082015181600001601e6101000a81548161ffff021916908361ffff1602179055506101008201518160010160006101000a81548161ffff021916908361ffff1602179055506101208201518160010160026101000a81548160ff021916908360ff1602179055506101408201518160010160036101000a81548161ffff021916908361ffff160217905550505003905084860260ff166040519080825280601f01601f1916602001820160405280156146c45781602001602082028038833980820191505090505b50600e600083815260200190815260200160002090805190602001906146eb929190614fc7565b506146f68782614e91565b7fae2afd753dcf65cbe021dcbb3791526c72987ff900eb8053e044701df3a12a6d818787604051808481526020018360ff1681526020018260ff168152602001935050505060405180910390a1600193505050509392505050565b6000806147738573ffffffffffffffffffffffffffffffffffffffff16614ee8565b15156147825760019150614936565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614844578082015181840152602081019050614829565b50505050905090810190601f1680156148715780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561489257600080fd5b505af11580156148a6573d6000803e3d6000fd5b505050506040513d60208110156148bc57600080fd5b8101908080519060200190929190505050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b600b60149054906101000a900460ff16158015614a045750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614a03575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515614a0f57600080fd5b601260029054906101000a900460ff1660ff168160010160029054906101000a900460ff1660ff16101515614ab457601260029054906101000a900460ff168160010160028282829054906101000a900460ff160392506101000a81548160ff021916908360ff16021790555080600001601081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff160217905550505b50565b6000600b60149054906101000a900460ff16158015614b7e5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614b7d575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515614b8957600080fd5b600082118015614b9d575060148054905082105b1515614ba857600080fd5b601482815481101515614bb757fe5b9060005260206000209060020201905060135442018160000160186101000a81548163ffffffff021916908363ffffffff1602179055505050565b8173ffffffffffffffffffffffffffffffffffffffff16614c12826125a9565b73ffffffffffffffffffffffffffffffffffffffff16141515614c3457600080fd5b614c876001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614d2090919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000828211151515614d2e57fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515614da657600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614e4a6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614efb90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b614e9b8282614f17565b600880549050600960008381526020019081526020016000208190555060088190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b600080823b905060008111915050919050565b60008183019050828110151515614f0e57fe5b80905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614f5357600080fd5b614f5d8282614083565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061500857805160ff1916838001178555615036565b82800160010185558215615036579182015b8281111561503557825182559160200191906001019061501a565b5b5090506150439190615073565b5090565b81548183558181111561506e5781836000526020600020918201910161506d9190615073565b5b505050565b61509591905b80821115615091576000816000905550600101615079565b5090565b905600a165627a7a7230582074b45d36c59576b5ecf532712581fd01f9cd5e394f062fb5b246808c1d6526c80029

Deployed Bytecode

0x608060405260043610610272576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde0314610277578063081812fc14610307578063095ea7b3146103745780630ae5e739146103c15780631124c05a1461040457806318160ddd146104865780631a3cd59a146104b15780631c4b774b1461058157806323b872dd146105ca5780632671e253146106375780632f745c591461067c57806333771860146106dd578063379c5131146107205780633f4ba83a146107b857806342842e0e146107cf5780634c207ac81461083c5780634e71e0c8146108d55780634f558e79146108ec5780634f6ccce71461093157806350df8f711461097257806353ed5143146109b757806359c21fd814610a235780635c975abb14610a545780636352211e14610a835780636a62784214610af057806370a0823114610b4b578063715018a614610ba257806372b614af14610bb957806375321c4a14610be457806381b890fc14610c665780638456cb5914610cb057806385e6853114610cc757806386481d4014610d0a5780638da5cb5b14610d535780638e00555314610daa5780638f50fb0614610ddb5780639419fd2914610e8157806395d89b4114610ec857806398d5fdca14610f58578063a035b1fe14610f83578063a22cb46514610fb6578063b88d4fde14611005578063c365d4f0146110b8578063c87b56dd146110e9578063c9dfa7311461118f578063ce8775a4146111de578063d2bafbe614611287578063e30c3978146112b4578063e59de2951461130b578063e985e9c51461133c578063f2fde38b146113b7578063f80eba7c146113fa575b600080fd5b34801561028357600080fd5b5061028c61144e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102cc5780820151818401526020810190506102b1565b50505050905090810190601f1680156102f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031357600080fd5b50610332600480360381019080803590602001909291905050506114f0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561038057600080fd5b506103bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061152d565b005b3480156103cd57600080fd5b50610402600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116f3565b005b34801561041057600080fd5b5061042f600480360381019080803590602001909291905050506117aa565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610472578082015181840152602081019050610457565b505050509050019250505060405180910390f35b34801561049257600080fd5b5061049b611838565b6040518082815260200191505060405180910390f35b3480156104bd57600080fd5b506104dc60048036038101908080359060200190929190505050611845565b60405180896fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020018861ffff1661ffff1681526020018763ffffffff1663ffffffff1681526020018660ff1660ff1681526020018560ff1660ff1681526020018461ffff1661ffff1681526020018361ffff1661ffff1681526020018261ffff1661ffff1681526020019850505050505050505060405180910390f35b34801561058d57600080fd5b506105ac60048036038101908080359060200190929190505050611953565b604051808261ffff1661ffff16815260200191505060405180910390f35b3480156105d657600080fd5b50610635600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119af565b005b34801561064357600080fd5b5061066260048036038101908080359060200190929190505050611ac6565b604051808215151515815260200191505060405180910390f35b34801561068857600080fd5b506106c7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d7b565b6040518082815260200191505060405180910390f35b3480156106e957600080fd5b5061071e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611df2565b005b34801561072c57600080fd5b50610761600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ece565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107a4578082015181840152602081019050610789565b505050509050019250505060405180910390f35b3480156107c457600080fd5b506107cd611f65565b005b3480156107db57600080fd5b5061083a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612025565b005b34801561084857600080fd5b506108bb60048036038101908080359060200190929190803561ffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061205d565b604051808215151515815260200191505060405180910390f35b3480156108e157600080fd5b506108ea61227a565b005b3480156108f857600080fd5b506109176004803603810190808035906020019092919050505061241b565b604051808215151515815260200191505060405180910390f35b34801561093d57600080fd5b5061095c6004803603810190808035906020019092919050505061248c565b6040518082815260200191505060405180910390f35b34801561097e57600080fd5b5061099d600480360381019080803590602001909291905050506124c4565b604051808215151515815260200191505060405180910390f35b3480156109c357600080fd5b506109cc61252b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610a0f5780820151818401526020810190506109f4565b505050509050019250505060405180910390f35b348015610a2f57600080fd5b50610a38612583565b604051808260ff1660ff16815260200191505060405180910390f35b348015610a6057600080fd5b50610a69612596565b604051808215151515815260200191505060405180910390f35b348015610a8f57600080fd5b50610aae600480360381019080803590602001909291905050506125a9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610afc57600080fd5b50610b31600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612626565b604051808215151515815260200191505060405180910390f35b348015610b5757600080fd5b50610b8c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612780565b6040518082815260200191505060405180910390f35b348015610bae57600080fd5b50610bb7612804565b005b348015610bc557600080fd5b50610bce612909565b6040518082815260200191505060405180910390f35b348015610bf057600080fd5b50610c0f6004803603810190808035906020019092919050505061290f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c52578082015181840152602081019050610c37565b505050509050019250505060405180910390f35b348015610c7257600080fd5b50610cae6004803603810190808035906020019092919080356fffffffffffffffffffffffffffffffff19169060200190929190505050612ae6565b005b348015610cbc57600080fd5b50610cc5612b87565b005b348015610cd357600080fd5b50610d08600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c48565b005b348015610d1657600080fd5b50610d3560048036038101908080359060200190929190505050612cff565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610d5f57600080fd5b50610d68612d3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610db657600080fd5b50610dd9600480360381019080803561ffff169060200190929190505050612d62565b005b348015610de757600080fd5b50610e0660048036038101908080359060200190929190505050612dde565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e46578082015181840152602081019050610e2b565b50505050905090810190601f168015610e735780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e8d57600080fd5b50610eac60048036038101908080359060200190929190505050612f30565b604051808260ff1660ff16815260200191505060405180910390f35b348015610ed457600080fd5b50610edd612f8b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f1d578082015181840152602081019050610f02565b50505050905090810190601f168015610f4a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610f6457600080fd5b50610f6d61302d565b6040518082815260200191505060405180910390f35b348015610f8f57600080fd5b50610f98613049565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610fc257600080fd5b50611003600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061305d565b005b34801561101157600080fd5b506110b6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613199565b005b3480156110c457600080fd5b506110cd6131d8565b604051808260ff1660ff16815260200191505060405180910390f35b3480156110f557600080fd5b50611114600480360381019080803590602001909291905050506131eb565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611154578082015181840152602081019050611139565b50505050905090810190601f1680156111815780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561119b57600080fd5b506111c460048036038101908080359060200190929190803590602001909291905050506132b4565b604051808215151515815260200191505060405180910390f35b3480156111ea57600080fd5b5061126d600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192908035906020019092919050505061351e565b604051808215151515815260200191505060405180910390f35b34801561129357600080fd5b506112b2600480360381019080803590602001909291905050506138cd565b005b3480156112c057600080fd5b506112c9613933565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561131757600080fd5b5061133a600480360381019080803561ffff169060200190929190505050613959565b005b34801561134857600080fd5b5061139d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139c3565b604051808215151515815260200191505060405180910390f35b3480156113c357600080fd5b506113f8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613a57565b005b34801561140657600080fd5b5061143260048036038101908080359060200190929190803560ff169060200190929190505050613af7565b604051808260ff1660ff16815260200191505060405180910390f35b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114e65780601f106114bb576101008083540402835291602001916114e6565b820191906000526020600020905b8154815290600101906020018083116114c957829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000611538826125a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561157557600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115b557506115b481336139c3565b5b15156115c057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166115e1836114f0565b73ffffffffffffffffffffffffffffffffffffffff161415806116315750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156116ee57826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561174f57600080fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60606000821180156117c0575060148054905082105b15156117cb57600080fd5b600f600083815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561182c57602002820191906000526020600020905b81546000191681526020019060010190808311611814575b50505050509050919050565b6000600880549050905090565b6000806000806000806000806000808a11801561186657506014805490508a105b151561187157600080fd5b60148a81548110151561188057fe5b906000526020600020906002020190508060000160009054906101000a9004700100000000000000000000000000000000028160000160109054906101000a900461ffff168260000160129054906101000a900463ffffffff168360000160169054906101000a900460ff168460000160179054906101000a900460ff1685600001601e9054906101000a900461ffff168660010160009054906101000a900461ffff168760010160039054906101000a900461ffff169850985098509850985098509850985050919395975091939597565b60008060008311801561196a575060148054905083105b151561197557600080fd5b60148381548110151561198457fe5b906000526020600020906002020190508060010160039054906101000a900461ffff16915050919050565b806119ba3382613c6d565b15156119c557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515611a0157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611a3d57600080fd5b611a478483613d02565b611a518483613e6b565b611a5b8383614083565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000806000600b60149054906101000a900460ff16158015611b905750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b8f575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515611b9b57600080fd5b600084118015611baf575060148054905084105b1515611bba57600080fd5b601484815481101515611bc957fe5b90600052602060002090600202019150600090505b8160000160179054906101000a900460ff168260000160169054906101000a900460ff160260ff16811015611cc65760007f010000000000000000000000000000000000000000000000000000000000000002600e6000868152602001908152602001600020828154600181600116156101000203166002900481101515611c6257fe5b815460011615611c815790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508080600101915050611bde565b60008260010160036101000a81548161ffff021916908361ffff160217905550600f6000858152602001908152602001600020611d0a42600160008060008061415a565b90806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055507fb151dd09a2d98f317bcb24f032fb1c489342f6f906c6b827ba3a72d6cab1401e846040518082815260200191505060405180910390a1600192505050919050565b6000611d8683612780565b82101515611d9357600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611ddf57fe5b9060005260206000200154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e4e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e8a57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611f5957602002820191906000526020600020905b815481526020019060010190808311611f45575b50505050509050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fc157600080fd5b600b60149054906101000a900460ff161515611fdc57600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b806120303382613c6d565b151561203b57600080fd5b6120578484846020604051908101604052806000815250613199565b50505050565b600080600b60149054906101000a900460ff1615151561207c57600080fd5b600b60149054906101000a900460ff161580156121415750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612140575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561214c57600080fd5b600085118015612160575060148054905085105b151561216b57600080fd5b60008461ffff1611151561217e57600080fd5b60148581548110151561218d57fe5b90600052602060002090600202019050838160010160036101000a81548161ffff021916908361ffff16021790555082600e600087815260200190815260200160002090805190602001906121e3929190614fc7565b50600f600086815260200190815260200160002061220842600080600080600061415a565b90806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055507ffaac92082460b3da200bee42b6863b57652aed78ef0a5e8548761e24f9757604856040518082815260200191505060405180910390a160019150509392505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156122d657600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000612496611838565b821015156124a357600080fd5b6008828154811015156124b257fe5b90600052602060002001549050919050565b6000806000831180156124db575060148054905083105b15156124e657600080fd5b6014838154811015156124f557fe5b90600052602060002090600202019050428160000160189054906101000a900463ffffffff1663ffffffff161115915050919050565b6060600880548060200260200160405190810160405280929190818152602001828054801561257957602002820191906000526020600020905b815481526020019060010190808311612565575b5050505050905090565b601060159054906101000a900460ff1681565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561261d57600080fd5b80915050919050565b6000600b60149054906101000a900460ff1615151561264457600080fd5b600b60149054906101000a900460ff161580156127095750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612708575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561271457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561275057600080fd5b61277982601060149054906101000a900460ff16601060159054906101000a900460ff1661420c565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156127bd57600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561286057600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60115481565b60606000806000606060009350600092508592505b6014805490508310156129d35760148381548110151561294057fe5b9060005260206000209060020201915060008260010160039054906101000a900461ffff1661ffff161180156129aa57503373ffffffffffffffffffffffffffffffffffffffff16612991846125a9565b73ffffffffffffffffffffffffffffffffffffffff1614155b156129c657838060010194505085841015156129c5576129d3565b5b8280600101935050612924565b600160115401604051908082528060200260200182016040528015612a075781602001602082028038833980820191505090505b509050600093505b601480549050831015612ada57601483815481101515612a2b57fe5b9060005260206000209060020201915060008260010160039054906101000a900461ffff1661ffff16118015612a9557503373ffffffffffffffffffffffffffffffffffffffff16612a7c846125a9565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612acd57828185806001019650815181101515612aaf57fe5b9060200190602002018181525050601154841115612acc57612ada565b5b8280600101935050612a0f565b80945050505050919050565b813373ffffffffffffffffffffffffffffffffffffffff16612b07826125a9565b73ffffffffffffffffffffffffffffffffffffffff16141515612b2957600080fd5b81601484815481101515612b3957fe5b906000526020600020906002020160000160006101000a8154816fffffffffffffffffffffffffffffffff021916908370010000000000000000000000000000000090040217905550505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612be357600080fd5b600b60149054906101000a900460ff16151515612bff57600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ca457600080fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080601483815481101515612d1157fe5b906000526020600020906002020190508060000160109054906101000a900461ffff16915050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612dbe57600080fd5b80601560006101000a81548161ffff021916908361ffff16021790555050565b60603373ffffffffffffffffffffffffffffffffffffffff16612e00836125a9565b73ffffffffffffffffffffffffffffffffffffffff161480612e72575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b1515612e7d57600080fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612f245780601f10612ef957610100808354040283529160200191612f24565b820191906000526020600020905b815481529060010190602001808311612f0757829003601f168201915b50505050509050919050565b600080600083118015612f47575060148054905083105b1515612f5257600080fd5b601483815481101515612f6157fe5b906000526020600020906002020190508060000160169054906101000a900460ff16915050919050565b606060058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130235780601f10612ff857610100808354040283529160200191613023565b820191906000526020600020905b81548152906001019060200180831161300657829003601f168201915b5050505050905090565b6000601560009054906101000a900461ffff1661ffff16905090565b601560009054906101000a900461ffff1681565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561309857600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b816131a43382613c6d565b15156131af57600080fd5b6131ba8585856119af565b6131c685858585614751565b15156131d157600080fd5b5050505050565b601060149054906101000a900460ff1681565b60606131f68261241b565b151561320157600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156132a85780601f1061327d576101008083540402835291602001916132a8565b820191906000526020600020905b81548152906001019060200180831161328b57829003601f168201915b50505050509050919050565b600080600b60149054906101000a900460ff1615801561337c5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061337b575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561338757600080fd5b60008411801561339b575060148054905084105b15156133a657600080fd5b6014848154811015156133b557fe5b9060005260206000209060020201905060008160010160036101000a81548161ffff021916908361ffff16021790555080600101600081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050601260019054906101000a900460ff1660ff168160000160128282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601260019054906101000a900460ff168160010160028282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506134ad8161493f565b600f60008581526020019081526020016000206134d142600386600080600061415a565b908060018154018082558091505090600182039060005260206000200160009091929091909150906000191690555061350984611ac6565b5061351384614ab7565b600191505092915050565b600080600080600b60149054906101000a900460ff161580156135e95750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806135e8575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156135f457600080fd5b600089118015613608575060148054905089105b151561361357600080fd5b61361c89612f30565b9250600091505b8482101561375f5760007f010000000000000000000000000000000000000000000000000000000000000002600e60008b8152602001908152602001600020878481518110151561367057fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900481546001816001161561010002031660029004811015156136fb57fe5b81546001161561371a5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508180600101925050613623565b60148981548110151561376e57fe5b9060005260206000209060020201905080600001601e81819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050601260009054906101000a900460ff1660ff168160000160128282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601260009054906101000a900460ff168160010160028282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506138468161493f565b600f60008a81526020019081526020016000206138854260028b8760ff168c81151561386e57fe5b068860ff168d81151561387d57fe5b04600161415a565b90806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055506138bd89614ab7565b6001935050505095945050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561392957600080fd5b8060138190555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156139b557600080fd5b8061ffff1660118190555050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613ab357600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60149054906101000a900460ff16158015613bbe5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480613bbd575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515613bc957600080fd5b600e60008481526020019081526020016000208260ff168154600181600116156101000203166002900481101515613bfd57fe5b815460011615613c1c5790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004905092915050565b600080613c79836125a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613ce857508373ffffffffffffffffffffffffffffffffffffffff16613cd0846114f0565b73ffffffffffffffffffffffffffffffffffffffff16145b80613cf95750613cf881856139c3565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff16613d22826125a9565b73ffffffffffffffffffffffffffffffffffffffff16141515613d4457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613e675760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000613e7a8585614bf2565b60076000858152602001908152602001600020549250613ee66001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050614d2090919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515613f3457fe5b9060005260206000200154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515613f8e57fe5b90600052602060002001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515613fea57fe5b9060005260206000200181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548091906001900361404a9190615047565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b600061408f8383614d39565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050906001820390600052602060002001600090919290919091505550806007600084815260200190815260200160002081905550505050565b6000680100000000000000008260ff16026c010000000000000000000000008460ff16027001000000000000000000000000000000008660ff1602740100000000000000000000000000000000000000008863ffffffff160278010000000000000000000000000000000000000000000000008a60ff16027c01000000000000000000000000000000000000000000000000000000008c63ffffffff1602171717171760010290509695505050505050565b600080600080600b60149054906101000a900460ff161580156142d75750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806142d6575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156142e257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415151561431e57600080fd5b60008660ff16118015614334575060008560ff16115b151561433f57600080fd5b6014805490509250737a3471c362b1b3274d6b3f254e57185ffe94788a63206b64b46007856040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180807f434153544c4523000000000000000000000000000000000000000000000000008152506020018381526020018281526020019250505060206040518083038186803b1580156143e357600080fd5b505af41580156143f7573d6000803e3d6000fd5b505050506040513d602081101561440d57600080fd5b810190808051906020019092919050505091506001601461016060405190810160405280856fffffffffffffffffffffffffffffffff19168152602001600161ffff168152602001600063ffffffff1681526020018960ff1681526020018860ff168152602001601354420163ffffffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600061ffff168152509080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060208201518160000160106101000a81548161ffff021916908361ffff16021790555060408201518160000160126101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600001601c6101000a81548161ffff021916908361ffff16021790555060e082015181600001601e6101000a81548161ffff021916908361ffff1602179055506101008201518160010160006101000a81548161ffff021916908361ffff1602179055506101208201518160010160026101000a81548160ff021916908360ff1602179055506101408201518160010160036101000a81548161ffff021916908361ffff160217905550505003905084860260ff166040519080825280601f01601f1916602001820160405280156146c45781602001602082028038833980820191505090505b50600e600083815260200190815260200160002090805190602001906146eb929190614fc7565b506146f68782614e91565b7fae2afd753dcf65cbe021dcbb3791526c72987ff900eb8053e044701df3a12a6d818787604051808481526020018360ff1681526020018260ff168152602001935050505060405180910390a1600193505050509392505050565b6000806147738573ffffffffffffffffffffffffffffffffffffffff16614ee8565b15156147825760019150614936565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614844578082015181840152602081019050614829565b50505050905090810190601f1680156148715780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561489257600080fd5b505af11580156148a6573d6000803e3d6000fd5b505050506040513d60208110156148bc57600080fd5b8101908080519060200190929190505050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b600b60149054906101000a900460ff16158015614a045750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614a03575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515614a0f57600080fd5b601260029054906101000a900460ff1660ff168160010160029054906101000a900460ff1660ff16101515614ab457601260029054906101000a900460ff168160010160028282829054906101000a900460ff160392506101000a81548160ff021916908360ff16021790555080600001601081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff160217905550505b50565b6000600b60149054906101000a900460ff16158015614b7e5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614b7d575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515614b8957600080fd5b600082118015614b9d575060148054905082105b1515614ba857600080fd5b601482815481101515614bb757fe5b9060005260206000209060020201905060135442018160000160186101000a81548163ffffffff021916908363ffffffff1602179055505050565b8173ffffffffffffffffffffffffffffffffffffffff16614c12826125a9565b73ffffffffffffffffffffffffffffffffffffffff16141515614c3457600080fd5b614c876001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614d2090919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000828211151515614d2e57fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515614da657600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614e4a6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614efb90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b614e9b8282614f17565b600880549050600960008381526020019081526020016000208190555060088190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b600080823b905060008111915050919050565b60008183019050828110151515614f0e57fe5b80905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614f5357600080fd5b614f5d8282614083565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061500857805160ff1916838001178555615036565b82800160010185558215615036579182015b8281111561503557825182559160200191906001019061501a565b5b5090506150439190615073565b5090565b81548183558181111561506e5781836000526020600020918201910161506d9190615073565b5b505050565b61509591905b80821115615091576000816000905550600101615079565b5090565b905600a165627a7a7230582074b45d36c59576b5ecf532712581fd01f9cd5e394f062fb5b246808c1d6526c80029

Swarm Source

bzzr://74b45d36c59576b5ecf532712581fd01f9cd5e394f062fb5b246808c1d6526c8

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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