Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 56 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Name | 6672747 | 2231 days ago | IN | 0 ETH | 0.00014726 | ||||
Set Name | 6672716 | 2231 days ago | IN | 0 ETH | 0.00014758 | ||||
Set Name | 6672713 | 2231 days ago | IN | 0 ETH | 0.00014726 | ||||
Set Name | 6672708 | 2231 days ago | IN | 0 ETH | 0.00014758 | ||||
Set Name | 6171777 | 2314 days ago | IN | 0 ETH | 0.00004379 | ||||
Set Name | 6171774 | 2314 days ago | IN | 0 ETH | 0.00004379 | ||||
Set Name | 6171763 | 2314 days ago | IN | 0 ETH | 0.00004331 | ||||
Set Name | 6171761 | 2314 days ago | IN | 0 ETH | 0.0000436 | ||||
Set Name | 6171761 | 2314 days ago | IN | 0 ETH | 0.00004341 | ||||
Set Name | 6171758 | 2314 days ago | IN | 0 ETH | 0.00004341 | ||||
Set Name | 6171756 | 2314 days ago | IN | 0 ETH | 0.00004341 | ||||
Set Name | 6171747 | 2314 days ago | IN | 0 ETH | 0.00004341 | ||||
Set Name | 6171721 | 2314 days ago | IN | 0 ETH | 0.00004341 | ||||
Set Name | 6171719 | 2314 days ago | IN | 0 ETH | 0.00004341 | ||||
Set Name | 6171640 | 2314 days ago | IN | 0 ETH | 0.00004341 | ||||
Set Name | 6171628 | 2314 days ago | IN | 0 ETH | 0.0000436 | ||||
Set Name | 6171618 | 2314 days ago | IN | 0 ETH | 0.0000436 | ||||
Set Name | 6171617 | 2314 days ago | IN | 0 ETH | 0.0000436 | ||||
Set Name | 6171537 | 2314 days ago | IN | 0 ETH | 0.00004341 | ||||
Set Name | 6167172 | 2314 days ago | IN | 0 ETH | 0.00004341 | ||||
Set Name | 6153999 | 2317 days ago | IN | 0 ETH | 0.00004341 | ||||
Set Name | 6140763 | 2319 days ago | IN | 0 ETH | 0.00014438 | ||||
Set Name | 6107184 | 2324 days ago | IN | 0 ETH | 0.0000436 | ||||
Set Name | 6107121 | 2324 days ago | IN | 0 ETH | 0.0000436 | ||||
Set Name | 6103289 | 2325 days ago | IN | 0 ETH | 0.00004341 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
60806040526000600b60146101000a81548160ff0219169083151502179055506005601060146101000a81548160ff021916908360ff1602179055506008601060156101000a81548160ff021916908360ff160217905550600a6011556003601260006101000a81548160ff021916908360ff1602179055506001601260016101000a81548160ff021916908360ff160217905550600a601260026101000a81548160ff021916908360ff16021790555061012c6013556103e8601560006101000a81548161ffff021916908361ffff160217905550348015620000e257600080fd5b506040805190810160405280601881526020017f43727970746f204e696e6a612047616d6520436173746c6500000000000000008152506040805190810160405280600381526020017f434e43000000000000000000000000000000000000000000000000000000000081525081600490805190602001906200016792919062000451565b5080600590805190602001906200018092919062000451565b50505033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506014610160604051908101604052807f44554d4d590000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff19168152602001600061ffff168152602001600063ffffffff168152602001600060ff168152602001600060ff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600061ffff168152509080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060208201518160000160106101000a81548161ffff021916908361ffff16021790555060408201518160000160126101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600001601c6101000a81548161ffff021916908361ffff16021790555060e082015181600001601e6101000a81548161ffff021916908361ffff1602179055506101008201518160010160006101000a81548161ffff021916908361ffff1602179055506101208201518160010160026101000a81548160ff021916908360ff1602179055506101408201518160010160036101000a81548161ffff021916908361ffff16021790555050505062000500565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200049457805160ff1916838001178555620004c5565b82800160010185558215620004c5579182015b82811115620004c4578251825591602001919060010190620004a7565b5b509050620004d49190620004d8565b5090565b620004fd91905b80821115620004f9576000816000905550600101620004df565b5090565b90565b6150c480620005106000396000f300608060405260043610610272576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde0314610277578063081812fc14610307578063095ea7b3146103745780630ae5e739146103c15780631124c05a1461040457806318160ddd146104865780631a3cd59a146104b15780631c4b774b1461058157806323b872dd146105ca5780632671e253146106375780632f745c591461067c57806333771860146106dd578063379c5131146107205780633f4ba83a146107b857806342842e0e146107cf5780634c207ac81461083c5780634e71e0c8146108d55780634f558e79146108ec5780634f6ccce71461093157806350df8f711461097257806353ed5143146109b757806359c21fd814610a235780635c975abb14610a545780636352211e14610a835780636a62784214610af057806370a0823114610b4b578063715018a614610ba257806372b614af14610bb957806375321c4a14610be457806381b890fc14610c665780638456cb5914610cb057806385e6853114610cc757806386481d4014610d0a5780638da5cb5b14610d535780638e00555314610daa5780638f50fb0614610ddb5780639419fd2914610e8157806395d89b4114610ec857806398d5fdca14610f58578063a035b1fe14610f83578063a22cb46514610fb6578063b88d4fde14611005578063c365d4f0146110b8578063c87b56dd146110e9578063c9dfa7311461118f578063ce8775a4146111de578063d2bafbe614611287578063e30c3978146112b4578063e59de2951461130b578063e985e9c51461133c578063f2fde38b146113b7578063f80eba7c146113fa575b600080fd5b34801561028357600080fd5b5061028c61144e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102cc5780820151818401526020810190506102b1565b50505050905090810190601f1680156102f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031357600080fd5b50610332600480360381019080803590602001909291905050506114f0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561038057600080fd5b506103bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061152d565b005b3480156103cd57600080fd5b50610402600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116f3565b005b34801561041057600080fd5b5061042f600480360381019080803590602001909291905050506117aa565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610472578082015181840152602081019050610457565b505050509050019250505060405180910390f35b34801561049257600080fd5b5061049b611838565b6040518082815260200191505060405180910390f35b3480156104bd57600080fd5b506104dc60048036038101908080359060200190929190505050611845565b60405180896fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020018861ffff1661ffff1681526020018763ffffffff1663ffffffff1681526020018660ff1660ff1681526020018560ff1660ff1681526020018461ffff1661ffff1681526020018361ffff1661ffff1681526020018261ffff1661ffff1681526020019850505050505050505060405180910390f35b34801561058d57600080fd5b506105ac60048036038101908080359060200190929190505050611953565b604051808261ffff1661ffff16815260200191505060405180910390f35b3480156105d657600080fd5b50610635600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119af565b005b34801561064357600080fd5b5061066260048036038101908080359060200190929190505050611ac6565b604051808215151515815260200191505060405180910390f35b34801561068857600080fd5b506106c7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d7b565b6040518082815260200191505060405180910390f35b3480156106e957600080fd5b5061071e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611df2565b005b34801561072c57600080fd5b50610761600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ece565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107a4578082015181840152602081019050610789565b505050509050019250505060405180910390f35b3480156107c457600080fd5b506107cd611f65565b005b3480156107db57600080fd5b5061083a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612025565b005b34801561084857600080fd5b506108bb60048036038101908080359060200190929190803561ffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061205d565b604051808215151515815260200191505060405180910390f35b3480156108e157600080fd5b506108ea61227a565b005b3480156108f857600080fd5b506109176004803603810190808035906020019092919050505061241b565b604051808215151515815260200191505060405180910390f35b34801561093d57600080fd5b5061095c6004803603810190808035906020019092919050505061248c565b6040518082815260200191505060405180910390f35b34801561097e57600080fd5b5061099d600480360381019080803590602001909291905050506124c4565b604051808215151515815260200191505060405180910390f35b3480156109c357600080fd5b506109cc61252b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610a0f5780820151818401526020810190506109f4565b505050509050019250505060405180910390f35b348015610a2f57600080fd5b50610a38612583565b604051808260ff1660ff16815260200191505060405180910390f35b348015610a6057600080fd5b50610a69612596565b604051808215151515815260200191505060405180910390f35b348015610a8f57600080fd5b50610aae600480360381019080803590602001909291905050506125a9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610afc57600080fd5b50610b31600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612626565b604051808215151515815260200191505060405180910390f35b348015610b5757600080fd5b50610b8c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612780565b6040518082815260200191505060405180910390f35b348015610bae57600080fd5b50610bb7612804565b005b348015610bc557600080fd5b50610bce612909565b6040518082815260200191505060405180910390f35b348015610bf057600080fd5b50610c0f6004803603810190808035906020019092919050505061290f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c52578082015181840152602081019050610c37565b505050509050019250505060405180910390f35b348015610c7257600080fd5b50610cae6004803603810190808035906020019092919080356fffffffffffffffffffffffffffffffff19169060200190929190505050612ae6565b005b348015610cbc57600080fd5b50610cc5612b87565b005b348015610cd357600080fd5b50610d08600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c48565b005b348015610d1657600080fd5b50610d3560048036038101908080359060200190929190505050612cff565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610d5f57600080fd5b50610d68612d3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610db657600080fd5b50610dd9600480360381019080803561ffff169060200190929190505050612d62565b005b348015610de757600080fd5b50610e0660048036038101908080359060200190929190505050612dde565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e46578082015181840152602081019050610e2b565b50505050905090810190601f168015610e735780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e8d57600080fd5b50610eac60048036038101908080359060200190929190505050612f30565b604051808260ff1660ff16815260200191505060405180910390f35b348015610ed457600080fd5b50610edd612f8b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f1d578082015181840152602081019050610f02565b50505050905090810190601f168015610f4a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610f6457600080fd5b50610f6d61302d565b6040518082815260200191505060405180910390f35b348015610f8f57600080fd5b50610f98613049565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610fc257600080fd5b50611003600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061305d565b005b34801561101157600080fd5b506110b6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613199565b005b3480156110c457600080fd5b506110cd6131d8565b604051808260ff1660ff16815260200191505060405180910390f35b3480156110f557600080fd5b50611114600480360381019080803590602001909291905050506131eb565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611154578082015181840152602081019050611139565b50505050905090810190601f1680156111815780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561119b57600080fd5b506111c460048036038101908080359060200190929190803590602001909291905050506132b4565b604051808215151515815260200191505060405180910390f35b3480156111ea57600080fd5b5061126d600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192908035906020019092919050505061351e565b604051808215151515815260200191505060405180910390f35b34801561129357600080fd5b506112b2600480360381019080803590602001909291905050506138cd565b005b3480156112c057600080fd5b506112c9613933565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561131757600080fd5b5061133a600480360381019080803561ffff169060200190929190505050613959565b005b34801561134857600080fd5b5061139d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139c3565b604051808215151515815260200191505060405180910390f35b3480156113c357600080fd5b506113f8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613a57565b005b34801561140657600080fd5b5061143260048036038101908080359060200190929190803560ff169060200190929190505050613af7565b604051808260ff1660ff16815260200191505060405180910390f35b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114e65780601f106114bb576101008083540402835291602001916114e6565b820191906000526020600020905b8154815290600101906020018083116114c957829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000611538826125a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561157557600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115b557506115b481336139c3565b5b15156115c057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166115e1836114f0565b73ffffffffffffffffffffffffffffffffffffffff161415806116315750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156116ee57826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561174f57600080fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60606000821180156117c0575060148054905082105b15156117cb57600080fd5b600f600083815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561182c57602002820191906000526020600020905b81546000191681526020019060010190808311611814575b50505050509050919050565b6000600880549050905090565b6000806000806000806000806000808a11801561186657506014805490508a105b151561187157600080fd5b60148a81548110151561188057fe5b906000526020600020906002020190508060000160009054906101000a9004700100000000000000000000000000000000028160000160109054906101000a900461ffff168260000160129054906101000a900463ffffffff168360000160169054906101000a900460ff168460000160179054906101000a900460ff1685600001601e9054906101000a900461ffff168660010160009054906101000a900461ffff168760010160039054906101000a900461ffff169850985098509850985098509850985050919395975091939597565b60008060008311801561196a575060148054905083105b151561197557600080fd5b60148381548110151561198457fe5b906000526020600020906002020190508060010160039054906101000a900461ffff16915050919050565b806119ba3382613c6d565b15156119c557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515611a0157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611a3d57600080fd5b611a478483613d02565b611a518483613e6b565b611a5b8383614083565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000806000600b60149054906101000a900460ff16158015611b905750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b8f575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515611b9b57600080fd5b600084118015611baf575060148054905084105b1515611bba57600080fd5b601484815481101515611bc957fe5b90600052602060002090600202019150600090505b8160000160179054906101000a900460ff168260000160169054906101000a900460ff160260ff16811015611cc65760007f010000000000000000000000000000000000000000000000000000000000000002600e6000868152602001908152602001600020828154600181600116156101000203166002900481101515611c6257fe5b815460011615611c815790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508080600101915050611bde565b60008260010160036101000a81548161ffff021916908361ffff160217905550600f6000858152602001908152602001600020611d0a42600160008060008061415a565b90806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055507fb151dd09a2d98f317bcb24f032fb1c489342f6f906c6b827ba3a72d6cab1401e846040518082815260200191505060405180910390a1600192505050919050565b6000611d8683612780565b82101515611d9357600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611ddf57fe5b9060005260206000200154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e4e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e8a57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611f5957602002820191906000526020600020905b815481526020019060010190808311611f45575b50505050509050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fc157600080fd5b600b60149054906101000a900460ff161515611fdc57600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b806120303382613c6d565b151561203b57600080fd5b6120578484846020604051908101604052806000815250613199565b50505050565b600080600b60149054906101000a900460ff1615151561207c57600080fd5b600b60149054906101000a900460ff161580156121415750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612140575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561214c57600080fd5b600085118015612160575060148054905085105b151561216b57600080fd5b60008461ffff1611151561217e57600080fd5b60148581548110151561218d57fe5b90600052602060002090600202019050838160010160036101000a81548161ffff021916908361ffff16021790555082600e600087815260200190815260200160002090805190602001906121e3929190614fc7565b50600f600086815260200190815260200160002061220842600080600080600061415a565b90806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055507ffaac92082460b3da200bee42b6863b57652aed78ef0a5e8548761e24f9757604856040518082815260200191505060405180910390a160019150509392505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156122d657600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000612496611838565b821015156124a357600080fd5b6008828154811015156124b257fe5b90600052602060002001549050919050565b6000806000831180156124db575060148054905083105b15156124e657600080fd5b6014838154811015156124f557fe5b90600052602060002090600202019050428160000160189054906101000a900463ffffffff1663ffffffff161115915050919050565b6060600880548060200260200160405190810160405280929190818152602001828054801561257957602002820191906000526020600020905b815481526020019060010190808311612565575b5050505050905090565b601060159054906101000a900460ff1681565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561261d57600080fd5b80915050919050565b6000600b60149054906101000a900460ff1615151561264457600080fd5b600b60149054906101000a900460ff161580156127095750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612708575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561271457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561275057600080fd5b61277982601060149054906101000a900460ff16601060159054906101000a900460ff1661420c565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156127bd57600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561286057600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60115481565b60606000806000606060009350600092508592505b6014805490508310156129d35760148381548110151561294057fe5b9060005260206000209060020201915060008260010160039054906101000a900461ffff1661ffff161180156129aa57503373ffffffffffffffffffffffffffffffffffffffff16612991846125a9565b73ffffffffffffffffffffffffffffffffffffffff1614155b156129c657838060010194505085841015156129c5576129d3565b5b8280600101935050612924565b600160115401604051908082528060200260200182016040528015612a075781602001602082028038833980820191505090505b509050600093505b601480549050831015612ada57601483815481101515612a2b57fe5b9060005260206000209060020201915060008260010160039054906101000a900461ffff1661ffff16118015612a9557503373ffffffffffffffffffffffffffffffffffffffff16612a7c846125a9565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612acd57828185806001019650815181101515612aaf57fe5b9060200190602002018181525050601154841115612acc57612ada565b5b8280600101935050612a0f565b80945050505050919050565b813373ffffffffffffffffffffffffffffffffffffffff16612b07826125a9565b73ffffffffffffffffffffffffffffffffffffffff16141515612b2957600080fd5b81601484815481101515612b3957fe5b906000526020600020906002020160000160006101000a8154816fffffffffffffffffffffffffffffffff021916908370010000000000000000000000000000000090040217905550505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612be357600080fd5b600b60149054906101000a900460ff16151515612bff57600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ca457600080fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080601483815481101515612d1157fe5b906000526020600020906002020190508060000160109054906101000a900461ffff16915050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612dbe57600080fd5b80601560006101000a81548161ffff021916908361ffff16021790555050565b60603373ffffffffffffffffffffffffffffffffffffffff16612e00836125a9565b73ffffffffffffffffffffffffffffffffffffffff161480612e72575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b1515612e7d57600080fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612f245780601f10612ef957610100808354040283529160200191612f24565b820191906000526020600020905b815481529060010190602001808311612f0757829003601f168201915b50505050509050919050565b600080600083118015612f47575060148054905083105b1515612f5257600080fd5b601483815481101515612f6157fe5b906000526020600020906002020190508060000160169054906101000a900460ff16915050919050565b606060058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130235780601f10612ff857610100808354040283529160200191613023565b820191906000526020600020905b81548152906001019060200180831161300657829003601f168201915b5050505050905090565b6000601560009054906101000a900461ffff1661ffff16905090565b601560009054906101000a900461ffff1681565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561309857600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b816131a43382613c6d565b15156131af57600080fd5b6131ba8585856119af565b6131c685858585614751565b15156131d157600080fd5b5050505050565b601060149054906101000a900460ff1681565b60606131f68261241b565b151561320157600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156132a85780601f1061327d576101008083540402835291602001916132a8565b820191906000526020600020905b81548152906001019060200180831161328b57829003601f168201915b50505050509050919050565b600080600b60149054906101000a900460ff1615801561337c5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061337b575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561338757600080fd5b60008411801561339b575060148054905084105b15156133a657600080fd5b6014848154811015156133b557fe5b9060005260206000209060020201905060008160010160036101000a81548161ffff021916908361ffff16021790555080600101600081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050601260019054906101000a900460ff1660ff168160000160128282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601260019054906101000a900460ff168160010160028282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506134ad8161493f565b600f60008581526020019081526020016000206134d142600386600080600061415a565b908060018154018082558091505090600182039060005260206000200160009091929091909150906000191690555061350984611ac6565b5061351384614ab7565b600191505092915050565b600080600080600b60149054906101000a900460ff161580156135e95750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806135e8575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156135f457600080fd5b600089118015613608575060148054905089105b151561361357600080fd5b61361c89612f30565b9250600091505b8482101561375f5760007f010000000000000000000000000000000000000000000000000000000000000002600e60008b8152602001908152602001600020878481518110151561367057fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900481546001816001161561010002031660029004811015156136fb57fe5b81546001161561371a5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508180600101925050613623565b60148981548110151561376e57fe5b9060005260206000209060020201905080600001601e81819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050601260009054906101000a900460ff1660ff168160000160128282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601260009054906101000a900460ff168160010160028282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506138468161493f565b600f60008a81526020019081526020016000206138854260028b8760ff168c81151561386e57fe5b068860ff168d81151561387d57fe5b04600161415a565b90806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055506138bd89614ab7565b6001935050505095945050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561392957600080fd5b8060138190555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156139b557600080fd5b8061ffff1660118190555050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613ab357600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60149054906101000a900460ff16158015613bbe5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480613bbd575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515613bc957600080fd5b600e60008481526020019081526020016000208260ff168154600181600116156101000203166002900481101515613bfd57fe5b815460011615613c1c5790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004905092915050565b600080613c79836125a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613ce857508373ffffffffffffffffffffffffffffffffffffffff16613cd0846114f0565b73ffffffffffffffffffffffffffffffffffffffff16145b80613cf95750613cf881856139c3565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff16613d22826125a9565b73ffffffffffffffffffffffffffffffffffffffff16141515613d4457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613e675760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000613e7a8585614bf2565b60076000858152602001908152602001600020549250613ee66001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050614d2090919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515613f3457fe5b9060005260206000200154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515613f8e57fe5b90600052602060002001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515613fea57fe5b9060005260206000200181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548091906001900361404a9190615047565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b600061408f8383614d39565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050906001820390600052602060002001600090919290919091505550806007600084815260200190815260200160002081905550505050565b6000680100000000000000008260ff16026c010000000000000000000000008460ff16027001000000000000000000000000000000008660ff1602740100000000000000000000000000000000000000008863ffffffff160278010000000000000000000000000000000000000000000000008a60ff16027c01000000000000000000000000000000000000000000000000000000008c63ffffffff1602171717171760010290509695505050505050565b600080600080600b60149054906101000a900460ff161580156142d75750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806142d6575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156142e257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415151561431e57600080fd5b60008660ff16118015614334575060008560ff16115b151561433f57600080fd5b6014805490509250737a3471c362b1b3274d6b3f254e57185ffe94788a63206b64b46007856040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180807f434153544c4523000000000000000000000000000000000000000000000000008152506020018381526020018281526020019250505060206040518083038186803b1580156143e357600080fd5b505af41580156143f7573d6000803e3d6000fd5b505050506040513d602081101561440d57600080fd5b810190808051906020019092919050505091506001601461016060405190810160405280856fffffffffffffffffffffffffffffffff19168152602001600161ffff168152602001600063ffffffff1681526020018960ff1681526020018860ff168152602001601354420163ffffffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600061ffff168152509080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060208201518160000160106101000a81548161ffff021916908361ffff16021790555060408201518160000160126101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600001601c6101000a81548161ffff021916908361ffff16021790555060e082015181600001601e6101000a81548161ffff021916908361ffff1602179055506101008201518160010160006101000a81548161ffff021916908361ffff1602179055506101208201518160010160026101000a81548160ff021916908360ff1602179055506101408201518160010160036101000a81548161ffff021916908361ffff160217905550505003905084860260ff166040519080825280601f01601f1916602001820160405280156146c45781602001602082028038833980820191505090505b50600e600083815260200190815260200160002090805190602001906146eb929190614fc7565b506146f68782614e91565b7fae2afd753dcf65cbe021dcbb3791526c72987ff900eb8053e044701df3a12a6d818787604051808481526020018360ff1681526020018260ff168152602001935050505060405180910390a1600193505050509392505050565b6000806147738573ffffffffffffffffffffffffffffffffffffffff16614ee8565b15156147825760019150614936565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614844578082015181840152602081019050614829565b50505050905090810190601f1680156148715780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561489257600080fd5b505af11580156148a6573d6000803e3d6000fd5b505050506040513d60208110156148bc57600080fd5b8101908080519060200190929190505050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b600b60149054906101000a900460ff16158015614a045750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614a03575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515614a0f57600080fd5b601260029054906101000a900460ff1660ff168160010160029054906101000a900460ff1660ff16101515614ab457601260029054906101000a900460ff168160010160028282829054906101000a900460ff160392506101000a81548160ff021916908360ff16021790555080600001601081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff160217905550505b50565b6000600b60149054906101000a900460ff16158015614b7e5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614b7d575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515614b8957600080fd5b600082118015614b9d575060148054905082105b1515614ba857600080fd5b601482815481101515614bb757fe5b9060005260206000209060020201905060135442018160000160186101000a81548163ffffffff021916908363ffffffff1602179055505050565b8173ffffffffffffffffffffffffffffffffffffffff16614c12826125a9565b73ffffffffffffffffffffffffffffffffffffffff16141515614c3457600080fd5b614c876001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614d2090919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000828211151515614d2e57fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515614da657600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614e4a6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614efb90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b614e9b8282614f17565b600880549050600960008381526020019081526020016000208190555060088190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b600080823b905060008111915050919050565b60008183019050828110151515614f0e57fe5b80905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614f5357600080fd5b614f5d8282614083565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061500857805160ff1916838001178555615036565b82800160010185558215615036579182015b8281111561503557825182559160200191906001019061501a565b5b5090506150439190615073565b5090565b81548183558181111561506e5781836000526020600020918201910161506d9190615073565b5b505050565b61509591905b80821115615091576000816000905550600101615079565b5090565b905600a165627a7a7230582074b45d36c59576b5ecf532712581fd01f9cd5e394f062fb5b246808c1d6526c80029
Deployed Bytecode
0x608060405260043610610272576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde0314610277578063081812fc14610307578063095ea7b3146103745780630ae5e739146103c15780631124c05a1461040457806318160ddd146104865780631a3cd59a146104b15780631c4b774b1461058157806323b872dd146105ca5780632671e253146106375780632f745c591461067c57806333771860146106dd578063379c5131146107205780633f4ba83a146107b857806342842e0e146107cf5780634c207ac81461083c5780634e71e0c8146108d55780634f558e79146108ec5780634f6ccce71461093157806350df8f711461097257806353ed5143146109b757806359c21fd814610a235780635c975abb14610a545780636352211e14610a835780636a62784214610af057806370a0823114610b4b578063715018a614610ba257806372b614af14610bb957806375321c4a14610be457806381b890fc14610c665780638456cb5914610cb057806385e6853114610cc757806386481d4014610d0a5780638da5cb5b14610d535780638e00555314610daa5780638f50fb0614610ddb5780639419fd2914610e8157806395d89b4114610ec857806398d5fdca14610f58578063a035b1fe14610f83578063a22cb46514610fb6578063b88d4fde14611005578063c365d4f0146110b8578063c87b56dd146110e9578063c9dfa7311461118f578063ce8775a4146111de578063d2bafbe614611287578063e30c3978146112b4578063e59de2951461130b578063e985e9c51461133c578063f2fde38b146113b7578063f80eba7c146113fa575b600080fd5b34801561028357600080fd5b5061028c61144e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102cc5780820151818401526020810190506102b1565b50505050905090810190601f1680156102f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031357600080fd5b50610332600480360381019080803590602001909291905050506114f0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561038057600080fd5b506103bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061152d565b005b3480156103cd57600080fd5b50610402600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116f3565b005b34801561041057600080fd5b5061042f600480360381019080803590602001909291905050506117aa565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610472578082015181840152602081019050610457565b505050509050019250505060405180910390f35b34801561049257600080fd5b5061049b611838565b6040518082815260200191505060405180910390f35b3480156104bd57600080fd5b506104dc60048036038101908080359060200190929190505050611845565b60405180896fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020018861ffff1661ffff1681526020018763ffffffff1663ffffffff1681526020018660ff1660ff1681526020018560ff1660ff1681526020018461ffff1661ffff1681526020018361ffff1661ffff1681526020018261ffff1661ffff1681526020019850505050505050505060405180910390f35b34801561058d57600080fd5b506105ac60048036038101908080359060200190929190505050611953565b604051808261ffff1661ffff16815260200191505060405180910390f35b3480156105d657600080fd5b50610635600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506119af565b005b34801561064357600080fd5b5061066260048036038101908080359060200190929190505050611ac6565b604051808215151515815260200191505060405180910390f35b34801561068857600080fd5b506106c7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d7b565b6040518082815260200191505060405180910390f35b3480156106e957600080fd5b5061071e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611df2565b005b34801561072c57600080fd5b50610761600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ece565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107a4578082015181840152602081019050610789565b505050509050019250505060405180910390f35b3480156107c457600080fd5b506107cd611f65565b005b3480156107db57600080fd5b5061083a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612025565b005b34801561084857600080fd5b506108bb60048036038101908080359060200190929190803561ffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061205d565b604051808215151515815260200191505060405180910390f35b3480156108e157600080fd5b506108ea61227a565b005b3480156108f857600080fd5b506109176004803603810190808035906020019092919050505061241b565b604051808215151515815260200191505060405180910390f35b34801561093d57600080fd5b5061095c6004803603810190808035906020019092919050505061248c565b6040518082815260200191505060405180910390f35b34801561097e57600080fd5b5061099d600480360381019080803590602001909291905050506124c4565b604051808215151515815260200191505060405180910390f35b3480156109c357600080fd5b506109cc61252b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610a0f5780820151818401526020810190506109f4565b505050509050019250505060405180910390f35b348015610a2f57600080fd5b50610a38612583565b604051808260ff1660ff16815260200191505060405180910390f35b348015610a6057600080fd5b50610a69612596565b604051808215151515815260200191505060405180910390f35b348015610a8f57600080fd5b50610aae600480360381019080803590602001909291905050506125a9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610afc57600080fd5b50610b31600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612626565b604051808215151515815260200191505060405180910390f35b348015610b5757600080fd5b50610b8c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612780565b6040518082815260200191505060405180910390f35b348015610bae57600080fd5b50610bb7612804565b005b348015610bc557600080fd5b50610bce612909565b6040518082815260200191505060405180910390f35b348015610bf057600080fd5b50610c0f6004803603810190808035906020019092919050505061290f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c52578082015181840152602081019050610c37565b505050509050019250505060405180910390f35b348015610c7257600080fd5b50610cae6004803603810190808035906020019092919080356fffffffffffffffffffffffffffffffff19169060200190929190505050612ae6565b005b348015610cbc57600080fd5b50610cc5612b87565b005b348015610cd357600080fd5b50610d08600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c48565b005b348015610d1657600080fd5b50610d3560048036038101908080359060200190929190505050612cff565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610d5f57600080fd5b50610d68612d3c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610db657600080fd5b50610dd9600480360381019080803561ffff169060200190929190505050612d62565b005b348015610de757600080fd5b50610e0660048036038101908080359060200190929190505050612dde565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e46578082015181840152602081019050610e2b565b50505050905090810190601f168015610e735780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e8d57600080fd5b50610eac60048036038101908080359060200190929190505050612f30565b604051808260ff1660ff16815260200191505060405180910390f35b348015610ed457600080fd5b50610edd612f8b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f1d578082015181840152602081019050610f02565b50505050905090810190601f168015610f4a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610f6457600080fd5b50610f6d61302d565b6040518082815260200191505060405180910390f35b348015610f8f57600080fd5b50610f98613049565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610fc257600080fd5b50611003600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061305d565b005b34801561101157600080fd5b506110b6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613199565b005b3480156110c457600080fd5b506110cd6131d8565b604051808260ff1660ff16815260200191505060405180910390f35b3480156110f557600080fd5b50611114600480360381019080803590602001909291905050506131eb565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611154578082015181840152602081019050611139565b50505050905090810190601f1680156111815780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561119b57600080fd5b506111c460048036038101908080359060200190929190803590602001909291905050506132b4565b604051808215151515815260200191505060405180910390f35b3480156111ea57600080fd5b5061126d600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192908035906020019092919050505061351e565b604051808215151515815260200191505060405180910390f35b34801561129357600080fd5b506112b2600480360381019080803590602001909291905050506138cd565b005b3480156112c057600080fd5b506112c9613933565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561131757600080fd5b5061133a600480360381019080803561ffff169060200190929190505050613959565b005b34801561134857600080fd5b5061139d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139c3565b604051808215151515815260200191505060405180910390f35b3480156113c357600080fd5b506113f8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613a57565b005b34801561140657600080fd5b5061143260048036038101908080359060200190929190803560ff169060200190929190505050613af7565b604051808260ff1660ff16815260200191505060405180910390f35b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114e65780601f106114bb576101008083540402835291602001916114e6565b820191906000526020600020905b8154815290600101906020018083116114c957829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000611538826125a9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561157557600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115b557506115b481336139c3565b5b15156115c057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166115e1836114f0565b73ffffffffffffffffffffffffffffffffffffffff161415806116315750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156116ee57826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561174f57600080fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60606000821180156117c0575060148054905082105b15156117cb57600080fd5b600f600083815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561182c57602002820191906000526020600020905b81546000191681526020019060010190808311611814575b50505050509050919050565b6000600880549050905090565b6000806000806000806000806000808a11801561186657506014805490508a105b151561187157600080fd5b60148a81548110151561188057fe5b906000526020600020906002020190508060000160009054906101000a9004700100000000000000000000000000000000028160000160109054906101000a900461ffff168260000160129054906101000a900463ffffffff168360000160169054906101000a900460ff168460000160179054906101000a900460ff1685600001601e9054906101000a900461ffff168660010160009054906101000a900461ffff168760010160039054906101000a900461ffff169850985098509850985098509850985050919395975091939597565b60008060008311801561196a575060148054905083105b151561197557600080fd5b60148381548110151561198457fe5b906000526020600020906002020190508060010160039054906101000a900461ffff16915050919050565b806119ba3382613c6d565b15156119c557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515611a0157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515611a3d57600080fd5b611a478483613d02565b611a518483613e6b565b611a5b8383614083565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000806000600b60149054906101000a900460ff16158015611b905750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b8f575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515611b9b57600080fd5b600084118015611baf575060148054905084105b1515611bba57600080fd5b601484815481101515611bc957fe5b90600052602060002090600202019150600090505b8160000160179054906101000a900460ff168260000160169054906101000a900460ff160260ff16811015611cc65760007f010000000000000000000000000000000000000000000000000000000000000002600e6000868152602001908152602001600020828154600181600116156101000203166002900481101515611c6257fe5b815460011615611c815790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508080600101915050611bde565b60008260010160036101000a81548161ffff021916908361ffff160217905550600f6000858152602001908152602001600020611d0a42600160008060008061415a565b90806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055507fb151dd09a2d98f317bcb24f032fb1c489342f6f906c6b827ba3a72d6cab1401e846040518082815260200191505060405180910390a1600192505050919050565b6000611d8683612780565b82101515611d9357600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611ddf57fe5b9060005260206000200154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e4e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e8a57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611f5957602002820191906000526020600020905b815481526020019060010190808311611f45575b50505050509050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fc157600080fd5b600b60149054906101000a900460ff161515611fdc57600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b806120303382613c6d565b151561203b57600080fd5b6120578484846020604051908101604052806000815250613199565b50505050565b600080600b60149054906101000a900460ff1615151561207c57600080fd5b600b60149054906101000a900460ff161580156121415750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612140575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561214c57600080fd5b600085118015612160575060148054905085105b151561216b57600080fd5b60008461ffff1611151561217e57600080fd5b60148581548110151561218d57fe5b90600052602060002090600202019050838160010160036101000a81548161ffff021916908361ffff16021790555082600e600087815260200190815260200160002090805190602001906121e3929190614fc7565b50600f600086815260200190815260200160002061220842600080600080600061415a565b90806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055507ffaac92082460b3da200bee42b6863b57652aed78ef0a5e8548761e24f9757604856040518082815260200191505060405180910390a160019150509392505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156122d657600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000612496611838565b821015156124a357600080fd5b6008828154811015156124b257fe5b90600052602060002001549050919050565b6000806000831180156124db575060148054905083105b15156124e657600080fd5b6014838154811015156124f557fe5b90600052602060002090600202019050428160000160189054906101000a900463ffffffff1663ffffffff161115915050919050565b6060600880548060200260200160405190810160405280929190818152602001828054801561257957602002820191906000526020600020905b815481526020019060010190808311612565575b5050505050905090565b601060159054906101000a900460ff1681565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561261d57600080fd5b80915050919050565b6000600b60149054906101000a900460ff1615151561264457600080fd5b600b60149054906101000a900460ff161580156127095750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612708575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561271457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561275057600080fd5b61277982601060149054906101000a900460ff16601060159054906101000a900460ff1661420c565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156127bd57600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561286057600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60115481565b60606000806000606060009350600092508592505b6014805490508310156129d35760148381548110151561294057fe5b9060005260206000209060020201915060008260010160039054906101000a900461ffff1661ffff161180156129aa57503373ffffffffffffffffffffffffffffffffffffffff16612991846125a9565b73ffffffffffffffffffffffffffffffffffffffff1614155b156129c657838060010194505085841015156129c5576129d3565b5b8280600101935050612924565b600160115401604051908082528060200260200182016040528015612a075781602001602082028038833980820191505090505b509050600093505b601480549050831015612ada57601483815481101515612a2b57fe5b9060005260206000209060020201915060008260010160039054906101000a900461ffff1661ffff16118015612a9557503373ffffffffffffffffffffffffffffffffffffffff16612a7c846125a9565b73ffffffffffffffffffffffffffffffffffffffff1614155b15612acd57828185806001019650815181101515612aaf57fe5b9060200190602002018181525050601154841115612acc57612ada565b5b8280600101935050612a0f565b80945050505050919050565b813373ffffffffffffffffffffffffffffffffffffffff16612b07826125a9565b73ffffffffffffffffffffffffffffffffffffffff16141515612b2957600080fd5b81601484815481101515612b3957fe5b906000526020600020906002020160000160006101000a8154816fffffffffffffffffffffffffffffffff021916908370010000000000000000000000000000000090040217905550505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612be357600080fd5b600b60149054906101000a900460ff16151515612bff57600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ca457600080fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080601483815481101515612d1157fe5b906000526020600020906002020190508060000160109054906101000a900461ffff16915050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612dbe57600080fd5b80601560006101000a81548161ffff021916908361ffff16021790555050565b60603373ffffffffffffffffffffffffffffffffffffffff16612e00836125a9565b73ffffffffffffffffffffffffffffffffffffffff161480612e72575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b1515612e7d57600080fd5b600e60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612f245780601f10612ef957610100808354040283529160200191612f24565b820191906000526020600020905b815481529060010190602001808311612f0757829003601f168201915b50505050509050919050565b600080600083118015612f47575060148054905083105b1515612f5257600080fd5b601483815481101515612f6157fe5b906000526020600020906002020190508060000160169054906101000a900460ff16915050919050565b606060058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130235780601f10612ff857610100808354040283529160200191613023565b820191906000526020600020905b81548152906001019060200180831161300657829003601f168201915b5050505050905090565b6000601560009054906101000a900461ffff1661ffff16905090565b601560009054906101000a900461ffff1681565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561309857600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b816131a43382613c6d565b15156131af57600080fd5b6131ba8585856119af565b6131c685858585614751565b15156131d157600080fd5b5050505050565b601060149054906101000a900460ff1681565b60606131f68261241b565b151561320157600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156132a85780601f1061327d576101008083540402835291602001916132a8565b820191906000526020600020905b81548152906001019060200180831161328b57829003601f168201915b50505050509050919050565b600080600b60149054906101000a900460ff1615801561337c5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061337b575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561338757600080fd5b60008411801561339b575060148054905084105b15156133a657600080fd5b6014848154811015156133b557fe5b9060005260206000209060020201905060008160010160036101000a81548161ffff021916908361ffff16021790555080600101600081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050601260019054906101000a900460ff1660ff168160000160128282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601260019054906101000a900460ff168160010160028282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506134ad8161493f565b600f60008581526020019081526020016000206134d142600386600080600061415a565b908060018154018082558091505090600182039060005260206000200160009091929091909150906000191690555061350984611ac6565b5061351384614ab7565b600191505092915050565b600080600080600b60149054906101000a900460ff161580156135e95750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806135e8575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156135f457600080fd5b600089118015613608575060148054905089105b151561361357600080fd5b61361c89612f30565b9250600091505b8482101561375f5760007f010000000000000000000000000000000000000000000000000000000000000002600e60008b8152602001908152602001600020878481518110151561367057fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900481546001816001161561010002031660029004811015156136fb57fe5b81546001161561371a5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055508180600101925050613623565b60148981548110151561376e57fe5b9060005260206000209060020201905080600001601e81819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050601260009054906101000a900460ff1660ff168160000160128282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601260009054906101000a900460ff168160010160028282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506138468161493f565b600f60008a81526020019081526020016000206138854260028b8760ff168c81151561386e57fe5b068860ff168d81151561387d57fe5b04600161415a565b90806001815401808255809150509060018203906000526020600020016000909192909190915090600019169055506138bd89614ab7565b6001935050505095945050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561392957600080fd5b8060138190555050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156139b557600080fd5b8061ffff1660118190555050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613ab357600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60149054906101000a900460ff16158015613bbe5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480613bbd575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515613bc957600080fd5b600e60008481526020019081526020016000208260ff168154600181600116156101000203166002900481101515613bfd57fe5b815460011615613c1c5790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004905092915050565b600080613c79836125a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613ce857508373ffffffffffffffffffffffffffffffffffffffff16613cd0846114f0565b73ffffffffffffffffffffffffffffffffffffffff16145b80613cf95750613cf881856139c3565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff16613d22826125a9565b73ffffffffffffffffffffffffffffffffffffffff16141515613d4457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613e675760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000613e7a8585614bf2565b60076000858152602001908152602001600020549250613ee66001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050614d2090919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515613f3457fe5b9060005260206000200154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515613f8e57fe5b90600052602060002001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515613fea57fe5b9060005260206000200181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548091906001900361404a9190615047565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b600061408f8383614d39565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050906001820390600052602060002001600090919290919091505550806007600084815260200190815260200160002081905550505050565b6000680100000000000000008260ff16026c010000000000000000000000008460ff16027001000000000000000000000000000000008660ff1602740100000000000000000000000000000000000000008863ffffffff160278010000000000000000000000000000000000000000000000008a60ff16027c01000000000000000000000000000000000000000000000000000000008c63ffffffff1602171717171760010290509695505050505050565b600080600080600b60149054906101000a900460ff161580156142d75750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806142d6575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156142e257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415151561431e57600080fd5b60008660ff16118015614334575060008560ff16115b151561433f57600080fd5b6014805490509250737a3471c362b1b3274d6b3f254e57185ffe94788a63206b64b46007856040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180807f434153544c4523000000000000000000000000000000000000000000000000008152506020018381526020018281526020019250505060206040518083038186803b1580156143e357600080fd5b505af41580156143f7573d6000803e3d6000fd5b505050506040513d602081101561440d57600080fd5b810190808051906020019092919050505091506001601461016060405190810160405280856fffffffffffffffffffffffffffffffff19168152602001600161ffff168152602001600063ffffffff1681526020018960ff1681526020018860ff168152602001601354420163ffffffff168152602001600061ffff168152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600061ffff168152509080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060208201518160000160106101000a81548161ffff021916908361ffff16021790555060408201518160000160126101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600001601c6101000a81548161ffff021916908361ffff16021790555060e082015181600001601e6101000a81548161ffff021916908361ffff1602179055506101008201518160010160006101000a81548161ffff021916908361ffff1602179055506101208201518160010160026101000a81548160ff021916908360ff1602179055506101408201518160010160036101000a81548161ffff021916908361ffff160217905550505003905084860260ff166040519080825280601f01601f1916602001820160405280156146c45781602001602082028038833980820191505090505b50600e600083815260200190815260200160002090805190602001906146eb929190614fc7565b506146f68782614e91565b7fae2afd753dcf65cbe021dcbb3791526c72987ff900eb8053e044701df3a12a6d818787604051808481526020018360ff1681526020018260ff168152602001935050505060405180910390a1600193505050509392505050565b6000806147738573ffffffffffffffffffffffffffffffffffffffff16614ee8565b15156147825760019150614936565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614844578082015181840152602081019050614829565b50505050905090810190601f1680156148715780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561489257600080fd5b505af11580156148a6573d6000803e3d6000fd5b505050506040513d60208110156148bc57600080fd5b8101908080519060200190929190505050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b600b60149054906101000a900460ff16158015614a045750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614a03575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515614a0f57600080fd5b601260029054906101000a900460ff1660ff168160010160029054906101000a900460ff1660ff16101515614ab457601260029054906101000a900460ff168160010160028282829054906101000a900460ff160392506101000a81548160ff021916908360ff16021790555080600001601081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff160217905550505b50565b6000600b60149054906101000a900460ff16158015614b7e5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614b7d575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515614b8957600080fd5b600082118015614b9d575060148054905082105b1515614ba857600080fd5b601482815481101515614bb757fe5b9060005260206000209060020201905060135442018160000160186101000a81548163ffffffff021916908363ffffffff1602179055505050565b8173ffffffffffffffffffffffffffffffffffffffff16614c12826125a9565b73ffffffffffffffffffffffffffffffffffffffff16141515614c3457600080fd5b614c876001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614d2090919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000828211151515614d2e57fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515614da657600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614e4a6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614efb90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b614e9b8282614f17565b600880549050600960008381526020019081526020016000208190555060088190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b600080823b905060008111915050919050565b60008183019050828110151515614f0e57fe5b80905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614f5357600080fd5b614f5d8282614083565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061500857805160ff1916838001178555615036565b82800160010185558215615036579182015b8281111561503557825182559160200191906001019061501a565b5b5090506150439190615073565b5090565b81548183558181111561506e5781836000526020600020918201910161506d9190615073565b5b505050565b61509591905b80821115615091576000816000905550600101615079565b5090565b905600a165627a7a7230582074b45d36c59576b5ecf532712581fd01f9cd5e394f062fb5b246808c1d6526c80029
Swarm Source
bzzr://74b45d36c59576b5ecf532712581fd01f9cd5e394f062fb5b246808c1d6526c8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.