ERC-721
Source Code
Overview
Max Total Supply
103 REDT
Holders
0
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 REDTLoading...
Loading
Loading...
Loading
Loading...
Loading
| # | Exchange | Pair | Price | 24H Volume | % Volume |
|---|
Contract Name:
RedTokenCore
Compiler Version
v0.5.7+commit.6da8b019
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2019-03-28
*/
// File: contracts\math\SafeMath.sol
pragma solidity 0.5.7;
/**
* @title SafeMath
* @dev Unsigned math operations with safety checks that revert on error
*/
library SafeMath {
/**
* @dev Multiplies two unsigned integers, reverts on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring '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;
}
uint256 c = a * b;
require(c / a == b);
return c;
}
/**
* @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a);
uint256 c = a - b;
return c;
}
/**
* @dev Adds two unsigned integers, reverts on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a);
return c;
}
/**
* @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
* reverts when dividing by zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b != 0);
return a % b;
}
}
// File: contracts\RedTokenAccessControl.sol
pragma solidity 0.5.7;
/*
* @title RedTokenAccessControl
* @notice This contract defines organizational roles and permissions.
*/
contract RedTokenAccessControl {
event Paused();
event Unpaused();
event PausedUser(address indexed account);
event UnpausedUser(address indexed account);
/*
* @notice CEO's address
*/
address public ceoAddress;
/*
* @notice CFO's address
*/
address public cfoAddress;
/*
* @notice COO's address
*/
address public cooAddress;
bool public paused = false;
/*
* @notice paused users status
*/
mapping (address => bool) private pausedUsers;
/*
* @notice init constructor
*/
constructor () internal {
ceoAddress = msg.sender;
cfoAddress = msg.sender;
cooAddress = msg.sender;
}
/*
* @dev Modifier to make a function only callable by the CEO
*/
modifier onlyCEO() {
require(msg.sender == ceoAddress);
_;
}
/*
* @dev Modifier to make a function only callable by the CFO
*/
modifier onlyCFO() {
require(msg.sender == cfoAddress);
_;
}
/*
* @dev Modifier to make a function only callable by the COO
*/
modifier onlyCOO() {
require(msg.sender == cooAddress);
_;
}
/*
* @dev Modifier to make a function only callable by C-level execs
*/
modifier onlyCLevel() {
require(
msg.sender == cooAddress ||
msg.sender == ceoAddress ||
msg.sender == cfoAddress
);
_;
}
/*
* @dev Modifier to make a function only callable by CEO or CFO
*/
modifier onlyCEOOrCFO() {
require(
msg.sender == cfoAddress ||
msg.sender == ceoAddress
);
_;
}
/*
* @dev Modifier to make a function only callable by CEO or COO
*/
modifier onlyCEOOrCOO() {
require(
msg.sender == cooAddress ||
msg.sender == ceoAddress
);
_;
}
/*
* @notice Sets a new CEO
* @param _newCEO - the address of the new CEO
*/
function setCEO(address _newCEO) external onlyCEO {
require(_newCEO != address(0));
ceoAddress = _newCEO;
}
/*
* @notice Sets a new CFO
* @param _newCFO - the address of the new CFO
*/
function setCFO(address _newCFO) external onlyCEO {
require(_newCFO != address(0));
cfoAddress = _newCFO;
}
/*
* @notice Sets a new COO
* @param _newCOO - the address of the new COO
*/
function setCOO(address _newCOO) external onlyCEO {
require(_newCOO != address(0));
cooAddress = _newCOO;
}
/* Pausable functionality adapted from OpenZeppelin **/
/*
* @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);
_;
}
/*
* @notice called by any C-LEVEL to pause, triggers stopped state
*/
function pause() external onlyCLevel whenNotPaused {
paused = true;
emit Paused();
}
/*
* @notice called by any C-LEVEL to unpause, returns to normal state
*/
function unpause() external onlyCLevel whenPaused {
paused = false;
emit Unpaused();
}
/* user Pausable functionality ref someting : openzeppelin/access/Roles.sol **/
/*
* @dev Modifier to make a function callable only when the user is not paused.
*/
modifier whenNotPausedUser(address account) {
require(account != address(0));
require(!pausedUsers[account]);
_;
}
/*
* @dev Modifier to make a function callable only when the user is paused.
*/
modifier whenPausedUser(address account) {
require(account != address(0));
require(pausedUsers[account]);
_;
}
/*
* @dev check if an account has this pausedUsers
* @return bool
*/
function has(address account) internal view returns (bool) {
require(account != address(0));
return pausedUsers[account];
}
/*
* @notice _addPauseUser
*/
function _addPauseUser(address account) internal {
require(account != address(0));
require(!has(account));
pausedUsers[account] = true;
emit PausedUser(account);
}
/*
* @notice _unpausedUser
*/
function _unpausedUser(address account) internal {
require(account != address(0));
require(has(account));
pausedUsers[account] = false;
emit UnpausedUser(account);
}
/*
* @notice isPausedUser
*/
function isPausedUser(address account) external view returns (bool) {
return has(account);
}
/*
* @notice called by the COO to pauseUser, triggers stopped user state
*/
function pauseUser(address account) external onlyCOO whenNotPausedUser(account) {
_addPauseUser(account);
}
/*
* @notice called by any C-LEVEL to unpauseUser, returns to user state
*/
function unpauseUser(address account) external onlyCLevel whenPausedUser(account) {
_unpausedUser(account);
}
}
// File: contracts\RedTokenBase.sol
pragma solidity 0.5.7;
/*
* @title RedTokenBase
* @notice This contract defines the RedToken data structure and how to read from it / functions
*/
contract RedTokenBase is RedTokenAccessControl {
using SafeMath for uint256;
/*
* @notice Product defines a RedToken
*/
struct RedToken {
uint256 tokenId;
string rmsBondNo;
uint256 bondAmount;
uint256 listingAmount;
uint256 collectedAmount;
uint createdTime;
bool isValid;
}
/*
* @notice tokenId for share users by listingAmount
*/
mapping (uint256 => mapping(address => uint256)) shareUsers;
/*
* @notice tokenid by share accounts in shareUsers list iterator.
*/
mapping (uint256 => address []) shareUsersKeys;
/** events **/
event RedTokenCreated(
address account,
uint256 tokenId,
string rmsBondNo,
uint256 bondAmount,
uint256 listingAmount,
uint256 collectedAmount,
uint createdTime
);
/*
* @notice All redTokens in existence.
* @dev The ID of each redToken is an index in this array.
*/
RedToken[] redTokens;
/*
* @notice Get a redToken RmsBondNo
* @param _tokenId the token id
*/
function redTokenRmsBondNo(uint256 _tokenId) external view returns (string memory) {
return redTokens[_tokenId].rmsBondNo;
}
/*
* @notice Get a redToken BondAmount
* @param _tokenId the token id
*/
function redTokenBondAmount(uint256 _tokenId) external view returns (uint256) {
return redTokens[_tokenId].bondAmount;
}
/*
* @notice Get a redToken ListingAmount
* @param _tokenId the token id
*/
function redTokenListingAmount(uint256 _tokenId) external view returns (uint256) {
return redTokens[_tokenId].listingAmount;
}
/*
* @notice Get a redToken CollectedAmount
* @param _tokenId the token id
*/
function redTokenCollectedAmount(uint256 _tokenId) external view returns (uint256) {
return redTokens[_tokenId].collectedAmount;
}
/*
* @notice Get a redToken CreatedTime
* @param _tokenId the token id
*/
function redTokenCreatedTime(uint256 _tokenId) external view returns (uint) {
return redTokens[_tokenId].createdTime;
}
/*
* @notice isValid a redToken
* @param _tokenId the token id
*/
function isValidRedToken(uint256 _tokenId) public view returns (bool) {
return redTokens[_tokenId].isValid;
}
/*
* @notice info a redToken
* @param _tokenId the token id
*/
function redTokenInfo(uint256 _tokenId)
external view returns (uint256, string memory, uint256, uint256, uint256, uint)
{
require(isValidRedToken(_tokenId));
RedToken memory _redToken = redTokens[_tokenId];
return (
_redToken.tokenId,
_redToken.rmsBondNo,
_redToken.bondAmount,
_redToken.listingAmount,
_redToken.collectedAmount,
_redToken.createdTime
);
}
/*
* @notice info a token of share users
* @param _tokenId the token id
*/
function redTokenInfoOfshareUsers(uint256 _tokenId) external view returns (address[] memory, uint256[] memory) {
require(isValidRedToken(_tokenId));
uint256 keySize = shareUsersKeys[_tokenId].length;
address[] memory addrs = new address[](keySize);
uint256[] memory amounts = new uint256[](keySize);
for (uint index = 0; index < keySize; index++) {
addrs[index] = shareUsersKeys[_tokenId][index];
amounts[index] = shareUsers[_tokenId][addrs[index]];
}
return (addrs, amounts);
}
}
// File: contracts\interfaces\ERC721.sol
pragma solidity 0.5.7;
/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
/// Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface ERC721 {
/// @dev This emits when ownership of any NFT changes by any mechanism.
/// This event emits when NFTs are created (`from` == 0) and destroyed
/// (`to` == 0). Exception: during contract creation, any number of NFTs
/// may be created and assigned without emitting Transfer. At the time of
/// any transfer, the approved address for that NFT (if any) is reset to none.
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
/// @dev This emits when the approved address for an NFT is changed or
/// reaffirmed. The zero address indicates there is no approved address.
/// When a Transfer event emits, this also indicates that the approved
/// address for that NFT (if any) is reset to none.
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
/// @dev This emits when an operator is enabled or disabled for an owner.
/// The operator can manage all NFTs of the owner.
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
/// @notice Count all NFTs assigned to an owner
/// @dev NFTs assigned to the zero address are considered invalid, and this
/// function throws for queries about the zero address.
/// @param _owner An address for whom to query the balance
/// @return The number of NFTs owned by `_owner`, possibly zero
function balanceOf(address _owner) external view returns (uint256);
/// @notice Find the owner of an NFT
/// @dev NFTs assigned to zero address are considered invalid, and queries
/// about them do throw.
/// @param _tokenId The identifier for an NFT
/// @return The address of the owner of the NFT
function ownerOf(uint256 _tokenId) external view returns (address);
/// @notice Transfers the ownership of an NFT from one address to another address
/// @dev Throws unless `msg.sender` is the current owner, an authorized
/// operator, or the approved address for this NFT. Throws if `_from` is
/// not the current owner. Throws if `_to` is the zero address. Throws if
/// `_tokenId` is not a valid NFT. When transfer is complete, this function
/// checks if `_to` is a smart contract (code size > 0). If so, it calls
/// `onERC721Received` on `_to` and throws if the return value is not
/// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
/// @param _from The current owner of the NFT
/// @param _to The new owner
/// @param _tokenId The NFT to transfer
/// @param data Additional data with no specified format, sent in call to `_to`
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;
/// @notice Transfers the ownership of an NFT from one address to another address
/// @dev This works identically to the other function with an extra data parameter,
/// except this function just sets data to "".
/// @param _from The current owner of the NFT
/// @param _to The new owner
/// @param _tokenId The NFT to transfer
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
/// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
/// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
/// THEY MAY BE PERMANENTLY LOST
/// @dev Throws unless `msg.sender` is the current owner, an authorized
/// operator, or the approved address for this NFT. Throws if `_from` is
/// not the current owner. Throws if `_to` is the zero address. Throws if
/// `_tokenId` is not a valid NFT.
/// @param _from The current owner of the NFT
/// @param _to The new owner
/// @param _tokenId The NFT to transfer
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
/// @notice Change or reaffirm the approved address for an NFT
/// @dev The zero address indicates there is no approved address.
/// Throws unless `msg.sender` is the current NFT owner, or an authorized
/// operator of the current owner.
/// @param _approved The new approved NFT controller
/// @param _tokenId The NFT to approve
function approve(address _approved, uint256 _tokenId) external payable;
/// @notice Enable or disable approval for a third party ("operator") to manage
/// all of `msg.sender`'s assets
/// @dev Emits the ApprovalForAll event. The contract MUST allow
/// multiple operators per owner.
/// @param _operator Address to add to the set of authorized operators
/// @param _approved True if the operator is approved, false to revoke approval
function setApprovalForAll(address _operator, bool _approved) external;
/// @notice Get the approved address for a single NFT
/// @dev Throws if `_tokenId` is not a valid NFT.
/// @param _tokenId The NFT to find the approved address for
/// @return The approved address for this NFT, or the zero address if there is none
function getApproved(uint256 _tokenId) external view returns (address);
/// @notice Query if an address is an authorized operator for another address
/// @param _owner The address that owns the NFTs
/// @param _operator The address that acts on behalf of the owner
/// @return True if `_operator` is an approved operator for `_owner`, false otherwise
function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}
// File: contracts\interfaces\ERC721Metadata.sol
pragma solidity 0.5.7;
/*
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
* Note: the ERC-165 identifier for this interface is 0x5b5e139f
*/
interface ERC721Metadata /* is ERC721 */ {
/*
* @notice A descriptive name for a collection of NFTs in this contract
*/
function name() external pure returns (string memory _name);
/*
* @notice An abbreviated name for NFTs in this contract
*/
function symbol() external pure returns (string memory _symbol);
/*
* @notice A distinct Uniform Resource Identifier (URI) for a given asset.
* @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
* 3986. The URI may point to a JSON file that conforms to the "ERC721
* Metadata JSON Schema".
*/
function tokenURI(uint256 _tokenId) external view returns (string memory);
}
// File: contracts\interfaces\ERC721Enumerable.sol
pragma solidity 0.5.7;
/*
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
* Note: the ERC-165 identifier for this interface is 0x780e9d63
*/
interface ERC721Enumerable /* is ERC721 */ {
/*
* @notice Count NFTs tracked by this contract
* @return A count of valid NFTs tracked by this contract, where each one of
* them has an assigned and queryable owner not equal to the zero address
*/
function totalSupply() external view returns (uint256);
/*
* @notice Enumerate valid NFTs
* @dev Throws if `_index` >= `totalSupply()`.
* @param _index A counter less than `totalSupply()`
* @return The token identifier for the `_index`th NFT,
* (sort order not specified)
*/
function tokenByIndex(uint256 _index) external view returns (uint256);
/*
* @notice Enumerate NFTs assigned to an owner
* @dev Throws if `_index` >= `balanceOf(_owner)` or if
* `_owner` is the zero address, representing invalid NFTs.
* @param _owner An address where we are interested in NFTs owned by them
* @param _index A counter less than `balanceOf(_owner)`
* @return The token identifier for the `_index`th NFT assigned to `_owner`,
* (sort order not specified)
*/
function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 _tokenId);
}
// File: contracts\interfaces\ERC165.sol
pragma solidity 0.5.7;
interface ERC165 {
/*
* @notice Query if a contract implements an interface
* @param interfaceID The interface identifier, as specified in ERC-165
* @dev Interface identification is specified in ERC-165. This function
* uses less than 30,000 gas.
* @return `true` if the contract implements `interfaceID` and
* `interfaceID` is not 0xffffffff, `false` otherwise
*/
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
// File: contracts\strings\Strings.sol
pragma solidity 0.5.7;
library Strings {
// via https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol
function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) internal pure returns (string memory) {
bytes memory _ba = bytes(_a);
bytes memory _bb = bytes(_b);
bytes memory _bc = bytes(_c);
bytes memory _bd = bytes(_d);
bytes memory _be = bytes(_e);
string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
bytes memory babcde = bytes(abcde);
uint k = 0;
for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
for (uint i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
for (uint i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
for (uint i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
for (uint i = 0; i < _be.length; i++) babcde[k++] = _be[i];
return string(babcde);
}
function strConcat(string memory _a, string memory _b, string memory _c, string memory _d) internal pure returns (string memory) {
return strConcat(_a, _b, _c, _d, "");
}
function strConcat(string memory _a, string memory _b, string memory _c) internal pure returns (string memory) {
return strConcat(_a, _b, _c, "", "");
}
function strConcat(string memory _a, string memory _b) internal pure returns (string memory) {
return strConcat(_a, _b, "", "", "");
}
function uint2str(uint i) internal pure returns (string memory) {
if (i == 0) return "0";
uint j = i;
uint len;
while (j != 0){
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len - 1;
while (i != 0){
bstr[k--] = byte(uint8(48 + i % 10));
i /= 10;
}
return string(bstr);
}
}
// File: contracts\interfaces\ERC721TokenReceiver.sol
pragma solidity 0.5.7;
/*
* @dev Note: the ERC-165 identifier for this interface is 0xf0b9e5ba
*/
interface ERC721TokenReceiver {
/*
* @notice Handle the receipt of an NFT
* @dev The ERC721 smart contract calls this function on the recipient
* after a `transfer`. 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)"))`
* unless throwing
*/
function onERC721Received(address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}
// File: contracts\RedTokenOwnership.sol
pragma solidity 0.5.7;
/*
* @title RedTokenOwnership
* @notice control by TokenBase.
*/
contract RedTokenOwnership is RedTokenBase, ERC721, ERC165, ERC721Metadata, ERC721Enumerable {
using SafeMath for uint256;
// Total amount of tokens
uint256 private totalTokens;
// Mapping from token ID to owner
mapping (uint256 => address) private tokenOwner;
// 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;
// Mapping from token ID to approved address
mapping (uint256 => address) internal tokenApprovals;
// Mapping from owner address to operator address to approval
mapping (address => mapping (address => bool)) internal operatorApprovals;
/** events **/
event calculateShareUsers(uint256 tokenId, address owner, address from, address to, uint256 amount);
event CollectedAmountUpdate(uint256 tokenId, address owner, uint256 amount);
/** Constants **/
// Configure these for your own deployment
string internal constant NAME = "RedToken";
string internal constant SYMBOL = "REDT";
string internal tokenMetadataBaseURI = "https://doc.reditus.co.kr/?docid=";
/** structs **/
function supportsInterface(
bytes4 interfaceID) // solium-disable-line dotta/underscore-function-arguments
external view returns (bool)
{
return
interfaceID == this.supportsInterface.selector || // ERC165
interfaceID == 0x5b5e139f || // ERC721Metadata
interfaceID == 0x80ac58cd || // ERC-721
interfaceID == 0x780e9d63; // ERC721Enumerable
}
/*
* @notice 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);
_;
}
/** external functions **/
/*
* @notice token's name
*/
function name() external pure returns (string memory) {
return NAME;
}
/*
* @notice symbols's name
*/
function symbol() external pure returns (string memory) {
return SYMBOL;
}
/*
* @notice tokenURI
* @dev do not checked in array and used function isValidRedToken value is not important, only check in redTokens array
*/
function tokenURI(uint256 _tokenId)
external
view
returns (string memory infoUrl)
{
if ( isValidRedToken(_tokenId) ){
return Strings.strConcat( tokenMetadataBaseURI, Strings.uint2str(_tokenId));
}else{
return Strings.strConcat( tokenMetadataBaseURI, Strings.uint2str(_tokenId));
}
}
/*
* @notice setTokenMetadataBaseURI
*/
function setTokenMetadataBaseURI(string calldata _newBaseURI) external onlyCOO {
tokenMetadataBaseURI = _newBaseURI;
}
/*
* @notice Gets the total amount of tokens stored by the contract
* @return uint256 representing the total amount of tokens
*/
function totalSupply() external view returns (uint256) {
return totalTokens;
}
/*
* @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;
}
/*
* @notice 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 ownedTokens[_owner].length;
}
/*
* @notice Gets the list of tokens owned by a given address
* @param _owner address to query the tokens of
* @return uint256[] representing the list of tokens owned by the passed address
*/
function tokensOf(address _owner) external view returns (uint256[] memory) {
require(_owner != address(0));
return ownedTokens[_owner];
}
/*
* @notice Enumerate valid NFTs
* @dev Our Licenses are kept in an array and each new License-token is just
* the next element in the array. This method is required for ERC721Enumerable
* which may support more complicated storage schemes. However, in our case the
* _index is the tokenId
* @param _index A counter less than `totalSupply()`
* @return The token identifier for the `_index`th NFT
*/
function tokenByIndex(uint256 _index) external view returns (uint256) {
require(_index < totalTokens);
return _index;
}
/*
* @notice Enumerate NFTs assigned to an owner
* @dev Throws if `_index` >= `balanceOf(_owner)` or if
* `_owner` is the zero address, representing invalid NFTs.
* @param _owner An address where we are interested in NFTs owned by them
* @param _index A counter less than `balanceOf(_owner)`
* @return The token identifier for the `_index`th NFT assigned to `_owner`,
*/
function tokenOfOwnerByIndex(address _owner, uint256 _index)
external
view
returns (uint256 _tokenId)
{
require(_index < balanceOf(_owner));
return ownedTokens[_owner][_index];
}
/*
* @notice Gets the approved address to take ownership of a given token ID
* @param _tokenId uint256 ID of the token to query the approval of
* @return address currently approved to take ownership of the given token ID
*/
function getApproved(uint256 _tokenId) public view returns (address) {
return tokenApprovals[_tokenId];
}
/*
* @notice 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];
}
/*
* @notice Approves another address to claim for the ownership of the given token ID
* @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)
external
payable
whenNotPaused
whenNotPausedUser(msg.sender)
onlyOwnerOf(_tokenId)
{
require(_to != ownerOf(_tokenId));
if (getApproved(_tokenId) != address(0) || _to != address(0)) {
tokenApprovals[_tokenId] = _to;
emit Approval(ownerOf(_tokenId), _to, _tokenId);
}
}
/*
* @notice Enable or disable approval for a third party ("operator") to manage all your assets
* @dev Emits the ApprovalForAll event
* @param _to Address to add to the set of authorized operators.
* @param _approved True if the operators is approved, false to revoke approval
*/
function setApprovalForAll(address _to, bool _approved)
external
whenNotPaused
whenNotPausedUser(msg.sender)
{
if(_approved) {
approveAll(_to);
} else {
disapproveAll(_to);
}
}
/*
* @notice Approves another address to claim for the ownership of any tokens owned by this account
* @param _to address to be approved for the given token ID
*/
function approveAll(address _to)
internal
whenNotPaused
whenNotPausedUser(msg.sender)
{
require(_to != msg.sender);
require(_to != address(0));
operatorApprovals[msg.sender][_to] = true;
emit ApprovalForAll(msg.sender, _to, true);
}
/*
* @notice Removes approval for another address to claim for the ownership of any
* tokens owned by this account.
* @dev Note that this only removes the operator approval and
* does not clear any independent, specific approvals of token transfers to this address
* @param _to address to be disapproved for the given token ID
*/
function disapproveAll(address _to)
internal
whenNotPaused
whenNotPausedUser(msg.sender)
{
require(_to != msg.sender);
delete operatorApprovals[msg.sender][_to];
emit ApprovalForAll(msg.sender, _to, false);
}
/*
* @notice Tells whether the msg.sender is approved to transfer the given token ID or not
* Checks both for specific approval and operator approval
* @param _tokenId uint256 ID of the token to query the approval of
* @return bool whether transfer by msg.sender is approved for the given token ID or not
*/
function isSenderApprovedFor(uint256 _tokenId) public view returns (bool) {
return
ownerOf(_tokenId) == msg.sender ||
getApproved(_tokenId) == msg.sender ||
isApprovedForAll(ownerOf(_tokenId), msg.sender);
}
/*
* @notice Transfers the ownership of a given token ID to another address
* @param _to address to receive the ownership of the given token ID
* @param _tokenId uint256 ID of the token to be transferred
*/
function transfer(address _to, uint256 _tokenId)
external
payable
whenNotPaused
whenNotPausedUser(msg.sender)
onlyOwnerOf(_tokenId)
{
_clearApprovalAndTransfer(msg.sender, _to, _tokenId);
}
/*
* @notice Transfer a token owned by another address, for which the calling address has
* previously been granted transfer approval by the owner.
* @param _from The address that owns the token
* @param _to The address that will take ownership of the token. Can be any address, including the caller
* @param _tokenId The ID of the token to be transferred
*/
function transferFrom(
address _from,
address _to,
uint256 _tokenId
)
external
payable
whenNotPaused
whenNotPausedUser(msg.sender)
{
require(isSenderApprovedFor(_tokenId));
_clearApprovalAndTransfer(_from, _to, _tokenId);
}
/*
* @notice Transfers the ownership of an NFT from one address to another address
* @dev This works identically to the other function with an extra data parameter,
* except this function just sets data to ""
* @param _from The current owner of the NFT
* @param _to The new owner
* @param _tokenId The NFT to transfer
*/
function safeTransferFrom(
address _from,
address _to,
uint256 _tokenId
)
external
payable
whenNotPaused
whenNotPausedUser(msg.sender)
{
require(isSenderApprovedFor(_tokenId));
_safeTransferFrom(_from, _to, _tokenId, "");
}
/*
* @notice Transfers the ownership of an NFT from one address to another address
* @dev Throws unless `msg.sender` is the current owner, an authorized
* operator, or the approved address for this NFT. Throws if `_from` is
* not the current owner. Throws if `_to` is the zero address. Throws if
* `_tokenId` is not a valid NFT. When transfer is complete, this function
* checks if `_to` is a smart contract (code size > 0). If so, it calls
* `onERC721Received` on `_to` and throws if the return value is not
* `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
* @param _from The current owner of the NFT
* @param _to The new owner
* @param _tokenId The NFT to transfer
* @param _data Additional data with no specified format, sent in call to `_to`
*/
function safeTransferFrom(
address _from,
address _to,
uint256 _tokenId,
bytes calldata _data
)
external
payable
whenNotPaused
whenNotPausedUser(msg.sender)
{
require(isSenderApprovedFor(_tokenId));
_safeTransferFrom(_from, _to, _tokenId, _data);
}
/*
* @notice send amount shareUsers
*/
function sendAmountShareUsers(
uint256 _tokenId,
address _to,
uint256 _amount
)
external
onlyCOO
returns (bool)
{
require(_to != address(0));
return _calculateShareUsers(_tokenId, ownerOf(_tokenId), _to, _amount);
}
/*
* @notice send amount shareUsers
*/
function sendAmountShareUsersFrom(
uint256 _tokenId,
address _from,
address _to,
uint256 _amount
)
external
onlyCOO
returns (bool)
{
require(_to != address(0));
return _calculateShareUsers(_tokenId, _from, _to, _amount);
}
/*
* @notice update collectedAmount
*/
function updateCollectedAmount(
uint256 _tokenId,
uint256 _amount
)
external
onlyCOO
returns (bool)
{
require(isValidRedToken(_tokenId));
require(_amount > 0);
redTokens[_tokenId].collectedAmount = redTokens[_tokenId].collectedAmount.add(_amount);
emit CollectedAmountUpdate(_tokenId, ownerOf(_tokenId), _amount);
return true;
}
/*
* @notice createRedToken
*/
function createRedToken(
address _user,
string calldata _rmsBondNo,
uint256 _bondAmount,
uint256 _listingAmount
)
external
onlyCOO
returns (uint256)
{
return _createRedToken(_user,_rmsBondNo,_bondAmount,_listingAmount);
}
/*
* @notice burn amount a token by share users
*/
function burnAmountByShareUser(
uint256 _tokenId,
address _from,
uint256 _amount
)
external
onlyCOO
returns (bool)
{
return _calculateShareUsers(_tokenId, _from, address(0), _amount);
}
/*
* @notice burn RedToken
*/
function burn(
address _owner,
uint256 _tokenId
)
external
onlyCOO
returns(bool)
{
require(_owner != address(0));
return _burn(_owner, _tokenId);
}
/** internal function **/
function isContract(address _addr) internal view returns (bool) {
uint size;
assembly { size := extcodesize(_addr) }
return size > 0;
}
/*
* @notice checked shareUser by shareUsersKeys
*/
function isShareUser(
uint256 _tokenId,
address _from
)
internal
view
returns (bool)
{
bool chechedUser = false;
for (uint index = 0; index < shareUsersKeys[_tokenId].length; index++) {
if ( shareUsersKeys[_tokenId][index] == _from ){
chechedUser = true;
break;
}
}
return chechedUser;
}
/*
* @notice Transfers the ownership of an NFT from one address to another address
* @param _from The current owner of the NFT
* @param _to The new owner
* @param _tokenId The NFT to transfer
* @param _data Additional data with no specified format, sent in call to `_to`
*/
function _safeTransferFrom(
address _from,
address _to,
uint256 _tokenId,
bytes memory _data
)
internal
{
_clearApprovalAndTransfer(_from, _to, _tokenId);
if (isContract(_to)) {
bytes4 tokenReceiverResponse = ERC721TokenReceiver(_to).onERC721Received.gas(50000)(
_from, _tokenId, _data
);
require(tokenReceiverResponse == bytes4(keccak256("onERC721Received(address,uint256,bytes)")));
}
}
/*
* @notice Internal function to clear current approval and transfer the ownership of a given token ID
* @param _from address which you want to send tokens from
* @param _to address which you want to transfer the token to
* @param _tokenId uint256 ID of the token to be transferred
*/
function _clearApprovalAndTransfer(
address _from,
address _to,
uint256 _tokenId
)
internal
{
require(_to != address(0));
require(_to != ownerOf(_tokenId));
require(ownerOf(_tokenId) == _from);
require(isValidRedToken(_tokenId));
address owner = ownerOf(_tokenId);
_clearApproval(owner, _tokenId);
_removeToken(owner, _tokenId);
_addToken(_to, _tokenId);
_changeTokenShareUserByOwner(owner, _to, _tokenId);
emit Transfer(owner, _to, _tokenId);
}
/*
* @notice change token owner rate sending
* @param _from address which you want to change rate from
* @param _to address which you want to change rate the token to
* @param _tokenId uint256 ID of the token to be change rate
*/
function _changeTokenShareUserByOwner(
address _from,
address _to,
uint256 _tokenId
)
internal
{
uint256 amount = shareUsers[_tokenId][_from];
delete shareUsers[_tokenId][_from];
shareUsers[_tokenId][_to] = shareUsers[_tokenId][_to].add(amount);
if ( !isShareUser(_tokenId, _to) ) {
shareUsersKeys[_tokenId].push(_to);
}
}
/*
* @notice remove shareUsers
*/
function _calculateShareUsers(
uint256 _tokenId,
address _from,
address _to,
uint256 _amount
)
internal
returns (bool)
{
require(_from != address(0));
require(_from != _to);
require(_amount > 0);
require(shareUsers[_tokenId][_from] >= _amount);
require(isValidRedToken(_tokenId));
shareUsers[_tokenId][_from] = shareUsers[_tokenId][_from].sub(_amount);
shareUsers[_tokenId][_to] = shareUsers[_tokenId][_to].add(_amount);
if ( !isShareUser(_tokenId, _to) ) {
shareUsersKeys[_tokenId].push(_to);
}
emit calculateShareUsers(_tokenId, ownerOf(_tokenId), _from, _to, _amount);
return true;
}
/*
* @notice Internal function to clear current approval of a given token ID
* @param _tokenId uint256 ID of the token to be transferred
*/
function _clearApproval(
address _owner,
uint256 _tokenId
)
internal
{
require(ownerOf(_tokenId) == _owner);
tokenApprovals[_tokenId] = address(0);
emit Approval(_owner, address(0), _tokenId);
}
function _createRedToken(
address _user,
string memory _rmsBondNo,
uint256 _bondAmount,
uint256 _listingAmount
)
internal
returns (uint256)
{
require(_user != address(0));
require(bytes(_rmsBondNo).length > 0);
require(_bondAmount > 0);
require(_listingAmount > 0);
uint256 _newTokenId = redTokens.length;
RedToken memory _redToken = RedToken({
tokenId: _newTokenId,
rmsBondNo: _rmsBondNo,
bondAmount: _bondAmount,
listingAmount: _listingAmount,
collectedAmount: 0,
createdTime: now,
isValid:true
});
redTokens.push(_redToken) - 1;
shareUsers[_newTokenId][_user] = shareUsers[_newTokenId][_user].add(_listingAmount);
shareUsersKeys[_newTokenId].push(_user);
_addToken(_user, _newTokenId);
emit RedTokenCreated(_user,
_redToken.tokenId,
_redToken.rmsBondNo,
_redToken.bondAmount,
_redToken.listingAmount,
_redToken.collectedAmount,
_redToken.createdTime);
return _newTokenId;
}
/*
* @notice 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 _addToken(
address _to,
uint256 _tokenId
)
internal
{
require(tokenOwner[_tokenId] == address(0));
tokenOwner[_tokenId] = _to;
uint256 length = balanceOf(_to);
ownedTokens[_to].push(_tokenId);
ownedTokensIndex[_tokenId] = length;
totalTokens = totalTokens.add(1);
}
/*
* @notice 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 _removeToken(
address _from,
uint256 _tokenId
)
internal
{
require(ownerOf(_tokenId) == _from);
uint256 tokenIndex = ownedTokensIndex[_tokenId];
uint256 lastTokenIndex = balanceOf(_from).sub(1);
uint256 lastToken = ownedTokens[_from][lastTokenIndex];
tokenOwner[_tokenId] = address(0);
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;
totalTokens = totalTokens.sub(1);
}
/*
* @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
returns(bool)
{
require(ownerOf(_tokenId) == _owner);
_clearApproval(_owner, _tokenId);
_removeToken(_owner, _tokenId);
redTokens[_tokenId].isValid = false;
emit Transfer(_owner, address(0), _tokenId);
return true;
}
}
// File: contracts\RedTokenCore.sol
pragma solidity 0.5.7;
/*
* @title RedTokenCore is the entry point of the contract
* @notice RedTokenCore is the entry point and it controls the ability to set a new
* contract address, in the case where an upgrade is required
*/
contract RedTokenCore is RedTokenOwnership{
constructor() public {
ceoAddress = msg.sender;
cooAddress = msg.sender;
cfoAddress = msg.sender;
}
function() external {
assert(false);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","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":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newBaseURI","type":"string"}],"name":"setTokenMetadataBaseURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"_tokenId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"sendAmountShareUsersFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPausedUser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"redTokenCreatedTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"sendAmountShareUsers","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"isSenderApprovedFor","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":"_owner","type":"address"}],"name":"tokensOf","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_rmsBondNo","type":"string"},{"name":"_bondAmount","type":"uint256"},{"name":"_listingAmount","type":"uint256"}],"name":"createRedToken","outputs":[{"name":"","type":"uint256"}],"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":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"unpauseUser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"isValidRedToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"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":"_tokenId","type":"uint256"}],"name":"redTokenBondAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"redTokenRmsBondNo","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"redTokenListingAmount","outputs":[{"name":"","type":"uint256"}],"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":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"pauseUser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"redTokenCollectedAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_from","type":"address"},{"name":"_amount","type":"uint256"}],"name":"burnAmountByShareUser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"infoUrl","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"redTokenInfoOfshareUsers","outputs":[{"name":"","type":"address[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_amount","type":"uint256"}],"name":"updateCollectedAmount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"redTokenInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"string"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":false,"stateMutability":"nonpayable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"calculateShareUsers","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"CollectedAmountUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"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"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"rmsBondNo","type":"string"},{"indexed":false,"name":"bondAmount","type":"uint256"},{"indexed":false,"name":"listingAmount","type":"uint256"},{"indexed":false,"name":"collectedAmount","type":"uint256"},{"indexed":false,"name":"createdTime","type":"uint256"}],"name":"RedTokenCreated","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PausedUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"UnpausedUser","type":"event"}]Contract Creation Code
60806040526000600260146101000a81548160ff021916908315150217905550604051806060016040528060218152602001620058c460219139600d908051906020019062000050929190620001e9565b503480156200005e57600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000298565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200022c57805160ff19168380011785556200025d565b828001600101855582156200025d579182015b828111156200025c5782518255916020019190600101906200023f565b5b5090506200026c919062000270565b5090565b6200029591905b808211156200029157600081600090555060010162000277565b5090565b90565b61561c80620002a86000396000f3fe60806040526004361061027d5760003560e01c80636352211e1161014f578063a9059cbb116100c1578063c4defb091161007a578063c4defb091461127f578063c87b56dd146112fc578063ce696ca5146113b0578063d86ac8d714611488578063e532b01b146114e5578063e985e9c5146115bc5761027d565b8063a9059cbb14611028578063b047fb5014611076578063b341e6be146110cd578063b88d4fde1461111c578063bfcb9079146111df578063c0885af8146112305761027d565b8063939a518b11610113578063939a518b14610d7257806395d89b4114610dc55780639dc29fac14610e55578063a22cb46514610ec8578063a34b041414610f25578063a603644314610f745761027d565b80636352211e14610b5c5780636b08e00014610bd757806370a0823114610ca55780638456cb5914610d0a5780638622878d14610d215761027d565b80632f745c59116101f35780634cc028aa116101ac5780634cc028aa146109175780634e0a3379146109945780634eae8e30146109e55780634f6ccce714610a385780635a3f267214610a875780635c975abb14610b2d5761027d565b80632f745c59146106ce57806332f67cc81461073d5780633f4ba83a146107da57806342842e0e146107f157806344c22b581461085f57806348263272146108c85761027d565b80630a0f8168116102455780630a0f8168146104b657806318160ddd1461050d5780631e20363a1461053857806323b872dd146105be57806327d7874c1461062c5780632ba73c151461067d5761027d565b806301ffc9a7146102945780630519ce791461030657806306fdde031461035d578063081812fc146103ed578063095ea7b314610468575b34801561028957600080fd5b50600061029257fe5b005b3480156102a057600080fd5b506102ec600480360360208110156102b757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611645565b604051808215151515815260200191505060405180910390f35b34801561031257600080fd5b5061031b611726565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561036957600080fd5b5061037261174c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b2578082015181840152602081019050610397565b50505050905090810190601f1680156103df5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f957600080fd5b506104266004803603602081101561041057600080fd5b8101908080359060200190929190505050611789565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104b46004803603604081101561047e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117c6565b005b3480156104c257600080fd5b506104cb611a26565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561051957600080fd5b50610522611a4b565b6040518082815260200191505060405180910390f35b34801561054457600080fd5b506105bc6004803603602081101561055b57600080fd5b810190808035906020019064010000000081111561057857600080fd5b82018360208201111561058a57600080fd5b803590602001918460018302840111640100000000831117156105ac57600080fd5b9091929391929390505050611a55565b005b61062a600480360360608110156105d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ac5565b005b34801561063857600080fd5b5061067b6004803603602081101561064f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b94565b005b34801561068957600080fd5b506106cc600480360360208110156106a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c6a565b005b3480156106da57600080fd5b50610727600480360360408110156106f157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d41565b6040518082815260200191505060405180910390f35b34801561074957600080fd5b506107c06004803603608081101561076057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611db4565b604051808215151515815260200191505060405180910390f35b3480156107e657600080fd5b506107ef611e60565b005b61085d6004803603606081101561080757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611fcb565b005b34801561086b57600080fd5b506108ae6004803603602081101561088257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120aa565b604051808215151515815260200191505060405180910390f35b3480156108d457600080fd5b50610901600480360360208110156108eb57600080fd5b81019080803590602001909291905050506120bc565b6040518082815260200191505060405180910390f35b34801561092357600080fd5b5061097a6004803603606081101561093a57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120e4565b604051808215151515815260200191505060405180910390f35b3480156109a057600080fd5b506109e3600480360360208110156109b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612197565b005b3480156109f157600080fd5b50610a1e60048036036020811015610a0857600080fd5b810190808035906020019092919050505061226e565b604051808215151515815260200191505060405180910390f35b348015610a4457600080fd5b50610a7160048036036020811015610a5b57600080fd5b8101908080359060200190929190505050612305565b6040518082815260200191505060405180910390f35b348015610a9357600080fd5b50610ad660048036036020811015610aaa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061231d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b19578082015181840152602081019050610afe565b505050509050019250505060405180910390f35b348015610b3957600080fd5b50610b426123ee565b604051808215151515815260200191505060405180910390f35b348015610b6857600080fd5b50610b9560048036036020811015610b7f57600080fd5b8101908080359060200190929190505050612401565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610be357600080fd5b50610c8f60048036036080811015610bfa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c3757600080fd5b820183602082011115610c4957600080fd5b80359060200191846001830284011164010000000083111715610c6b57600080fd5b9091929391929390803590602001909291908035906020019092919050505061247d565b6040518082815260200191505060405180910390f35b348015610cb157600080fd5b50610cf460048036036020811015610cc857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612534565b6040518082815260200191505060405180910390f35b348015610d1657600080fd5b50610d1f6125b9565b005b348015610d2d57600080fd5b50610d7060048036036020811015610d4457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612725565b005b348015610d7e57600080fd5b50610dab60048036036020811015610d9557600080fd5b81019080803590602001909291905050506128cc565b604051808215151515815260200191505060405180910390f35b348015610dd157600080fd5b50610dda612901565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1a578082015181840152602081019050610dff565b50505050905090810190601f168015610e475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e6157600080fd5b50610eae60048036036040811015610e7857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061293e565b604051808215151515815260200191505060405180910390f35b348015610ed457600080fd5b50610f2360048036036040811015610eeb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129e6565b005b348015610f3157600080fd5b50610f5e60048036036020811015610f4857600080fd5b8101908080359060200190929190505050612ab5565b6040518082815260200191505060405180910390f35b348015610f8057600080fd5b50610fad60048036036020811015610f9757600080fd5b8101908080359060200190929190505050612add565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610fed578082015181840152602081019050610fd2565b50505050905090810190601f16801561101a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6110746004803603604081101561103e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b9d565b005b34801561108257600080fd5b5061108b612c9b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156110d957600080fd5b50611106600480360360208110156110f057600080fd5b8101908080359060200190929190505050612cc1565b6040518082815260200191505060405180910390f35b6111dd6004803603608081101561113257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561119957600080fd5b8201836020820111156111ab57600080fd5b803590602001918460018302840111640100000000831117156111cd57600080fd5b9091929391929390505050612ce9565b005b3480156111eb57600080fd5b5061122e6004803603602081101561120257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612dff565b005b34801561123c57600080fd5b506112696004803603602081101561125357600080fd5b8101908080359060200190929190505050612ef8565b6040518082815260200191505060405180910390f35b34801561128b57600080fd5b506112e2600480360360608110156112a257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612f20565b604051808215151515815260200191505060405180910390f35b34801561130857600080fd5b506113356004803603602081101561131f57600080fd5b8101908080359060200190929190505050612f92565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561137557808201518184015260208101905061135a565b50505050905090810190601f1680156113a25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156113bc57600080fd5b506113e9600480360360208110156113d357600080fd5b8101908080359060200190929190505050613109565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611430578082015181840152602081019050611415565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611472578082015181840152602081019050611457565b5050505090500194505050505060405180910390f35b34801561149457600080fd5b506114cb600480360360408110156114ab57600080fd5b8101908080359060200190929190803590602001909291905050506132d6565b604051808215151515815260200191505060405180910390f35b3480156114f157600080fd5b5061151e6004803603602081101561150857600080fd5b8101908080359060200190929190505050613429565b6040518087815260200180602001868152602001858152602001848152602001838152602001828103825287818151815260200191508051906020019080838360005b8381101561157c578082015181840152602081019050611561565b50505050905090810190601f1680156115a95780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b3480156115c857600080fd5b5061162b600480360360408110156115df57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061359b565b604051808215151515815260200191505060405180910390f35b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116bf5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806116ef57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061171f575063780e9d6360e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606040518060400160405280600881526020017f526564546f6b656e000000000000000000000000000000000000000000000000815250905090565b6000600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600260149054906101000a900460ff16156117e057600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181b57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561187257600080fd5b813373ffffffffffffffffffffffffffffffffffffffff1661189382612401565b73ffffffffffffffffffffffffffffffffffffffff16146118b357600080fd5b6118bc83612401565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156118f457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1661191584611789565b73ffffffffffffffffffffffffffffffffffffffff161415806119655750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611a205783600b600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff166119dd85612401565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b50505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600754905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aaf57600080fd5b8181600d9190611ac0929190615439565b505050565b600260149054906101000a900460ff1615611adf57600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b1a57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b7157600080fd5b611b7a8261226e565b611b8357600080fd5b611b8e84848461362f565b50505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bed57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c2757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cc357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cfd57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611d4c83612534565b8210611d5757600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611da157fe5b9060005260206000200154905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e1057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e4a57600080fd5b611e5685858585613793565b9050949350505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f0857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611f605750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611f6957600080fd5b600260149054906101000a900460ff16611f8257600080fd5b6000600260146101000a81548160ff0219169083151502179055507fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693360405160405180910390a1565b600260149054906101000a900460ff1615611fe557600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561202057600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561207757600080fd5b6120808261226e565b61208957600080fd5b6120a484848460405180602001604052806000815250613b66565b50505050565b60006120b582613d20565b9050919050565b6000600682815481106120cb57fe5b9060005260206000209060070201600501549050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461214057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561217a57600080fd5b61218e8461218786612401565b8585613793565b90509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121f057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561222a57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60003373ffffffffffffffffffffffffffffffffffffffff1661229083612401565b73ffffffffffffffffffffffffffffffffffffffff1614806122e557503373ffffffffffffffffffffffffffffffffffffffff166122cd83611789565b73ffffffffffffffffffffffffffffffffffffffff16145b806122fe57506122fd6122f783612401565b3361359b565b5b9050919050565b6000600754821061231557600080fd5b819050919050565b6060600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561235957600080fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156123e257602002820191906000526020600020905b8154815260200190600101908083116123ce575b50505050509050919050565b600260149054906101000a900460ff1681565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561247457600080fd5b80915050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124d957600080fd5b6125298686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508585613daf565b905095945050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561256f57600080fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061266157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806126b95750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6126c257600080fd5b600260149054906101000a900460ff16156126dc57600080fd5b6001600260146101000a81548160ff0219169083151502179055507f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75260405160405180910390a1565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127cd57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806128255750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61282e57600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561286957600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128bf57600080fd5b6128c882614155565b5050565b6000600682815481106128db57fe5b906000526020600020906007020160060160009054906101000a900460ff169050919050565b60606040518060400160405280600481526020017f5245445400000000000000000000000000000000000000000000000000000000815250905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461299a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129d457600080fd5b6129de838361423f565b905092915050565b600260149054906101000a900460ff1615612a0057600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a3b57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a9257600080fd5b8115612aa657612aa183614332565b612ab0565b612aaf83614554565b5b505050565b600060068281548110612ac457fe5b9060005260206000209060070201600201549050919050565b606060068281548110612aec57fe5b90600052602060002090600702016001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b915780601f10612b6657610100808354040283529160200191612b91565b820191906000526020600020905b815481529060010190602001808311612b7457829003601f168201915b50505050509050919050565b600260149054906101000a900460ff1615612bb757600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bf257600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612c4957600080fd5b813373ffffffffffffffffffffffffffffffffffffffff16612c6a82612401565b73ffffffffffffffffffffffffffffffffffffffff1614612c8a57600080fd5b612c9533858561362f565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060068281548110612cd057fe5b9060005260206000209060070201600301549050919050565b600260149054906101000a900460ff1615612d0357600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d3e57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612d9557600080fd5b612d9e8461226e565b612da757600080fd5b612df786868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613b66565b505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e5957600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e9457600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612eeb57600080fd5b612ef482614733565b5050565b600060068281548110612f0757fe5b9060005260206000209060070201600401549050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f7c57600080fd5b612f898484600085613793565b90509392505050565b6060612f9d826128cc565b156130555761304e600d8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561303b5780601f106130105761010080835404028352916020019161303b565b820191906000526020600020905b81548152906001019060200180831161301e57829003601f168201915b50505050506130498461481e565b61494b565b9050613104565b613101600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130ee5780601f106130c3576101008083540402835291602001916130ee565b820191906000526020600020905b8154815290600101906020018083116130d157829003601f168201915b50505050506130fc8461481e565b61494b565b90505b919050565b606080613115836128cc565b61311e57600080fd5b60006005600085815260200190815260200160002080549050905060608160405190808252806020026020018201604052801561316a5781602001602082028038833980820191505090505b50905060608260405190808252806020026020018201604052801561319e5781602001602082028038833980820191505090505b50905060008090505b838110156132c7576005600088815260200190815260200160002081815481106131cd57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061320457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060046000888152602001908152602001600020600084838151811061325f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548282815181106132ae57fe5b60200260200101818152505080806001019150506131a7565b50818194509450505050915091565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461333257600080fd5b61333b836128cc565b61334457600080fd5b6000821161335157600080fd5b613382826006858154811061336257fe5b90600052602060002090600702016004015461498f90919063ffffffff16565b6006848154811061338f57fe5b9060005260206000209060070201600401819055507f05337d88b83679841d390a2fbdf3a5c88bdb06460f3975e249bafeaabfafb1fc836133cf85612401565b84604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a16001905092915050565b6000606060008060008061343c876128cc565b61344557600080fd5b61344d6154b9565b6006888154811061345a57fe5b90600052602060002090600702016040518060e001604052908160008201548152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156135165780601f106134eb57610100808354040283529160200191613516565b820191906000526020600020905b8154815290600101906020018083116134f957829003601f168201915b50505050508152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff1615151515815250509050806000015181602001518260400151836060015184608001518560a001518494509650965096509650965096505091939550919395565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561366957600080fd5b61367281612401565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136aa57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166136ca82612401565b73ffffffffffffffffffffffffffffffffffffffff16146136ea57600080fd5b6136f3816128cc565b6136fc57600080fd5b600061370782612401565b905061371381836149ae565b61371d8183614aa1565b6137278383614d1f565b613732818484614e8c565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156137ce57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561380757600080fd5b6000821161381457600080fd5b816004600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561387157600080fd5b61387a856128cc565b61388357600080fd5b6138e6826004600088815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461507890919063ffffffff16565b6004600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061399d826004600088815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461498f90919063ffffffff16565b6004600087815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139fb8584615098565b613a7757600560008681526020019081526020016000208390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b7fa75257f47ef40a14f62a43929f445734a6f637f872fc94577d76af85e26025d585613aa287612401565b868686604051808681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019550505050505060405180910390a160019050949350505050565b613b7184848461362f565b613b7a83615160565b15613d1a5760008373ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba61c3508786866040518563ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613c2a578082015181840152602081019050613c0f565b50505050905090810190601f168015613c575780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600088803b158015613c7857600080fd5b5087f1158015613c8c573d6000803e3d6000fd5b50505050506040513d6020811015613ca357600080fd5b8101908080519060200190929190505050905060405180806155ca60279139602701905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613d1857600080fd5b505b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d5b57600080fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613dea57600080fd5b6000845111613df857600080fd5b60008311613e0557600080fd5b60008211613e1257600080fd5b60006006805490509050613e246154b9565b6040518060e0016040528083815260200187815260200186815260200185815260200160008152602001428152602001600115158152509050600160068290806001815401808255809150509060018203906000526020600020906007020160009091929091909150600082015181600001556020820151816001019080519060200190613eb39291906154f8565b5060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555050505050613f63846004600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461498f90919063ffffffff16565b6004600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008381526020019081526020016000208790806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506140388783614d1f565b7fc501ac2be852a550c9c6067d077aede2499d3faa4f52b69eb0bf0c685b135e6687826000015183602001518460400151856060015186608001518760a00151604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200187815260200180602001868152602001858152602001848152602001838152602001828103825287818151815260200191508051906020019080838360005b838110156141085780820151818401526020810190506140ed565b50505050905090810190601f1680156141355780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390a18192505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561418f57600080fd5b61419881613d20565b6141a157600080fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fa0d94fc04c80f003b48a783ce73888e968d047f20aa82b15ea04a337adfdb54e60405160405180910390a250565b60008273ffffffffffffffffffffffffffffffffffffffff1661426183612401565b73ffffffffffffffffffffffffffffffffffffffff161461428157600080fd5b61428b83836149ae565b6142958383614aa1565b6000600683815481106142a457fe5b906000526020600020906007020160060160006101000a81548160ff02191690831515021790555081600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001905092915050565b600260149054906101000a900460ff161561434c57600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561438757600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156143de57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561441757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561445157600080fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c316001604051808215151515815260200191505060405180910390a35050565b600260149054906101000a900460ff161561456e57600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156145a957600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561460057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561463957600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690558173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c316000604051808215151515815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561476d57600080fd5b61477681613d20565b1561478057600080fd5b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f7f8a124e9caf40fb6766c0ef83b56076743409baa010cde8e7a972466bed1fcd60405160405180910390a250565b60606000821415614866576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614946565b600082905060005b60008214614890578080600101915050600a828161488857fe5b04915061486e565b6060816040519080825280601f01601f1916602001820160405280156148c55781602001600182028038833980820191505090505b50905060006001830390505b6000861461493e57600a86816148e357fe5b0660300160f81b828280600190039350815181106148fd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a868161493657fe5b0495506148d1565b819450505050505b919050565b60606149878383604051806020016040528060008152506040518060200160405280600081525060405180602001604052806000815250615173565b905092915050565b6000808284019050838110156149a457600080fd5b8091505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166149ce82612401565b73ffffffffffffffffffffffffffffffffffffffff16146149ee57600080fd5b6000600b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff16614ac182612401565b73ffffffffffffffffffffffffffffffffffffffff1614614ae157600080fd5b6000600a60008381526020019081526020016000205490506000614b176001614b0986612534565b61507890919063ffffffff16565b90506000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110614b6557fe5b9060005260206000200154905060006008600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110614c1057fe5b90600052602060002001819055506000600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110614c6a57fe5b9060005260206000200181905550600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003614cca9190615578565b506000600a60008681526020019081526020016000208190555082600a600083815260200190815260200160002081905550614d12600160075461507890919063ffffffff16565b6007819055505050505050565b600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614d8b57600080fd5b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000614de883612534565b9050600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505090600182039060005260206000200160009091929091909150555080600a600084815260200190815260200160002081905550614e81600160075461498f90919063ffffffff16565b600781905550505050565b60006004600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506004600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055614f98816004600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461498f90919063ffffffff16565b6004600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614ff68284615098565b61507257600560008381526020019081526020016000208390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b50505050565b60008282111561508757600080fd5b600082840390508091505092915050565b6000806000905060008090505b6005600086815260200190815260200160002080549050811015615155578373ffffffffffffffffffffffffffffffffffffffff166005600087815260200190815260200160002082815481106150f857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156151485760019150615155565b80806001019150506150a5565b508091505092915050565b600080823b905060008111915050919050565b6060808690506060869050606086905060608690506060869050606081518351855187518951010101016040519080825280601f01601f1916602001820160405280156151cf5781602001600182028038833980820191505090505b5090506060819050600080905060008090505b8851811015615250578881815181106151f757fe5b602001015160f81c60f81b83838060010194508151811061521457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506151e2565b5060008090505b87518110156152c55787818151811061526c57fe5b602001015160f81c60f81b83838060010194508151811061528957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050615257565b5060008090505b865181101561533a578681815181106152e157fe5b602001015160f81c60f81b8383806001019450815181106152fe57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506152cc565b5060008090505b85518110156153af5785818151811061535657fe5b602001015160f81c60f81b83838060010194508151811061537357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050615341565b5060008090505b8451811015615424578481815181106153cb57fe5b602001015160f81c60f81b8383806001019450815181106153e857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506153b6565b50819850505050505050505095945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061547a57803560ff19168380011785556154a8565b828001600101855582156154a8579182015b828111156154a757823582559160200191906001019061548c565b5b5090506154b591906155a4565b5090565b6040518060e001604052806000815260200160608152602001600081526020016000815260200160008152602001600081526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061553957805160ff1916838001178555615567565b82800160010185558215615567579182015b8281111561556657825182559160200191906001019061554b565b5b50905061557491906155a4565b5090565b81548183558181111561559f5781836000526020600020918201910161559e91906155a4565b5b505050565b6155c691905b808211156155c25760008160009055506001016155aa565b5090565b9056fe6f6e455243373231526563656976656428616464726573732c75696e743235362c627974657329a165627a7a72305820184266fb4e98551a636645c39347c9591c1a44597d86d9aabf8a02feaf5b19fc002968747470733a2f2f646f632e726564697475732e636f2e6b722f3f646f6369643d
Deployed Bytecode
0x60806040526004361061027d5760003560e01c80636352211e1161014f578063a9059cbb116100c1578063c4defb091161007a578063c4defb091461127f578063c87b56dd146112fc578063ce696ca5146113b0578063d86ac8d714611488578063e532b01b146114e5578063e985e9c5146115bc5761027d565b8063a9059cbb14611028578063b047fb5014611076578063b341e6be146110cd578063b88d4fde1461111c578063bfcb9079146111df578063c0885af8146112305761027d565b8063939a518b11610113578063939a518b14610d7257806395d89b4114610dc55780639dc29fac14610e55578063a22cb46514610ec8578063a34b041414610f25578063a603644314610f745761027d565b80636352211e14610b5c5780636b08e00014610bd757806370a0823114610ca55780638456cb5914610d0a5780638622878d14610d215761027d565b80632f745c59116101f35780634cc028aa116101ac5780634cc028aa146109175780634e0a3379146109945780634eae8e30146109e55780634f6ccce714610a385780635a3f267214610a875780635c975abb14610b2d5761027d565b80632f745c59146106ce57806332f67cc81461073d5780633f4ba83a146107da57806342842e0e146107f157806344c22b581461085f57806348263272146108c85761027d565b80630a0f8168116102455780630a0f8168146104b657806318160ddd1461050d5780631e20363a1461053857806323b872dd146105be57806327d7874c1461062c5780632ba73c151461067d5761027d565b806301ffc9a7146102945780630519ce791461030657806306fdde031461035d578063081812fc146103ed578063095ea7b314610468575b34801561028957600080fd5b50600061029257fe5b005b3480156102a057600080fd5b506102ec600480360360208110156102b757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611645565b604051808215151515815260200191505060405180910390f35b34801561031257600080fd5b5061031b611726565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561036957600080fd5b5061037261174c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b2578082015181840152602081019050610397565b50505050905090810190601f1680156103df5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f957600080fd5b506104266004803603602081101561041057600080fd5b8101908080359060200190929190505050611789565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104b46004803603604081101561047e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117c6565b005b3480156104c257600080fd5b506104cb611a26565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561051957600080fd5b50610522611a4b565b6040518082815260200191505060405180910390f35b34801561054457600080fd5b506105bc6004803603602081101561055b57600080fd5b810190808035906020019064010000000081111561057857600080fd5b82018360208201111561058a57600080fd5b803590602001918460018302840111640100000000831117156105ac57600080fd5b9091929391929390505050611a55565b005b61062a600480360360608110156105d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ac5565b005b34801561063857600080fd5b5061067b6004803603602081101561064f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b94565b005b34801561068957600080fd5b506106cc600480360360208110156106a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c6a565b005b3480156106da57600080fd5b50610727600480360360408110156106f157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d41565b6040518082815260200191505060405180910390f35b34801561074957600080fd5b506107c06004803603608081101561076057600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611db4565b604051808215151515815260200191505060405180910390f35b3480156107e657600080fd5b506107ef611e60565b005b61085d6004803603606081101561080757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611fcb565b005b34801561086b57600080fd5b506108ae6004803603602081101561088257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120aa565b604051808215151515815260200191505060405180910390f35b3480156108d457600080fd5b50610901600480360360208110156108eb57600080fd5b81019080803590602001909291905050506120bc565b6040518082815260200191505060405180910390f35b34801561092357600080fd5b5061097a6004803603606081101561093a57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120e4565b604051808215151515815260200191505060405180910390f35b3480156109a057600080fd5b506109e3600480360360208110156109b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612197565b005b3480156109f157600080fd5b50610a1e60048036036020811015610a0857600080fd5b810190808035906020019092919050505061226e565b604051808215151515815260200191505060405180910390f35b348015610a4457600080fd5b50610a7160048036036020811015610a5b57600080fd5b8101908080359060200190929190505050612305565b6040518082815260200191505060405180910390f35b348015610a9357600080fd5b50610ad660048036036020811015610aaa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061231d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b19578082015181840152602081019050610afe565b505050509050019250505060405180910390f35b348015610b3957600080fd5b50610b426123ee565b604051808215151515815260200191505060405180910390f35b348015610b6857600080fd5b50610b9560048036036020811015610b7f57600080fd5b8101908080359060200190929190505050612401565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610be357600080fd5b50610c8f60048036036080811015610bfa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c3757600080fd5b820183602082011115610c4957600080fd5b80359060200191846001830284011164010000000083111715610c6b57600080fd5b9091929391929390803590602001909291908035906020019092919050505061247d565b6040518082815260200191505060405180910390f35b348015610cb157600080fd5b50610cf460048036036020811015610cc857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612534565b6040518082815260200191505060405180910390f35b348015610d1657600080fd5b50610d1f6125b9565b005b348015610d2d57600080fd5b50610d7060048036036020811015610d4457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612725565b005b348015610d7e57600080fd5b50610dab60048036036020811015610d9557600080fd5b81019080803590602001909291905050506128cc565b604051808215151515815260200191505060405180910390f35b348015610dd157600080fd5b50610dda612901565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1a578082015181840152602081019050610dff565b50505050905090810190601f168015610e475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e6157600080fd5b50610eae60048036036040811015610e7857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061293e565b604051808215151515815260200191505060405180910390f35b348015610ed457600080fd5b50610f2360048036036040811015610eeb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129e6565b005b348015610f3157600080fd5b50610f5e60048036036020811015610f4857600080fd5b8101908080359060200190929190505050612ab5565b6040518082815260200191505060405180910390f35b348015610f8057600080fd5b50610fad60048036036020811015610f9757600080fd5b8101908080359060200190929190505050612add565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610fed578082015181840152602081019050610fd2565b50505050905090810190601f16801561101a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6110746004803603604081101561103e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612b9d565b005b34801561108257600080fd5b5061108b612c9b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156110d957600080fd5b50611106600480360360208110156110f057600080fd5b8101908080359060200190929190505050612cc1565b6040518082815260200191505060405180910390f35b6111dd6004803603608081101561113257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561119957600080fd5b8201836020820111156111ab57600080fd5b803590602001918460018302840111640100000000831117156111cd57600080fd5b9091929391929390505050612ce9565b005b3480156111eb57600080fd5b5061122e6004803603602081101561120257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612dff565b005b34801561123c57600080fd5b506112696004803603602081101561125357600080fd5b8101908080359060200190929190505050612ef8565b6040518082815260200191505060405180910390f35b34801561128b57600080fd5b506112e2600480360360608110156112a257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612f20565b604051808215151515815260200191505060405180910390f35b34801561130857600080fd5b506113356004803603602081101561131f57600080fd5b8101908080359060200190929190505050612f92565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561137557808201518184015260208101905061135a565b50505050905090810190601f1680156113a25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156113bc57600080fd5b506113e9600480360360208110156113d357600080fd5b8101908080359060200190929190505050613109565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015611430578082015181840152602081019050611415565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015611472578082015181840152602081019050611457565b5050505090500194505050505060405180910390f35b34801561149457600080fd5b506114cb600480360360408110156114ab57600080fd5b8101908080359060200190929190803590602001909291905050506132d6565b604051808215151515815260200191505060405180910390f35b3480156114f157600080fd5b5061151e6004803603602081101561150857600080fd5b8101908080359060200190929190505050613429565b6040518087815260200180602001868152602001858152602001848152602001838152602001828103825287818151815260200191508051906020019080838360005b8381101561157c578082015181840152602081019050611561565b50505050905090810190601f1680156115a95780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b3480156115c857600080fd5b5061162b600480360360408110156115df57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061359b565b604051808215151515815260200191505060405180910390f35b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116bf5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806116ef57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061171f575063780e9d6360e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606040518060400160405280600881526020017f526564546f6b656e000000000000000000000000000000000000000000000000815250905090565b6000600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600260149054906101000a900460ff16156117e057600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181b57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561187257600080fd5b813373ffffffffffffffffffffffffffffffffffffffff1661189382612401565b73ffffffffffffffffffffffffffffffffffffffff16146118b357600080fd5b6118bc83612401565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156118f457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1661191584611789565b73ffffffffffffffffffffffffffffffffffffffff161415806119655750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611a205783600b600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff166119dd85612401565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b50505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600754905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611aaf57600080fd5b8181600d9190611ac0929190615439565b505050565b600260149054906101000a900460ff1615611adf57600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b1a57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611b7157600080fd5b611b7a8261226e565b611b8357600080fd5b611b8e84848461362f565b50505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bed57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c2757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cc357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cfd57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611d4c83612534565b8210611d5757600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611da157fe5b9060005260206000200154905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e1057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e4a57600080fd5b611e5685858585613793565b9050949350505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f0857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611f605750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611f6957600080fd5b600260149054906101000a900460ff16611f8257600080fd5b6000600260146101000a81548160ff0219169083151502179055507fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693360405160405180910390a1565b600260149054906101000a900460ff1615611fe557600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561202057600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561207757600080fd5b6120808261226e565b61208957600080fd5b6120a484848460405180602001604052806000815250613b66565b50505050565b60006120b582613d20565b9050919050565b6000600682815481106120cb57fe5b9060005260206000209060070201600501549050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461214057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561217a57600080fd5b61218e8461218786612401565b8585613793565b90509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121f057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561222a57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60003373ffffffffffffffffffffffffffffffffffffffff1661229083612401565b73ffffffffffffffffffffffffffffffffffffffff1614806122e557503373ffffffffffffffffffffffffffffffffffffffff166122cd83611789565b73ffffffffffffffffffffffffffffffffffffffff16145b806122fe57506122fd6122f783612401565b3361359b565b5b9050919050565b6000600754821061231557600080fd5b819050919050565b6060600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561235957600080fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806020026020016040519081016040528092919081815260200182805480156123e257602002820191906000526020600020905b8154815260200190600101908083116123ce575b50505050509050919050565b600260149054906101000a900460ff1681565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561247457600080fd5b80915050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146124d957600080fd5b6125298686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508585613daf565b905095945050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561256f57600080fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061266157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806126b95750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6126c257600080fd5b600260149054906101000a900460ff16156126dc57600080fd5b6001600260146101000a81548160ff0219169083151502179055507f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75260405160405180910390a1565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806127cd57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806128255750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61282e57600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561286957600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166128bf57600080fd5b6128c882614155565b5050565b6000600682815481106128db57fe5b906000526020600020906007020160060160009054906101000a900460ff169050919050565b60606040518060400160405280600481526020017f5245445400000000000000000000000000000000000000000000000000000000815250905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461299a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129d457600080fd5b6129de838361423f565b905092915050565b600260149054906101000a900460ff1615612a0057600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a3b57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612a9257600080fd5b8115612aa657612aa183614332565b612ab0565b612aaf83614554565b5b505050565b600060068281548110612ac457fe5b9060005260206000209060070201600201549050919050565b606060068281548110612aec57fe5b90600052602060002090600702016001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612b915780601f10612b6657610100808354040283529160200191612b91565b820191906000526020600020905b815481529060010190602001808311612b7457829003601f168201915b50505050509050919050565b600260149054906101000a900460ff1615612bb757600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612bf257600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612c4957600080fd5b813373ffffffffffffffffffffffffffffffffffffffff16612c6a82612401565b73ffffffffffffffffffffffffffffffffffffffff1614612c8a57600080fd5b612c9533858561362f565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060068281548110612cd057fe5b9060005260206000209060070201600301549050919050565b600260149054906101000a900460ff1615612d0357600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d3e57600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612d9557600080fd5b612d9e8461226e565b612da757600080fd5b612df786868686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613b66565b505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e5957600080fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612e9457600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612eeb57600080fd5b612ef482614733565b5050565b600060068281548110612f0757fe5b9060005260206000209060070201600401549050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f7c57600080fd5b612f898484600085613793565b90509392505050565b6060612f9d826128cc565b156130555761304e600d8054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561303b5780601f106130105761010080835404028352916020019161303b565b820191906000526020600020905b81548152906001019060200180831161301e57829003601f168201915b50505050506130498461481e565b61494b565b9050613104565b613101600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156130ee5780601f106130c3576101008083540402835291602001916130ee565b820191906000526020600020905b8154815290600101906020018083116130d157829003601f168201915b50505050506130fc8461481e565b61494b565b90505b919050565b606080613115836128cc565b61311e57600080fd5b60006005600085815260200190815260200160002080549050905060608160405190808252806020026020018201604052801561316a5781602001602082028038833980820191505090505b50905060608260405190808252806020026020018201604052801561319e5781602001602082028038833980820191505090505b50905060008090505b838110156132c7576005600088815260200190815260200160002081815481106131cd57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061320457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060046000888152602001908152602001600020600084838151811061325f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548282815181106132ae57fe5b60200260200101818152505080806001019150506131a7565b50818194509450505050915091565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461333257600080fd5b61333b836128cc565b61334457600080fd5b6000821161335157600080fd5b613382826006858154811061336257fe5b90600052602060002090600702016004015461498f90919063ffffffff16565b6006848154811061338f57fe5b9060005260206000209060070201600401819055507f05337d88b83679841d390a2fbdf3a5c88bdb06460f3975e249bafeaabfafb1fc836133cf85612401565b84604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a16001905092915050565b6000606060008060008061343c876128cc565b61344557600080fd5b61344d6154b9565b6006888154811061345a57fe5b90600052602060002090600702016040518060e001604052908160008201548152602001600182018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156135165780601f106134eb57610100808354040283529160200191613516565b820191906000526020600020905b8154815290600101906020018083116134f957829003601f168201915b50505050508152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff1615151515815250509050806000015181602001518260400151836060015184608001518560a001518494509650965096509650965096505091939550919395565b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561366957600080fd5b61367281612401565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136aa57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166136ca82612401565b73ffffffffffffffffffffffffffffffffffffffff16146136ea57600080fd5b6136f3816128cc565b6136fc57600080fd5b600061370782612401565b905061371381836149ae565b61371d8183614aa1565b6137278383614d1f565b613732818484614e8c565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156137ce57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561380757600080fd5b6000821161381457600080fd5b816004600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561387157600080fd5b61387a856128cc565b61388357600080fd5b6138e6826004600088815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461507890919063ffffffff16565b6004600087815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061399d826004600088815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461498f90919063ffffffff16565b6004600087815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139fb8584615098565b613a7757600560008681526020019081526020016000208390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b7fa75257f47ef40a14f62a43929f445734a6f637f872fc94577d76af85e26025d585613aa287612401565b868686604051808681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019550505050505060405180910390a160019050949350505050565b613b7184848461362f565b613b7a83615160565b15613d1a5760008373ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba61c3508786866040518563ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613c2a578082015181840152602081019050613c0f565b50505050905090810190601f168015613c575780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600088803b158015613c7857600080fd5b5087f1158015613c8c573d6000803e3d6000fd5b50505050506040513d6020811015613ca357600080fd5b8101908080519060200190929190505050905060405180806155ca60279139602701905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613d1857600080fd5b505b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d5b57600080fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613dea57600080fd5b6000845111613df857600080fd5b60008311613e0557600080fd5b60008211613e1257600080fd5b60006006805490509050613e246154b9565b6040518060e0016040528083815260200187815260200186815260200185815260200160008152602001428152602001600115158152509050600160068290806001815401808255809150509060018203906000526020600020906007020160009091929091909150600082015181600001556020820151816001019080519060200190613eb39291906154f8565b5060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555050505050613f63846004600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461498f90919063ffffffff16565b6004600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560008381526020019081526020016000208790806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506140388783614d1f565b7fc501ac2be852a550c9c6067d077aede2499d3faa4f52b69eb0bf0c685b135e6687826000015183602001518460400151856060015186608001518760a00151604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200187815260200180602001868152602001858152602001848152602001838152602001828103825287818151815260200191508051906020019080838360005b838110156141085780820151818401526020810190506140ed565b50505050905090810190601f1680156141355780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390a18192505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561418f57600080fd5b61419881613d20565b6141a157600080fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fa0d94fc04c80f003b48a783ce73888e968d047f20aa82b15ea04a337adfdb54e60405160405180910390a250565b60008273ffffffffffffffffffffffffffffffffffffffff1661426183612401565b73ffffffffffffffffffffffffffffffffffffffff161461428157600080fd5b61428b83836149ae565b6142958383614aa1565b6000600683815481106142a457fe5b906000526020600020906007020160060160006101000a81548160ff02191690831515021790555081600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001905092915050565b600260149054906101000a900460ff161561434c57600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561438757600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156143de57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561441757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561445157600080fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c316001604051808215151515815260200191505060405180910390a35050565b600260149054906101000a900460ff161561456e57600080fd5b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156145a957600080fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561460057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561463957600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690558173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c316000604051808215151515815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561476d57600080fd5b61477681613d20565b1561478057600080fd5b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f7f8a124e9caf40fb6766c0ef83b56076743409baa010cde8e7a972466bed1fcd60405160405180910390a250565b60606000821415614866576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050614946565b600082905060005b60008214614890578080600101915050600a828161488857fe5b04915061486e565b6060816040519080825280601f01601f1916602001820160405280156148c55781602001600182028038833980820191505090505b50905060006001830390505b6000861461493e57600a86816148e357fe5b0660300160f81b828280600190039350815181106148fd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a868161493657fe5b0495506148d1565b819450505050505b919050565b60606149878383604051806020016040528060008152506040518060200160405280600081525060405180602001604052806000815250615173565b905092915050565b6000808284019050838110156149a457600080fd5b8091505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166149ce82612401565b73ffffffffffffffffffffffffffffffffffffffff16146149ee57600080fd5b6000600b600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff16614ac182612401565b73ffffffffffffffffffffffffffffffffffffffff1614614ae157600080fd5b6000600a60008381526020019081526020016000205490506000614b176001614b0986612534565b61507890919063ffffffff16565b90506000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110614b6557fe5b9060005260206000200154905060006008600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110614c1057fe5b90600052602060002001819055506000600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110614c6a57fe5b9060005260206000200181905550600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003614cca9190615578565b506000600a60008681526020019081526020016000208190555082600a600083815260200190815260200160002081905550614d12600160075461507890919063ffffffff16565b6007819055505050505050565b600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614d8b57600080fd5b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000614de883612534565b9050600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505090600182039060005260206000200160009091929091909150555080600a600084815260200190815260200160002081905550614e81600160075461498f90919063ffffffff16565b600781905550505050565b60006004600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506004600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055614f98816004600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461498f90919063ffffffff16565b6004600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614ff68284615098565b61507257600560008381526020019081526020016000208390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b50505050565b60008282111561508757600080fd5b600082840390508091505092915050565b6000806000905060008090505b6005600086815260200190815260200160002080549050811015615155578373ffffffffffffffffffffffffffffffffffffffff166005600087815260200190815260200160002082815481106150f857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156151485760019150615155565b80806001019150506150a5565b508091505092915050565b600080823b905060008111915050919050565b6060808690506060869050606086905060608690506060869050606081518351855187518951010101016040519080825280601f01601f1916602001820160405280156151cf5781602001600182028038833980820191505090505b5090506060819050600080905060008090505b8851811015615250578881815181106151f757fe5b602001015160f81c60f81b83838060010194508151811061521457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506151e2565b5060008090505b87518110156152c55787818151811061526c57fe5b602001015160f81c60f81b83838060010194508151811061528957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050615257565b5060008090505b865181101561533a578681815181106152e157fe5b602001015160f81c60f81b8383806001019450815181106152fe57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506152cc565b5060008090505b85518110156153af5785818151811061535657fe5b602001015160f81c60f81b83838060010194508151811061537357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050615341565b5060008090505b8451811015615424578481815181106153cb57fe5b602001015160f81c60f81b8383806001019450815181106153e857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506153b6565b50819850505050505050505095945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061547a57803560ff19168380011785556154a8565b828001600101855582156154a8579182015b828111156154a757823582559160200191906001019061548c565b5b5090506154b591906155a4565b5090565b6040518060e001604052806000815260200160608152602001600081526020016000815260200160008152602001600081526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061553957805160ff1916838001178555615567565b82800160010185558215615567579182015b8281111561556657825182559160200191906001019061554b565b5b50905061557491906155a4565b5090565b81548183558181111561559f5781836000526020600020918201910161559e91906155a4565b5b505050565b6155c691905b808211156155c25760008160009055506001016155aa565b5090565b9056fe6f6e455243373231526563656976656428616464726573732c75696e743235362c627974657329a165627a7a72305820184266fb4e98551a636645c39347c9591c1a44597d86d9aabf8a02feaf5b19fc0029
Swarm Source
bzzr://184266fb4e98551a636645c39347c9591c1a44597d86d9aabf8a02feaf5b19fc
Loading...
Loading
Loading...
Loading
[ 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.