ETH Price: $2,634.50 (+6.74%)

Token

Fysical (FYS)
 

Overview

Max Total Supply

1,000,000,000 FYS

Holders

5,608

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Fysical

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-02-28
*/

pragma solidity ^0.4.13;

contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

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

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

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

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

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

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
    return true;
  }

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

}

contract StandardToken is ERC20, BasicToken {

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


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

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

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

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

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

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

}

contract Fysical is StandardToken {
    using SafeMath for uint256;

    // To increase consistency and reduce the opportunity for human error, the '*sById' mappings, '*Count' values,
    // 'get*ById' function declarations/implementations, and 'create*' function declarations/implementations have been
    // programmatically-generated based on the each struct's name, member types/names, and the comments sharing a line
    // with a member.
    //
    // This programmatic generation builds 'require' function calls based on the following rules:
    //      - 'string' values must have length > 0
    //      - 'bytes' and uint256[] values may have any length
    //      - 'uint256' values representing a quantity must be > 0 (identifiers and Ethereum block numbers do not represent a quantity)
    //
    // The implementation of 'createProposal' contains one operation not found in the other programmatically-generated
    // 'create*' functions, a call to 'transferTokensToEscrow'.
    //
    // None of the other members or functions have been programmatically generated.

    // See https://en.wikipedia.org/wiki/Uniform_Resource_Identifier.
    // The risk of preventing support for a future addition to the URI syntax outweighs the benefit of validating URI
    // values within this immutable smart contract, so readers of Uri values should expect values that do not conform
    // to the formal syntax of a URI.
    struct Uri {
        string value;
    }

    // A set of URIs may describe multiple methods to access a particular resource.
    struct UriSet {
        uint256[] uniqueUriIdsSortedAscending;    // each value must be key in 'urisById'
    }

    // See https://en.wikipedia.org/wiki/Checksum#Algorithms. The description of the algorithm referred to by each URI
    // in the set should give a reader enough information to interpret the 'value' member of a 'Checksum' object
    // referring to this algorithm object.
    struct ChecksumAlgorithm {
        uint256 descriptionUriSetId;    // must be key in 'uriSetsById'
    }

    // See https://en.wikipedia.org/wiki/Checksum. The 'resourceByteCount' indicates the number of bytes contained in
    // the resource. Though this is not strictly part of most common Checksum algorithms, its validation may also be
    // useful. The 'value' field should contain the expected output of passing the resource content to the checksum
    // algorithm.
    struct Checksum {
        uint256 algorithmId; // must be key in 'checksumAlgorithmsById'
        uint256 resourceByteCount;
        bytes value;
    }

    // See https://en.wikipedia.org/wiki/Encryption. The description of the algorithm referred to by each URI
    // in the set should give a reader enough information to access the content of an encrypted resource. The algorithm
    // may be a symmetric encryption algorithm or an asymmetric encryption algorithm
    struct EncryptionAlgorithm {
        uint256 descriptionUriSetId;    // must be key in 'uriSetsById'
    }

    // For each resource, an Ethereum account may describe a checksum for the encrypted content of a resource and a
    // checksum for the decrypted content of a resource. When the resource is encrypted with a null encryption
    // algorithm, the resource is effectively unencrypted, so these two checksums should be identical
    // (See https://en.wikipedia.org/wiki/Null_encryption).
    struct ChecksumPair {
        uint256 encryptedChecksumId; // must be key in 'checksumsById'
        uint256 decryptedChecksumId; // must be key in 'checksumsById'
    }

    // A 'Resource' is content accessible with each URI referenced in the 'uriSetId'. This content should be
    // encrypted with the algorithm described by the 'EncryptionAlgorithm' referenced in 'encryptionAlgorithmId'. Each
    // resource referenced in 'metaResourceSetId' should describe the decrypted content in some way.
    //
    // For example, if the decrypted content conforms to a Protocol Buffers schema, the corresponding proto definition
    // file should be included in the meta-resources. Likewise, that proto definition resource should refer to a
    // resource like https://en.wikipedia.org/wiki/Protocol_Buffers among its meta-resources.
    struct Resource {
        uint256 uriSetId;                // must be key in 'uriSetsById'
        uint256 encryptionAlgorithmId;   // must be key in 'encryptionAlgorithmsById'
        uint256 metaResourceSetId;       // must be key in 'resourceSetsById'
    }

    // See https://en.wikipedia.org/wiki/Public-key_cryptography. This value should be the public key used in an
    // asymmetric encryption operation. It should be useful for encrypting an resource destined for the holder of the
    // corresponding private key or for decrypting a resource encrypted with the corresponding private key.
    struct PublicKey {
        bytes value;
    }

    // A 'ResourceSet' groups together resources that may be part of a trade proposal involving Fysical tokens. The
    // creator of a 'ResourceSet' must include a public key for use in the encryption operations of creating and
    // accepting a trade proposal. The creator must also specify the encryption algorithm a proposal creator should
    // use along with this resource set creator's public key. Just as a single resource may have meta-resources
    // describing the content of a resource, a 'ResourceSet' may have resources describing the whole resource set.
    //
    // Creators should be careful to not include so many resources that an Ethereum transaction to accept a proposal
    // might run out of gas while storing the corresponding encrypted decryption keys.
    //
    // While developing reasonable filters for un-useful data in this collection, developers should choose a practical
    // maximum depth of traversal through the meta-resources, since an infinite loop is possible.
    struct ResourceSet {
        address creator;
        uint256 creatorPublicKeyId;                     // must be key in 'publicKeysById'
        uint256 proposalEncryptionAlgorithmId;          // must be key in 'encryptionAlgorithmsById'
        uint256[] uniqueResourceIdsSortedAscending;     // each value must be key in 'resourcesById'
        uint256 metaResourceSetId;                      // must be key in 'resourceSetsById'
    }

    // The creator of a trade proposal may include arbitrary content to be considered part of the agreement the
    // resource set is accepting. This may be useful for license agreements to be enforced within a jurisdiction
    // governing the trade partners. The content available through each URI in the set should be encrypted first with
    // the public key of a resource set's creator and then with the private key of a proposal's creator.
    struct Agreement {
        uint256 uriSetId;           // must be key in 'uriSetsById'
        uint256 checksumPairId;     // must be key in 'checksumPairsById'
    }

    // Many agreements may be grouped together in an 'AgreementSet'
    struct AgreementSet {
        uint256[] uniqueAgreementIdsSortedAscending; // each value must be key in 'agreementsById'
    }

    // A 'TokenTransfer' describes a transfer of tokens to occur between two Ethereum accounts.
    struct TokenTransfer {
        address source;
        address destination;
        uint256 tokenCount;
    }

    // Many token transfers may be grouped together in a "TokenTransferSet'
    struct TokenTransferSet {
        uint256[] uniqueTokenTransferIdsSortedAscending; // each value must be key in 'tokenTransfersById'
    }

    // A 'Proposal' describes the conditions for the atomic exchange of Fysical tokens and a keys to decrypt resources
    // in a resource set. The creator must specify the asymmetric encryption algorithm for use when accepting the
    // proposal, along with this creator's public key. The creator may specify arbitrary agreements that should be
    // considered a condition of the trade.
    //
    // During the execution of 'createProposal', the count of tokens specified in each token transfer will be transfered
    // from the specified source account to the account with the Ethereum address of 0. When the proposal state changes
    // to a final state, these tokens will be returned to the source accounts or tranfserred to the destination account.
    //
    // By including a 'minimumBlockNumberForWithdrawal' value later than the current Ethereum block, the proposal
    // creator can give the resource set creator a rough sense of how long the proposal will remain certainly
    // acceptable. This is particularly useful because the execution of an Ethereum transaction to accept a proposal
    // exposes the encrypted decryption keys to the Ethereum network regardless of whether the transaction succeeds.
    // Within the time frame that a proposal acceptance transaction will certainly succeed, the resource creator need
    // not be concerned with the possibility that an acceptance transaction might execute after a proposal withdrawal
    // submitted to the Ethereum network at approximately the same time.
    struct Proposal {
        uint256 minimumBlockNumberForWithdrawal;
        address creator;
        uint256 creatorPublicKeyId;                 // must be key in 'publicKeysById'
        uint256 acceptanceEncryptionAlgorithmId;    // must be key in 'encryptionAlgorithmsById'
        uint256 resourceSetId;                      // must be key in 'resourceSetsById'
        uint256 agreementSetId;                     // must be key in 'agreementSetsById'
        uint256 tokenTransferSetId;                 // must be key in 'tokenTransferSetsById'
    }

    // When created, the proposal is in the 'Pending' state. All other states are final states, so a proposal may change
    // state exactly one time based on a call to 'withdrawProposal', 'acceptProposal', or 'rejectProposal'.
    enum ProposalState {
        Pending,
        WithdrawnByCreator,
        RejectedByResourceSetCreator,
        AcceptedByResourceSetCreator
    }

    // solium would warn "Constant name 'name' doesn't follow the UPPER_CASE notation", but this public constant is
    // recommended by https://theethereum.wiki/w/index.php/ERC20_Token_Standard, so we'll disable warnings for the line.
    //
    /* solium-disable-next-line */
    string public constant name = "Fysical";

    // solium would warn "Constant name 'symbol' doesn't follow the UPPER_CASE notation", but this public constant is
    // recommended by https://theethereum.wiki/w/index.php/ERC20_Token_Standard, so we'll disable warnings for the line.
    //
    /* solium-disable-next-line */
    string public constant symbol = "FYS";

    // solium would warn "Constant name 'decimals' doesn't follow the UPPER_CASE notation", but this public constant is
    // recommended by https://theethereum.wiki/w/index.php/ERC20_Token_Standard, so we'll disable warnings for the line.
    //
    /* solium-disable-next-line */
    uint8 public constant decimals = 9;

    uint256 public constant ONE_BILLION = 1000000000;
    uint256 public constant ONE_QUINTILLION = 1000000000000000000;

    // See https://en.wikipedia.org/wiki/9,223,372,036,854,775,807
    uint256 public constant MAXIMUM_64_BIT_SIGNED_INTEGER_VALUE = 9223372036854775807;

    uint256 public constant EMPTY_PUBLIC_KEY_ID = 0;
    uint256 public constant NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_ID = 0;
    uint256 public constant NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_SET_ID = 0;
    uint256 public constant NULL_ENCRYPTION_ALGORITHM_ID = 0;
    uint256 public constant EMPTY_RESOURCE_SET_ID = 0;

    mapping(uint256 => Uri) internal urisById;
    uint256 internal uriCount = 0;

    mapping(uint256 => UriSet) internal uriSetsById;
    uint256 internal uriSetCount = 0;

    mapping(uint256 => ChecksumAlgorithm) internal checksumAlgorithmsById;
    uint256 internal checksumAlgorithmCount = 0;

    mapping(uint256 => Checksum) internal checksumsById;
    uint256 internal checksumCount = 0;

    mapping(uint256 => EncryptionAlgorithm) internal encryptionAlgorithmsById;
    uint256 internal encryptionAlgorithmCount = 0;

    mapping(uint256 => ChecksumPair) internal checksumPairsById;
    uint256 internal checksumPairCount = 0;

    mapping(uint256 => Resource) internal resourcesById;
    uint256 internal resourceCount = 0;

    mapping(uint256 => PublicKey) internal publicKeysById;
    uint256 internal publicKeyCount = 0;

    mapping(uint256 => ResourceSet) internal resourceSetsById;
    uint256 internal resourceSetCount = 0;

    mapping(uint256 => Agreement) internal agreementsById;
    uint256 internal agreementCount = 0;

    mapping(uint256 => AgreementSet) internal agreementSetsById;
    uint256 internal agreementSetCount = 0;

    mapping(uint256 => TokenTransfer) internal tokenTransfersById;
    uint256 internal tokenTransferCount = 0;

    mapping(uint256 => TokenTransferSet) internal tokenTransferSetsById;
    uint256 internal tokenTransferSetCount = 0;

    mapping(uint256 => Proposal) internal proposalsById;
    uint256 internal proposalCount = 0;

    mapping(uint256 => ProposalState) internal statesByProposalId;

    mapping(uint256 => mapping(uint256 => bytes)) internal encryptedDecryptionKeysByProposalIdAndResourceId;

    mapping(address => mapping(uint256 => bool)) internal checksumPairAssignmentsByCreatorAndResourceId;

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

    function Fysical() public {
        assert(ProposalState(0) == ProposalState.Pending);

        // The total number of Fysical tokens is intended to be one billion, with the ability to express values with
        // nine decimals places of precision. The token values passed in ERC20 functions and operations involving
        // TokenTransfer operations must be counts of nano-Fysical tokens (one billionth of one Fysical token).
        //
        // See the initialization of the total supply in https://theethereum.wiki/w/index.php/ERC20_Token_Standard.

        assert(0 < ONE_BILLION);
        assert(0 < ONE_QUINTILLION);
        assert(MAXIMUM_64_BIT_SIGNED_INTEGER_VALUE > ONE_BILLION);
        assert(MAXIMUM_64_BIT_SIGNED_INTEGER_VALUE > ONE_QUINTILLION);
        assert(ONE_BILLION == uint256(10)**decimals);
        assert(ONE_QUINTILLION == ONE_BILLION.mul(ONE_BILLION));

        totalSupply_ = ONE_QUINTILLION;

        balances[msg.sender] = totalSupply_;

        // From "https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#transfer-1" on 2018-02-08 (commit cea1db05a3444870132ec3cb7dd78a244cba1805):
        //  "A token contract which creates new tokens SHOULD trigger a Transfer event with the _from address set to 0x0 when tokens are created."
        Transfer(0x0, msg.sender, balances[msg.sender]);

        // This mimics the behavior of the 'createPublicKey' external function.
        assert(EMPTY_PUBLIC_KEY_ID == publicKeyCount);
        publicKeysById[EMPTY_PUBLIC_KEY_ID] = PublicKey(new bytes(0));
        publicKeyCount = publicKeyCount.add(1);
        assert(1 == publicKeyCount);

        // This mimics the behavior of the 'createUri' external function.
        assert(NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_ID == uriCount);
        urisById[NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_ID] = Uri("https://en.wikipedia.org/wiki/Null_encryption");
        uriCount = uriCount.add(1);
        assert(1 == uriCount);

        // This mimics the behavior of the 'createUriSet' external function.
        assert(NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_SET_ID == uriSetCount);
        uint256[] memory uniqueIdsSortedAscending = new uint256[](1);
        uniqueIdsSortedAscending[0] = NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_ID;
        validateIdSet(uniqueIdsSortedAscending, uriCount);
        uriSetsById[NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_SET_ID] = UriSet(uniqueIdsSortedAscending);
        uriSetCount = uriSetCount.add(1);
        assert(1 == uriSetCount);

        // This mimics the behavior of the 'createEncryptionAlgorithm' external function.
        assert(NULL_ENCRYPTION_ALGORITHM_ID == encryptionAlgorithmCount);
        encryptionAlgorithmsById[NULL_ENCRYPTION_ALGORITHM_ID] = EncryptionAlgorithm(NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_SET_ID);
        encryptionAlgorithmCount = encryptionAlgorithmCount.add(1);
        assert(1 == encryptionAlgorithmCount);

        // This mimics the behavior of the 'createResourceSet' external function, but allows for a self-reference in
        // the assignment of the 'metaResourceSetId' member, which the function would prohibit.
        assert(EMPTY_RESOURCE_SET_ID == resourceSetCount);
        resourceSetsById[EMPTY_RESOURCE_SET_ID] = ResourceSet(
            msg.sender,
            EMPTY_PUBLIC_KEY_ID,
            NULL_ENCRYPTION_ALGORITHM_ID,
            new uint256[](0),
            EMPTY_RESOURCE_SET_ID
        );
        resourceSetCount = resourceSetCount.add(1);
        assert(1 == resourceSetCount);
    }

    function getUriCount() external view returns (uint256) {
        return uriCount;
    }

    function getUriById(uint256 id) external view returns (string) {
        require(id < uriCount);

        Uri memory object = urisById[id];
        return object.value;
    }

    function getUriSetCount() external view returns (uint256) {
        return uriSetCount;
    }

    function getUriSetById(uint256 id) external view returns (uint256[]) {
        require(id < uriSetCount);

        UriSet memory object = uriSetsById[id];
        return object.uniqueUriIdsSortedAscending;
    }

    function getChecksumAlgorithmCount() external view returns (uint256) {
        return checksumAlgorithmCount;
    }

    function getChecksumAlgorithmById(uint256 id) external view returns (uint256) {
        require(id < checksumAlgorithmCount);

        ChecksumAlgorithm memory object = checksumAlgorithmsById[id];
        return object.descriptionUriSetId;
    }

    function getChecksumCount() external view returns (uint256) {
        return checksumCount;
    }

    function getChecksumById(uint256 id) external view returns (uint256, uint256, bytes) {
        require(id < checksumCount);

        Checksum memory object = checksumsById[id];
        return (object.algorithmId, object.resourceByteCount, object.value);
    }

    function getEncryptionAlgorithmCount() external view returns (uint256) {
        return encryptionAlgorithmCount;
    }

    function getEncryptionAlgorithmById(uint256 id) external view returns (uint256) {
        require(id < encryptionAlgorithmCount);

        EncryptionAlgorithm memory object = encryptionAlgorithmsById[id];
        return object.descriptionUriSetId;
    }

    function getChecksumPairCount() external view returns (uint256) {
        return checksumPairCount;
    }

    function getChecksumPairById(uint256 id) external view returns (uint256, uint256) {
        require(id < checksumPairCount);

        ChecksumPair memory object = checksumPairsById[id];
        return (object.encryptedChecksumId, object.decryptedChecksumId);
    }

    function getResourceCount() external view returns (uint256) {
        return resourceCount;
    }

    function getResourceById(uint256 id) external view returns (uint256, uint256, uint256) {
        require(id < resourceCount);

        Resource memory object = resourcesById[id];
        return (object.uriSetId, object.encryptionAlgorithmId, object.metaResourceSetId);
    }

    function getPublicKeyCount() external view returns (uint256) {
        return publicKeyCount;
    }

    function getPublicKeyById(uint256 id) external view returns (bytes) {
        require(id < publicKeyCount);

        PublicKey memory object = publicKeysById[id];
        return object.value;
    }

    function getResourceSetCount() external view returns (uint256) {
        return resourceSetCount;
    }

    function getResourceSetById(uint256 id) external view returns (address, uint256, uint256, uint256[], uint256) {
        require(id < resourceSetCount);

        ResourceSet memory object = resourceSetsById[id];
        return (object.creator, object.creatorPublicKeyId, object.proposalEncryptionAlgorithmId, object.uniqueResourceIdsSortedAscending, object.metaResourceSetId);
    }

    function getAgreementCount() external view returns (uint256) {
        return agreementCount;
    }

    function getAgreementById(uint256 id) external view returns (uint256, uint256) {
        require(id < agreementCount);

        Agreement memory object = agreementsById[id];
        return (object.uriSetId, object.checksumPairId);
    }

    function getAgreementSetCount() external view returns (uint256) {
        return agreementSetCount;
    }

    function getAgreementSetById(uint256 id) external view returns (uint256[]) {
        require(id < agreementSetCount);

        AgreementSet memory object = agreementSetsById[id];
        return object.uniqueAgreementIdsSortedAscending;
    }

    function getTokenTransferCount() external view returns (uint256) {
        return tokenTransferCount;
    }

    function getTokenTransferById(uint256 id) external view returns (address, address, uint256) {
        require(id < tokenTransferCount);

        TokenTransfer memory object = tokenTransfersById[id];
        return (object.source, object.destination, object.tokenCount);
    }

    function getTokenTransferSetCount() external view returns (uint256) {
        return tokenTransferSetCount;
    }

    function getTokenTransferSetById(uint256 id) external view returns (uint256[]) {
        require(id < tokenTransferSetCount);

        TokenTransferSet memory object = tokenTransferSetsById[id];
        return object.uniqueTokenTransferIdsSortedAscending;
    }

    function getProposalCount() external view returns (uint256) {
        return proposalCount;
    }

    function getProposalById(uint256 id) external view returns (uint256, address, uint256, uint256, uint256, uint256, uint256) {
        require(id < proposalCount);

        Proposal memory object = proposalsById[id];
        return (object.minimumBlockNumberForWithdrawal, object.creator, object.creatorPublicKeyId, object.acceptanceEncryptionAlgorithmId, object.resourceSetId, object.agreementSetId, object.tokenTransferSetId);
    }

    function getStateByProposalId(uint256 proposalId) external view returns (ProposalState) {
        require(proposalId < proposalCount);

        return statesByProposalId[proposalId];
    }

    // Check to see if an Ethereum account has assigned a checksum for a particular resource.
    function hasAddressAssignedResourceChecksumPair(address address_, uint256 resourceId) external view returns (bool) {
        require(resourceId < resourceCount);

        return checksumPairAssignmentsByCreatorAndResourceId[address_][resourceId];
    }

    // Retrieve the checksum assigned assigned to particular resource
    function getChecksumPairIdByAssignerAndResourceId(address assigner, uint256 resourceId) external view returns (uint256) {
        require(resourceId < resourceCount);
        require(checksumPairAssignmentsByCreatorAndResourceId[assigner][resourceId]);

        return checksumPairIdsByCreatorAndResourceId[assigner][resourceId];
    }

    // Retrieve the encrypted key to decrypt a resource referenced by an accepted proposal.
    function getEncryptedResourceDecryptionKey(uint256 proposalId, uint256 resourceId) external view returns (bytes) {
        require(proposalId < proposalCount);
        require(ProposalState.AcceptedByResourceSetCreator == statesByProposalId[proposalId]);
        require(resourceId < resourceCount);

        uint256[] memory validResourceIds = resourceSetsById[proposalsById[proposalId].resourceSetId].uniqueResourceIdsSortedAscending;
        require(0 < validResourceIds.length);

        if (1 == validResourceIds.length) {
            require(resourceId == validResourceIds[0]);

        } else {
            uint256 lowIndex = 0;
            uint256 highIndex = validResourceIds.length.sub(1);
            uint256 middleIndex = lowIndex.add(highIndex).div(2);

            while (resourceId != validResourceIds[middleIndex]) {
                require(lowIndex <= highIndex);

                if (validResourceIds[middleIndex] < resourceId) {
                    lowIndex = middleIndex.add(1);
                } else {
                    highIndex = middleIndex.sub(1);
                }

                middleIndex = lowIndex.add(highIndex).div(2);
            }
        }

        return encryptedDecryptionKeysByProposalIdAndResourceId[proposalId][resourceId];
    }

    function createUri(
        string value
    ) external returns (uint256)
    {
        require(0 < bytes(value).length);

        uint256 id = uriCount;
        uriCount = id.add(1);
        urisById[id] = Uri(
            value
        );

        return id;
    }

    function createUriSet(
        uint256[] uniqueUriIdsSortedAscending
    ) external returns (uint256)
    {
        validateIdSet(uniqueUriIdsSortedAscending, uriCount);

        uint256 id = uriSetCount;
        uriSetCount = id.add(1);
        uriSetsById[id] = UriSet(
            uniqueUriIdsSortedAscending
        );

        return id;
    }

    function createChecksumAlgorithm(
        uint256 descriptionUriSetId
    ) external returns (uint256)
    {
        require(descriptionUriSetId < uriSetCount);

        uint256 id = checksumAlgorithmCount;
        checksumAlgorithmCount = id.add(1);
        checksumAlgorithmsById[id] = ChecksumAlgorithm(
            descriptionUriSetId
        );

        return id;
    }

    function createChecksum(
        uint256 algorithmId,
        uint256 resourceByteCount,
        bytes value
    ) external returns (uint256)
    {
        require(algorithmId < checksumAlgorithmCount);
        require(0 < resourceByteCount);

        uint256 id = checksumCount;
        checksumCount = id.add(1);
        checksumsById[id] = Checksum(
            algorithmId,
            resourceByteCount,
            value
        );

        return id;
    }

    function createEncryptionAlgorithm(
        uint256 descriptionUriSetId
    ) external returns (uint256)
    {
        require(descriptionUriSetId < uriSetCount);

        uint256 id = encryptionAlgorithmCount;
        encryptionAlgorithmCount = id.add(1);
        encryptionAlgorithmsById[id] = EncryptionAlgorithm(
            descriptionUriSetId
        );

        return id;
    }

    function createChecksumPair(
        uint256 encryptedChecksumId,
        uint256 decryptedChecksumId
    ) external returns (uint256)
    {
        require(encryptedChecksumId < checksumCount);
        require(decryptedChecksumId < checksumCount);

        uint256 id = checksumPairCount;
        checksumPairCount = id.add(1);
        checksumPairsById[id] = ChecksumPair(
            encryptedChecksumId,
            decryptedChecksumId
        );

        return id;
    }

    function createResource(
        uint256 uriSetId,
        uint256 encryptionAlgorithmId,
        uint256 metaResourceSetId
    ) external returns (uint256)
    {
        require(uriSetId < uriSetCount);
        require(encryptionAlgorithmId < encryptionAlgorithmCount);
        require(metaResourceSetId < resourceSetCount);

        uint256 id = resourceCount;
        resourceCount = id.add(1);
        resourcesById[id] = Resource(
            uriSetId,
            encryptionAlgorithmId,
            metaResourceSetId
        );

        return id;
    }

    function createPublicKey(
        bytes value
    ) external returns (uint256)
    {
        uint256 id = publicKeyCount;
        publicKeyCount = id.add(1);
        publicKeysById[id] = PublicKey(
            value
        );

        return id;
    }

    function createResourceSet(
        uint256 creatorPublicKeyId,
        uint256 proposalEncryptionAlgorithmId,
        uint256[] uniqueResourceIdsSortedAscending,
        uint256 metaResourceSetId
    ) external returns (uint256)
    {
        require(creatorPublicKeyId < publicKeyCount);
        require(proposalEncryptionAlgorithmId < encryptionAlgorithmCount);
        validateIdSet(uniqueResourceIdsSortedAscending, resourceCount);
        require(metaResourceSetId < resourceSetCount);

        uint256 id = resourceSetCount;
        resourceSetCount = id.add(1);
        resourceSetsById[id] = ResourceSet(
            msg.sender,
            creatorPublicKeyId,
            proposalEncryptionAlgorithmId,
            uniqueResourceIdsSortedAscending,
            metaResourceSetId
        );

        return id;
    }

    function createAgreement(
        uint256 uriSetId,
        uint256 checksumPairId
    ) external returns (uint256)
    {
        require(uriSetId < uriSetCount);
        require(checksumPairId < checksumPairCount);

        uint256 id = agreementCount;
        agreementCount = id.add(1);
        agreementsById[id] = Agreement(
            uriSetId,
            checksumPairId
        );

        return id;
    }

    function createAgreementSet(
        uint256[] uniqueAgreementIdsSortedAscending
    ) external returns (uint256)
    {
        validateIdSet(uniqueAgreementIdsSortedAscending, agreementCount);

        uint256 id = agreementSetCount;
        agreementSetCount = id.add(1);
        agreementSetsById[id] = AgreementSet(
            uniqueAgreementIdsSortedAscending
        );

        return id;
    }

    function createTokenTransfer(
        address source,
        address destination,
        uint256 tokenCount
    ) external returns (uint256)
    {
        require(address(0) != source);
        require(address(0) != destination);
        require(0 < tokenCount);

        uint256 id = tokenTransferCount;
        tokenTransferCount = id.add(1);
        tokenTransfersById[id] = TokenTransfer(
            source,
            destination,
            tokenCount
        );

        return id;
    }

    function createTokenTransferSet(
        uint256[] uniqueTokenTransferIdsSortedAscending
    ) external returns (uint256)
    {
        validateIdSet(uniqueTokenTransferIdsSortedAscending, tokenTransferCount);

        uint256 id = tokenTransferSetCount;
        tokenTransferSetCount = id.add(1);
        tokenTransferSetsById[id] = TokenTransferSet(
            uniqueTokenTransferIdsSortedAscending
        );

        return id;
    }

    function createProposal(
        uint256 minimumBlockNumberForWithdrawal,
        uint256 creatorPublicKeyId,
        uint256 acceptanceEncryptionAlgorithmId,
        uint256 resourceSetId,
        uint256 agreementSetId,
        uint256 tokenTransferSetId
    ) external returns (uint256)
    {
        require(creatorPublicKeyId < publicKeyCount);
        require(acceptanceEncryptionAlgorithmId < encryptionAlgorithmCount);
        require(resourceSetId < resourceSetCount);
        require(agreementSetId < agreementSetCount);
        require(tokenTransferSetId < tokenTransferSetCount);

        transferTokensToEscrow(msg.sender, tokenTransferSetId);

        uint256 id = proposalCount;
        proposalCount = id.add(1);
        proposalsById[id] = Proposal(
            minimumBlockNumberForWithdrawal,
            msg.sender,
            creatorPublicKeyId,
            acceptanceEncryptionAlgorithmId,
            resourceSetId,
            agreementSetId,
            tokenTransferSetId
        );

        return id;
    }

    // Each Ethereum account may assign a 'ChecksumPair' to a resource exactly once. This ensures that each claim that a
    // checksum should match a resource is attached to a particular authority. This operation is not bound to the
    // creation of the resource because the resource's creator may not know the checksum when creating the resource.
    function assignResourceChecksumPair(
        uint256 resourceId,
        uint256 checksumPairId
    ) external
    {
        require(resourceId < resourceCount);
        require(checksumPairId < checksumPairCount);
        require(false == checksumPairAssignmentsByCreatorAndResourceId[msg.sender][resourceId]);

        checksumPairIdsByCreatorAndResourceId[msg.sender][resourceId] = checksumPairId;
        checksumPairAssignmentsByCreatorAndResourceId[msg.sender][resourceId] = true;
    }

    // This function moves a proposal to a final state of `WithdrawnByCreator' and returns tokens to the sources
    // described by the proposal's transfers.
    function withdrawProposal(
        uint256 proposalId
    ) external
    {
        require(proposalId < proposalCount);
        require(ProposalState.Pending == statesByProposalId[proposalId]);

        Proposal memory proposal = proposalsById[proposalId];
        require(msg.sender == proposal.creator);
        require(block.number >= proposal.minimumBlockNumberForWithdrawal);

        returnTokensFromEscrow(proposal.creator, proposal.tokenTransferSetId);
        statesByProposalId[proposalId] = ProposalState.WithdrawnByCreator;
    }

    // This function moves a proposal to a final state of `RejectedByResourceSetCreator' and returns tokens to the sources
    // described by the proposal's transfers.
    function rejectProposal(
        uint256 proposalId
    ) external
    {
        require(proposalId < proposalCount);
        require(ProposalState.Pending == statesByProposalId[proposalId]);

        Proposal memory proposal = proposalsById[proposalId];
        require(msg.sender == resourceSetsById[proposal.resourceSetId].creator);

        returnTokensFromEscrow(proposal.creator, proposal.tokenTransferSetId);
        statesByProposalId[proposalId] = ProposalState.RejectedByResourceSetCreator;
    }

    // This function moves a proposal to a final state of `RejectedByResourceSetCreator' and sends tokens to the
    // destinations described by the proposal's transfers.
    //
    // The caller should encrypt each decryption key corresponding
    // to each resource in the proposal's resource set first with the public key of the proposal's creator and then with
    // the private key assoicated with the public key referenced in the resource set. The caller should concatenate
    // these encrypted values and pass the resulting byte array as 'concatenatedResourceDecryptionKeys'.
    // The length of each encrypted decryption key should be provided in the 'concatenatedResourceDecryptionKeyLengths'.
    // The index of each value in 'concatenatedResourceDecryptionKeyLengths' must correspond to an index in the resource
    // set referenced by the proposal.
    function acceptProposal(
        uint256 proposalId,
        bytes concatenatedResourceDecryptionKeys,
        uint256[] concatenatedResourceDecryptionKeyLengths
    ) external
    {
        require(proposalId < proposalCount);
        require(ProposalState.Pending == statesByProposalId[proposalId]);

        Proposal memory proposal = proposalsById[proposalId];
        require(msg.sender == resourceSetsById[proposal.resourceSetId].creator);

        storeEncryptedDecryptionKeys(
            proposalId,
            concatenatedResourceDecryptionKeys,
            concatenatedResourceDecryptionKeyLengths
        );

        transferTokensFromEscrow(proposal.tokenTransferSetId);

        statesByProposalId[proposalId] = ProposalState.AcceptedByResourceSetCreator;
    }

    function validateIdSet(uint256[] uniqueIdsSortedAscending, uint256 idCount) private pure {
        if (0 < uniqueIdsSortedAscending.length) {

            uint256 id = uniqueIdsSortedAscending[0];
            require(id < idCount);

            uint256 previousId = id;
            for (uint256 index = 1; index < uniqueIdsSortedAscending.length; index = index.add(1)) {
                id = uniqueIdsSortedAscending[index];
                require(id < idCount);
                require(previousId < id);

                previousId = id;
            }
        }
    }

    function transferTokensToEscrow(address proposalCreator, uint256 tokenTransferSetId) private {
        assert(tokenTransferSetId < tokenTransferSetCount);
        assert(address(0) != proposalCreator);

        uint256[] memory tokenTransferIds = tokenTransferSetsById[tokenTransferSetId].uniqueTokenTransferIdsSortedAscending;
        for (uint256 index = 0; index < tokenTransferIds.length; index = index.add(1)) {
            uint256 tokenTransferId = tokenTransferIds[index];
            assert(tokenTransferId < tokenTransferCount);

            TokenTransfer memory tokenTransfer = tokenTransfersById[tokenTransferId];
            assert(0 < tokenTransfer.tokenCount);
            assert(address(0) != tokenTransfer.source);
            assert(address(0) != tokenTransfer.destination);

            require(tokenTransfer.tokenCount <= balances[tokenTransfer.source]);

            if (tokenTransfer.source != proposalCreator) {
                require(tokenTransfer.tokenCount <= allowed[tokenTransfer.source][proposalCreator]);

                allowed[tokenTransfer.source][proposalCreator] = allowed[tokenTransfer.source][proposalCreator].sub(tokenTransfer.tokenCount);
            }

            balances[tokenTransfer.source] = balances[tokenTransfer.source].sub(tokenTransfer.tokenCount);
            balances[address(0)] = balances[address(0)].add(tokenTransfer.tokenCount);

            Transfer(tokenTransfer.source, address(0), tokenTransfer.tokenCount);
        }
    }

    function returnTokensFromEscrow(address proposalCreator, uint256 tokenTransferSetId) private {
        assert(tokenTransferSetId < tokenTransferSetCount);
        assert(address(0) != proposalCreator);

        uint256[] memory tokenTransferIds = tokenTransferSetsById[tokenTransferSetId].uniqueTokenTransferIdsSortedAscending;
        for (uint256 index = 0; index < tokenTransferIds.length; index = index.add(1)) {
            uint256 tokenTransferId = tokenTransferIds[index];
            assert(tokenTransferId < tokenTransferCount);

            TokenTransfer memory tokenTransfer = tokenTransfersById[tokenTransferId];
            assert(0 < tokenTransfer.tokenCount);
            assert(address(0) != tokenTransfer.source);
            assert(address(0) != tokenTransfer.destination);
            assert(tokenTransfer.tokenCount <= balances[address(0)]);

            balances[tokenTransfer.source] = balances[tokenTransfer.source].add(tokenTransfer.tokenCount);
            balances[address(0)] = balances[address(0)].sub(tokenTransfer.tokenCount);

            Transfer(address(0), tokenTransfer.source, tokenTransfer.tokenCount);
        }
    }

    function transferTokensFromEscrow(uint256 tokenTransferSetId) private {
        assert(tokenTransferSetId < tokenTransferSetCount);

        uint256[] memory tokenTransferIds = tokenTransferSetsById[tokenTransferSetId].uniqueTokenTransferIdsSortedAscending;
        for (uint256 index = 0; index < tokenTransferIds.length; index = index.add(1)) {
            uint256 tokenTransferId = tokenTransferIds[index];
            assert(tokenTransferId < tokenTransferCount);

            TokenTransfer memory tokenTransfer = tokenTransfersById[tokenTransferId];
            assert(0 < tokenTransfer.tokenCount);
            assert(address(0) != tokenTransfer.source);
            assert(address(0) != tokenTransfer.destination);

            balances[address(0)] = balances[address(0)].sub(tokenTransfer.tokenCount);
            balances[tokenTransfer.destination] = balances[tokenTransfer.destination].add(tokenTransfer.tokenCount);
            Transfer(address(0), tokenTransfer.destination, tokenTransfer.tokenCount);
        }
    }

    function storeEncryptedDecryptionKeys(
        uint256 proposalId,
        bytes concatenatedEncryptedResourceDecryptionKeys,
        uint256[] encryptedResourceDecryptionKeyLengths
    ) private
    {
        assert(proposalId < proposalCount);

        uint256 resourceSetId = proposalsById[proposalId].resourceSetId;
        assert(resourceSetId < resourceSetCount);

        ResourceSet memory resourceSet = resourceSetsById[resourceSetId];
        require(resourceSet.uniqueResourceIdsSortedAscending.length == encryptedResourceDecryptionKeyLengths.length);

        uint256 concatenatedEncryptedResourceDecryptionKeysIndex = 0;
        for (uint256 resourceIndex = 0; resourceIndex < encryptedResourceDecryptionKeyLengths.length; resourceIndex = resourceIndex.add(1)) {
            bytes memory encryptedResourceDecryptionKey = new bytes(encryptedResourceDecryptionKeyLengths[resourceIndex]);
            require(0 < encryptedResourceDecryptionKey.length);

            for (uint256 encryptedResourceDecryptionKeyIndex = 0; encryptedResourceDecryptionKeyIndex < encryptedResourceDecryptionKey.length; encryptedResourceDecryptionKeyIndex = encryptedResourceDecryptionKeyIndex.add(1)) {
                require(concatenatedEncryptedResourceDecryptionKeysIndex < concatenatedEncryptedResourceDecryptionKeys.length);
                encryptedResourceDecryptionKey[encryptedResourceDecryptionKeyIndex] = concatenatedEncryptedResourceDecryptionKeys[concatenatedEncryptedResourceDecryptionKeysIndex];
                concatenatedEncryptedResourceDecryptionKeysIndex = concatenatedEncryptedResourceDecryptionKeysIndex.add(1);
            }

            uint256 resourceId = resourceSet.uniqueResourceIdsSortedAscending[resourceIndex];
            assert(resourceId < resourceCount);

            encryptedDecryptionKeysByProposalIdAndResourceId[proposalId][resourceId] = encryptedResourceDecryptionKey;
        }

        require(concatenatedEncryptedResourceDecryptionKeysIndex == concatenatedEncryptedResourceDecryptionKeys.length);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"getAgreementCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"source","type":"address"},{"name":"destination","type":"address"},{"name":"tokenCount","type":"uint256"}],"name":"createTokenTransfer","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getUriCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"uniqueAgreementIdsSortedAscending","type":"uint256[]"}],"name":"createAgreementSet","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getEncryptionAlgorithmCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getAgreementSetById","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPublicKeyCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"uniqueTokenTransferIdsSortedAscending","type":"uint256[]"}],"name":"createTokenTransferSet","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAgreementSetCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTokenTransferSetCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getResourceSetCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"NULL_ENCRYPTION_ALGORITHM_ID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getChecksumPairById","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"minimumBlockNumberForWithdrawal","type":"uint256"},{"name":"creatorPublicKeyId","type":"uint256"},{"name":"acceptanceEncryptionAlgorithmId","type":"uint256"},{"name":"resourceSetId","type":"uint256"},{"name":"agreementSetId","type":"uint256"},{"name":"tokenTransferSetId","type":"uint256"}],"name":"createProposal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getProposalById","outputs":[{"name":"","type":"uint256"},{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"proposalId","type":"uint256"},{"name":"resourceId","type":"uint256"}],"name":"getEncryptedResourceDecryptionKey","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"uriSetId","type":"uint256"},{"name":"checksumPairId","type":"uint256"}],"name":"createAgreement","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getChecksumAlgorithmCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getTokenTransferSetById","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"encryptedChecksumId","type":"uint256"},{"name":"decryptedChecksumId","type":"uint256"}],"name":"createChecksumPair","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getChecksumCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getAgreementById","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ONE_BILLION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EMPTY_RESOURCE_SET_ID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getChecksumAlgorithmById","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"algorithmId","type":"uint256"},{"name":"resourceByteCount","type":"uint256"},{"name":"value","type":"bytes"}],"name":"createChecksum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"uriSetId","type":"uint256"},{"name":"encryptionAlgorithmId","type":"uint256"},{"name":"metaResourceSetId","type":"uint256"}],"name":"createResource","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"proposalId","type":"uint256"}],"name":"getStateByProposalId","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"descriptionUriSetId","type":"uint256"}],"name":"createEncryptionAlgorithm","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getUriById","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getUriSetById","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getTokenTransferById","outputs":[{"name":"","type":"address"},{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getResourceSetById","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256[]"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"uniqueUriIdsSortedAscending","type":"uint256[]"}],"name":"createUriSet","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAXIMUM_64_BIT_SIGNED_INTEGER_VALUE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"descriptionUriSetId","type":"uint256"}],"name":"createChecksumAlgorithm","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getEncryptionAlgorithmById","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getResourceCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"bytes"}],"name":"createPublicKey","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getUriSetCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_ID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ONE_QUINTILLION","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"proposalId","type":"uint256"}],"name":"rejectProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getChecksumById","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getProposalCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"address_","type":"address"},{"name":"resourceId","type":"uint256"}],"name":"hasAddressAssignedResourceChecksumPair","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getResourceById","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"string"}],"name":"createUri","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"assigner","type":"address"},{"name":"resourceId","type":"uint256"}],"name":"getChecksumPairIdByAssignerAndResourceId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getChecksumPairCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getPublicKeyById","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"proposalId","type":"uint256"}],"name":"withdrawProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"EMPTY_PUBLIC_KEY_ID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"creatorPublicKeyId","type":"uint256"},{"name":"proposalEncryptionAlgorithmId","type":"uint256"},{"name":"uniqueResourceIdsSortedAscending","type":"uint256[]"},{"name":"metaResourceSetId","type":"uint256"}],"name":"createResourceSet","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"resourceId","type":"uint256"},{"name":"checksumPairId","type":"uint256"}],"name":"assignResourceChecksumPair","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_SET_ID","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"proposalId","type":"uint256"},{"name":"concatenatedResourceDecryptionKeys","type":"bytes"},{"name":"concatenatedResourceDecryptionKeyLengths","type":"uint256[]"}],"name":"acceptProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getTokenTransferCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

60606040526000600455600060065560006008556000600a556000600c556000600e55600060105560006012556000601455600060165560006018556000601a556000601c556000601e5534156200005657600080fd5b62000060620005e6565b6200007e633b9aca00806401000000006200390d620004f482021704565b670de0b6b3a7640000146200008f57fe5b670de0b6b3a76400006001819055600160a060020a033316600081815260208190526040808220849055919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91905190815260200160405180910390a360125415620000fa57fe5b6020604051908101604052806000604051805910620001165750595b818152601f19601f8301168101602001604052905090526000805260116020527f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b78151819080516200016d929160200190620005f8565b50506012546200018e9150600164010000000062002ba56200052e82021704565b60128190556001146200019d57fe5b60045415620001a857fe5b60206040519081016040528060606040519081016040908152602d82527f68747470733a2f2f656e2e77696b6970656469612e6f72672f77696b692f4e756020808401919091527f6c6c5f656e6372797074696f6e0000000000000000000000000000000000000091830191909152915260008052600390527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff81518190805162000258929160200190620005f8565b5050600454620002799150600164010000000062002ba56200052e82021704565b60048190556001146200028857fe5b600654156200029357fe5b6001604051805910620002a35750595b90808252806020026020018201604052509050600081600081518110620002c657fe5b60209081029091010152600454620002ee90829064010000000062002bbb6200053e82021704565b60206040519081016040528181526000805260056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc8151819080516200033c9291602001906200067d565b50506006546200035d9150600164010000000062002ba56200052e82021704565b60068190556001146200036c57fe5b600c54156200037757fe5b602060405190810160405260008082528052600b6020527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f768151905550600c54620003d290600164010000000062002ba56200052e82021704565b600c819055600114620003e157fe5b60145415620003ec57fe5b60a06040519081016040528033600160a060020a0316815260200160008152602001600081526020016000604051805910620004255750595b81815260209182028101820160405282526000918101829052908052601390527f8fa6efc3be94b5b348b21fea823fe8d100408cee9b7f90524494500445d8ff6c81518154600160a060020a031916600160a060020a03919091161781556020820151816001015560408201518160020155606082015181600301908051620004b39291602001906200067d565b50608082015160049091015550601454620004de90600164010000000062002ba56200052e82021704565b6014819055600114620004ed57fe5b50620006da565b60008083151562000509576000915062000527565b508282028284828115156200051a57fe5b04146200052357fe5b8091505b5092915050565b6000828201838110156200052357fe5b6000806000845160001015620005df57846000815181106200055c57fe5b9060200190602002015192508383106200057557600080fd5b5081905060015b8451811015620005df578481815181106200059357fe5b906020019060200201519250838310620005ac57600080fd5b828210620005b957600080fd5b829150620005d781600164010000000062002ba56200052e82021704565b90506200057c565b5050505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200063b57805160ff19168380011785556200066b565b828001600101855582156200066b579182015b828111156200066b5782518255916020019190600101906200064e565b5062000679929150620006ba565b5090565b8280548282559060005260206000209081019282156200066b57916020028201828111156200066b5782518255916020019190600101906200064e565b620006d791905b80821115620006795760008155600101620006c1565b90565b6139a480620006ea6000396000f30060606040526004361061032b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416628bed3e811461033057806301c0954b1461035557806302d055311461037d57806306fdde03146103905780630828baa21461041a578063095ea7b3146104385780630f732bdc1461046e578063143c28301461048157806318160ddd146104ea5780631880692f146104fd57806320e190a41461051057806322b6fe9e1461052e57806323b872dd1461054157806327d51979146105695780632a61d47b1461057c5780632be6ec1f1461058f578063313ce567146105a257806334116fd8146105cb57806334f99b59146105f95780633656de211461061e5780633befcd631461067a57806344ce97c914610693578063466c3a2b146106ac5780634dfe165c146106bf5780634e006d83146106d55780635044b112146106ee578063573fb624146107015780635d12fc0c14610717578063650619571461058f578063661884631461072a5780636928e1421461074c5780636d8062ee1461076257806370a08231146107885780637773c36e146107a75780637ad669e9146107c35780637b7179fc146107fd5780637e2d0ebc14610813578063820a5b191461082957806387181b101461083f57806389f90872146108825780638e5653d41461091a57806395d89b4114610938578063970afd9b1461094b578063980619a71461095e5780639bad7720146109745780639f96de0f1461098a578063a75c127b1461099d578063a9059cbb146109bb578063b086d5aa146109dd578063b154dea61461058f578063b663dc0a146109f0578063bc28d87814610a03578063bc824a7714610a1b578063c08cc02d14610ab7578063c18d958214610aca578063c798192214610aec578063cbb9d38514610b26578063d206703514610b44578063d6f22e6914610b66578063d73dd62314610b79578063dd62ed3e14610b9b578063e0db1b9114610bc0578063e1f02ffa14610bd6578063ea32c95e1461058f578063f26be2a814610bec578063f3fbad2514610c15578063fab3ebb11461058f578063feadaa1b14610c2e578063feaf087214610c5c575b600080fd5b341561033b57600080fd5b610343610c6f565b60405190815260200160405180910390f35b341561036057600080fd5b610343600160a060020a0360043581169060243516604435610c76565b341561038857600080fd5b610343610d72565b341561039b57600080fd5b6103a3610d78565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103df5780820151838201526020016103c7565b50505050905090810190601f16801561040c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561042557600080fd5b6103436004803560248101910135610daf565b341561044357600080fd5b61045a600160a060020a0360043516602435610e72565b604051901515815260200160405180910390f35b341561047957600080fd5b610343610ede565b341561048c57600080fd5b610497600435610ee4565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156104d65780820151838201526020016104be565b505050509050019250505060405180910390f35b34156104f557600080fd5b610343610f83565b341561050857600080fd5b610343610f89565b341561051b57600080fd5b6103436004803560248101910135610f8f565b341561053957600080fd5b610343611043565b341561054c57600080fd5b61045a600160a060020a0360043581169060243516604435611049565b341561057457600080fd5b6103436111b7565b341561058757600080fd5b6103436111bd565b341561059a57600080fd5b6103436111c3565b34156105ad57600080fd5b6105b56111c8565b60405160ff909116815260200160405180910390f35b34156105d657600080fd5b6105e16004356111cd565b60405191825260208201526040908101905180910390f35b341561060457600080fd5b61034360043560243560443560643560843560a435611221565b341561062957600080fd5b610634600435611359565b604051968752600160a060020a0390951660208701526040808701949094526060860192909252608085015260a084015260c083019190915260e0909101905180910390f35b341561068557600080fd5b6103a360043560243561141a565b341561069e57600080fd5b6103436004356024356116bc565b34156106b757600080fd5b61034361172f565b34156106ca57600080fd5b610497600435611735565b34156106e057600080fd5b6103436004356024356117d2565b34156106f957600080fd5b610343611845565b341561070c57600080fd5b6105e160043561184b565b341561072257600080fd5b61034361189f565b341561073557600080fd5b61045a600160a060020a03600435166024356118a7565b341561075757600080fd5b6103436004356119a1565b341561076d57600080fd5b610343600480359060248035916044359182019101356119e2565b341561079357600080fd5b610343600160a060020a0360043516611aa9565b34156107b257600080fd5b610343600435602435604435611ac4565b34156107ce57600080fd5b6107d9600435611b57565b604051808260038111156107e957fe5b60ff16815260200191505060405180910390f35b341561080857600080fd5b610343600435611b7e565b341561081e57600080fd5b6103a3600435611bcf565b341561083457600080fd5b610497600435611cae565b341561084a57600080fd5b610855600435611d4b565b604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390f35b341561088d57600080fd5b610898600435611dc6565b6040518086600160a060020a0316600160a060020a0316815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156109025780820151838201526020016108ea565b50505050905001965050505050505060405180910390f35b341561092557600080fd5b6103436004803560248101910135611eda565b341561094357600080fd5b6103a3611f8e565b341561095657600080fd5b610343611fc5565b341561096957600080fd5b610343600435611fd1565b341561097f57600080fd5b610343600435612022565b341561099557600080fd5b610343612063565b34156109a857600080fd5b6103436004803560248101910135612069565b34156109c657600080fd5b61045a600160a060020a03600435166024356120e4565b34156109e857600080fd5b6103436121e4565b34156109fb57600080fd5b6103436121ea565b3415610a0e57600080fd5b610a196004356121f6565b005b3415610a2657600080fd5b610a31600435612304565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610a7a578082015183820152602001610a62565b50505050905090810190601f168015610aa75780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b3415610ac257600080fd5b610343612416565b3415610ad557600080fd5b61045a600160a060020a036004351660243561241c565b3415610af757600080fd5b610b02600435612459565b60405180848152602001838152602001828152602001935050505060405180910390f35b3415610b3157600080fd5b61034360048035602481019101356124c8565b3415610b4f57600080fd5b610343600160a060020a0360043516602435612550565b3415610b7157600080fd5b6103436125bc565b3415610b8457600080fd5b61045a600160a060020a03600435166024356125c2565b3415610ba657600080fd5b610343600160a060020a0360043581169060243516612666565b3415610bcb57600080fd5b6103a3600435612691565b3415610be157600080fd5b610a19600435612738565b3415610bf757600080fd5b61034360048035906024803591604435918201910135606435612841565b3415610c2057600080fd5b610a1960043560243561299f565b3415610c3957600080fd5b610a19600480359060248035808201929081013591604435908101910135612a32565b3415610c6757600080fd5b610343612b9f565b6016545b90565b600080600160a060020a0385161515610c8e57600080fd5b600160a060020a0384161515610ca357600080fd5b6000839010610cb157600080fd5b50601a54610cc681600163ffffffff612ba516565b601a5560606040519081016040908152600160a060020a038088168352861660208084019190915281830186905260008481526019909152208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015160018201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560408201516002909101555090509392505050565b60045490565b60408051908101604052600781527f4679736963616c00000000000000000000000000000000000000000000000000602082015281565b600080610dec84848080602002602001604051908101604052809392919081815260200183836020028082843750506016549350612bbb92505050565b50601854610e0181600163ffffffff612ba516565b601855602060405190810160405280858580806020026020016040519081016040528093929190818152602001838360200280828437505050929093525050506000828152601760205260409020815181908051610e6392916020019061370f565b509050508091505b5092915050565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b600c5490565b610eec61375a565b610ef461376c565b6018548310610f0257600080fd5b6000838152601760209081526040918290209151908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015610f6c57602002820191906000526020600020905b815481526020019060010190808311610f58575b505050505081525050905080600001519392505050565b60015490565b60125490565b600080610fcc8484808060200260200160405190810160405280939291908181526020018383602002808284375050601a549350612bbb92505050565b50601c54610fe181600163ffffffff612ba516565b601c55602060405190810160405280858580806020026020016040519081016040528093929190818152602001838360200280828437505050929093525050506000828152601b60205260409020815181908051610e6392916020019061370f565b60185490565b6000600160a060020a038316151561106057600080fd5b600160a060020a03841660009081526020819052604090205482111561108557600080fd5b600160a060020a03808516600090815260026020908152604080832033909416835292905220548211156110b857600080fd5b600160a060020a0384166000908152602081905260409020546110e1908363ffffffff612c5116565b600160a060020a038086166000908152602081905260408082209390935590851681522054611116908363ffffffff612ba516565b600160a060020a038085166000908152602081815260408083209490945587831682526002815283822033909316825291909152205461115c908363ffffffff612c5116565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516916000805160206139398339815191529085905190815260200160405180910390a35060019392505050565b601c5490565b60145490565b600081565b600981565b6000806111d8613785565b600e5484106111e657600080fd5b6000848152600d6020526040908190209080519081016040528154815260019091015460208201529050805181602001519250925050915091565b6000806012548710151561123457600080fd5b600c54861061124257600080fd5b601454851061125057600080fd5b601854841061125e57600080fd5b601c54831061126c57600080fd5b6112763384612c63565b50601e5461128b81600163ffffffff612ba516565b601e5560e06040519081016040528089815260200133600160a060020a0316815260200188815260200187815260200186815260200185815260200184815250601d600083815260200190815260200160002060008201518155602082015160018201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201516006909101555090509695505050505050565b600080600080600080600061136c61379c565b601e54891061137a57600080fd5b6000898152601d6020526040908190209060e090519081016040908152825482526001830154600160a060020a031660208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460c08201529050805181602001518260400151836060015184608001518560a001518660c00151959f949e50929c50909a509850965090945092505050565b61142261375a565b61142a61375a565b6000806000601e548710151561143f57600080fd5b6000878152601f602052604090205460ff16600381111561145c57fe5b60031461146857600080fd5b601054861061147657600080fd5b6000878152601d6020908152604080832060040154835260138252918290206003018054909290918281020190519081016040528092919081815260200182805480156114e257602002820191906000526020600020905b8154815260200190600101908083116114ce575b5050505050935083516000106114f757600080fd5b835160011415611528578360008151811061150e57fe5b90602001906020020151861461152357600080fd5b6115f3565b6000925061153f600185519063ffffffff612c5116565b91506115626002611556858563ffffffff612ba516565b9063ffffffff612fb816565b90505b83818151811061157157fe5b9060200190602002015186146115f3578183111561158e57600080fd5b8584828151811061159b57fe5b9060200190602002015110156115c3576115bc81600163ffffffff612ba516565b92506115d7565b6115d481600163ffffffff612c5116565b91505b6115ec6002611556858563ffffffff612ba516565b9050611565565b6020600088815260200190815260200160002060008781526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ab5780601f10611680576101008083540402835291602001916116ab565b820191906000526020600020905b81548152906001019060200180831161168e57829003601f168201915b505050505094505050505092915050565b600080600654841015156116cf57600080fd5b600e5483106116dd57600080fd5b506016546116f281600163ffffffff612ba516565b6016556040805190810160409081528582526020808301869052600084815260159091522081518155602082015160019091015550905092915050565b60085490565b61173d61375a565b61174561376c565b601c54831061175357600080fd5b6000838152601b60209081526040918290209151908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015610f6c5760200282019190600052602060002090815481526020019060010190808311610f5857505050505081525050905080600001519392505050565b600080600a54841015156117e557600080fd5b600a5483106117f357600080fd5b50600e5461180881600163ffffffff612ba516565b600e5560408051908101604090815285825260208083018690526000848152600d9091522081518155602082015160019091015550905092915050565b600a5490565b600080611856613785565b601654841061186457600080fd5b600084815260156020526040908190209080519081016040528154815260019091015460208201529050805181602001519250925050915091565b633b9aca0081565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561190457600160a060020a03338116600090815260026020908152604080832093881683529290529081205561193b565b611914818463ffffffff612c5116565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b60006119ab61375a565b60085483106119b957600080fd5b600083815260076020908152604091829020915190810160405290548152905080519392505050565b600080600854861015156119f557600080fd5b6000859010611a0357600080fd5b50600a54611a1881600163ffffffff612ba516565b600a5560606040519081016040528087815260200186815260200185858080601f01602080910402602001604051908101604052818152929190602084018383808284375050509290935250505060008281526009602052604090208151815560208201518160010155604082015181600201908051611a9c9291602001906137e3565b5091979650505050505050565b600160a060020a031660009081526020819052604090205490565b60008060065485101515611ad757600080fd5b600c548410611ae557600080fd5b6014548310611af357600080fd5b50601054611b0881600163ffffffff612ba516565b6010556060604051908101604090815286825260208083018790528183018690526000848152600f90915220815181556020820151816001015560408201516002909101555090509392505050565b601e546000908210611b6857600080fd5b506000908152601f602052604090205460ff1690565b60008060065483101515611b9157600080fd5b50600c54611ba681600163ffffffff612ba516565b600c55602060405190810160409081528482526000838152600b60205220815190555092915050565b611bd761375a565b611bdf61376c565b6004548310611bed57600080fd5b60008381526003602090815260409182902091519081016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6c5780601f10611c7657610100808354040283529160200191610f6c565b820191906000526020600020905b815481529060010190602001808311611c8457505050919092525091925082915050519392505050565b611cb661375a565b611cbe61376c565b6006548310611ccc57600080fd5b6000838152600560209081526040918290209151908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015610f6c5760200282019190600052602060002090815481526020019060010190808311610f5857505050505081525050905080600001519392505050565b6000806000611d58613850565b601a548510611d6657600080fd5b60008581526019602052604090819020906060905190810160409081528254600160a060020a0390811683526001840154166020830152600290920154918101919091529050805181602001518260400151935093509350509193909250565b6000806000611dd361375a565b6000611ddd613870565b6014548710611deb57600080fd5b600087815260136020526040908190209060a0905190810160405290816000820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a03168152602001600182015481526020016002820154815260200160038201805480602002602001604051908101604052809291908181526020018280548015611e9957602002820191906000526020600020905b815481526020019060010190808311611e85575b50505050508152602001600482015481525050905080600001518160200151826040015183606001518460800151939b929a50909850965090945092505050565b600080611f1784848080602002602001604051908101604052809392919081815260200183836020028082843750506004549350612bbb92505050565b50600654611f2c81600163ffffffff612ba516565b600655602060405190810160405280858580806020026020016040519081016040528093929190818152602001838360200280828437505050929093525050506000828152600560205260409020815181908051610e6392916020019061370f565b60408051908101604052600381527f4659530000000000000000000000000000000000000000000000000000000000602082015281565b677fffffffffffffff81565b60008060065483101515611fe457600080fd5b50600854611ff981600163ffffffff612ba516565b600855602060405190810160409081528482526000838152600760205220815190555092915050565b600061202c61375a565b600c54831061203a57600080fd5b6000838152600b6020908152604091829020915190810160405290548152905080519392505050565b60105490565b60125460009061208081600163ffffffff612ba516565b60125560206040519081016040528085858080601f0160208091040260200160405190810160405281815292919060208401838380828437505050929093525050506000828152601160205260409020815181908051610e639291602001906137e3565b6000600160a060020a03831615156120fb57600080fd5b600160a060020a03331660009081526020819052604090205482111561212057600080fd5b600160a060020a033316600090815260208190526040902054612149908363ffffffff612c5116565b600160a060020a03338116600090815260208190526040808220939093559085168152205461217e908363ffffffff612ba516565b60008085600160a060020a0316600160a060020a031681526020019081526020016000208190555082600160a060020a031633600160a060020a03166000805160206139398339815191528460405190815260200160405180910390a350600192915050565b60065490565b670de0b6b3a764000081565b6121fe61379c565b601e54821061220c57600080fd5b6000828152601f602052604090205460ff16600381111561222957fe5b1561223357600080fd5b6000828152601d6020526040908190209060e090519081016040908152825482526001830154600160a060020a0316602083015260028301549082015260038201546060820152600482015460808201908152600583015460a083015260069092015460c0820152915060139060009051815260208101919091526040016000205433600160a060020a039081169116146122cd57600080fd5b6122df81602001518260c00151612fcf565b6000828152601f6020526040902080546002919060ff19166001835b02179055505050565b60008061230f61375a565b6123176138af565b600a54851061232557600080fd5b60008581526009602052604090819020906060905190810160405290816000820154815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123ee5780601f106123c3576101008083540402835291602001916123ee565b820191906000526020600020905b8154815290600101906020018083116123d157829003601f168201915b5050505050815250509050806000015181602001518260400151919790965090945092505050565b601e5490565b601054600090821061242d57600080fd5b50600160a060020a03919091166000908152602160209081526040808320938352929052205460ff1690565b60008060006124666138d1565b601054851061247457600080fd5b6000858152600f602052604090819020906060905190810160409081528254825260018301546020830152600290920154918101919091529050805181602001518260400151935093509350509193909250565b6000808281106124d757600080fd5b506004546124ec81600163ffffffff612ba516565b60045560206040519081016040528085858080601f0160208091040260200160405190810160405281815292919060208401838380828437505050929093525050506000828152600360205260409020815181908051610e639291602001906137e3565b601054600090821061256157600080fd5b600160a060020a038316600090815260216020908152604080832085845290915290205460ff16151561259357600080fd5b50600160a060020a03919091166000908152602260209081526040808320938352929052205490565b600e5490565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120546125fa908363ffffffff612ba516565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b61269961375a565b6126a161376c565b60125483106126af57600080fd5b60008381526011602090815260409182902091519081016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6c5780601f10611c7657610100808354040283529160200191610f6c565b61274061379c565b601e54821061274e57600080fd5b6000828152601f602052604090205460ff16600381111561276b57fe5b1561277557600080fd5b6000828152601d6020526040908190209060e090519081016040908152825482526001830154600160a060020a0316602083019081526002840154918301919091526003830154606083015260048301546080830152600583015460a083015260069092015460c0820152915051600160a060020a031633600160a060020a031614151561280257600080fd5b805143101561281057600080fd5b61282281602001518260c00151612fcf565b6000828152601f6020526040902080546001919060ff191682806122fb565b6000806012548710151561285457600080fd5b600c54861061286257600080fd5b61289c85858080602002602001604051908101604052809392919081815260200183836020028082843750506010549350612bbb92505050565b60145483106128aa57600080fd5b506014546128bf81600163ffffffff612ba516565b60145560a06040519081016040528033600160a060020a03168152602001888152602001878152602001868680806020026020016040519081016040528093929190818152602001838360200280828437505050928452505050602090810185905260008381526013909152604090208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015181600101556040820151816002015560608201518160030190805161298792916020019061370f565b50608082015160049091015550905095945050505050565b60105482106129ad57600080fd5b600e5481106129bb57600080fd5b600160a060020a033316600090815260216020908152604080832085845290915290205460ff16156129ec57600080fd5b600160a060020a0333166000818152602260209081526040808320868452825280832094909455918152602182528281209381529290529020805460ff19166001179055565b612a3a61379c565b601e548610612a4857600080fd5b6000868152601f602052604090205460ff166003811115612a6557fe5b15612a6f57600080fd5b6000868152601d6020526040908190209060e090519081016040908152825482526001830154600160a060020a0316602083015260028301549082015260038201546060820152600482015460808201908152600583015460a083015260069092015460c0820152915060139060009051815260208101919091526040016000205433600160a060020a03908116911614612b0957600080fd5b612b728686868080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050508585808060200260200160405190810160405280939291908181526020018383602002808284375061321f945050505050565b612b7f8160c001516134ed565b50505060009283525050601f60205260409020805460ff19166003179055565b601a5490565b600082820183811015612bb457fe5b9392505050565b6000806000845160001015612c4a5784600081518110612bd757fe5b906020019060200201519250838310612bef57600080fd5b5081905060015b8451811015612c4a57848181518110612c0b57fe5b906020019060200201519250838310612c2357600080fd5b828210612c2f57600080fd5b829150612c4381600163ffffffff612ba516565b9050612bf6565b5050505050565b600082821115612c5d57fe5b50900390565b612c6b61375a565b600080612c76613850565b601c548510612c8157fe5b600160a060020a0386161515612c9357fe5b601b6000868152602001908152602001600020600001805480602002602001604051908101604052809291908181526020018280548015612cf357602002820191906000526020600020905b815481526020019060010190808311612cdf575b50505050509350600092505b8351831015612fb057838381518110612d1457fe5b90602001906020020151601a549092508210612d2c57fe5b60008281526019602052604090819020906060905190810160409081528254600160a060020a0390811683526001840154166020830152600290920154918101918252915051600010612d7b57fe5b8051600160a060020a03161515612d8e57fe5b8060200151600160a060020a03161515612da457fe5b6000808251600160a060020a0316600160a060020a031681526020019081526020016000205481604001511115612dda57600080fd5b600160a060020a0386168151600160a060020a031614612ec357600260008251600160a060020a0316600160a060020a03168152602001908152602001600020600087600160a060020a0316600160a060020a031681526020019081526020016000205481604001511115612e4e57600080fd5b612e928160400151600260008451600160a060020a03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff612c5116565b600260008351600160a060020a03908116825260208083019390935260409182016000908120918b16815292529020555b612ef681604001516000808451600160a060020a031681526020810191909152604001600020549063ffffffff612c5116565b6000808351600160a060020a0316600160a060020a0316815260200190815260200160002081905550612f4b81604001516000808052602052600080516020613959833981519152549063ffffffff612ba516565b60008080526020819052600080516020613959833981519152919091558151600160a060020a0316600080516020613939833981519152836040015160405190815260200160405180910390a3612fa983600163ffffffff612ba516565b9250612cff565b505050505050565b6000808284811515612fc657fe5b04949350505050565b612fd761375a565b600080612fe2613850565b601c548510612fed57fe5b600160a060020a0386161515612fff57fe5b601b600086815260200190815260200160002060000180548060200260200160405190810160405280929190818152602001828054801561305f57602002820191906000526020600020905b81548152602001906001019080831161304b575b50505050509350600092505b8351831015612fb05783838151811061308057fe5b90602001906020020151601a54909250821061309857fe5b60008281526019602052604090819020906060905190810160409081528254600160a060020a03908116835260018401541660208301526002909201549181019182529150516000106130e757fe5b8051600160a060020a031615156130fa57fe5b8060200151600160a060020a0316151561311057fe5b6000808052602052600080516020613959833981519152546040820151111561313557fe5b61316881604001516000808451600160a060020a031681526020810191909152604001600020549063ffffffff612ba516565b6000808351600160a060020a0316600160a060020a03168152602001908152602001600020819055506131bd81604001516000808052602052600080516020613959833981519152549063ffffffff612c5116565b6000808052602052600080516020613959833981519152558051600160a060020a03166000600080516020613939833981519152604084015160405190815260200160405180910390a361321883600163ffffffff612ba516565b925061306b565b6000613229613870565b60008061323461375a565b600080601e548a10151561324457fe5b60008a8152601d6020526040902060040154601454909750871061326457fe5b600087815260136020526040908190209060a0905190810160405290816000820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200160018201548152602001600282015481526020016003820180548060200260200160405190810160405280929190818152602001828054801561331257602002820191906000526020600020905b8154815260200190600101908083116132fe575b50505050508152602001600482015481525050955087518660600151511461333957600080fd5b60009450600093505b87518410156134d45787848151811061335757fe5b9060200190602002015160405180591061336e5750595b818152601f19601f830116810160200160405290509250825160001061339357600080fd5b600091505b825182101561346b57885185106133ae57600080fd5b8885815181106133ba57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838151811061341057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061345185600163ffffffff612ba516565b945061346482600163ffffffff612ba516565b9150613398565b8560600151848151811061347b57fe5b90602001906020020151601054909150811061349357fe5b60008a81526020808052604080832084845290915290208380516134bb9291602001906137e3565b506134cd84600163ffffffff612ba516565b9350613342565b885185146134e157600080fd5b50505050505050505050565b6134f561375a565b600080613500613850565b601c54851061350b57fe5b601b600086815260200190815260200160002060000180548060200260200160405190810160405280929190818152602001828054801561356b57602002820191906000526020600020905b815481526020019060010190808311613557575b50505050509350600092505b8351831015612c4a5783838151811061358c57fe5b90602001906020020151601a5490925082106135a457fe5b60008281526019602052604090819020906060905190810160409081528254600160a060020a03908116835260018401541660208301526002909201549181019182529150516000106135f357fe5b8051600160a060020a0316151561360657fe5b8060200151600160a060020a0316151561361c57fe5b61364881604001516000808052602052600080516020613959833981519152549063ffffffff612c5116565b60008080526020526000805160206139598339815191525561369660408201516000808460200151600160a060020a031681526020810191909152604001600020549063ffffffff612ba516565b6000808360200151600160a060020a0316600160a060020a03168152602001908152602001600020819055508060200151600160a060020a03166000600080516020613939833981519152604084015160405190815260200160405180910390a361370883600163ffffffff612ba516565b9250613577565b82805482825590600052602060002090810192821561374a579160200282015b8281111561374a57825182559160200191906001019061372f565b506137569291506138f3565b5090565b60206040519081016040526000815290565b60206040519081016040528061378061375a565b905290565b604080519081016040526000808252602082015290565b60e060405190810160405280600081526020016000600160a060020a0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061382457805160ff191683800117855561374a565b8280016001018555821561374a579182018281111561374a57825182559160200191906001019061372f565b606060405190810160409081526000808352602083018190529082015290565b60a0604051908101604052806000600160a060020a0316815260200160008152602001600081526020016138a261375a565b8152602001600081525090565b606060405190810160405280600081526020016000815260200161378061375a565b6060604051908101604052806000815260200160008152602001600081525090565b610c7391905b8082111561375657600081556001016138f9565b6000808315156139205760009150610e6b565b5082820282848281151561393057fe5b0414612bb457fe00ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5a165627a7a723058200fb0c3cbc8d416f4de6c6e803e18100f4a7e09d3da8bf366c4c066a943f890510029

Deployed Bytecode

0x60606040526004361061032b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416628bed3e811461033057806301c0954b1461035557806302d055311461037d57806306fdde03146103905780630828baa21461041a578063095ea7b3146104385780630f732bdc1461046e578063143c28301461048157806318160ddd146104ea5780631880692f146104fd57806320e190a41461051057806322b6fe9e1461052e57806323b872dd1461054157806327d51979146105695780632a61d47b1461057c5780632be6ec1f1461058f578063313ce567146105a257806334116fd8146105cb57806334f99b59146105f95780633656de211461061e5780633befcd631461067a57806344ce97c914610693578063466c3a2b146106ac5780634dfe165c146106bf5780634e006d83146106d55780635044b112146106ee578063573fb624146107015780635d12fc0c14610717578063650619571461058f578063661884631461072a5780636928e1421461074c5780636d8062ee1461076257806370a08231146107885780637773c36e146107a75780637ad669e9146107c35780637b7179fc146107fd5780637e2d0ebc14610813578063820a5b191461082957806387181b101461083f57806389f90872146108825780638e5653d41461091a57806395d89b4114610938578063970afd9b1461094b578063980619a71461095e5780639bad7720146109745780639f96de0f1461098a578063a75c127b1461099d578063a9059cbb146109bb578063b086d5aa146109dd578063b154dea61461058f578063b663dc0a146109f0578063bc28d87814610a03578063bc824a7714610a1b578063c08cc02d14610ab7578063c18d958214610aca578063c798192214610aec578063cbb9d38514610b26578063d206703514610b44578063d6f22e6914610b66578063d73dd62314610b79578063dd62ed3e14610b9b578063e0db1b9114610bc0578063e1f02ffa14610bd6578063ea32c95e1461058f578063f26be2a814610bec578063f3fbad2514610c15578063fab3ebb11461058f578063feadaa1b14610c2e578063feaf087214610c5c575b600080fd5b341561033b57600080fd5b610343610c6f565b60405190815260200160405180910390f35b341561036057600080fd5b610343600160a060020a0360043581169060243516604435610c76565b341561038857600080fd5b610343610d72565b341561039b57600080fd5b6103a3610d78565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103df5780820151838201526020016103c7565b50505050905090810190601f16801561040c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561042557600080fd5b6103436004803560248101910135610daf565b341561044357600080fd5b61045a600160a060020a0360043516602435610e72565b604051901515815260200160405180910390f35b341561047957600080fd5b610343610ede565b341561048c57600080fd5b610497600435610ee4565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156104d65780820151838201526020016104be565b505050509050019250505060405180910390f35b34156104f557600080fd5b610343610f83565b341561050857600080fd5b610343610f89565b341561051b57600080fd5b6103436004803560248101910135610f8f565b341561053957600080fd5b610343611043565b341561054c57600080fd5b61045a600160a060020a0360043581169060243516604435611049565b341561057457600080fd5b6103436111b7565b341561058757600080fd5b6103436111bd565b341561059a57600080fd5b6103436111c3565b34156105ad57600080fd5b6105b56111c8565b60405160ff909116815260200160405180910390f35b34156105d657600080fd5b6105e16004356111cd565b60405191825260208201526040908101905180910390f35b341561060457600080fd5b61034360043560243560443560643560843560a435611221565b341561062957600080fd5b610634600435611359565b604051968752600160a060020a0390951660208701526040808701949094526060860192909252608085015260a084015260c083019190915260e0909101905180910390f35b341561068557600080fd5b6103a360043560243561141a565b341561069e57600080fd5b6103436004356024356116bc565b34156106b757600080fd5b61034361172f565b34156106ca57600080fd5b610497600435611735565b34156106e057600080fd5b6103436004356024356117d2565b34156106f957600080fd5b610343611845565b341561070c57600080fd5b6105e160043561184b565b341561072257600080fd5b61034361189f565b341561073557600080fd5b61045a600160a060020a03600435166024356118a7565b341561075757600080fd5b6103436004356119a1565b341561076d57600080fd5b610343600480359060248035916044359182019101356119e2565b341561079357600080fd5b610343600160a060020a0360043516611aa9565b34156107b257600080fd5b610343600435602435604435611ac4565b34156107ce57600080fd5b6107d9600435611b57565b604051808260038111156107e957fe5b60ff16815260200191505060405180910390f35b341561080857600080fd5b610343600435611b7e565b341561081e57600080fd5b6103a3600435611bcf565b341561083457600080fd5b610497600435611cae565b341561084a57600080fd5b610855600435611d4b565b604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390f35b341561088d57600080fd5b610898600435611dc6565b6040518086600160a060020a0316600160a060020a0316815260200185815260200184815260200180602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156109025780820151838201526020016108ea565b50505050905001965050505050505060405180910390f35b341561092557600080fd5b6103436004803560248101910135611eda565b341561094357600080fd5b6103a3611f8e565b341561095657600080fd5b610343611fc5565b341561096957600080fd5b610343600435611fd1565b341561097f57600080fd5b610343600435612022565b341561099557600080fd5b610343612063565b34156109a857600080fd5b6103436004803560248101910135612069565b34156109c657600080fd5b61045a600160a060020a03600435166024356120e4565b34156109e857600080fd5b6103436121e4565b34156109fb57600080fd5b6103436121ea565b3415610a0e57600080fd5b610a196004356121f6565b005b3415610a2657600080fd5b610a31600435612304565b6040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610a7a578082015183820152602001610a62565b50505050905090810190601f168015610aa75780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b3415610ac257600080fd5b610343612416565b3415610ad557600080fd5b61045a600160a060020a036004351660243561241c565b3415610af757600080fd5b610b02600435612459565b60405180848152602001838152602001828152602001935050505060405180910390f35b3415610b3157600080fd5b61034360048035602481019101356124c8565b3415610b4f57600080fd5b610343600160a060020a0360043516602435612550565b3415610b7157600080fd5b6103436125bc565b3415610b8457600080fd5b61045a600160a060020a03600435166024356125c2565b3415610ba657600080fd5b610343600160a060020a0360043581169060243516612666565b3415610bcb57600080fd5b6103a3600435612691565b3415610be157600080fd5b610a19600435612738565b3415610bf757600080fd5b61034360048035906024803591604435918201910135606435612841565b3415610c2057600080fd5b610a1960043560243561299f565b3415610c3957600080fd5b610a19600480359060248035808201929081013591604435908101910135612a32565b3415610c6757600080fd5b610343612b9f565b6016545b90565b600080600160a060020a0385161515610c8e57600080fd5b600160a060020a0384161515610ca357600080fd5b6000839010610cb157600080fd5b50601a54610cc681600163ffffffff612ba516565b601a5560606040519081016040908152600160a060020a038088168352861660208084019190915281830186905260008481526019909152208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015160018201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560408201516002909101555090509392505050565b60045490565b60408051908101604052600781527f4679736963616c00000000000000000000000000000000000000000000000000602082015281565b600080610dec84848080602002602001604051908101604052809392919081815260200183836020028082843750506016549350612bbb92505050565b50601854610e0181600163ffffffff612ba516565b601855602060405190810160405280858580806020026020016040519081016040528093929190818152602001838360200280828437505050929093525050506000828152601760205260409020815181908051610e6392916020019061370f565b509050508091505b5092915050565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b600c5490565b610eec61375a565b610ef461376c565b6018548310610f0257600080fd5b6000838152601760209081526040918290209151908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015610f6c57602002820191906000526020600020905b815481526020019060010190808311610f58575b505050505081525050905080600001519392505050565b60015490565b60125490565b600080610fcc8484808060200260200160405190810160405280939291908181526020018383602002808284375050601a549350612bbb92505050565b50601c54610fe181600163ffffffff612ba516565b601c55602060405190810160405280858580806020026020016040519081016040528093929190818152602001838360200280828437505050929093525050506000828152601b60205260409020815181908051610e6392916020019061370f565b60185490565b6000600160a060020a038316151561106057600080fd5b600160a060020a03841660009081526020819052604090205482111561108557600080fd5b600160a060020a03808516600090815260026020908152604080832033909416835292905220548211156110b857600080fd5b600160a060020a0384166000908152602081905260409020546110e1908363ffffffff612c5116565b600160a060020a038086166000908152602081905260408082209390935590851681522054611116908363ffffffff612ba516565b600160a060020a038085166000908152602081815260408083209490945587831682526002815283822033909316825291909152205461115c908363ffffffff612c5116565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516916000805160206139398339815191529085905190815260200160405180910390a35060019392505050565b601c5490565b60145490565b600081565b600981565b6000806111d8613785565b600e5484106111e657600080fd5b6000848152600d6020526040908190209080519081016040528154815260019091015460208201529050805181602001519250925050915091565b6000806012548710151561123457600080fd5b600c54861061124257600080fd5b601454851061125057600080fd5b601854841061125e57600080fd5b601c54831061126c57600080fd5b6112763384612c63565b50601e5461128b81600163ffffffff612ba516565b601e5560e06040519081016040528089815260200133600160a060020a0316815260200188815260200187815260200186815260200185815260200184815250601d600083815260200190815260200160002060008201518155602082015160018201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201516006909101555090509695505050505050565b600080600080600080600061136c61379c565b601e54891061137a57600080fd5b6000898152601d6020526040908190209060e090519081016040908152825482526001830154600160a060020a031660208301526002830154908201526003820154606082015260048201546080820152600582015460a082015260069091015460c08201529050805181602001518260400151836060015184608001518560a001518660c00151959f949e50929c50909a509850965090945092505050565b61142261375a565b61142a61375a565b6000806000601e548710151561143f57600080fd5b6000878152601f602052604090205460ff16600381111561145c57fe5b60031461146857600080fd5b601054861061147657600080fd5b6000878152601d6020908152604080832060040154835260138252918290206003018054909290918281020190519081016040528092919081815260200182805480156114e257602002820191906000526020600020905b8154815260200190600101908083116114ce575b5050505050935083516000106114f757600080fd5b835160011415611528578360008151811061150e57fe5b90602001906020020151861461152357600080fd5b6115f3565b6000925061153f600185519063ffffffff612c5116565b91506115626002611556858563ffffffff612ba516565b9063ffffffff612fb816565b90505b83818151811061157157fe5b9060200190602002015186146115f3578183111561158e57600080fd5b8584828151811061159b57fe5b9060200190602002015110156115c3576115bc81600163ffffffff612ba516565b92506115d7565b6115d481600163ffffffff612c5116565b91505b6115ec6002611556858563ffffffff612ba516565b9050611565565b6020600088815260200190815260200160002060008781526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ab5780601f10611680576101008083540402835291602001916116ab565b820191906000526020600020905b81548152906001019060200180831161168e57829003601f168201915b505050505094505050505092915050565b600080600654841015156116cf57600080fd5b600e5483106116dd57600080fd5b506016546116f281600163ffffffff612ba516565b6016556040805190810160409081528582526020808301869052600084815260159091522081518155602082015160019091015550905092915050565b60085490565b61173d61375a565b61174561376c565b601c54831061175357600080fd5b6000838152601b60209081526040918290209151908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015610f6c5760200282019190600052602060002090815481526020019060010190808311610f5857505050505081525050905080600001519392505050565b600080600a54841015156117e557600080fd5b600a5483106117f357600080fd5b50600e5461180881600163ffffffff612ba516565b600e5560408051908101604090815285825260208083018690526000848152600d9091522081518155602082015160019091015550905092915050565b600a5490565b600080611856613785565b601654841061186457600080fd5b600084815260156020526040908190209080519081016040528154815260019091015460208201529050805181602001519250925050915091565b633b9aca0081565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561190457600160a060020a03338116600090815260026020908152604080832093881683529290529081205561193b565b611914818463ffffffff612c5116565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b60006119ab61375a565b60085483106119b957600080fd5b600083815260076020908152604091829020915190810160405290548152905080519392505050565b600080600854861015156119f557600080fd5b6000859010611a0357600080fd5b50600a54611a1881600163ffffffff612ba516565b600a5560606040519081016040528087815260200186815260200185858080601f01602080910402602001604051908101604052818152929190602084018383808284375050509290935250505060008281526009602052604090208151815560208201518160010155604082015181600201908051611a9c9291602001906137e3565b5091979650505050505050565b600160a060020a031660009081526020819052604090205490565b60008060065485101515611ad757600080fd5b600c548410611ae557600080fd5b6014548310611af357600080fd5b50601054611b0881600163ffffffff612ba516565b6010556060604051908101604090815286825260208083018790528183018690526000848152600f90915220815181556020820151816001015560408201516002909101555090509392505050565b601e546000908210611b6857600080fd5b506000908152601f602052604090205460ff1690565b60008060065483101515611b9157600080fd5b50600c54611ba681600163ffffffff612ba516565b600c55602060405190810160409081528482526000838152600b60205220815190555092915050565b611bd761375a565b611bdf61376c565b6004548310611bed57600080fd5b60008381526003602090815260409182902091519081016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6c5780601f10611c7657610100808354040283529160200191610f6c565b820191906000526020600020905b815481529060010190602001808311611c8457505050919092525091925082915050519392505050565b611cb661375a565b611cbe61376c565b6006548310611ccc57600080fd5b6000838152600560209081526040918290209151908101604052908160008201805480602002602001604051908101604052809291908181526020018280548015610f6c5760200282019190600052602060002090815481526020019060010190808311610f5857505050505081525050905080600001519392505050565b6000806000611d58613850565b601a548510611d6657600080fd5b60008581526019602052604090819020906060905190810160409081528254600160a060020a0390811683526001840154166020830152600290920154918101919091529050805181602001518260400151935093509350509193909250565b6000806000611dd361375a565b6000611ddd613870565b6014548710611deb57600080fd5b600087815260136020526040908190209060a0905190810160405290816000820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a03168152602001600182015481526020016002820154815260200160038201805480602002602001604051908101604052809291908181526020018280548015611e9957602002820191906000526020600020905b815481526020019060010190808311611e85575b50505050508152602001600482015481525050905080600001518160200151826040015183606001518460800151939b929a50909850965090945092505050565b600080611f1784848080602002602001604051908101604052809392919081815260200183836020028082843750506004549350612bbb92505050565b50600654611f2c81600163ffffffff612ba516565b600655602060405190810160405280858580806020026020016040519081016040528093929190818152602001838360200280828437505050929093525050506000828152600560205260409020815181908051610e6392916020019061370f565b60408051908101604052600381527f4659530000000000000000000000000000000000000000000000000000000000602082015281565b677fffffffffffffff81565b60008060065483101515611fe457600080fd5b50600854611ff981600163ffffffff612ba516565b600855602060405190810160409081528482526000838152600760205220815190555092915050565b600061202c61375a565b600c54831061203a57600080fd5b6000838152600b6020908152604091829020915190810160405290548152905080519392505050565b60105490565b60125460009061208081600163ffffffff612ba516565b60125560206040519081016040528085858080601f0160208091040260200160405190810160405281815292919060208401838380828437505050929093525050506000828152601160205260409020815181908051610e639291602001906137e3565b6000600160a060020a03831615156120fb57600080fd5b600160a060020a03331660009081526020819052604090205482111561212057600080fd5b600160a060020a033316600090815260208190526040902054612149908363ffffffff612c5116565b600160a060020a03338116600090815260208190526040808220939093559085168152205461217e908363ffffffff612ba516565b60008085600160a060020a0316600160a060020a031681526020019081526020016000208190555082600160a060020a031633600160a060020a03166000805160206139398339815191528460405190815260200160405180910390a350600192915050565b60065490565b670de0b6b3a764000081565b6121fe61379c565b601e54821061220c57600080fd5b6000828152601f602052604090205460ff16600381111561222957fe5b1561223357600080fd5b6000828152601d6020526040908190209060e090519081016040908152825482526001830154600160a060020a0316602083015260028301549082015260038201546060820152600482015460808201908152600583015460a083015260069092015460c0820152915060139060009051815260208101919091526040016000205433600160a060020a039081169116146122cd57600080fd5b6122df81602001518260c00151612fcf565b6000828152601f6020526040902080546002919060ff19166001835b02179055505050565b60008061230f61375a565b6123176138af565b600a54851061232557600080fd5b60008581526009602052604090819020906060905190810160405290816000820154815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123ee5780601f106123c3576101008083540402835291602001916123ee565b820191906000526020600020905b8154815290600101906020018083116123d157829003601f168201915b5050505050815250509050806000015181602001518260400151919790965090945092505050565b601e5490565b601054600090821061242d57600080fd5b50600160a060020a03919091166000908152602160209081526040808320938352929052205460ff1690565b60008060006124666138d1565b601054851061247457600080fd5b6000858152600f602052604090819020906060905190810160409081528254825260018301546020830152600290920154918101919091529050805181602001518260400151935093509350509193909250565b6000808281106124d757600080fd5b506004546124ec81600163ffffffff612ba516565b60045560206040519081016040528085858080601f0160208091040260200160405190810160405281815292919060208401838380828437505050929093525050506000828152600360205260409020815181908051610e639291602001906137e3565b601054600090821061256157600080fd5b600160a060020a038316600090815260216020908152604080832085845290915290205460ff16151561259357600080fd5b50600160a060020a03919091166000908152602260209081526040808320938352929052205490565b600e5490565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120546125fa908363ffffffff612ba516565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b61269961375a565b6126a161376c565b60125483106126af57600080fd5b60008381526011602090815260409182902091519081016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6c5780601f10611c7657610100808354040283529160200191610f6c565b61274061379c565b601e54821061274e57600080fd5b6000828152601f602052604090205460ff16600381111561276b57fe5b1561277557600080fd5b6000828152601d6020526040908190209060e090519081016040908152825482526001830154600160a060020a0316602083019081526002840154918301919091526003830154606083015260048301546080830152600583015460a083015260069092015460c0820152915051600160a060020a031633600160a060020a031614151561280257600080fd5b805143101561281057600080fd5b61282281602001518260c00151612fcf565b6000828152601f6020526040902080546001919060ff191682806122fb565b6000806012548710151561285457600080fd5b600c54861061286257600080fd5b61289c85858080602002602001604051908101604052809392919081815260200183836020028082843750506010549350612bbb92505050565b60145483106128aa57600080fd5b506014546128bf81600163ffffffff612ba516565b60145560a06040519081016040528033600160a060020a03168152602001888152602001878152602001868680806020026020016040519081016040528093929190818152602001838360200280828437505050928452505050602090810185905260008381526013909152604090208151815473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0391909116178155602082015181600101556040820151816002015560608201518160030190805161298792916020019061370f565b50608082015160049091015550905095945050505050565b60105482106129ad57600080fd5b600e5481106129bb57600080fd5b600160a060020a033316600090815260216020908152604080832085845290915290205460ff16156129ec57600080fd5b600160a060020a0333166000818152602260209081526040808320868452825280832094909455918152602182528281209381529290529020805460ff19166001179055565b612a3a61379c565b601e548610612a4857600080fd5b6000868152601f602052604090205460ff166003811115612a6557fe5b15612a6f57600080fd5b6000868152601d6020526040908190209060e090519081016040908152825482526001830154600160a060020a0316602083015260028301549082015260038201546060820152600482015460808201908152600583015460a083015260069092015460c0820152915060139060009051815260208101919091526040016000205433600160a060020a03908116911614612b0957600080fd5b612b728686868080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050508585808060200260200160405190810160405280939291908181526020018383602002808284375061321f945050505050565b612b7f8160c001516134ed565b50505060009283525050601f60205260409020805460ff19166003179055565b601a5490565b600082820183811015612bb457fe5b9392505050565b6000806000845160001015612c4a5784600081518110612bd757fe5b906020019060200201519250838310612bef57600080fd5b5081905060015b8451811015612c4a57848181518110612c0b57fe5b906020019060200201519250838310612c2357600080fd5b828210612c2f57600080fd5b829150612c4381600163ffffffff612ba516565b9050612bf6565b5050505050565b600082821115612c5d57fe5b50900390565b612c6b61375a565b600080612c76613850565b601c548510612c8157fe5b600160a060020a0386161515612c9357fe5b601b6000868152602001908152602001600020600001805480602002602001604051908101604052809291908181526020018280548015612cf357602002820191906000526020600020905b815481526020019060010190808311612cdf575b50505050509350600092505b8351831015612fb057838381518110612d1457fe5b90602001906020020151601a549092508210612d2c57fe5b60008281526019602052604090819020906060905190810160409081528254600160a060020a0390811683526001840154166020830152600290920154918101918252915051600010612d7b57fe5b8051600160a060020a03161515612d8e57fe5b8060200151600160a060020a03161515612da457fe5b6000808251600160a060020a0316600160a060020a031681526020019081526020016000205481604001511115612dda57600080fd5b600160a060020a0386168151600160a060020a031614612ec357600260008251600160a060020a0316600160a060020a03168152602001908152602001600020600087600160a060020a0316600160a060020a031681526020019081526020016000205481604001511115612e4e57600080fd5b612e928160400151600260008451600160a060020a03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff612c5116565b600260008351600160a060020a03908116825260208083019390935260409182016000908120918b16815292529020555b612ef681604001516000808451600160a060020a031681526020810191909152604001600020549063ffffffff612c5116565b6000808351600160a060020a0316600160a060020a0316815260200190815260200160002081905550612f4b81604001516000808052602052600080516020613959833981519152549063ffffffff612ba516565b60008080526020819052600080516020613959833981519152919091558151600160a060020a0316600080516020613939833981519152836040015160405190815260200160405180910390a3612fa983600163ffffffff612ba516565b9250612cff565b505050505050565b6000808284811515612fc657fe5b04949350505050565b612fd761375a565b600080612fe2613850565b601c548510612fed57fe5b600160a060020a0386161515612fff57fe5b601b600086815260200190815260200160002060000180548060200260200160405190810160405280929190818152602001828054801561305f57602002820191906000526020600020905b81548152602001906001019080831161304b575b50505050509350600092505b8351831015612fb05783838151811061308057fe5b90602001906020020151601a54909250821061309857fe5b60008281526019602052604090819020906060905190810160409081528254600160a060020a03908116835260018401541660208301526002909201549181019182529150516000106130e757fe5b8051600160a060020a031615156130fa57fe5b8060200151600160a060020a0316151561311057fe5b6000808052602052600080516020613959833981519152546040820151111561313557fe5b61316881604001516000808451600160a060020a031681526020810191909152604001600020549063ffffffff612ba516565b6000808351600160a060020a0316600160a060020a03168152602001908152602001600020819055506131bd81604001516000808052602052600080516020613959833981519152549063ffffffff612c5116565b6000808052602052600080516020613959833981519152558051600160a060020a03166000600080516020613939833981519152604084015160405190815260200160405180910390a361321883600163ffffffff612ba516565b925061306b565b6000613229613870565b60008061323461375a565b600080601e548a10151561324457fe5b60008a8152601d6020526040902060040154601454909750871061326457fe5b600087815260136020526040908190209060a0905190810160405290816000820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200160018201548152602001600282015481526020016003820180548060200260200160405190810160405280929190818152602001828054801561331257602002820191906000526020600020905b8154815260200190600101908083116132fe575b50505050508152602001600482015481525050955087518660600151511461333957600080fd5b60009450600093505b87518410156134d45787848151811061335757fe5b9060200190602002015160405180591061336e5750595b818152601f19601f830116810160200160405290509250825160001061339357600080fd5b600091505b825182101561346b57885185106133ae57600080fd5b8885815181106133ba57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838151811061341057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061345185600163ffffffff612ba516565b945061346482600163ffffffff612ba516565b9150613398565b8560600151848151811061347b57fe5b90602001906020020151601054909150811061349357fe5b60008a81526020808052604080832084845290915290208380516134bb9291602001906137e3565b506134cd84600163ffffffff612ba516565b9350613342565b885185146134e157600080fd5b50505050505050505050565b6134f561375a565b600080613500613850565b601c54851061350b57fe5b601b600086815260200190815260200160002060000180548060200260200160405190810160405280929190818152602001828054801561356b57602002820191906000526020600020905b815481526020019060010190808311613557575b50505050509350600092505b8351831015612c4a5783838151811061358c57fe5b90602001906020020151601a5490925082106135a457fe5b60008281526019602052604090819020906060905190810160409081528254600160a060020a03908116835260018401541660208301526002909201549181019182529150516000106135f357fe5b8051600160a060020a0316151561360657fe5b8060200151600160a060020a0316151561361c57fe5b61364881604001516000808052602052600080516020613959833981519152549063ffffffff612c5116565b60008080526020526000805160206139598339815191525561369660408201516000808460200151600160a060020a031681526020810191909152604001600020549063ffffffff612ba516565b6000808360200151600160a060020a0316600160a060020a03168152602001908152602001600020819055508060200151600160a060020a03166000600080516020613939833981519152604084015160405190815260200160405180910390a361370883600163ffffffff612ba516565b9250613577565b82805482825590600052602060002090810192821561374a579160200282015b8281111561374a57825182559160200191906001019061372f565b506137569291506138f3565b5090565b60206040519081016040526000815290565b60206040519081016040528061378061375a565b905290565b604080519081016040526000808252602082015290565b60e060405190810160405280600081526020016000600160a060020a0316815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061382457805160ff191683800117855561374a565b8280016001018555821561374a579182018281111561374a57825182559160200191906001019061372f565b606060405190810160409081526000808352602083018190529082015290565b60a0604051908101604052806000600160a060020a0316815260200160008152602001600081526020016138a261375a565b8152602001600081525090565b606060405190810160405280600081526020016000815260200161378061375a565b6060604051908101604052806000815260200160008152602001600081525090565b610c7391905b8082111561375657600081556001016138f9565b6000808315156139205760009150610e6b565b5082820282848281151561393057fe5b0414612bb457fe00ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5a165627a7a723058200fb0c3cbc8d416f4de6c6e803e18100f4a7e09d3da8bf366c4c066a943f890510029

Swarm Source

bzzr://0fb0c3cbc8d416f4de6c6e803e18100f4a7e09d3da8bf366c4c066a943f89051
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.