Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
64 CNN
Holders
31
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 0 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
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:
NinjaToken
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 NinjaToken is ERC721Token, AccessByGame { string public constant NAME = "Crypto Ninja Game Ninja"; string public constant SYMBOL = "CNN"; event NewNinja(uint256 ninjaid, bytes16 name, bytes32 pattern); struct Ninja { bytes32 pattern; bytes16 name; uint16 level; uint32 exp; uint8 dna1; uint8 dna2; uint32 readyTime; uint16 winCount; uint8 levelPoint; uint16 lossCount; uint16 reward; uint256 lastAttackedCastleid; } mapping (uint256 => bytes) private paths; mapping (uint256 => bytes) private steps; EverGold internal goldToken; uint8 internal expOnSuccess = 3; uint8 internal expOnFault = 1; uint8 internal leveupExp = 10; uint256 internal cooldownTime = 5 minutes; uint256 internal maxCoordinate = 12; Ninja[] internal ninjas; uint256 private randNonce = 0; uint8 public kindCount = 2; uint32[] public COLORS = [ 0xD7003A00, 0xF3980000, 0x00552E00, 0x19448E00, 0x543F3200, 0xE7609E00, 0xFFEC4700, 0x68BE8D00, 0x0095D900, 0xE9DFE500, 0xEE836F00, 0xF2F2B000, 0xAACF5300, 0x0A3AF00, 0xF8FBF800, 0xF4B3C200, 0x928C3600, 0xA59ACA00, 0xABCED800, 0x30283300, 0xFDEFF200, 0xDDBB9900, 0x74539900, 0xAA4C8F00 ]; uint256 public price = 1000; /// @dev Constructor constructor() public ERC721Token(NAME, SYMBOL) { ninjas.push(Ninja({ pattern: 0, name: "DUMMY", level: 0, exp: 0, dna1: 0, dna2: 0, readyTime: 0, winCount: 0, lossCount: 0, levelPoint:0, reward: 0, lastAttackedCastleid: 0 })); } function mint(address _beneficiary) public whenNotPaused onlyAccessByGame returns (bool) { require(_beneficiary != address(0)); return _create(_beneficiary, 0, 0); } function burn(uint256 _tokenId) external onlyOwnerOf(_tokenId) { super._burn(msg.sender, _tokenId); } function setPath( uint256 _ninjaid, uint256 _castleid, bytes _path, bytes _steps) public onlyAccessByGame { Ninja storage ninja = ninjas[_ninjaid]; ninja.lastAttackedCastleid = _castleid; paths[_ninjaid] = _path; steps[_ninjaid] = _steps; } function win(uint256 _ninjaid) public onlyAccessByGame returns (bool) { Ninja storage ninja = ninjas[_ninjaid]; ninja.winCount++; ninja.exp += expOnSuccess; ninja.levelPoint += expOnSuccess; _levelUp(ninja); _triggerCooldown(_ninjaid); return true; } function lost(uint256 _ninjaid) public onlyAccessByGame returns (bool) { Ninja storage ninja = ninjas[_ninjaid]; ninja.lossCount++; ninja.exp += expOnFault; ninja.levelPoint += expOnFault; _levelUp(ninja); _triggerCooldown(_ninjaid); return true; } function setName(uint256 _ninjaid, bytes16 _newName) external onlyOwnerOf(_ninjaid) { ninjas[_ninjaid].name = _newName; } function setGoldContract(address _goldTokenAddress) public onlyOwner { require(_goldTokenAddress != address(0)); goldToken = EverGold(_goldTokenAddress); } function setNinjaKindCount(uint8 _kindCount) public onlyOwner { kindCount = _kindCount; } function setPrice(uint16 _price) public onlyOwner { price = _price; } function setMaxCoordinate(uint16 _maxCoordinate) public onlyOwner { maxCoordinate = _maxCoordinate; } function setMaxCoordinate(uint256 _cooldownTime) public onlyOwner { cooldownTime = _cooldownTime; } function _create(address _beneficiary, uint8 _dna1, uint8 _dna2) private returns (bool) { bytes32 pattern = _generateInitialPattern(); uint256 tokenid = ninjas.length; bytes16 name = StringLib.generateName("NINJA#", 6, tokenid); uint256 id = ninjas.push(Ninja({ pattern: pattern, name: name, level: 1, exp: 0, dna1: _dna1, dna2: _dna2, readyTime: uint32(now + cooldownTime), winCount: 0, lossCount: 0, levelPoint:0, reward: 0, lastAttackedCastleid: 0})) - 1; super._mint(_beneficiary, id); emit NewNinja(id, name, pattern); return true; } function _triggerCooldown(uint256 _ninjaid) internal onlyAccessByGame { Ninja storage ninja = ninjas[_ninjaid]; ninja.readyTime = uint32(now + cooldownTime); } function _levelUp(Ninja storage _ninja) internal onlyAccessByGame { if (_ninja.levelPoint >= leveupExp) { _ninja.levelPoint -= leveupExp; _ninja.level++; if (_ninja.level == 2) { _ninja.dna1 = uint8(_getRandom(6)); } else if (_ninja.level == 5) { _ninja.dna2 = uint8(_getRandom(6)); } } } function getByOwner(address _owner) external view returns(uint256[] result) { return ownedTokens[_owner]; } function getInfo(uint256 _ninjaid) external view returns (bytes16, uint32, uint16, uint16, bytes32, uint8, uint8) { Ninja storage ninja = ninjas[_ninjaid]; return (ninja.name, ninja.level, ninja.winCount, ninja.lossCount, ninja.pattern, ninja.dna1, ninja.dna2); } function getHp(uint256 _ninjaid) public view returns (uint32) { Ninja storage ninja = ninjas[_ninjaid]; return uint32(100 + (ninja.level - 1) * 10); } function getDna1(uint256 _ninjaid) public view returns (uint8) { Ninja storage ninja = ninjas[_ninjaid]; return ninja.dna1; } function getDna2(uint256 _ninjaid) public view returns (uint8) { Ninja storage ninja = ninjas[_ninjaid]; return ninja.dna2; } function isReady(uint256 _ninjaid) public view returns (bool) { Ninja storage ninja = ninjas[_ninjaid]; return (ninja.readyTime <= now); } function getReward(uint256 _ninjaid) public view onlyOwnerOf(_ninjaid) returns (uint16) { Ninja storage ninja = ninjas[_ninjaid]; return ninja.reward; } function getPath(uint256 _ninjaid) public view onlyOwnerOf(_ninjaid) returns (bytes path) { return paths[_ninjaid]; } function getLastAttack(uint256 _ninjaid) public view onlyOwnerOf(_ninjaid) returns (uint256 castleid, bytes path) { Ninja storage ninja = ninjas[_ninjaid]; return (ninja.lastAttackedCastleid, paths[_ninjaid]); } function getAttr(bytes32 _pattern, uint256 _n) internal pure returns (bytes4) { require(_n < 8); uint32 mask = 0xffffffff; return bytes4(uint256(_pattern) / (2 ** ((7 - _n) * 8)) & mask); } function _getRandom(uint256 _modulus) internal onlyAccessByGame returns(uint32) { randNonce = randNonce.add(1); return uint32(uint256(keccak256(abi.encodePacked(now, msg.sender, randNonce))) % _modulus); } function _generateInitialPattern() internal onlyAccessByGame returns (bytes32) { uint256 pattern = 0; uint32 color = COLORS[(_getRandom(COLORS.length))]; for (uint256 i = 0; i < 8; i++) { uint32 temp = color; if (i == 1) { temp |= _getRandom(2); } else { temp |= _getRandom(maxCoordinate); } pattern = pattern | (temp * 2 ** (8 * 4 * (7 - i))); } return bytes32(pattern); } function getPrice() public view returns (uint256) { return price; } }
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":"kindCount","outputs":[{"name":"","type":"uint8"}],"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":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_ninjaid","type":"uint256"}],"name":"getInfo","outputs":[{"name":"","type":"bytes16"},{"name":"","type":"uint32"},{"name":"","type":"uint16"},{"name":"","type":"uint16"},{"name":"","type":"bytes32"},{"name":"","type":"uint8"},{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_ninjaid","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":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":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"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":"_ninjaid","type":"uint256"}],"name":"isReady","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_ninjaid","type":"uint256"}],"name":"win","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":false,"inputs":[{"name":"_ninjaid","type":"uint256"}],"name":"lost","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_ninjaid","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":true,"inputs":[{"name":"_ninjaid","type":"uint256"}],"name":"getHp","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"COLORS","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"revokeAccess","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_ninjaid","type":"uint256"},{"name":"_castleid","type":"uint256"},{"name":"_path","type":"bytes"},{"name":"_steps","type":"bytes"}],"name":"setPath","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"setPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_ninjaid","type":"uint256"}],"name":"getLastAttack","outputs":[{"name":"castleid","type":"uint256"},{"name":"path","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maxCoordinate","type":"uint16"}],"name":"setMaxCoordinate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"NAME","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_ninjaid","type":"uint256"}],"name":"getDna1","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_ninjaid","type":"uint256"}],"name":"getDna2","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cooldownTime","type":"uint256"}],"name":"setMaxCoordinate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_ninjaid","type":"uint256"}],"name":"getPath","outputs":[{"name":"path","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_kindCount","type":"uint8"}],"name":"setNinjaKindCount","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":"SYMBOL","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"ninjaid","type":"uint256"},{"indexed":false,"name":"name","type":"bytes16"},{"indexed":false,"name":"pattern","type":"bytes32"}],"name":"NewNinja","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
60806040526000600b60146101000a81548160ff0219169083151502179055506003601060146101000a81548160ff021916908360ff1602179055506001601060156101000a81548160ff021916908360ff160217905550600a601060166101000a81548160ff021916908360ff16021790555061012c601155600c60125560006014556002601560006101000a81548160ff021916908360ff1602179055506103006040519081016040528063d7003a0063ffffffff16815260200163f398000063ffffffff16815260200162552e0063ffffffff1681526020016319448e0063ffffffff16815260200163543f320063ffffffff16815260200163e7609e0063ffffffff16815260200163ffec470063ffffffff1681526020016368be8d0063ffffffff1681526020016295d90063ffffffff16815260200163e9dfe50063ffffffff16815260200163ee836f0063ffffffff16815260200163f2f2b00063ffffffff16815260200163aacf530063ffffffff16815260200162a3af0063ffffffff16815260200163f8fbf80063ffffffff16815260200163f4b3c20063ffffffff16815260200163928c360063ffffffff16815260200163a59aca0063ffffffff16815260200163abced80063ffffffff168152602001633028330063ffffffff16815260200163fdeff20063ffffffff16815260200163ddbb990063ffffffff168152602001637453990063ffffffff16815260200163aa4c8f0063ffffffff16815250601690601862000239929190620005be565b506103e86017553480156200024d57600080fd5b506040805190810160405280601781526020017f43727970746f204e696e6a612047616d65204e696e6a610000000000000000008152506040805190810160405280600381526020017f434e4e00000000000000000000000000000000000000000000000000000000008152508160049080519060200190620002d292919062000675565b508060059080519060200190620002eb92919062000675565b50505033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060136101806040519081016040528060006001026000191681526020017f44554d4d590000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff19168152602001600061ffff168152602001600063ffffffff168152602001600060ff168152602001600060ff168152602001600063ffffffff168152602001600061ffff168152602001600060ff168152602001600061ffff168152602001600061ffff1681526020016000815250908060018154018082558091505090600182039060005260206000209060040201600090919290919091506000820151816000019060001916905560208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060408201518160010160106101000a81548161ffff021916908361ffff16021790555060608201518160010160126101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160166101000a81548160ff021916908360ff16021790555060a08201518160010160176101000a81548160ff021916908360ff16021790555060c08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600101601c6101000a81548161ffff021916908361ffff16021790555061010082015181600101601e6101000a81548160ff021916908360ff1602179055506101208201518160020160006101000a81548161ffff021916908361ffff1602179055506101408201518160020160026101000a81548161ffff021916908361ffff16021790555061016082015181600301555050506200075a565b82805482825590600052602060002090600701600890048101928215620006625791602002820160005b838211156200062e57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302620005e8565b8015620006605782816101000a81549063ffffffff02191690556004016020816003010492830192600103026200062e565b505b509050620006719190620006fc565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620006b857805160ff1916838001178555620006e9565b82800160010185558215620006e9579182015b82811115620006e8578251825591602001919060010190620006cb565b5b509050620006f8919062000732565b5090565b6200072f91905b808211156200072b57600081816101000a81549063ffffffff02191690555060010162000703565b5090565b90565b6200075791905b808211156200075357600081600090555060010162000739565b5090565b90565b614c2b806200076a6000396000f300608060405260043610610272576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde0314610277578063080bfdeb14610307578063081812fc14610338578063095ea7b3146103a55780630ae5e739146103f257806318160ddd146104355780631a3cd59a146104605780631c4b774b1461052157806323b872dd1461056a5780632f745c59146105d75780633377186014610638578063379c51311461067b5780633f4ba83a1461071357806342842e0e1461072a57806342966c68146107975780634e71e0c8146107c45780634f558e79146107db5780634f6ccce71461082057806350df8f71146108615780635bc60cfc146108a65780635c975abb146108eb5780636352211e1461091a5780636a6278421461098757806370a08231146109e2578063715018a614610a395780637cbc4eb614610a5057806381b890fc14610a955780638456cb5914610adf5780638458bd7014610af6578063857a6f5b14610b4357806385e6853114610b905780638965816314610bd35780638da5cb5b14610c965780638ed67a4414610ced57806395d89b4114610d1e57806398d5fdca14610dae578063a035b1fe14610dd9578063a12433fa14610e04578063a174481214610eb1578063a22cb46514610ee2578063a3f4df7e14610f31578063a9b542bd14610fc1578063b11b40a114611008578063b88d4fde1461104f578063c87b56dd14611102578063d2bafbe6146111a8578063e1765073146111d5578063e30c39781461127b578063e7e31d52146112d2578063e985e9c514611302578063f2fde38b1461137d578063f76f8d78146113c0575b600080fd5b34801561028357600080fd5b5061028c611450565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102cc5780820151818401526020810190506102b1565b50505050905090810190601f1680156102f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031357600080fd5b5061031c6114f2565b604051808260ff1660ff16815260200191505060405180910390f35b34801561034457600080fd5b5061036360048036038101908080359060200190929190505050611505565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103b157600080fd5b506103f0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611542565b005b3480156103fe57600080fd5b50610433600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611708565b005b34801561044157600080fd5b5061044a6117bf565b6040518082815260200191505060405180910390f35b34801561046c57600080fd5b5061048b600480360381019080803590602001909291905050506117cc565b60405180886fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020018763ffffffff1663ffffffff1681526020018661ffff1661ffff1681526020018561ffff1661ffff16815260200184600019166000191681526020018360ff1660ff1681526020018260ff1660ff16815260200197505050505050505060405180910390f35b34801561052d57600080fd5b5061054c6004803603810190808035906020019092919050505061189c565b604051808261ffff1661ffff16815260200191505060405180910390f35b34801561057657600080fd5b506105d5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061191d565b005b3480156105e357600080fd5b50610622600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a34565b6040518082815260200191505060405180910390f35b34801561064457600080fd5b50610679600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aab565b005b34801561068757600080fd5b506106bc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b87565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156106ff5780820151818401526020810190506106e4565b505050509050019250505060405180910390f35b34801561071f57600080fd5b50610728611c1e565b005b34801561073657600080fd5b50610795600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cde565b005b3480156107a357600080fd5b506107c260048036038101908080359060200190929190505050611d16565b005b3480156107d057600080fd5b506107d9611d67565b005b3480156107e757600080fd5b5061080660048036038101908080359060200190929190505050611f08565b604051808215151515815260200191505060405180910390f35b34801561082c57600080fd5b5061084b60048036038101908080359060200190929190505050611f79565b6040518082815260200191505060405180910390f35b34801561086d57600080fd5b5061088c60048036038101908080359060200190929190505050611fb1565b604051808215151515815260200191505060405180910390f35b3480156108b257600080fd5b506108d160048036038101908080359060200190929190505050611ff9565b604051808215151515815260200191505060405180910390f35b3480156108f757600080fd5b506109006121c6565b604051808215151515815260200191505060405180910390f35b34801561092657600080fd5b50610945600480360381019080803590602001909291905050506121d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561099357600080fd5b506109c8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612256565b604051808215151515815260200191505060405180910390f35b3480156109ee57600080fd5b50610a23600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612393565b6040518082815260200191505060405180910390f35b348015610a4557600080fd5b50610a4e612417565b005b348015610a5c57600080fd5b50610a7b6004803603810190808035906020019092919050505061251c565b604051808215151515815260200191505060405180910390f35b348015610aa157600080fd5b50610add6004803603810190808035906020019092919080356fffffffffffffffffffffffffffffffff191690602001909291905050506126e9565b005b348015610aeb57600080fd5b50610af461278a565b005b348015610b0257600080fd5b50610b216004803603810190808035906020019092919050505061284b565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b348015610b4f57600080fd5b50610b6e60048036038101908080359060200190929190505050612895565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b348015610b9c57600080fd5b50610bd1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ce565b005b348015610bdf57600080fd5b50610c946004803603810190808035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612985565b005b348015610ca257600080fd5b50610cab612ad6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cf957600080fd5b50610d1c600480360381019080803561ffff169060200190929190505050612afc565b005b348015610d2a57600080fd5b50610d33612b66565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d73578082015181840152602081019050610d58565b50505050905090810190601f168015610da05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dba57600080fd5b50610dc3612c08565b6040518082815260200191505060405180910390f35b348015610de557600080fd5b50610dee612c12565b6040518082815260200191505060405180910390f35b348015610e1057600080fd5b50610e2f60048036038101908080359060200190929190505050612c18565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e75578082015181840152602081019050610e5a565b50505050905090810190601f168015610ea25780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b348015610ebd57600080fd5b50610ee0600480360381019080803561ffff169060200190929190505050612d3f565b005b348015610eee57600080fd5b50610f2f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612da9565b005b348015610f3d57600080fd5b50610f46612ee5565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f86578082015181840152602081019050610f6b565b50505050905090810190601f168015610fb35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610fcd57600080fd5b50610fec60048036038101908080359060200190929190505050612f1e565b604051808260ff1660ff16815260200191505060405180910390f35b34801561101457600080fd5b5061103360048036038101908080359060200190929190505050612f5a565b604051808260ff1660ff16815260200191505060405180910390f35b34801561105b57600080fd5b50611100600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612f96565b005b34801561110e57600080fd5b5061112d60048036038101908080359060200190929190505050612fd5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561116d578082015181840152602081019050611152565b50505050905090810190601f16801561119a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156111b457600080fd5b506111d36004803603810190808035906020019092919050505061309e565b005b3480156111e157600080fd5b5061120060048036038101908080359060200190929190505050613104565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611240578082015181840152602081019050611225565b50505050905090810190601f16801561126d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561128757600080fd5b506112906131fd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156112de57600080fd5b50611300600480360381019080803560ff169060200190929190505050613223565b005b34801561130e57600080fd5b50611363600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061329d565b604051808215151515815260200191505060405180910390f35b34801561138957600080fd5b506113be600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613331565b005b3480156113cc57600080fd5b506113d56133d1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156114155780820151818401526020810190506113fa565b50505050905090810190601f1680156114425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114e85780601f106114bd576101008083540402835291602001916114e8565b820191906000526020600020905b8154815290600101906020018083116114cb57829003601f168201915b5050505050905090565b601560009054906101000a900460ff1681565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061154d826121d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561158a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115ca57506115c9813361329d565b5b15156115d557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166115f683611505565b73ffffffffffffffffffffffffffffffffffffffff161415806116465750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561170357826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561176457600080fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b6000806000806000806000806013898154811015156117e757fe5b906000526020600020906004020190508060010160009054906101000a9004700100000000000000000000000000000000028160010160109054906101000a900461ffff1682600101601c9054906101000a900461ffff168360020160009054906101000a900461ffff1684600001548560010160169054906101000a900460ff168660010160179054906101000a900460ff168561ffff169550975097509750975097509750975050919395979092949650565b600080823373ffffffffffffffffffffffffffffffffffffffff166118c0826121d9565b73ffffffffffffffffffffffffffffffffffffffff161415156118e257600080fd5b6013848154811015156118f157fe5b906000526020600020906004020191508160020160029054906101000a900461ffff1692505050919050565b80611928338261340a565b151561193357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561196f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156119ab57600080fd5b6119b5848361349f565b6119bf8483613608565b6119c98383613820565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000611a3f83612393565b82101515611a4c57600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611a9857fe5b9060005260206000200154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b0757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b4357600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611c1257602002820191906000526020600020905b815481526020019060010190808311611bfe575b50505050509050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c7a57600080fd5b600b60149054906101000a900460ff161515611c9557600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b80611ce9338261340a565b1515611cf457600080fd5b611d108484846020604051908101604052806000815250612f96565b50505050565b803373ffffffffffffffffffffffffffffffffffffffff16611d37826121d9565b73ffffffffffffffffffffffffffffffffffffffff16141515611d5957600080fd5b611d6333836138f7565b5050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dc357600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000611f836117bf565b82101515611f9057600080fd5b600882815481101515611f9f57fe5b90600052602060002001549050919050565b600080601383815481101515611fc357fe5b90600052602060002090600402019050428160010160189054906101000a900463ffffffff1663ffffffff161115915050919050565b600080600b60149054906101000a900460ff161580156120c15750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806120c0575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156120cc57600080fd5b6013838154811015156120db57fe5b9060005260206000209060040201905080600101601c81819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050601060149054906101000a900460ff1660ff168160010160128282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601060149054906101000a900460ff1681600101601e8282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506121b381613a2f565b6121bc83613c38565b6001915050919050565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561224d57600080fd5b80915050919050565b6000600b60149054906101000a900460ff1615151561227457600080fd5b600b60149054906101000a900460ff161580156123395750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612338575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561234457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561238057600080fd5b61238c82600080613d54565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156123d057600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561247357600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600b60149054906101000a900460ff161580156125e45750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806125e3575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156125ef57600080fd5b6013838154811015156125fe57fe5b9060005260206000209060040201905080600201600081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050601060159054906101000a900460ff1660ff168160010160128282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601060159054906101000a900460ff1681600101601e8282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506126d681613a2f565b6126df83613c38565b6001915050919050565b813373ffffffffffffffffffffffffffffffffffffffff1661270a826121d9565b73ffffffffffffffffffffffffffffffffffffffff1614151561272c57600080fd5b8160138481548110151561273c57fe5b906000526020600020906004020160010160006101000a8154816fffffffffffffffffffffffffffffffff021916908370010000000000000000000000000000000090040217905550505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127e657600080fd5b600b60149054906101000a900460ff1615151561280257600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60008060138381548110151561285d57fe5b90600052602060002090600402019050600a60018260010160109054906101000a900461ffff16030260640161ffff16915050919050565b6016818154811015156128a457fe5b9060005260206000209060089182820401919006600402915054906101000a900463ffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561292a57600080fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600b60149054906101000a900460ff16158015612a4c5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612a4b575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515612a5757600080fd5b601385815481101515612a6657fe5b9060005260206000209060040201905083816003018190555082600e60008781526020019081526020016000209080519060200190612aa6929190614ae6565b5081600f60008781526020019081526020016000209080519060200190612ace929190614ae6565b505050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b5857600080fd5b8061ffff1660178190555050565b606060058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612bfe5780601f10612bd357610100808354040283529160200191612bfe565b820191906000526020600020905b815481529060010190602001808311612be157829003601f168201915b5050505050905090565b6000601754905090565b60175481565b600060606000833373ffffffffffffffffffffffffffffffffffffffff16612c3f826121d9565b73ffffffffffffffffffffffffffffffffffffffff16141515612c6157600080fd5b601385815481101515612c7057fe5b906000526020600020906004020191508160030154600e6000878152602001908152602001600020808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612d2d5780601f10612d0257610100808354040283529160200191612d2d565b820191906000526020600020905b815481529060010190602001808311612d1057829003601f168201915b50505050509050935093505050915091565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d9b57600080fd5b8061ffff1660128190555050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612de457600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6040805190810160405280601781526020017f43727970746f204e696e6a612047616d65204e696e6a6100000000000000000081525081565b600080601383815481101515612f3057fe5b906000526020600020906004020190508060010160169054906101000a900460ff16915050919050565b600080601383815481101515612f6c57fe5b906000526020600020906004020190508060010160179054906101000a900460ff16915050919050565b81612fa1338261340a565b1515612fac57600080fd5b612fb785858561191d565b612fc38585858561413f565b1515612fce57600080fd5b5050505050565b6060612fe082611f08565b1515612feb57600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130925780601f1061306757610100808354040283529160200191613092565b820191906000526020600020905b81548152906001019060200180831161307557829003601f168201915b50505050509050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130fa57600080fd5b8060118190555050565b6060813373ffffffffffffffffffffffffffffffffffffffff16613127826121d9565b73ffffffffffffffffffffffffffffffffffffffff1614151561314957600080fd5b600e60008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131f05780601f106131c5576101008083540402835291602001916131f0565b820191906000526020600020905b8154815290600101906020018083116131d357829003601f168201915b5050505050915050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561327f57600080fd5b80601560006101000a81548160ff021916908360ff16021790555050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561338d57600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040805190810160405280600381526020017f434e4e000000000000000000000000000000000000000000000000000000000081525081565b600080613416836121d9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061348557508373ffffffffffffffffffffffffffffffffffffffff1661346d84611505565b73ffffffffffffffffffffffffffffffffffffffff16145b806134965750613495818561329d565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166134bf826121d9565b73ffffffffffffffffffffffffffffffffffffffff161415156134e157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156136045760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000613617858561432d565b600760008581526020019081526020016000205492506136836001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061445b90919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156136d157fe5b9060005260206000200154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110151561372b57fe5b90600052602060002001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561378757fe5b9060005260206000200181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036137e79190614b66565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b600061382c8383614474565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050906001820390600052602060002001600090919290919091505550806007600084815260200190815260200160002081905550505050565b600080600061390685856145cc565b6000600a600086815260200190815260200160002080546001816001161561010002031660029004905014151561395757600a600085815260200190815260200160002060006139569190614b92565b5b60096000858152602001908152602001600020549250613986600160088054905061445b90919063ffffffff16565b915060088281548110151561399757fe5b90600052602060002001549050806008848154811015156139b457fe5b906000526020600020018190555060006008838154811015156139d357fe5b906000526020600020018190555060088054809190600190036139f69190614b66565b50600060096000868152602001908152602001600020819055508260096000838152602001908152602001600020819055505050505050565b600b60149054906101000a900460ff16158015613af45750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480613af3575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515613aff57600080fd5b601060169054906101000a900460ff1660ff1681600101601e9054906101000a900460ff1660ff16101515613c3557601060169054906101000a900460ff1681600101601e8282829054906101000a900460ff160392506101000a81548160ff021916908360ff16021790555080600101601081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff1602179055505060028160010160109054906101000a900461ffff1661ffff161415613bed57613bcc600661464a565b8160010160166101000a81548160ff021916908360ff160217905550613c34565b60058160010160109054906101000a900461ffff1661ffff161415613c3357613c16600661464a565b8160010160176101000a81548160ff021916908360ff1602179055505b5b5b50565b6000600b60149054906101000a900460ff16158015613cff5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480613cfe575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515613d0a57600080fd5b601382815481101515613d1957fe5b9060005260206000209060040201905060115442018160010160186101000a81548163ffffffff021916908363ffffffff1602179055505050565b6000806000806000613d6461481d565b93506013805490509250737a3471c362b1b3274d6b3f254e57185ffe94788a63206b64b46006856040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180807f4e494e4a412300000000000000000000000000000000000000000000000000008152506020018381526020018281526020019250505060206040518083038186803b158015613e0a57600080fd5b505af4158015613e1e573d6000803e3d6000fd5b505050506040513d6020811015613e3457600080fd5b81019080805190602001909291905050509150600160136101806040519081016040528087600019168152602001856fffffffffffffffffffffffffffffffff19168152602001600161ffff168152602001600063ffffffff1681526020018a60ff1681526020018960ff168152602001601154420163ffffffff168152602001600061ffff168152602001600060ff168152602001600061ffff168152602001600061ffff1681526020016000815250908060018154018082558091505090600182039060005260206000209060040201600090919290919091506000820151816000019060001916905560208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060408201518160010160106101000a81548161ffff021916908361ffff16021790555060608201518160010160126101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160166101000a81548160ff021916908360ff16021790555060a08201518160010160176101000a81548160ff021916908360ff16021790555060c08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600101601c6101000a81548161ffff021916908361ffff16021790555061010082015181600101601e6101000a81548160ff021916908360ff1602179055506101208201518160020160006101000a81548161ffff021916908361ffff1602179055506101408201518160020160026101000a81548161ffff021916908361ffff160217905550610160820151816003015550500390506140bb88826149b0565b7f2ad00a0a154523e942fe463c22cdbcc277a42edc4a3dd45a942296ee21ff6d0781838660405180848152602001836fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020018260001916600019168152602001935050505060405180910390a160019450505050509392505050565b6000806141618573ffffffffffffffffffffffffffffffffffffffff16614a07565b15156141705760019150614324565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614232578082015181840152602081019050614217565b50505050905090810190601f16801561425f5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561428057600080fd5b505af1158015614294573d6000803e3d6000fd5b505050506040513d60208110156142aa57600080fd5b8101908080519060200190929190505050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661434d826121d9565b73ffffffffffffffffffffffffffffffffffffffff1614151561436f57600080fd5b6143c26001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461445b90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600082821115151561446957fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156144e157600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506145856001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a1a90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6145d6828261349f565b6145e08282613608565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000600b60149054906101000a900460ff161580156147115750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614710575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561471c57600080fd5b6147326001601454614a1a90919063ffffffff16565b601481905550814233601454604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182815260200193505050506040516020818303038152906040526040518082805190602001908083835b6020831015156147db57805182526020820191506020810190506020830392506147b6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206001900481151561481557fe5b069050919050565b6000806000806000600b60149054906101000a900460ff161580156148ea5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806148e9575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156148f557600080fd5b60009350601661490960168054905061464a565b63ffffffff1681548110151561491b57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff169250600091505b60088210156149a357829050600182141561497057614967600261464a565b81179050614980565b61497b60125461464a565b811790505b8160070360200260020a8163ffffffff1602841793508180600101925050614948565b8360010294505050505090565b6149ba8282614a36565b600880549050600960008381526020019081526020016000208190555060088190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b600080823b905060008111915050919050565b60008183019050828110151515614a2d57fe5b80905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614a7257600080fd5b614a7c8282613820565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614b2757805160ff1916838001178555614b55565b82800160010185558215614b55579182015b82811115614b54578251825591602001919060010190614b39565b5b509050614b629190614bda565b5090565b815481835581811115614b8d57818360005260206000209182019101614b8c9190614bda565b5b505050565b50805460018160011615610100020316600290046000825580601f10614bb85750614bd7565b601f016020900490600052602060002090810190614bd69190614bda565b5b50565b614bfc91905b80821115614bf8576000816000905550600101614be0565b5090565b905600a165627a7a72305820f3ee078895e7d71372691203b5ca8145bc0bd02a9d54e009c6af268505e3e0340029
Deployed Bytecode
0x608060405260043610610272576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde0314610277578063080bfdeb14610307578063081812fc14610338578063095ea7b3146103a55780630ae5e739146103f257806318160ddd146104355780631a3cd59a146104605780631c4b774b1461052157806323b872dd1461056a5780632f745c59146105d75780633377186014610638578063379c51311461067b5780633f4ba83a1461071357806342842e0e1461072a57806342966c68146107975780634e71e0c8146107c45780634f558e79146107db5780634f6ccce71461082057806350df8f71146108615780635bc60cfc146108a65780635c975abb146108eb5780636352211e1461091a5780636a6278421461098757806370a08231146109e2578063715018a614610a395780637cbc4eb614610a5057806381b890fc14610a955780638456cb5914610adf5780638458bd7014610af6578063857a6f5b14610b4357806385e6853114610b905780638965816314610bd35780638da5cb5b14610c965780638ed67a4414610ced57806395d89b4114610d1e57806398d5fdca14610dae578063a035b1fe14610dd9578063a12433fa14610e04578063a174481214610eb1578063a22cb46514610ee2578063a3f4df7e14610f31578063a9b542bd14610fc1578063b11b40a114611008578063b88d4fde1461104f578063c87b56dd14611102578063d2bafbe6146111a8578063e1765073146111d5578063e30c39781461127b578063e7e31d52146112d2578063e985e9c514611302578063f2fde38b1461137d578063f76f8d78146113c0575b600080fd5b34801561028357600080fd5b5061028c611450565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102cc5780820151818401526020810190506102b1565b50505050905090810190601f1680156102f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031357600080fd5b5061031c6114f2565b604051808260ff1660ff16815260200191505060405180910390f35b34801561034457600080fd5b5061036360048036038101908080359060200190929190505050611505565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103b157600080fd5b506103f0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611542565b005b3480156103fe57600080fd5b50610433600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611708565b005b34801561044157600080fd5b5061044a6117bf565b6040518082815260200191505060405180910390f35b34801561046c57600080fd5b5061048b600480360381019080803590602001909291905050506117cc565b60405180886fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020018763ffffffff1663ffffffff1681526020018661ffff1661ffff1681526020018561ffff1661ffff16815260200184600019166000191681526020018360ff1660ff1681526020018260ff1660ff16815260200197505050505050505060405180910390f35b34801561052d57600080fd5b5061054c6004803603810190808035906020019092919050505061189c565b604051808261ffff1661ffff16815260200191505060405180910390f35b34801561057657600080fd5b506105d5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061191d565b005b3480156105e357600080fd5b50610622600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a34565b6040518082815260200191505060405180910390f35b34801561064457600080fd5b50610679600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611aab565b005b34801561068757600080fd5b506106bc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b87565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156106ff5780820151818401526020810190506106e4565b505050509050019250505060405180910390f35b34801561071f57600080fd5b50610728611c1e565b005b34801561073657600080fd5b50610795600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cde565b005b3480156107a357600080fd5b506107c260048036038101908080359060200190929190505050611d16565b005b3480156107d057600080fd5b506107d9611d67565b005b3480156107e757600080fd5b5061080660048036038101908080359060200190929190505050611f08565b604051808215151515815260200191505060405180910390f35b34801561082c57600080fd5b5061084b60048036038101908080359060200190929190505050611f79565b6040518082815260200191505060405180910390f35b34801561086d57600080fd5b5061088c60048036038101908080359060200190929190505050611fb1565b604051808215151515815260200191505060405180910390f35b3480156108b257600080fd5b506108d160048036038101908080359060200190929190505050611ff9565b604051808215151515815260200191505060405180910390f35b3480156108f757600080fd5b506109006121c6565b604051808215151515815260200191505060405180910390f35b34801561092657600080fd5b50610945600480360381019080803590602001909291905050506121d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561099357600080fd5b506109c8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612256565b604051808215151515815260200191505060405180910390f35b3480156109ee57600080fd5b50610a23600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612393565b6040518082815260200191505060405180910390f35b348015610a4557600080fd5b50610a4e612417565b005b348015610a5c57600080fd5b50610a7b6004803603810190808035906020019092919050505061251c565b604051808215151515815260200191505060405180910390f35b348015610aa157600080fd5b50610add6004803603810190808035906020019092919080356fffffffffffffffffffffffffffffffff191690602001909291905050506126e9565b005b348015610aeb57600080fd5b50610af461278a565b005b348015610b0257600080fd5b50610b216004803603810190808035906020019092919050505061284b565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b348015610b4f57600080fd5b50610b6e60048036038101908080359060200190929190505050612895565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b348015610b9c57600080fd5b50610bd1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128ce565b005b348015610bdf57600080fd5b50610c946004803603810190808035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612985565b005b348015610ca257600080fd5b50610cab612ad6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cf957600080fd5b50610d1c600480360381019080803561ffff169060200190929190505050612afc565b005b348015610d2a57600080fd5b50610d33612b66565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d73578082015181840152602081019050610d58565b50505050905090810190601f168015610da05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dba57600080fd5b50610dc3612c08565b6040518082815260200191505060405180910390f35b348015610de557600080fd5b50610dee612c12565b6040518082815260200191505060405180910390f35b348015610e1057600080fd5b50610e2f60048036038101908080359060200190929190505050612c18565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e75578082015181840152602081019050610e5a565b50505050905090810190601f168015610ea25780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b348015610ebd57600080fd5b50610ee0600480360381019080803561ffff169060200190929190505050612d3f565b005b348015610eee57600080fd5b50610f2f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612da9565b005b348015610f3d57600080fd5b50610f46612ee5565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610f86578082015181840152602081019050610f6b565b50505050905090810190601f168015610fb35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610fcd57600080fd5b50610fec60048036038101908080359060200190929190505050612f1e565b604051808260ff1660ff16815260200191505060405180910390f35b34801561101457600080fd5b5061103360048036038101908080359060200190929190505050612f5a565b604051808260ff1660ff16815260200191505060405180910390f35b34801561105b57600080fd5b50611100600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612f96565b005b34801561110e57600080fd5b5061112d60048036038101908080359060200190929190505050612fd5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561116d578082015181840152602081019050611152565b50505050905090810190601f16801561119a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156111b457600080fd5b506111d36004803603810190808035906020019092919050505061309e565b005b3480156111e157600080fd5b5061120060048036038101908080359060200190929190505050613104565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611240578082015181840152602081019050611225565b50505050905090810190601f16801561126d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561128757600080fd5b506112906131fd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156112de57600080fd5b50611300600480360381019080803560ff169060200190929190505050613223565b005b34801561130e57600080fd5b50611363600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061329d565b604051808215151515815260200191505060405180910390f35b34801561138957600080fd5b506113be600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613331565b005b3480156113cc57600080fd5b506113d56133d1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156114155780820151818401526020810190506113fa565b50505050905090810190601f1680156114425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114e85780601f106114bd576101008083540402835291602001916114e8565b820191906000526020600020905b8154815290600101906020018083116114cb57829003601f168201915b5050505050905090565b601560009054906101000a900460ff1681565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061154d826121d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561158a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115ca57506115c9813361329d565b5b15156115d557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166115f683611505565b73ffffffffffffffffffffffffffffffffffffffff161415806116465750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561170357826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561176457600080fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600880549050905090565b6000806000806000806000806013898154811015156117e757fe5b906000526020600020906004020190508060010160009054906101000a9004700100000000000000000000000000000000028160010160109054906101000a900461ffff1682600101601c9054906101000a900461ffff168360020160009054906101000a900461ffff1684600001548560010160169054906101000a900460ff168660010160179054906101000a900460ff168561ffff169550975097509750975097509750975050919395979092949650565b600080823373ffffffffffffffffffffffffffffffffffffffff166118c0826121d9565b73ffffffffffffffffffffffffffffffffffffffff161415156118e257600080fd5b6013848154811015156118f157fe5b906000526020600020906004020191508160020160029054906101000a900461ffff1692505050919050565b80611928338261340a565b151561193357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561196f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156119ab57600080fd5b6119b5848361349f565b6119bf8483613608565b6119c98383613820565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000611a3f83612393565b82101515611a4c57600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515611a9857fe5b9060005260206000200154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b0757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611b4357600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611c1257602002820191906000526020600020905b815481526020019060010190808311611bfe575b50505050509050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c7a57600080fd5b600b60149054906101000a900460ff161515611c9557600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b80611ce9338261340a565b1515611cf457600080fd5b611d108484846020604051908101604052806000815250612f96565b50505050565b803373ffffffffffffffffffffffffffffffffffffffff16611d37826121d9565b73ffffffffffffffffffffffffffffffffffffffff16141515611d5957600080fd5b611d6333836138f7565b5050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dc357600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000611f836117bf565b82101515611f9057600080fd5b600882815481101515611f9f57fe5b90600052602060002001549050919050565b600080601383815481101515611fc357fe5b90600052602060002090600402019050428160010160189054906101000a900463ffffffff1663ffffffff161115915050919050565b600080600b60149054906101000a900460ff161580156120c15750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806120c0575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156120cc57600080fd5b6013838154811015156120db57fe5b9060005260206000209060040201905080600101601c81819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050601060149054906101000a900460ff1660ff168160010160128282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601060149054906101000a900460ff1681600101601e8282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506121b381613a2f565b6121bc83613c38565b6001915050919050565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561224d57600080fd5b80915050919050565b6000600b60149054906101000a900460ff1615151561227457600080fd5b600b60149054906101000a900460ff161580156123395750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612338575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561234457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561238057600080fd5b61238c82600080613d54565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156123d057600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561247357600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600b60149054906101000a900460ff161580156125e45750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806125e3575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156125ef57600080fd5b6013838154811015156125fe57fe5b9060005260206000209060040201905080600201600081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff16021790555050601060159054906101000a900460ff1660ff168160010160128282829054906101000a900463ffffffff160192506101000a81548163ffffffff021916908363ffffffff160217905550601060159054906101000a900460ff1681600101601e8282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506126d681613a2f565b6126df83613c38565b6001915050919050565b813373ffffffffffffffffffffffffffffffffffffffff1661270a826121d9565b73ffffffffffffffffffffffffffffffffffffffff1614151561272c57600080fd5b8160138481548110151561273c57fe5b906000526020600020906004020160010160006101000a8154816fffffffffffffffffffffffffffffffff021916908370010000000000000000000000000000000090040217905550505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127e657600080fd5b600b60149054906101000a900460ff1615151561280257600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60008060138381548110151561285d57fe5b90600052602060002090600402019050600a60018260010160109054906101000a900461ffff16030260640161ffff16915050919050565b6016818154811015156128a457fe5b9060005260206000209060089182820401919006600402915054906101000a900463ffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561292a57600080fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600b60149054906101000a900460ff16158015612a4c5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612a4b575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515612a5757600080fd5b601385815481101515612a6657fe5b9060005260206000209060040201905083816003018190555082600e60008781526020019081526020016000209080519060200190612aa6929190614ae6565b5081600f60008781526020019081526020016000209080519060200190612ace929190614ae6565b505050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b5857600080fd5b8061ffff1660178190555050565b606060058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612bfe5780601f10612bd357610100808354040283529160200191612bfe565b820191906000526020600020905b815481529060010190602001808311612be157829003601f168201915b5050505050905090565b6000601754905090565b60175481565b600060606000833373ffffffffffffffffffffffffffffffffffffffff16612c3f826121d9565b73ffffffffffffffffffffffffffffffffffffffff16141515612c6157600080fd5b601385815481101515612c7057fe5b906000526020600020906004020191508160030154600e6000878152602001908152602001600020808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612d2d5780601f10612d0257610100808354040283529160200191612d2d565b820191906000526020600020905b815481529060010190602001808311612d1057829003601f168201915b50505050509050935093505050915091565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612d9b57600080fd5b8061ffff1660128190555050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612de457600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6040805190810160405280601781526020017f43727970746f204e696e6a612047616d65204e696e6a6100000000000000000081525081565b600080601383815481101515612f3057fe5b906000526020600020906004020190508060010160169054906101000a900460ff16915050919050565b600080601383815481101515612f6c57fe5b906000526020600020906004020190508060010160179054906101000a900460ff16915050919050565b81612fa1338261340a565b1515612fac57600080fd5b612fb785858561191d565b612fc38585858561413f565b1515612fce57600080fd5b5050505050565b6060612fe082611f08565b1515612feb57600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130925780601f1061306757610100808354040283529160200191613092565b820191906000526020600020905b81548152906001019060200180831161307557829003601f168201915b50505050509050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130fa57600080fd5b8060118190555050565b6060813373ffffffffffffffffffffffffffffffffffffffff16613127826121d9565b73ffffffffffffffffffffffffffffffffffffffff1614151561314957600080fd5b600e60008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131f05780601f106131c5576101008083540402835291602001916131f0565b820191906000526020600020905b8154815290600101906020018083116131d357829003601f168201915b5050505050915050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561327f57600080fd5b80601560006101000a81548160ff021916908360ff16021790555050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561338d57600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040805190810160405280600381526020017f434e4e000000000000000000000000000000000000000000000000000000000081525081565b600080613416836121d9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061348557508373ffffffffffffffffffffffffffffffffffffffff1661346d84611505565b73ffffffffffffffffffffffffffffffffffffffff16145b806134965750613495818561329d565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166134bf826121d9565b73ffffffffffffffffffffffffffffffffffffffff161415156134e157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156136045760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000613617858561432d565b600760008581526020019081526020016000205492506136836001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061445b90919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156136d157fe5b9060005260206000200154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110151561372b57fe5b90600052602060002001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561378757fe5b9060005260206000200181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036137e79190614b66565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b600061382c8383614474565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050906001820390600052602060002001600090919290919091505550806007600084815260200190815260200160002081905550505050565b600080600061390685856145cc565b6000600a600086815260200190815260200160002080546001816001161561010002031660029004905014151561395757600a600085815260200190815260200160002060006139569190614b92565b5b60096000858152602001908152602001600020549250613986600160088054905061445b90919063ffffffff16565b915060088281548110151561399757fe5b90600052602060002001549050806008848154811015156139b457fe5b906000526020600020018190555060006008838154811015156139d357fe5b906000526020600020018190555060088054809190600190036139f69190614b66565b50600060096000868152602001908152602001600020819055508260096000838152602001908152602001600020819055505050505050565b600b60149054906101000a900460ff16158015613af45750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480613af3575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515613aff57600080fd5b601060169054906101000a900460ff1660ff1681600101601e9054906101000a900460ff1660ff16101515613c3557601060169054906101000a900460ff1681600101601e8282829054906101000a900460ff160392506101000a81548160ff021916908360ff16021790555080600101601081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff1602179055505060028160010160109054906101000a900461ffff1661ffff161415613bed57613bcc600661464a565b8160010160166101000a81548160ff021916908360ff160217905550613c34565b60058160010160109054906101000a900461ffff1661ffff161415613c3357613c16600661464a565b8160010160176101000a81548160ff021916908360ff1602179055505b5b5b50565b6000600b60149054906101000a900460ff16158015613cff5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480613cfe575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b1515613d0a57600080fd5b601382815481101515613d1957fe5b9060005260206000209060040201905060115442018160010160186101000a81548163ffffffff021916908363ffffffff1602179055505050565b6000806000806000613d6461481d565b93506013805490509250737a3471c362b1b3274d6b3f254e57185ffe94788a63206b64b46006856040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180807f4e494e4a412300000000000000000000000000000000000000000000000000008152506020018381526020018281526020019250505060206040518083038186803b158015613e0a57600080fd5b505af4158015613e1e573d6000803e3d6000fd5b505050506040513d6020811015613e3457600080fd5b81019080805190602001909291905050509150600160136101806040519081016040528087600019168152602001856fffffffffffffffffffffffffffffffff19168152602001600161ffff168152602001600063ffffffff1681526020018a60ff1681526020018960ff168152602001601154420163ffffffff168152602001600061ffff168152602001600060ff168152602001600061ffff168152602001600061ffff1681526020016000815250908060018154018082558091505090600182039060005260206000209060040201600090919290919091506000820151816000019060001916905560208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060408201518160010160106101000a81548161ffff021916908361ffff16021790555060608201518160010160126101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160166101000a81548160ff021916908360ff16021790555060a08201518160010160176101000a81548160ff021916908360ff16021790555060c08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600101601c6101000a81548161ffff021916908361ffff16021790555061010082015181600101601e6101000a81548160ff021916908360ff1602179055506101208201518160020160006101000a81548161ffff021916908361ffff1602179055506101408201518160020160026101000a81548161ffff021916908361ffff160217905550610160820151816003015550500390506140bb88826149b0565b7f2ad00a0a154523e942fe463c22cdbcc277a42edc4a3dd45a942296ee21ff6d0781838660405180848152602001836fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020018260001916600019168152602001935050505060405180910390a160019450505050509392505050565b6000806141618573ffffffffffffffffffffffffffffffffffffffff16614a07565b15156141705760019150614324565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614232578082015181840152602081019050614217565b50505050905090810190601f16801561425f5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561428057600080fd5b505af1158015614294573d6000803e3d6000fd5b505050506040513d60208110156142aa57600080fd5b8101908080519060200190929190505050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661434d826121d9565b73ffffffffffffffffffffffffffffffffffffffff1614151561436f57600080fd5b6143c26001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461445b90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600082821115151561446957fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156144e157600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506145856001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614a1a90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6145d6828261349f565b6145e08282613608565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000600b60149054906101000a900460ff161580156147115750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614710575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b151561471c57600080fd5b6147326001601454614a1a90919063ffffffff16565b601481905550814233601454604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182815260200193505050506040516020818303038152906040526040518082805190602001908083835b6020831015156147db57805182526020820191506020810190506020830392506147b6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206001900481151561481557fe5b069050919050565b6000806000806000600b60149054906101000a900460ff161580156148ea5750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806148e9575060011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b5b15156148f557600080fd5b60009350601661490960168054905061464a565b63ffffffff1681548110151561491b57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff169250600091505b60088210156149a357829050600182141561497057614967600261464a565b81179050614980565b61497b60125461464a565b811790505b8160070360200260020a8163ffffffff1602841793508180600101925050614948565b8360010294505050505090565b6149ba8282614a36565b600880549050600960008381526020019081526020016000208190555060088190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b600080823b905060008111915050919050565b60008183019050828110151515614a2d57fe5b80905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614a7257600080fd5b614a7c8282613820565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614b2757805160ff1916838001178555614b55565b82800160010185558215614b55579182015b82811115614b54578251825591602001919060010190614b39565b5b509050614b629190614bda565b5090565b815481835581811115614b8d57818360005260206000209182019101614b8c9190614bda565b5b505050565b50805460018160011615610100020316600290046000825580601f10614bb85750614bd7565b601f016020900490600052602060002090810190614bd69190614bda565b5b50565b614bfc91905b80821115614bf8576000816000905550600101614be0565b5090565b905600a165627a7a72305820f3ee078895e7d71372691203b5ca8145bc0bd02a9d54e009c6af268505e3e0340029
Swarm Source
bzzr://f3ee078895e7d71372691203b5ca8145bc0bd02a9d54e009c6af268505e3e034
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.