ETH Price: $1,584.24 (-0.33%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Transfer Pro...214973042024-12-28 0:13:47111 days ago1735344827IN
0x223c067F...4C335fecB
0 ETH0.000113984.66463625
Set Transfer Pro...214972912024-12-28 0:11:11111 days ago1735344671IN
0x223c067F...4C335fecB
0 ETH0.000122185.05015933
Set Transfer Pro...161636072022-12-11 19:38:47858 days ago1670787527IN
0x223c067F...4C335fecB
0 ETH0.000412816.89418037
Set Voting Proxy156279582022-09-27 23:28:11933 days ago1664321291IN
0x223c067F...4C335fecB
0 ETH0.0002753810.92146092
Set Transfer Pro...128541112021-07-19 1:37:081369 days ago1626658628IN
0x223c067F...4C335fecB
0 ETH0.0004493818.4
Set Keys95222642020-02-20 20:25:531883 days ago1582230353IN
0x223c067F...4C335fecB
0 ETH0.0004032116
Set Spawn Proxy72308322019-02-17 6:37:542251 days ago1550385474IN
0x223c067F...4C335fecB
0 ETH0.000190928
Set Spawn Proxy71764522019-02-05 3:35:532263 days ago1549337753IN
0x223c067F...4C335fecB
0 ETH0.000071593
Set Spawn Proxy71763622019-02-05 3:08:562263 days ago1549336136IN
0x223c067F...4C335fecB
0 ETH0.000071593
Activate Point71763422019-02-05 3:04:362263 days ago1549335876IN
0x223c067F...4C335fecB
0 ETH0.00006863
Activate Point71763322019-02-05 3:02:312263 days ago1549335751IN
0x223c067F...4C335fecB
0 ETH0.000043052
Transfer70724702019-01-15 21:30:082284 days ago1547587808IN
0x223c067F...4C335fecB
0.01 ETH0.0002104610
Transfer Ownersh...67849432018-11-27 23:34:092333 days ago1543361649IN
0x223c067F...4C335fecB
0 ETH0.000128634

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
-141610372022-02-07 20:11:281165 days ago1644264688
0x223c067F...4C335fecB
0.025 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Azimuth

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-01-04
*/

//  the azimuth data store
//  https://azimuth.network

pragma solidity 0.4.24;

////////////////////////////////////////////////////////////////////////////////
//  Imports
////////////////////////////////////////////////////////////////////////////////

// OpenZeppelin's Ownable.sol

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

////////////////////////////////////////////////////////////////////////////////
//  Azimuth
////////////////////////////////////////////////////////////////////////////////

//  Azimuth: point state data contract
//
//    This contract is used for storing all data related to Azimuth points
//    and their ownership. Consider this contract the Azimuth ledger.
//
//    It also contains permissions data, which ties in to ERC721
//    functionality. Operators of an address are allowed to transfer
//    ownership of all points owned by their associated address
//    (ERC721's approveAll()). A transfer proxy is allowed to transfer
//    ownership of a single point (ERC721's approve()).
//    Separate from ERC721 are managers, assigned per point. They are
//    allowed to perform "low-impact" operations on the owner's points,
//    like configuring public keys and making escape requests.
//
//    Since data stores are difficult to upgrade, this contract contains
//    as little actual business logic as possible. Instead, the data stored
//    herein can only be modified by this contract's owner, which can be
//    changed and is thus upgradable/replaceable.
//
//    This contract will be owned by the Ecliptic contract.
//
contract Azimuth is Ownable
{
//
//  Events
//

  //  OwnerChanged: :point is now owned by :owner
  //
  event OwnerChanged(uint32 indexed point, address indexed owner);

  //  Activated: :point is now active
  //
  event Activated(uint32 indexed point);

  //  Spawned: :prefix has spawned :child
  //
  event Spawned(uint32 indexed prefix, uint32 indexed child);

  //  EscapeRequested: :point has requested a new :sponsor
  //
  event EscapeRequested(uint32 indexed point, uint32 indexed sponsor);

  //  EscapeCanceled: :point's :sponsor request was canceled or rejected
  //
  event EscapeCanceled(uint32 indexed point, uint32 indexed sponsor);

  //  EscapeAccepted: :point confirmed with a new :sponsor
  //
  event EscapeAccepted(uint32 indexed point, uint32 indexed sponsor);

  //  LostSponsor: :point's :sponsor is now refusing it service
  //
  event LostSponsor(uint32 indexed point, uint32 indexed sponsor);

  //  ChangedKeys: :point has new network public keys
  //
  event ChangedKeys( uint32 indexed point,
                     bytes32 encryptionKey,
                     bytes32 authenticationKey,
                     uint32 cryptoSuiteVersion,
                     uint32 keyRevisionNumber );

  //  BrokeContinuity: :point has a new continuity number, :number
  //
  event BrokeContinuity(uint32 indexed point, uint32 number);

  //  ChangedSpawnProxy: :spawnProxy can now spawn using :point
  //
  event ChangedSpawnProxy(uint32 indexed point, address indexed spawnProxy);

  //  ChangedTransferProxy: :transferProxy can now transfer ownership of :point
  //
  event ChangedTransferProxy( uint32 indexed point,
                              address indexed transferProxy );

  //  ChangedManagementProxy: :managementProxy can now manage :point
  //
  event ChangedManagementProxy( uint32 indexed point,
                                address indexed managementProxy );

  //  ChangedVotingProxy: :votingProxy can now vote using :point
  //
  event ChangedVotingProxy(uint32 indexed point, address indexed votingProxy);

  //  ChangedDns: dnsDomains have been updated
  //
  event ChangedDns(string primary, string secondary, string tertiary);

//
//  Structures
//

  //  Size: kinds of points registered on-chain
  //
  //    NOTE: the order matters, because of Solidity enum numbering
  //
  enum Size
  {
    Galaxy, // = 0
    Star,   // = 1
    Planet  // = 2
  }

  //  Point: state of a point
  //
  //    While the ordering of the struct members is semantically chaotic,
  //    they are ordered to tightly pack them into Ethereum's 32-byte storage
  //    slots, which reduces gas costs for some function calls.
  //    The comment ticks indicate assumed slot boundaries.
  //
  struct Point
  {
    //  encryptionKey: (curve25519) encryption public key, or 0 for none
    //
    bytes32 encryptionKey;
  //
    //  authenticationKey: (ed25519) authentication public key, or 0 for none
    //
    bytes32 authenticationKey;
  //
    //  spawned: for stars and galaxies, all :active children
    //
    uint32[] spawned;
  //
    //  hasSponsor: true if the sponsor still supports the point
    //
    bool hasSponsor;

    //  active: whether point can be linked
    //
    //    false: point belongs to prefix, cannot be configured or linked
    //    true: point no longer belongs to prefix, can be configured and linked
    //
    bool active;

    //  escapeRequested: true if the point has requested to change sponsors
    //
    bool escapeRequested;

    //  sponsor: the point that supports this one on the network, or,
    //           if :hasSponsor is false, the last point that supported it.
    //           (by default, the point's half-width prefix)
    //
    uint32 sponsor;

    //  escapeRequestedTo: if :escapeRequested is true, new sponsor requested
    //
    uint32 escapeRequestedTo;

    //  cryptoSuiteVersion: version of the crypto suite used for the pubkeys
    //
    uint32 cryptoSuiteVersion;

    //  keyRevisionNumber: incremented every time the public keys change
    //
    uint32 keyRevisionNumber;

    //  continuityNumber: incremented to indicate network-side state loss
    //
    uint32 continuityNumber;
  }

  //  Deed: permissions for a point
  //
  struct Deed
  {
    //  owner: address that owns this point
    //
    address owner;

    //  managementProxy: 0, or another address with the right to perform
    //                   low-impact, managerial operations on this point
    //
    address managementProxy;

    //  spawnProxy: 0, or another address with the right to spawn children
    //              of this point
    //
    address spawnProxy;

    //  votingProxy: 0, or another address with the right to vote as this point
    //
    address votingProxy;

    //  transferProxy: 0, or another address with the right to transfer
    //                 ownership of this point
    //
    address transferProxy;
  }

//
//  General state
//

  //  points: per point, general network-relevant point state
  //
  mapping(uint32 => Point) public points;

  //  rights: per point, on-chain ownership and permissions
  //
  mapping(uint32 => Deed) public rights;

  //  operators: per owner, per address, has the right to transfer ownership
  //             of all the owner's points (ERC721)
  //
  mapping(address => mapping(address => bool)) public operators;

  //  dnsDomains: base domains for contacting galaxies
  //
  //    dnsDomains[0] is primary, the others are used as fallbacks
  //
  string[3] public dnsDomains;

//
//  Lookups
//

  //  sponsoring: per point, the points they are sponsoring
  //
  mapping(uint32 => uint32[]) public sponsoring;

  //  sponsoringIndexes: per point, per point, (index + 1) in
  //                     the sponsoring array
  //
  mapping(uint32 => mapping(uint32 => uint256)) public sponsoringIndexes;

  //  escapeRequests: per point, the points they have open escape requests from
  //
  mapping(uint32 => uint32[]) public escapeRequests;

  //  escapeRequestsIndexes: per point, per point, (index + 1) in
  //                         the escapeRequests array
  //
  mapping(uint32 => mapping(uint32 => uint256)) public escapeRequestsIndexes;

  //  pointsOwnedBy: per address, the points they own
  //
  mapping(address => uint32[]) public pointsOwnedBy;

  //  pointOwnerIndexes: per owner, per point, (index + 1) in
  //                     the pointsOwnedBy array
  //
  //    We delete owners by moving the last entry in the array to the
  //    newly emptied slot, which is (n - 1) where n is the value of
  //    pointOwnerIndexes[owner][point].
  //
  mapping(address => mapping(uint32 => uint256)) public pointOwnerIndexes;

  //  managerFor: per address, the points they are the management proxy for
  //
  mapping(address => uint32[]) public managerFor;

  //  managerForIndexes: per address, per point, (index + 1) in
  //                     the managerFor array
  //
  mapping(address => mapping(uint32 => uint256)) public managerForIndexes;

  //  spawningFor: per address, the points they can spawn with
  //
  mapping(address => uint32[]) public spawningFor;

  //  spawningForIndexes: per address, per point, (index + 1) in
  //                      the spawningFor array
  //
  mapping(address => mapping(uint32 => uint256)) public spawningForIndexes;

  //  votingFor: per address, the points they can vote with
  //
  mapping(address => uint32[]) public votingFor;

  //  votingForIndexes: per address, per point, (index + 1) in
  //                    the votingFor array
  //
  mapping(address => mapping(uint32 => uint256)) public votingForIndexes;

  //  transferringFor: per address, the points they can transfer
  //
  mapping(address => uint32[]) public transferringFor;

  //  transferringForIndexes: per address, per point, (index + 1) in
  //                          the transferringFor array
  //
  mapping(address => mapping(uint32 => uint256)) public transferringForIndexes;

//
//  Logic
//

  //  constructor(): configure default dns domains
  //
  constructor()
    public
  {
    setDnsDomains("example.com", "example.com", "example.com");
  }

  //  setDnsDomains(): set the base domains used for contacting galaxies
  //
  //    Note: since a string is really just a byte[], and Solidity can't
  //    work with two-dimensional arrays yet, we pass in the three
  //    domains as individual strings.
  //
  function setDnsDomains(string _primary, string _secondary, string _tertiary)
    onlyOwner
    public
  {
    dnsDomains[0] = _primary;
    dnsDomains[1] = _secondary;
    dnsDomains[2] = _tertiary;
    emit ChangedDns(_primary, _secondary, _tertiary);
  }

  //
  //  Point reading
  //

    //  isActive(): return true if _point is active
    //
    function isActive(uint32 _point)
      view
      external
      returns (bool equals)
    {
      return points[_point].active;
    }

    //  getKeys(): returns the public keys and their details, as currently
    //             registered for _point
    //
    function getKeys(uint32 _point)
      view
      external
      returns (bytes32 crypt, bytes32 auth, uint32 suite, uint32 revision)
    {
      Point storage point = points[_point];
      return (point.encryptionKey,
              point.authenticationKey,
              point.cryptoSuiteVersion,
              point.keyRevisionNumber);
    }

    //  getKeyRevisionNumber(): gets the revision number of _point's current
    //                          public keys
    //
    function getKeyRevisionNumber(uint32 _point)
      view
      external
      returns (uint32 revision)
    {
      return points[_point].keyRevisionNumber;
    }

    //  hasBeenLinked(): returns true if the point has ever been assigned keys
    //
    function hasBeenLinked(uint32 _point)
      view
      external
      returns (bool result)
    {
      return ( points[_point].keyRevisionNumber > 0 );
    }

    //  isLive(): returns true if _point currently has keys properly configured
    //
    function isLive(uint32 _point)
      view
      external
      returns (bool result)
    {
      Point storage point = points[_point];
      return ( point.encryptionKey != 0 &&
               point.authenticationKey != 0 &&
               point.cryptoSuiteVersion != 0 );
    }

    //  getContinuityNumber(): returns _point's current continuity number
    //
    function getContinuityNumber(uint32 _point)
      view
      external
      returns (uint32 continuityNumber)
    {
      return points[_point].continuityNumber;
    }

    //  getSpawnCount(): return the number of children spawned by _point
    //
    function getSpawnCount(uint32 _point)
      view
      external
      returns (uint32 spawnCount)
    {
      uint256 len = points[_point].spawned.length;
      assert(len < 2**32);
      return uint32(len);
    }

    //  getSpawned(): return array of points created under _point
    //
    //    Note: only useful for clients, as Solidity does not currently
    //    support returning dynamic arrays.
    //
    function getSpawned(uint32 _point)
      view
      external
      returns (uint32[] spawned)
    {
      return points[_point].spawned;
    }

    //  hasSponsor(): returns true if _point's sponsor is providing it service
    //
    function hasSponsor(uint32 _point)
      view
      external
      returns (bool has)
    {
      return points[_point].hasSponsor;
    }

    //  getSponsor(): returns _point's current (or most recent) sponsor
    //
    function getSponsor(uint32 _point)
      view
      external
      returns (uint32 sponsor)
    {
      return points[_point].sponsor;
    }

    //  isSponsor(): returns true if _sponsor is currently providing service
    //               to _point
    //
    function isSponsor(uint32 _point, uint32 _sponsor)
      view
      external
      returns (bool result)
    {
      Point storage point = points[_point];
      return ( point.hasSponsor &&
               (point.sponsor == _sponsor) );
    }

    //  getSponsoringCount(): returns the number of points _sponsor is
    //                        providing service to
    //
    function getSponsoringCount(uint32 _sponsor)
      view
      external
      returns (uint256 count)
    {
      return sponsoring[_sponsor].length;
    }

    //  getSponsoring(): returns a list of points _sponsor is providing
    //                   service to
    //
    //    Note: only useful for clients, as Solidity does not currently
    //    support returning dynamic arrays.
    //
    function getSponsoring(uint32 _sponsor)
      view
      external
      returns (uint32[] sponsees)
    {
      return sponsoring[_sponsor];
    }

    //  escaping

    //  isEscaping(): returns true if _point has an outstanding escape request
    //
    function isEscaping(uint32 _point)
      view
      external
      returns (bool escaping)
    {
      return points[_point].escapeRequested;
    }

    //  getEscapeRequest(): returns _point's current escape request
    //
    //    the returned escape request is only valid as long as isEscaping()
    //    returns true
    //
    function getEscapeRequest(uint32 _point)
      view
      external
      returns (uint32 escape)
    {
      return points[_point].escapeRequestedTo;
    }

    //  isRequestingEscapeTo(): returns true if _point has an outstanding
    //                          escape request targetting _sponsor
    //
    function isRequestingEscapeTo(uint32 _point, uint32 _sponsor)
      view
      public
      returns (bool equals)
    {
      Point storage point = points[_point];
      return (point.escapeRequested && (point.escapeRequestedTo == _sponsor));
    }

    //  getEscapeRequestsCount(): returns the number of points _sponsor
    //                            is providing service to
    //
    function getEscapeRequestsCount(uint32 _sponsor)
      view
      external
      returns (uint256 count)
    {
      return escapeRequests[_sponsor].length;
    }

    //  getEscapeRequests(): get the points _sponsor has received escape
    //                       requests from
    //
    //    Note: only useful for clients, as Solidity does not currently
    //    support returning dynamic arrays.
    //
    function getEscapeRequests(uint32 _sponsor)
      view
      external
      returns (uint32[] requests)
    {
      return escapeRequests[_sponsor];
    }

  //
  //  Point writing
  //

    //  activatePoint(): activate a point, register it as spawned by its prefix
    //
    function activatePoint(uint32 _point)
      onlyOwner
      external
    {
      //  make a point active, setting its sponsor to its prefix
      //
      Point storage point = points[_point];
      require(!point.active);
      point.active = true;
      registerSponsor(_point, true, getPrefix(_point));
      emit Activated(_point);
    }

    //  setKeys(): set network public keys of _point to _encryptionKey and
    //            _authenticationKey, with the specified _cryptoSuiteVersion
    //
    function setKeys(uint32 _point,
                     bytes32 _encryptionKey,
                     bytes32 _authenticationKey,
                     uint32 _cryptoSuiteVersion)
      onlyOwner
      external
    {
      Point storage point = points[_point];
      if ( point.encryptionKey == _encryptionKey &&
           point.authenticationKey == _authenticationKey &&
           point.cryptoSuiteVersion == _cryptoSuiteVersion )
      {
        return;
      }

      point.encryptionKey = _encryptionKey;
      point.authenticationKey = _authenticationKey;
      point.cryptoSuiteVersion = _cryptoSuiteVersion;
      point.keyRevisionNumber++;

      emit ChangedKeys(_point,
                       _encryptionKey,
                       _authenticationKey,
                       _cryptoSuiteVersion,
                       point.keyRevisionNumber);
    }

    //  incrementContinuityNumber(): break continuity for _point
    //
    function incrementContinuityNumber(uint32 _point)
      onlyOwner
      external
    {
      Point storage point = points[_point];
      point.continuityNumber++;
      emit BrokeContinuity(_point, point.continuityNumber);
    }

    //  registerSpawn(): add a point to its prefix's list of spawned points
    //
    function registerSpawned(uint32 _point)
      onlyOwner
      external
    {
      //  if a point is its own prefix (a galaxy) then don't register it
      //
      uint32 prefix = getPrefix(_point);
      if (prefix == _point)
      {
        return;
      }

      //  register a new spawned point for the prefix
      //
      points[prefix].spawned.push(_point);
      emit Spawned(prefix, _point);
    }

    //  loseSponsor(): indicates that _point's sponsor is no longer providing
    //                 it service
    //
    function loseSponsor(uint32 _point)
      onlyOwner
      external
    {
      Point storage point = points[_point];
      if (!point.hasSponsor)
      {
        return;
      }
      registerSponsor(_point, false, point.sponsor);
      emit LostSponsor(_point, point.sponsor);
    }

    //  setEscapeRequest(): for _point, start an escape request to _sponsor
    //
    function setEscapeRequest(uint32 _point, uint32 _sponsor)
      onlyOwner
      external
    {
      if (isRequestingEscapeTo(_point, _sponsor))
      {
        return;
      }
      registerEscapeRequest(_point, true, _sponsor);
      emit EscapeRequested(_point, _sponsor);
    }

    //  cancelEscape(): for _point, stop the current escape request, if any
    //
    function cancelEscape(uint32 _point)
      onlyOwner
      external
    {
      Point storage point = points[_point];
      if (!point.escapeRequested)
      {
        return;
      }
      uint32 request = point.escapeRequestedTo;
      registerEscapeRequest(_point, false, 0);
      emit EscapeCanceled(_point, request);
    }

    //  doEscape(): perform the requested escape
    //
    function doEscape(uint32 _point)
      onlyOwner
      external
    {
      Point storage point = points[_point];
      require(point.escapeRequested);
      registerSponsor(_point, true, point.escapeRequestedTo);
      registerEscapeRequest(_point, false, 0);
      emit EscapeAccepted(_point, point.sponsor);
    }

  //
  //  Point utils
  //

    //  getPrefix(): compute prefix ("parent") of _point
    //
    function getPrefix(uint32 _point)
      pure
      public
      returns (uint16 prefix)
    {
      if (_point < 0x10000)
      {
        return uint16(_point % 0x100);
      }
      return uint16(_point % 0x10000);
    }

    //  getPointSize(): return the size of _point
    //
    function getPointSize(uint32 _point)
      external
      pure
      returns (Size _size)
    {
      if (_point < 0x100) return Size.Galaxy;
      if (_point < 0x10000) return Size.Star;
      return Size.Planet;
    }

    //  internal use

    //  registerSponsor(): set the sponsorship state of _point and update the
    //                     reverse lookup for sponsors
    //
    function registerSponsor(uint32 _point, bool _hasSponsor, uint32 _sponsor)
      internal
    {
      Point storage point = points[_point];
      bool had = point.hasSponsor;
      uint32 prev = point.sponsor;

      //  if we didn't have a sponsor, and won't get one,
      //  or if we get the sponsor we already have,
      //  nothing will change, so jump out early.
      //
      if ( (!had && !_hasSponsor) ||
           (had && _hasSponsor && prev == _sponsor) )
      {
        return;
      }

      //  if the point used to have a different sponsor, do some gymnastics
      //  to keep the reverse lookup gapless.  delete the point from the old
      //  sponsor's list, then fill that gap with the list tail.
      //
      if (had)
      {
        //  i: current index in previous sponsor's list of sponsored points
        //
        uint256 i = sponsoringIndexes[prev][_point];

        //  we store index + 1, because 0 is the solidity default value
        //
        assert(i > 0);
        i--;

        //  copy the last item in the list into the now-unused slot,
        //  making sure to update its :sponsoringIndexes reference
        //
        uint32[] storage prevSponsoring = sponsoring[prev];
        uint256 last = prevSponsoring.length - 1;
        uint32 moved = prevSponsoring[last];
        prevSponsoring[i] = moved;
        sponsoringIndexes[prev][moved] = i + 1;

        //  delete the last item
        //
        delete(prevSponsoring[last]);
        prevSponsoring.length = last;
        sponsoringIndexes[prev][_point] = 0;
      }

      if (_hasSponsor)
      {
        uint32[] storage newSponsoring = sponsoring[_sponsor];
        newSponsoring.push(_point);
        sponsoringIndexes[_sponsor][_point] = newSponsoring.length;
      }

      point.sponsor = _sponsor;
      point.hasSponsor = _hasSponsor;
    }

    //  registerEscapeRequest(): set the escape state of _point and update the
    //                           reverse lookup for sponsors
    //
    function registerEscapeRequest( uint32 _point,
                                    bool _isEscaping, uint32 _sponsor )
      internal
    {
      Point storage point = points[_point];
      bool was = point.escapeRequested;
      uint32 prev = point.escapeRequestedTo;

      //  if we weren't escaping, and won't be,
      //  or if we were escaping, and the new target is the same,
      //  nothing will change, so jump out early.
      //
      if ( (!was && !_isEscaping) ||
           (was && _isEscaping && prev == _sponsor) )
      {
        return;
      }

      //  if the point used to have a different request, do some gymnastics
      //  to keep the reverse lookup gapless.  delete the point from the old
      //  sponsor's list, then fill that gap with the list tail.
      //
      if (was)
      {
        //  i: current index in previous sponsor's list of sponsored points
        //
        uint256 i = escapeRequestsIndexes[prev][_point];

        //  we store index + 1, because 0 is the solidity default value
        //
        assert(i > 0);
        i--;

        //  copy the last item in the list into the now-unused slot,
        //  making sure to update its :escapeRequestsIndexes reference
        //
        uint32[] storage prevRequests = escapeRequests[prev];
        uint256 last = prevRequests.length - 1;
        uint32 moved = prevRequests[last];
        prevRequests[i] = moved;
        escapeRequestsIndexes[prev][moved] = i + 1;

        //  delete the last item
        //
        delete(prevRequests[last]);
        prevRequests.length = last;
        escapeRequestsIndexes[prev][_point] = 0;
      }

      if (_isEscaping)
      {
        uint32[] storage newRequests = escapeRequests[_sponsor];
        newRequests.push(_point);
        escapeRequestsIndexes[_sponsor][_point] = newRequests.length;
      }

      point.escapeRequestedTo = _sponsor;
      point.escapeRequested = _isEscaping;
    }

  //
  //  Deed reading
  //

    //  owner

    //  getOwner(): return owner of _point
    //
    function getOwner(uint32 _point)
      view
      external
      returns (address owner)
    {
      return rights[_point].owner;
    }

    //  isOwner(): true if _point is owned by _address
    //
    function isOwner(uint32 _point, address _address)
      view
      external
      returns (bool result)
    {
      return (rights[_point].owner == _address);
    }

    //  getOwnedPointCount(): return length of array of points that _whose owns
    //
    function getOwnedPointCount(address _whose)
      view
      external
      returns (uint256 count)
    {
      return pointsOwnedBy[_whose].length;
    }

    //  getOwnedPoints(): return array of points that _whose owns
    //
    //    Note: only useful for clients, as Solidity does not currently
    //    support returning dynamic arrays.
    //
    function getOwnedPoints(address _whose)
      view
      external
      returns (uint32[] ownedPoints)
    {
      return pointsOwnedBy[_whose];
    }

    //  getOwnedPointAtIndex(): get point at _index from array of points that
    //                         _whose owns
    //
    function getOwnedPointAtIndex(address _whose, uint256 _index)
      view
      external
      returns (uint32 point)
    {
      uint32[] storage owned = pointsOwnedBy[_whose];
      require(_index < owned.length);
      return owned[_index];
    }

    //  management proxy

    //  getManagementProxy(): returns _point's current management proxy
    //
    function getManagementProxy(uint32 _point)
      view
      external
      returns (address manager)
    {
      return rights[_point].managementProxy;
    }

    //  isManagementProxy(): returns true if _proxy is _point's management proxy
    //
    function isManagementProxy(uint32 _point, address _proxy)
      view
      external
      returns (bool result)
    {
      return (rights[_point].managementProxy == _proxy);
    }

    //  canManage(): true if _who is the owner or manager of _point
    //
    function canManage(uint32 _point, address _who)
      view
      external
      returns (bool result)
    {
      Deed storage deed = rights[_point];
      return ( (0x0 != _who) &&
               ( (_who == deed.owner) ||
                 (_who == deed.managementProxy) ) );
    }

    //  getManagerForCount(): returns the amount of points _proxy can manage
    //
    function getManagerForCount(address _proxy)
      view
      external
      returns (uint256 count)
    {
      return managerFor[_proxy].length;
    }

    //  getManagerFor(): returns the points _proxy can manage
    //
    //    Note: only useful for clients, as Solidity does not currently
    //    support returning dynamic arrays.
    //
    function getManagerFor(address _proxy)
      view
      external
      returns (uint32[] mfor)
    {
      return managerFor[_proxy];
    }

    //  spawn proxy

    //  getSpawnProxy(): returns _point's current spawn proxy
    //
    function getSpawnProxy(uint32 _point)
      view
      external
      returns (address spawnProxy)
    {
      return rights[_point].spawnProxy;
    }

    //  isSpawnProxy(): returns true if _proxy is _point's spawn proxy
    //
    function isSpawnProxy(uint32 _point, address _proxy)
      view
      external
      returns (bool result)
    {
      return (rights[_point].spawnProxy == _proxy);
    }

    //  canSpawnAs(): true if _who is the owner or spawn proxy of _point
    //
    function canSpawnAs(uint32 _point, address _who)
      view
      external
      returns (bool result)
    {
      Deed storage deed = rights[_point];
      return ( (0x0 != _who) &&
               ( (_who == deed.owner) ||
                 (_who == deed.spawnProxy) ) );
    }

    //  getSpawningForCount(): returns the amount of points _proxy
    //                         can spawn with
    //
    function getSpawningForCount(address _proxy)
      view
      external
      returns (uint256 count)
    {
      return spawningFor[_proxy].length;
    }

    //  getSpawningFor(): get the points _proxy can spawn with
    //
    //    Note: only useful for clients, as Solidity does not currently
    //    support returning dynamic arrays.
    //
    function getSpawningFor(address _proxy)
      view
      external
      returns (uint32[] sfor)
    {
      return spawningFor[_proxy];
    }

    //  voting proxy

    //  getVotingProxy(): returns _point's current voting proxy
    //
    function getVotingProxy(uint32 _point)
      view
      external
      returns (address voter)
    {
      return rights[_point].votingProxy;
    }

    //  isVotingProxy(): returns true if _proxy is _point's voting proxy
    //
    function isVotingProxy(uint32 _point, address _proxy)
      view
      external
      returns (bool result)
    {
      return (rights[_point].votingProxy == _proxy);
    }

    //  canVoteAs(): true if _who is the owner of _point,
    //               or the voting proxy of _point's owner
    //
    function canVoteAs(uint32 _point, address _who)
      view
      external
      returns (bool result)
    {
      Deed storage deed = rights[_point];
      return ( (0x0 != _who) &&
               ( (_who == deed.owner) ||
                 (_who == deed.votingProxy) ) );
    }

    //  getVotingForCount(): returns the amount of points _proxy can vote as
    //
    function getVotingForCount(address _proxy)
      view
      external
      returns (uint256 count)
    {
      return votingFor[_proxy].length;
    }

    //  getVotingFor(): returns the points _proxy can vote as
    //
    //    Note: only useful for clients, as Solidity does not currently
    //    support returning dynamic arrays.
    //
    function getVotingFor(address _proxy)
      view
      external
      returns (uint32[] vfor)
    {
      return votingFor[_proxy];
    }

    //  transfer proxy

    //  getTransferProxy(): returns _point's current transfer proxy
    //
    function getTransferProxy(uint32 _point)
      view
      external
      returns (address transferProxy)
    {
      return rights[_point].transferProxy;
    }

    //  isTransferProxy(): returns true if _proxy is _point's transfer proxy
    //
    function isTransferProxy(uint32 _point, address _proxy)
      view
      external
      returns (bool result)
    {
      return (rights[_point].transferProxy == _proxy);
    }

    //  canTransfer(): true if _who is the owner or transfer proxy of _point,
    //                 or is an operator for _point's current owner
    //
    function canTransfer(uint32 _point, address _who)
      view
      external
      returns (bool result)
    {
      Deed storage deed = rights[_point];
      return ( (0x0 != _who) &&
               ( (_who == deed.owner) ||
                 (_who == deed.transferProxy) ||
                 operators[deed.owner][_who] ) );
    }

    //  getTransferringForCount(): returns the amount of points _proxy
    //                             can transfer
    //
    function getTransferringForCount(address _proxy)
      view
      external
      returns (uint256 count)
    {
      return transferringFor[_proxy].length;
    }

    //  getTransferringFor(): get the points _proxy can transfer
    //
    //    Note: only useful for clients, as Solidity does not currently
    //    support returning dynamic arrays.
    //
    function getTransferringFor(address _proxy)
      view
      external
      returns (uint32[] tfor)
    {
      return transferringFor[_proxy];
    }

    //  isOperator(): returns true if _operator is allowed to transfer
    //                ownership of _owner's points
    //
    function isOperator(address _owner, address _operator)
      view
      external
      returns (bool result)
    {
      return operators[_owner][_operator];
    }

  //
  //  Deed writing
  //

    //  setOwner(): set owner of _point to _owner
    //
    //    Note: setOwner() only implements the minimal data storage
    //    logic for a transfer; the full transfer is implemented in
    //    Ecliptic.
    //
    //    Note: _owner must not be the zero address.
    //
    function setOwner(uint32 _point, address _owner)
      onlyOwner
      external
    {
      //  prevent burning of points by making zero the owner
      //
      require(0x0 != _owner);

      //  prev: previous owner, if any
      //
      address prev = rights[_point].owner;

      if (prev == _owner)
      {
        return;
      }

      //  if the point used to have a different owner, do some gymnastics to
      //  keep the list of owned points gapless.  delete this point from the
      //  list, then fill that gap with the list tail.
      //
      if (0x0 != prev)
      {
        //  i: current index in previous owner's list of owned points
        //
        uint256 i = pointOwnerIndexes[prev][_point];

        //  we store index + 1, because 0 is the solidity default value
        //
        assert(i > 0);
        i--;

        //  copy the last item in the list into the now-unused slot,
        //  making sure to update its :pointOwnerIndexes reference
        //
        uint32[] storage owner = pointsOwnedBy[prev];
        uint256 last = owner.length - 1;
        uint32 moved = owner[last];
        owner[i] = moved;
        pointOwnerIndexes[prev][moved] = i + 1;

        //  delete the last item
        //
        delete(owner[last]);
        owner.length = last;
        pointOwnerIndexes[prev][_point] = 0;
      }

      //  update the owner list and the owner's index list
      //
      rights[_point].owner = _owner;
      pointsOwnedBy[_owner].push(_point);
      pointOwnerIndexes[_owner][_point] = pointsOwnedBy[_owner].length;
      emit OwnerChanged(_point, _owner);
    }

    //  setManagementProxy(): makes _proxy _point's management proxy
    //
    function setManagementProxy(uint32 _point, address _proxy)
      onlyOwner
      external
    {
      Deed storage deed = rights[_point];
      address prev = deed.managementProxy;
      if (prev == _proxy)
      {
        return;
      }

      //  if the point used to have a different manager, do some gymnastics
      //  to keep the reverse lookup gapless.  delete the point from the
      //  old manager's list, then fill that gap with the list tail.
      //
      if (0x0 != prev)
      {
        //  i: current index in previous manager's list of managed points
        //
        uint256 i = managerForIndexes[prev][_point];

        //  we store index + 1, because 0 is the solidity default value
        //
        assert(i > 0);
        i--;

        //  copy the last item in the list into the now-unused slot,
        //  making sure to update its :managerForIndexes reference
        //
        uint32[] storage prevMfor = managerFor[prev];
        uint256 last = prevMfor.length - 1;
        uint32 moved = prevMfor[last];
        prevMfor[i] = moved;
        managerForIndexes[prev][moved] = i + 1;

        //  delete the last item
        //
        delete(prevMfor[last]);
        prevMfor.length = last;
        managerForIndexes[prev][_point] = 0;
      }

      if (0x0 != _proxy)
      {
        uint32[] storage mfor = managerFor[_proxy];
        mfor.push(_point);
        managerForIndexes[_proxy][_point] = mfor.length;
      }

      deed.managementProxy = _proxy;
      emit ChangedManagementProxy(_point, _proxy);
    }

    //  setSpawnProxy(): makes _proxy _point's spawn proxy
    //
    function setSpawnProxy(uint32 _point, address _proxy)
      onlyOwner
      external
    {
      Deed storage deed = rights[_point];
      address prev = deed.spawnProxy;
      if (prev == _proxy)
      {
        return;
      }

      //  if the point used to have a different spawn proxy, do some
      //  gymnastics to keep the reverse lookup gapless.  delete the point
      //  from the old proxy's list, then fill that gap with the list tail.
      //
      if (0x0 != prev)
      {
        //  i: current index in previous proxy's list of spawning points
        //
        uint256 i = spawningForIndexes[prev][_point];

        //  we store index + 1, because 0 is the solidity default value
        //
        assert(i > 0);
        i--;

        //  copy the last item in the list into the now-unused slot,
        //  making sure to update its :spawningForIndexes reference
        //
        uint32[] storage prevSfor = spawningFor[prev];
        uint256 last = prevSfor.length - 1;
        uint32 moved = prevSfor[last];
        prevSfor[i] = moved;
        spawningForIndexes[prev][moved] = i + 1;

        //  delete the last item
        //
        delete(prevSfor[last]);
        prevSfor.length = last;
        spawningForIndexes[prev][_point] = 0;
      }

      if (0x0 != _proxy)
      {
        uint32[] storage sfor = spawningFor[_proxy];
        sfor.push(_point);
        spawningForIndexes[_proxy][_point] = sfor.length;
      }

      deed.spawnProxy = _proxy;
      emit ChangedSpawnProxy(_point, _proxy);
    }

    //  setVotingProxy(): makes _proxy _point's voting proxy
    //
    function setVotingProxy(uint32 _point, address _proxy)
      onlyOwner
      external
    {
      Deed storage deed = rights[_point];
      address prev = deed.votingProxy;
      if (prev == _proxy)
      {
        return;
      }

      //  if the point used to have a different voter, do some gymnastics
      //  to keep the reverse lookup gapless.  delete the point from the
      //  old voter's list, then fill that gap with the list tail.
      //
      if (0x0 != prev)
      {
        //  i: current index in previous voter's list of points it was
        //     voting for
        //
        uint256 i = votingForIndexes[prev][_point];

        //  we store index + 1, because 0 is the solidity default value
        //
        assert(i > 0);
        i--;

        //  copy the last item in the list into the now-unused slot,
        //  making sure to update its :votingForIndexes reference
        //
        uint32[] storage prevVfor = votingFor[prev];
        uint256 last = prevVfor.length - 1;
        uint32 moved = prevVfor[last];
        prevVfor[i] = moved;
        votingForIndexes[prev][moved] = i + 1;

        //  delete the last item
        //
        delete(prevVfor[last]);
        prevVfor.length = last;
        votingForIndexes[prev][_point] = 0;
      }

      if (0x0 != _proxy)
      {
        uint32[] storage vfor = votingFor[_proxy];
        vfor.push(_point);
        votingForIndexes[_proxy][_point] = vfor.length;
      }

      deed.votingProxy = _proxy;
      emit ChangedVotingProxy(_point, _proxy);
    }

    //  setManagementProxy(): makes _proxy _point's transfer proxy
    //
    function setTransferProxy(uint32 _point, address _proxy)
      onlyOwner
      external
    {
      Deed storage deed = rights[_point];
      address prev = deed.transferProxy;
      if (prev == _proxy)
      {
        return;
      }

      //  if the point used to have a different transfer proxy, do some
      //  gymnastics to keep the reverse lookup gapless.  delete the point
      //  from the old proxy's list, then fill that gap with the list tail.
      //
      if (0x0 != prev)
      {
        //  i: current index in previous proxy's list of transferable points
        //
        uint256 i = transferringForIndexes[prev][_point];

        //  we store index + 1, because 0 is the solidity default value
        //
        assert(i > 0);
        i--;

        //  copy the last item in the list into the now-unused slot,
        //  making sure to update its :transferringForIndexes reference
        //
        uint32[] storage prevTfor = transferringFor[prev];
        uint256 last = prevTfor.length - 1;
        uint32 moved = prevTfor[last];
        prevTfor[i] = moved;
        transferringForIndexes[prev][moved] = i + 1;

        //  delete the last item
        //
        delete(prevTfor[last]);
        prevTfor.length = last;
        transferringForIndexes[prev][_point] = 0;
      }

      if (0x0 != _proxy)
      {
        uint32[] storage tfor = transferringFor[_proxy];
        tfor.push(_point);
        transferringForIndexes[_proxy][_point] = tfor.length;
      }

      deed.transferProxy = _proxy;
      emit ChangedTransferProxy(_point, _proxy);
    }

    //  setOperator(): dis/allow _operator to transfer ownership of all points
    //                 owned by _owner
    //
    //    operators are part of the ERC721 standard
    //
    function setOperator(address _owner, address _operator, bool _approved)
      onlyOwner
      external
    {
      operators[_owner][_operator] = _approved;
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[{"name":"","type":"uint32"},{"name":"","type":"uint32"}],"name":"escapeRequestsIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_whose","type":"address"}],"name":"getOwnedPoints","outputs":[{"name":"ownedPoints","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"votingFor","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"}],"name":"rights","outputs":[{"name":"owner","type":"address"},{"name":"managementProxy","type":"address"},{"name":"spawnProxy","type":"address"},{"name":"votingProxy","type":"address"},{"name":"transferProxy","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"transferringFor","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_sponsor","type":"uint32"}],"name":"isSponsor","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getManagementProxy","outputs":[{"name":"manager","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getContinuityNumber","outputs":[{"name":"continuityNumber","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"},{"name":"","type":"uint256"}],"name":"sponsoring","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_whose","type":"address"}],"name":"getOwnedPointCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"doEscape","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_whose","type":"address"},{"name":"_index","type":"uint256"}],"name":"getOwnedPointAtIndex","outputs":[{"name":"point","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getTransferProxy","outputs":[{"name":"transferProxy","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"isSpawnProxy","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"pointsOwnedBy","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"operators","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getSpawnCount","outputs":[{"name":"spawnCount","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"setSpawnProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"setTransferProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"},{"name":"","type":"uint32"}],"name":"sponsoringIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"isTransferProxy","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getVotingProxy","outputs":[{"name":"voter","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"isManagementProxy","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint32"}],"name":"votingForIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"isLive","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_sponsor","type":"uint32"}],"name":"getEscapeRequests","outputs":[{"name":"requests","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getSponsor","outputs":[{"name":"sponsor","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_sponsor","type":"uint32"}],"name":"getEscapeRequestsCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint32"}],"name":"pointOwnerIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getManagerFor","outputs":[{"name":"mfor","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint32"}],"name":"managerForIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"managerFor","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"isActive","outputs":[{"name":"equals","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getOwner","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"}],"name":"points","outputs":[{"name":"encryptionKey","type":"bytes32"},{"name":"authenticationKey","type":"bytes32"},{"name":"hasSponsor","type":"bool"},{"name":"active","type":"bool"},{"name":"escapeRequested","type":"bool"},{"name":"sponsor","type":"uint32"},{"name":"escapeRequestedTo","type":"uint32"},{"name":"cryptoSuiteVersion","type":"uint32"},{"name":"keyRevisionNumber","type":"uint32"},{"name":"continuityNumber","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getSpawningForCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"hasBeenLinked","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_who","type":"address"}],"name":"canTransfer","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint32"}],"name":"spawningForIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"hasSponsor","outputs":[{"name":"has","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"activatePoint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getSpawned","outputs":[{"name":"spawned","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"setManagementProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_who","type":"address"}],"name":"canSpawnAs","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getKeyRevisionNumber","outputs":[{"name":"revision","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_who","type":"address"}],"name":"canManage","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getTransferringFor","outputs":[{"name":"tfor","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getPointSize","outputs":[{"name":"_size","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"_sponsor","type":"uint32"}],"name":"getSponsoringCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getSpawningFor","outputs":[{"name":"sfor","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"isEscaping","outputs":[{"name":"escaping","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"},{"name":"","type":"uint256"}],"name":"escapeRequests","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"setVotingProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_sponsor","type":"uint32"}],"name":"getSponsoring","outputs":[{"name":"sponsees","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_sponsor","type":"uint32"}],"name":"setEscapeRequest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isOperator","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_who","type":"address"}],"name":"canVoteAs","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_primary","type":"string"},{"name":"_secondary","type":"string"},{"name":"_tertiary","type":"string"}],"name":"setDnsDomains","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"loseSponsor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"registerSpawned","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getKeys","outputs":[{"name":"crypt","type":"bytes32"},{"name":"auth","type":"bytes32"},{"name":"suite","type":"uint32"},{"name":"revision","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"cancelEscape","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_address","type":"address"}],"name":"isOwner","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getManagerForCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint32"}],"name":"transferringForIndexes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getVotingFor","outputs":[{"name":"vfor","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"spawningFor","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getTransferringForCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_proxy","type":"address"}],"name":"isVotingProxy","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getPrefix","outputs":[{"name":"prefix","type":"uint16"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dnsDomains","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"incrementContinuityNumber","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getSpawnProxy","outputs":[{"name":"spawnProxy","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"}],"name":"getEscapeRequest","outputs":[{"name":"escape","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_encryptionKey","type":"bytes32"},{"name":"_authenticationKey","type":"bytes32"},{"name":"_cryptoSuiteVersion","type":"uint32"}],"name":"setKeys","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_proxy","type":"address"}],"name":"getVotingForCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_sponsor","type":"uint32"}],"name":"isRequestingEscapeTo","outputs":[{"name":"equals","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"owner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"}],"name":"Activated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"prefix","type":"uint32"},{"indexed":true,"name":"child","type":"uint32"}],"name":"Spawned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"sponsor","type":"uint32"}],"name":"EscapeRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"sponsor","type":"uint32"}],"name":"EscapeCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"sponsor","type":"uint32"}],"name":"EscapeAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"sponsor","type":"uint32"}],"name":"LostSponsor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":false,"name":"encryptionKey","type":"bytes32"},{"indexed":false,"name":"authenticationKey","type":"bytes32"},{"indexed":false,"name":"cryptoSuiteVersion","type":"uint32"},{"indexed":false,"name":"keyRevisionNumber","type":"uint32"}],"name":"ChangedKeys","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":false,"name":"number","type":"uint32"}],"name":"BrokeContinuity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"spawnProxy","type":"address"}],"name":"ChangedSpawnProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"transferProxy","type":"address"}],"name":"ChangedTransferProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"managementProxy","type":"address"}],"name":"ChangedManagementProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"point","type":"uint32"},{"indexed":true,"name":"votingProxy","type":"address"}],"name":"ChangedVotingProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"primary","type":"string"},{"indexed":false,"name":"secondary","type":"string"},{"indexed":false,"name":"tertiary","type":"string"}],"name":"ChangedDns","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60806040523480156200001157600080fd5b5060008054600160a060020a03191633179055604080518082018252600b8082527f6578616d706c652e636f6d00000000000000000000000000000000000000000060208084018290528451808601865283815280820183905285518087019096529285528401526200008d9264010000000062000093810204565b62000307565b600054600160a060020a03163314620000ab57600080fd5b8251620000c090600490602086019062000262565b508151620000d690600590602085019062000262565b508051620000ec90600690602084019062000262565b507ffafd04ade1daae2e1fdb0fc1cc6a899fd424063ed5c92120e67e073053b9489883838360405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b83811015620001585781810151838201526020016200013e565b50505050905090810190601f168015620001865780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b83811015620001bb578181015183820152602001620001a1565b50505050905090810190601f168015620001e95780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b838110156200021e57818101518382015260200162000204565b50505050905090810190601f1680156200024c5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002a557805160ff1916838001178555620002d5565b82800160010185558215620002d5579182015b82811115620002d5578251825591602001919060010190620002b8565b50620002e3929150620002e7565b5090565b6200030491905b80821115620002e35760008155600101620002ee565b90565b613e0180620003176000396000f3006080604052600436106103bb5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301d8a97f81146103c05780630333d499146103f657806304bbb61d1461046757806304bc94e5146104a4578063073167da146104fe57806308083039146105225780630f934e661461055a578063108d995b1461059457806312ace2e6146105b257806312afbc78146105d357806313063180146105f457806322a7906f1461061457806324541f781461063857806324ba1a461461065657806324cf61b5146106805780632637588e146106a4578063293a9169146106cb5780632a19642c146106e95780632c7ba564146107135780632cce0e291461073d5780633262207c1461076157806333f337241461078b578063375e24c1146107a957806337de45c1146107d35780633b17b4ea146107fd5780633c01a9fa1461081b578063439f7d3c146108395780634448f5fb14610857578063474dbae714610875578063483a15ed1461089f57806352c0683b146108c05780635a83df54146108ea5780635e19b3051461090e578063621b23e21461092c57806363fa9a871461094a5780636436b1b9146109c65780636d09887b146109e7578063715018a614610a05578063728aa85714610a1a57806376944d5b14610a4457806377eb4c5014610a6e5780637bc702a114610a8c578063846f652b14610aaa5780638866bb2c14610ac85780638a27bf5914610af25780638d2d3f4114610b1c5780638da5cb5b14610b3a5780639137fe0a14610b4f57806391398f2514610b795780639397640514610b9a578063942324c314610bdc5780639b0d1b2c14610bfa5780639b350e1214610c1b5780639dd9019014610c39578063a297c1d814610c5a578063a46afef114610c84578063a634585914610ca2578063b6363cf214610cc6578063b65afedd14610ced578063bac55edd14610d17578063bc562b9e14610dec578063bc735d9014610e0a578063c17ad9d814610e36578063c210c62314610e54578063c6d761d414610e9e578063caf590f914610ebc578063d154126414610ee6578063d2588e2014610f07578063d2a9b6ed14610f31578063d5c5164f14610f52578063ddc3595014610f76578063e01cff8414610fa0578063e213c84014610fc1578063e4a358d714610feb578063eccc8ff114611020578063f2fde38b146110ad578063f4914919146110ce578063f4e3be2d146110ec578063f5af66211461110a578063f9b87d4014611128578063fdb357be14611154578063fde9073314611175575b600080fd5b3480156103cc57600080fd5b506103e463ffffffff60043581169060243516611199565b60408051918252519081900360200190f35b34801561040257600080fd5b50610417600160a060020a03600435166111b6565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561045357818101518382015260200161043b565b505050509050019250505060405180910390f35b34801561047357600080fd5b5061048b600160a060020a036004351660243561124f565b6040805163ffffffff9092168252519081900360200190f35b3480156104b057600080fd5b506104c263ffffffff60043516611297565b60408051600160a060020a0396871681529486166020860152928516848401529084166060840152909216608082015290519081900360a00190f35b34801561050a57600080fd5b5061048b600160a060020a03600435166024356112d9565b34801561052e57600080fd5b5061054663ffffffff600435811690602435166112f4565b604080519115158252519081900360200190f35b34801561056657600080fd5b5061057863ffffffff60043516611338565b60408051600160a060020a039092168252519081900360200190f35b3480156105a057600080fd5b5061048b63ffffffff6004351661135c565b3480156105be57600080fd5b5061048b63ffffffff60043516602435611391565b3480156105df57600080fd5b506103e4600160a060020a03600435166113ac565b34801561060057600080fd5b5061061263ffffffff600435166113c7565b005b34801561062057600080fd5b5061048b600160a060020a036004351660243561147f565b34801561064457600080fd5b5061057863ffffffff600435166114e1565b34801561066257600080fd5b5061054663ffffffff60043516600160a060020a0360243516611505565b34801561068c57600080fd5b5061048b600160a060020a0360043516602435611532565b3480156106b057600080fd5b50610546600160a060020a036004358116906024351661154d565b3480156106d757600080fd5b5061048b63ffffffff6004351661156d565b3480156106f557600080fd5b5061061263ffffffff60043516600160a060020a036024351661159a565b34801561071f57600080fd5b5061061263ffffffff60043516600160a060020a036024351661189c565b34801561074957600080fd5b506103e463ffffffff60043581169060243516611b9b565b34801561076d57600080fd5b5061054663ffffffff60043516600160a060020a0360243516611bb8565b34801561079757600080fd5b5061057863ffffffff60043516611be4565b3480156107b557600080fd5b5061054663ffffffff60043516600160a060020a0360243516611c08565b3480156107df57600080fd5b506103e4600160a060020a036004351663ffffffff60243516611c34565b34801561080957600080fd5b5061054663ffffffff60043516611c51565b34801561082757600080fd5b5061041763ffffffff60043516611ca4565b34801561084557600080fd5b5061048b63ffffffff60043516611d11565b34801561086357600080fd5b506103e463ffffffff60043516611d36565b34801561088157600080fd5b506103e4600160a060020a036004351663ffffffff60243516611d4e565b3480156108ab57600080fd5b50610417600160a060020a0360043516611d6b565b3480156108cc57600080fd5b506103e4600160a060020a036004351663ffffffff60243516611ddb565b3480156108f657600080fd5b5061048b600160a060020a0360043516602435611df8565b34801561091a57600080fd5b5061054663ffffffff60043516611e13565b34801561093857600080fd5b5061057863ffffffff60043516611e36565b34801561095657600080fd5b5061096863ffffffff60043516611e57565b604080519a8b5260208b0199909952961515898901529415156060890152921515608088015263ffffffff91821660a0880152811660c087015290811660e08601529081166101008501521661012083015251908190036101400190f35b3480156109d257600080fd5b506103e4600160a060020a0360043516611eeb565b3480156109f357600080fd5b5061054663ffffffff60043516611f06565b348015610a1157600080fd5b50610612611f3a565b348015610a2657600080fd5b5061054663ffffffff60043516600160a060020a0360243516611f99565b348015610a5057600080fd5b506103e4600160a060020a036004351663ffffffff60243516612025565b348015610a7a57600080fd5b5061054663ffffffff60043516612042565b348015610a9857600080fd5b5061061263ffffffff60043516612060565b348015610ab657600080fd5b5061041763ffffffff60043516612103565b348015610ad457600080fd5b5061061263ffffffff60043516600160a060020a0360243516612173565b348015610afe57600080fd5b5061054663ffffffff60043516600160a060020a0360243516612472565b348015610b2857600080fd5b5061048b63ffffffff600435166124cb565b348015610b4657600080fd5b506105786124fc565b348015610b5b57600080fd5b5061054663ffffffff60043516600160a060020a036024351661250b565b348015610b8557600080fd5b50610417600160a060020a0360043516612564565b348015610ba657600080fd5b50610bb863ffffffff600435166125d4565b60405180826002811115610bc857fe5b60ff16815260200191505060405180910390f35b348015610be857600080fd5b506103e463ffffffff6004351661260f565b348015610c0657600080fd5b50610417600160a060020a0360043516612627565b348015610c2757600080fd5b5061054663ffffffff60043516612697565b348015610c4557600080fd5b5061048b63ffffffff600435166024356126bb565b348015610c6657600080fd5b5061061263ffffffff60043516600160a060020a03602435166126d6565b348015610c9057600080fd5b5061041763ffffffff600435166129d5565b348015610cae57600080fd5b5061061263ffffffff60043581169060243516612a42565b348015610cd257600080fd5b50610546600160a060020a0360043581169060243516612ab8565b348015610cf957600080fd5b5061054663ffffffff60043516600160a060020a0360243516612ae6565b348015610d2357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261061294369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750612b3f9650505050505050565b348015610df857600080fd5b5061061263ffffffff60043516612cfe565b348015610e1657600080fd5b50610612600160a060020a03600435811690602435166044351515612da4565b348015610e4257600080fd5b5061061263ffffffff60043516612df5565b348015610e6057600080fd5b50610e7263ffffffff60043516612ea8565b60408051948552602085019390935263ffffffff91821684840152166060830152519081900360800190f35b348015610eaa57600080fd5b5061061263ffffffff60043516612efa565b348015610ec857600080fd5b5061054663ffffffff60043516600160a060020a0360243516612fa8565b348015610ef257600080fd5b506103e4600160a060020a0360043516612fd1565b348015610f1357600080fd5b506103e4600160a060020a036004351663ffffffff60243516612fec565b348015610f3d57600080fd5b50610417600160a060020a0360043516613009565b348015610f5e57600080fd5b5061048b600160a060020a0360043516602435613079565b348015610f8257600080fd5b5061061263ffffffff60043516600160a060020a0360243516613094565b348015610fac57600080fd5b506103e4600160a060020a0360043516613328565b348015610fcd57600080fd5b5061054663ffffffff60043516600160a060020a0360243516613343565b348015610ff757600080fd5b5061100963ffffffff6004351661336f565b6040805161ffff9092168252519081900360200190f35b34801561102c57600080fd5b50611038600435613394565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561107257818101518382015260200161105a565b50505050905090810190601f16801561109f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156110b957600080fd5b50610612600160a060020a036004351661342f565b3480156110da57600080fd5b5061061263ffffffff60043516613452565b3480156110f857600080fd5b5061057863ffffffff60043516613508565b34801561111657600080fd5b5061048b63ffffffff6004351661352d565b34801561113457600080fd5b5061061263ffffffff600435811690602435906044359060643516613556565b34801561116057600080fd5b506103e4600160a060020a036004351661369b565b34801561118157600080fd5b5061054663ffffffff600435811690602435166136b6565b600a60209081526000928352604080842090915290825290205481565b600160a060020a0381166000908152600b602090815260409182902080548351818402810184019094528084526060939283018282801561124257602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116112055790505b505050505090505b919050565b60116020528160005260406000208181548110151561126a57fe5b9060005260206000209060089182820401919006600402915091509054906101000a900463ffffffff1681565b600260208190526000918252604090912080546001820154928201546003830154600490930154600160a060020a039283169483169391831692918216911685565b60136020528160005260406000208181548110151561126a57fe5b63ffffffff82166000908152600160205260408120600381015460ff1680156113305750600381015463ffffffff848116630100000090920416145b949350505050565b63ffffffff16600090815260026020526040902060010154600160a060020a031690565b63ffffffff90811660009081526001602052604090206003015473010000000000000000000000000000000000000090041690565b60076020528160005260406000208181548110151561126a57fe5b600160a060020a03166000908152600b602052604090205490565b60008054600160a060020a031633146113df57600080fd5b5063ffffffff81166000908152600160205260409020600381015462010000900460ff16151561140e57600080fd5b61142e8260018360030160079054906101000a900463ffffffff16613705565b61143a826000806139bf565b600381015460405163ffffffff63010000009092048216918416907f7e447c9b1bda4b174b0796e100bf7f34ebf36dbb7fe665490b1bfce6246a9da590600090a35050565b600160a060020a0382166000908152600b60205260408120805483106114a457600080fd5b80838154811015156114b257fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691505092915050565b63ffffffff16600090815260026020526040902060040154600160a060020a031690565b63ffffffff9190911660009081526002602081905260409091200154600160a060020a0391821691161490565b600b6020528160005260406000208181548110151561126a57fe5b600360209081526000928352604080842090915290825290205460ff1681565b63ffffffff8116600090815260016020526040812060020154640100000000811061159457fe5b92915050565b60008054819081908190819081908190600160a060020a031633146115be57600080fd5b63ffffffff8916600090815260026020819052604090912090810154909750600160a060020a03908116965088168614156115f857611891565b600160a060020a0386161561176d57600160a060020a038616600090815260106020908152604080832063ffffffff8d1684529091528120549550851161163b57fe5b600160a060020a0386166000908152600f60205260409020805460001996870196919550908101935084908490811061167057fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691508184868154811015156116a757fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a03891682526010835260408083209186168352925220600186019055835484908490811061170c57fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690558284816117419190613d06565b50600160a060020a038616600090815260106020908152604080832063ffffffff8d1684529091528120555b600160a060020a0388161561183f57600f600089600160a060020a0316600160a060020a0316815260200190815260200160002090508089908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050601060008a600160a060020a0316600160a060020a0316815260200190815260200160002060008b63ffffffff1663ffffffff168152602001908152602001600020819055505b600287018054600160a060020a031916600160a060020a038a1690811790915560405163ffffffff8b16907f902736af7b3cefe10d9e840aed0d687e35c84095122b25051a20ead8866f006d90600090a35b505050505050505050565b60008054819081908190819081908190600160a060020a031633146118c057600080fd5b63ffffffff891660009081526002602052604090206004810154909750600160a060020a03908116965088168614156118f857611891565b600160a060020a03861615611a6d57600160a060020a038616600090815260146020908152604080832063ffffffff8d1684529091528120549550851161193b57fe5b600160a060020a0386166000908152601360205260409020805460001996870196919550908101935084908490811061197057fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691508184868154811015156119a757fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a038916825260148352604080832091861683529252206001860190558354849084908110611a0c57fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff0219169055828481611a419190613d06565b50600160a060020a038616600090815260146020908152604080832063ffffffff8d1684529091528120555b600160a060020a03881615611b3f576013600089600160a060020a0316600160a060020a0316815260200190815260200160002090508089908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050601460008a600160a060020a0316600160a060020a0316815260200190815260200160002060008b63ffffffff1663ffffffff168152602001908152602001600020819055505b600487018054600160a060020a031916600160a060020a038a1690811790915560405163ffffffff8b16907fcfe369b7197e7f0cf06793ae2472a9b13583fecbed2f78dfa14d1f10796b847c90600090a3505050505050505050565b600860209081526000928352604080842090915290825290205481565b63ffffffff91909116600090815260026020526040902060040154600160a060020a0391821691161490565b63ffffffff16600090815260026020526040902060030154600160a060020a031690565b63ffffffff91909116600090815260026020526040902060010154600160a060020a0391821691161490565b601260209081526000928352604080842090915290825290205481565b63ffffffff81166000908152600160205260408120805415801590611c795750600181015415155b8015611c9d575060038101546b010000000000000000000000900463ffffffff1615155b9392505050565b63ffffffff8116600090815260096020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b63ffffffff908116600090815260016020526040902060030154630100000090041690565b63ffffffff1660009081526009602052604090205490565b600c60209081526000928352604080842090915290825290205481565b600160a060020a0381166000908152600d6020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b600e60209081526000928352604080842090915290825290205481565b600d6020528160005260406000208181548110151561126a57fe5b63ffffffff16600090815260016020526040902060030154610100900460ff1690565b63ffffffff16600090815260026020526040902054600160a060020a031690565b600160208190526000918252604090912080549181015460039091015460ff808216916101008104821691620100008204169063ffffffff6301000000820481169167010000000000000081048216916b01000000000000000000000082048116916f010000000000000000000000000000008104821691730100000000000000000000000000000000000000909104168a565b600160a060020a03166000908152600f602052604090205490565b63ffffffff9081166000908152600160205260408120600301546f0100000000000000000000000000000090049091161190565b600054600160a060020a03163314611f5157600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a260008054600160a060020a0319169055565b63ffffffff82166000908152600260205260408120600160a060020a0383161580159061133057508054600160a060020a0384811691161480611feb57506004810154600160a060020a038481169116145b8061133057508054600160a060020a0390811660009081526003602090815260408083209387168352929052205460ff1691505092915050565b601060209081526000928352604080842090915290825290205481565b63ffffffff1660009081526001602052604090206003015460ff1690565b60008054600160a060020a0316331461207857600080fd5b5063ffffffff811660009081526001602052604090206003810154610100900460ff16156120a557600080fd5b60038101805461ff0019166101001790556120ce8260016120c58261336f565b61ffff16613705565b60405163ffffffff8316907fe74c03809d0769e1b1f706cc8414258cd1f3b6fe020cd15d0165c210ba503a0f90600090a25050565b63ffffffff8116600090815260016020908152604091829020600201805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b60008054819081908190819081908190600160a060020a0316331461219757600080fd5b63ffffffff891660009081526002602052604090206001810154909750600160a060020a03908116965088168614156121cf57611891565b600160a060020a0386161561234457600160a060020a0386166000908152600e6020908152604080832063ffffffff8d1684529091528120549550851161221257fe5b600160a060020a0386166000908152600d60205260409020805460001996870196919550908101935084908490811061224757fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16915081848681548110151561227e57fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a0389168252600e83526040808320918616835292522060018601905583548490849081106122e357fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690558284816123189190613d06565b50600160a060020a0386166000908152600e6020908152604080832063ffffffff8d1684529091528120555b600160a060020a0388161561241657600d600089600160a060020a0316600160a060020a0316815260200190815260200160002090508089908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050600e60008a600160a060020a0316600160a060020a0316815260200190815260200160002060008b63ffffffff1663ffffffff168152602001908152602001600020819055505b600187018054600160a060020a031916600160a060020a038a1690811790915560405163ffffffff8b16907fab9c9327cffd2acc168fafedbe06139f5f55cb84c761df05e0511c251e2ee9bf90600090a3505050505050505050565b63ffffffff82166000908152600260205260408120600160a060020a0383161580159061133057508054600160a060020a0384811691161480611330575060020154600160a060020a0390811692169190911492915050565b63ffffffff9081166000908152600160205260409020600301546f0100000000000000000000000000000090041690565b600054600160a060020a031681565b63ffffffff82166000908152600260205260408120600160a060020a0383161580159061133057508054600160a060020a0384811691161480611330575060010154600160a060020a0390811692169190911492915050565b600160a060020a038116600090815260136020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b60006101008263ffffffff1610156125ee5750600061124a565b620100008263ffffffff1610156126075750600161124a565b506002919050565b63ffffffff1660009081526007602052604090205490565b600160a060020a0381166000908152600f6020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b63ffffffff1660009081526001602052604090206003015462010000900460ff1690565b60096020528160005260406000208181548110151561126a57fe5b60008054819081908190819081908190600160a060020a031633146126fa57600080fd5b63ffffffff891660009081526002602052604090206003810154909750600160a060020a039081169650881686141561273257611891565b600160a060020a038616156128a757600160a060020a038616600090815260126020908152604080832063ffffffff8d1684529091528120549550851161277557fe5b600160a060020a038616600090815260116020526040902080546000199687019691955090810193508490849081106127aa57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691508184868154811015156127e157fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a03891682526012835260408083209186168352925220600186019055835484908490811061284657fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff021916905582848161287b9190613d06565b50600160a060020a038616600090815260126020908152604080832063ffffffff8d1684529091528120555b600160a060020a03881615612979576011600089600160a060020a0316600160a060020a0316815260200190815260200160002090508089908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050601260008a600160a060020a0316600160a060020a0316815260200190815260200160002060008b63ffffffff1663ffffffff168152602001908152602001600020819055505b600387018054600160a060020a031916600160a060020a038a1690811790915560405163ffffffff8b16907fcbd6269ec71457f2c7b1a22774f246f6c5a2eae3795ed7300db517680c61c80590600090a3505050505050505050565b63ffffffff8116600090815260076020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b600054600160a060020a03163314612a5957600080fd5b612a6382826136b6565b15612a6d57612ab4565b612a79826001836139bf565b8063ffffffff168263ffffffff167fb4d4850b8f218218141c5665cba379e53e9bb015b51e8d934be70210aead874a60405160405180910390a35b5050565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205460ff1690565b63ffffffff82166000908152600260205260408120600160a060020a0383161580159061133057508054600160a060020a0384811691161480611330575060030154600160a060020a0390811692169190911492915050565b600054600160a060020a03163314612b5657600080fd5b8251612b69906004906020860190613d3a565b508151612b7d906005906020850190613d3a565b508051612b91906006906020840190613d3a565b507ffafd04ade1daae2e1fdb0fc1cc6a899fd424063ed5c92120e67e073053b9489883838360405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b83811015612bfb578181015183820152602001612be3565b50505050905090810190601f168015612c285780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b83811015612c5b578181015183820152602001612c43565b50505050905090810190601f168015612c885780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b83811015612cbb578181015183820152602001612ca3565b50505050905090810190601f168015612ce85780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1505050565b60008054600160a060020a03163314612d1657600080fd5b5063ffffffff81166000908152600160205260409020600381015460ff161515612d3f57612ab4565b612d5f8260008360030160039054906101000a900463ffffffff16613705565b600381015460405163ffffffff63010000009092048216918416907fd7704f9a25193dbd0b0cb4a809feffffa7f19d1aae8817a71346c194448210d590600090a35050565b600054600160a060020a03163314612dbb57600080fd5b600160a060020a03928316600090815260036020908152604080832094909516825292909252919020805460ff1916911515919091179055565b60008054600160a060020a03163314612e0d57600080fd5b612e168261336f565b61ffff16905063ffffffff8216811415612e2f57612ab4565b63ffffffff80821660008181526001602081815260408084206002018054938401815584529083206008830401805488871660046007909516949094026101000a848102970219169590951790945592517fb2d3a6e7a339f5c8ff96265e2f03a010a8541070f3744a2470909644150815469190a35050565b63ffffffff9081166000908152600160208190526040909120805491810154600390910154919390926b01000000000000000000000083048116926f0100000000000000000000000000000090041690565b600080548190600160a060020a03163314612f1457600080fd5b63ffffffff83166000908152600160205260409020600381015490925062010000900460ff161515612f4557612fa3565b506003810154670100000000000000900463ffffffff16612f68836000806139bf565b8063ffffffff168363ffffffff167fd653bb0e0bb7ce8393e624d98fbf17cda5902c8328ed0cd09988f36890d9932a60405160405180910390a35b505050565b63ffffffff91909116600090815260026020526040902054600160a060020a0391821691161490565b600160a060020a03166000908152600d602052604090205490565b601460209081526000928352604080842090915290825290205481565b600160a060020a038116600090815260116020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b600f6020528160005260406000208181548110151561126a57fe5b600080548190819081908190600160a060020a031633146130b457600080fd5b600160a060020a03861615156130c957600080fd5b63ffffffff8716600090815260026020526040902054600160a060020a03908116955086168514156130fa5761331f565b600160a060020a0385161561326f57600160a060020a0385166000908152600c6020908152604080832063ffffffff8b1684529091528120549450841161313d57fe5b600160a060020a0385166000908152600b60205260409020805460001995860195919450908101925083908390811061317257fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1690508083858154811015156131a957fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a0388168252600c835260408083209185168352925220600185019055825483908390811061320e57fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690558183816132439190613d06565b50600160a060020a0385166000908152600c6020908152604080832063ffffffff8b1684529091528120555b63ffffffff87811660008181526002602090815260408083208054600160a060020a031916600160a060020a038d16908117909155808452600b835281842080546001810182558186528486206008820401805460079092166004026101000a98890219909116978702979097179096558084529454600c835281842085855290925280832091909155517f16d0f539d49c6cad822b767a9445bfb1cf7ea6f2a6c2b120a7ea4cc7660d8fda9190a35b50505050505050565b600160a060020a031660009081526013602052604090205490565b63ffffffff91909116600090815260026020526040902060030154600160a060020a0391821691161490565b6000620100008263ffffffff16101561338c575060ff811661124a565b5061ffff1690565b600481600381106133a157fe5b018054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815293508301828280156134275780601f106133fc57610100808354040283529160200191613427565b820191906000526020600020905b81548152906001019060200180831161340a57829003601f168201915b505050505081565b600054600160a060020a0316331461344657600080fd5b61344f81613c96565b50565b60008054600160a060020a0316331461346a57600080fd5b5063ffffffff80821660008181526001602081815260409283902060038101805473010000000000000000000000000000000000000080820489169095018816850276ffffffff000000000000000000000000000000000000001990911617908190558451939004909516825291517f29294799f1c21a37ef838e15f79dd91bcee2df99d63cd1c18ac968b129514e6e929181900390910190a25050565b63ffffffff1660009081526002602081905260409091200154600160a060020a031690565b63ffffffff90811660009081526001602052604090206003015467010000000000000090041690565b60008054600160a060020a0316331461356e57600080fd5b5063ffffffff841660009081526001602052604090208054841480156135975750600181015483145b80156135be5750600381015463ffffffff8381166b01000000000000000000000090920416145b156135c857613694565b83815560018082018490556003820180546f0100000000000000000000000000000063ffffffff8087166b01000000000000000000000081026effffffff0000000000000000000000199094169390931782810482169095018116820272ffffffff0000000000000000000000000000001990951694909417928390556040805189815260208101899052808201939093529204831660608201529051918716917faa10e7a0117d4323f1d99d630ec169bebb3a988e895770e351987e01ff5423d59181900360800190a25b5050505050565b600160a060020a031660009081526011602052604090205490565b63ffffffff82166000908152600160205260408120600381015462010000900460ff16801561133057506003810154670100000000000000900463ffffffff9081169084161491505092915050565b63ffffffff80841660009081526001602052604081206003810154909260ff821692630100000090920416908080808086158015613741575089155b8061376857508680156137515750895b801561376857508863ffffffff168663ffffffff16145b15613772576139b2565b86156138cc5763ffffffff8087166000908152600860209081526040808320938f16835292905290812054955085116137a757fe5b63ffffffff8616600090815260076020526040902080546000199687019691955090810193508490849081106137d957fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16915081848681548110151561381057fe5b600091825260208083206008808404909101805460079094166004026101000a63ffffffff818102199095169685160295909517909455898216835292835260408083209186168352925220600186019055835484908490811061387057fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690558284816138a59190613d06565b5063ffffffff8087166000908152600860209081526040808320938f168352929052908120555b891561398957600760008a63ffffffff1663ffffffff1681526020019081526020016000209050808b908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050600860008b63ffffffff1663ffffffff16815260200190815260200160002060008d63ffffffff1663ffffffff168152602001908152602001600020819055505b60038801805466ffffffff0000001916630100000063ffffffff8c16021760ff19168b15151790555b5050505050505050505050565b63ffffffff80841660009081526001602052604081206003810154909260ff620100008304169267010000000000000090920416908080808086158015613a04575089155b80613a2b5750868015613a145750895b8015613a2b57508863ffffffff168663ffffffff16145b15613a35576139b2565b8615613b8d5763ffffffff8087166000908152600a60209081526040808320938f1683529290529081205495508511613a6a57fe5b63ffffffff861660009081526009602052604090208054600019968701969195509081019350849084908110613a9c57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff169150818486815481101515613ad357fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff8181021990941695841602949094179093558881168252600a8352604080832091861683529252206001860190558354849084908110613b3157fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff0219169055828481613b669190613d06565b5063ffffffff8087166000908152600a60209081526040808320938f168352929052908120555b8915613c4a57600960008a63ffffffff1663ffffffff1681526020019081526020016000209050808b908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050600a60008b63ffffffff1663ffffffff16815260200190815260200160002060008d63ffffffff1663ffffffff168152602001908152602001600020819055505b6003880180548b1515620100000262ff00001963ffffffff8d16670100000000000000026affffffff000000000000001990931692909217919091161790555050505050505050505050565b600160a060020a0381161515613cab57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a031916600160a060020a0392909216919091179055565b815481835581811115612fa3576007016008900481600701600890048360005260206000209182019101612fa39190613db8565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613d7b57805160ff1916838001178555613da8565b82800160010185558215613da8579182015b82811115613da8578251825591602001919060010190613d8d565b50613db4929150613db8565b5090565b613dd291905b80821115613db45760008155600101613dbe565b905600a165627a7a72305820e17b29d41082d92ff3fcb77ee16ddd9cee4ce75a55eb3bc727ed72ff0e59df930029

Deployed Bytecode

0x6080604052600436106103bb5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301d8a97f81146103c05780630333d499146103f657806304bbb61d1461046757806304bc94e5146104a4578063073167da146104fe57806308083039146105225780630f934e661461055a578063108d995b1461059457806312ace2e6146105b257806312afbc78146105d357806313063180146105f457806322a7906f1461061457806324541f781461063857806324ba1a461461065657806324cf61b5146106805780632637588e146106a4578063293a9169146106cb5780632a19642c146106e95780632c7ba564146107135780632cce0e291461073d5780633262207c1461076157806333f337241461078b578063375e24c1146107a957806337de45c1146107d35780633b17b4ea146107fd5780633c01a9fa1461081b578063439f7d3c146108395780634448f5fb14610857578063474dbae714610875578063483a15ed1461089f57806352c0683b146108c05780635a83df54146108ea5780635e19b3051461090e578063621b23e21461092c57806363fa9a871461094a5780636436b1b9146109c65780636d09887b146109e7578063715018a614610a05578063728aa85714610a1a57806376944d5b14610a4457806377eb4c5014610a6e5780637bc702a114610a8c578063846f652b14610aaa5780638866bb2c14610ac85780638a27bf5914610af25780638d2d3f4114610b1c5780638da5cb5b14610b3a5780639137fe0a14610b4f57806391398f2514610b795780639397640514610b9a578063942324c314610bdc5780639b0d1b2c14610bfa5780639b350e1214610c1b5780639dd9019014610c39578063a297c1d814610c5a578063a46afef114610c84578063a634585914610ca2578063b6363cf214610cc6578063b65afedd14610ced578063bac55edd14610d17578063bc562b9e14610dec578063bc735d9014610e0a578063c17ad9d814610e36578063c210c62314610e54578063c6d761d414610e9e578063caf590f914610ebc578063d154126414610ee6578063d2588e2014610f07578063d2a9b6ed14610f31578063d5c5164f14610f52578063ddc3595014610f76578063e01cff8414610fa0578063e213c84014610fc1578063e4a358d714610feb578063eccc8ff114611020578063f2fde38b146110ad578063f4914919146110ce578063f4e3be2d146110ec578063f5af66211461110a578063f9b87d4014611128578063fdb357be14611154578063fde9073314611175575b600080fd5b3480156103cc57600080fd5b506103e463ffffffff60043581169060243516611199565b60408051918252519081900360200190f35b34801561040257600080fd5b50610417600160a060020a03600435166111b6565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561045357818101518382015260200161043b565b505050509050019250505060405180910390f35b34801561047357600080fd5b5061048b600160a060020a036004351660243561124f565b6040805163ffffffff9092168252519081900360200190f35b3480156104b057600080fd5b506104c263ffffffff60043516611297565b60408051600160a060020a0396871681529486166020860152928516848401529084166060840152909216608082015290519081900360a00190f35b34801561050a57600080fd5b5061048b600160a060020a03600435166024356112d9565b34801561052e57600080fd5b5061054663ffffffff600435811690602435166112f4565b604080519115158252519081900360200190f35b34801561056657600080fd5b5061057863ffffffff60043516611338565b60408051600160a060020a039092168252519081900360200190f35b3480156105a057600080fd5b5061048b63ffffffff6004351661135c565b3480156105be57600080fd5b5061048b63ffffffff60043516602435611391565b3480156105df57600080fd5b506103e4600160a060020a03600435166113ac565b34801561060057600080fd5b5061061263ffffffff600435166113c7565b005b34801561062057600080fd5b5061048b600160a060020a036004351660243561147f565b34801561064457600080fd5b5061057863ffffffff600435166114e1565b34801561066257600080fd5b5061054663ffffffff60043516600160a060020a0360243516611505565b34801561068c57600080fd5b5061048b600160a060020a0360043516602435611532565b3480156106b057600080fd5b50610546600160a060020a036004358116906024351661154d565b3480156106d757600080fd5b5061048b63ffffffff6004351661156d565b3480156106f557600080fd5b5061061263ffffffff60043516600160a060020a036024351661159a565b34801561071f57600080fd5b5061061263ffffffff60043516600160a060020a036024351661189c565b34801561074957600080fd5b506103e463ffffffff60043581169060243516611b9b565b34801561076d57600080fd5b5061054663ffffffff60043516600160a060020a0360243516611bb8565b34801561079757600080fd5b5061057863ffffffff60043516611be4565b3480156107b557600080fd5b5061054663ffffffff60043516600160a060020a0360243516611c08565b3480156107df57600080fd5b506103e4600160a060020a036004351663ffffffff60243516611c34565b34801561080957600080fd5b5061054663ffffffff60043516611c51565b34801561082757600080fd5b5061041763ffffffff60043516611ca4565b34801561084557600080fd5b5061048b63ffffffff60043516611d11565b34801561086357600080fd5b506103e463ffffffff60043516611d36565b34801561088157600080fd5b506103e4600160a060020a036004351663ffffffff60243516611d4e565b3480156108ab57600080fd5b50610417600160a060020a0360043516611d6b565b3480156108cc57600080fd5b506103e4600160a060020a036004351663ffffffff60243516611ddb565b3480156108f657600080fd5b5061048b600160a060020a0360043516602435611df8565b34801561091a57600080fd5b5061054663ffffffff60043516611e13565b34801561093857600080fd5b5061057863ffffffff60043516611e36565b34801561095657600080fd5b5061096863ffffffff60043516611e57565b604080519a8b5260208b0199909952961515898901529415156060890152921515608088015263ffffffff91821660a0880152811660c087015290811660e08601529081166101008501521661012083015251908190036101400190f35b3480156109d257600080fd5b506103e4600160a060020a0360043516611eeb565b3480156109f357600080fd5b5061054663ffffffff60043516611f06565b348015610a1157600080fd5b50610612611f3a565b348015610a2657600080fd5b5061054663ffffffff60043516600160a060020a0360243516611f99565b348015610a5057600080fd5b506103e4600160a060020a036004351663ffffffff60243516612025565b348015610a7a57600080fd5b5061054663ffffffff60043516612042565b348015610a9857600080fd5b5061061263ffffffff60043516612060565b348015610ab657600080fd5b5061041763ffffffff60043516612103565b348015610ad457600080fd5b5061061263ffffffff60043516600160a060020a0360243516612173565b348015610afe57600080fd5b5061054663ffffffff60043516600160a060020a0360243516612472565b348015610b2857600080fd5b5061048b63ffffffff600435166124cb565b348015610b4657600080fd5b506105786124fc565b348015610b5b57600080fd5b5061054663ffffffff60043516600160a060020a036024351661250b565b348015610b8557600080fd5b50610417600160a060020a0360043516612564565b348015610ba657600080fd5b50610bb863ffffffff600435166125d4565b60405180826002811115610bc857fe5b60ff16815260200191505060405180910390f35b348015610be857600080fd5b506103e463ffffffff6004351661260f565b348015610c0657600080fd5b50610417600160a060020a0360043516612627565b348015610c2757600080fd5b5061054663ffffffff60043516612697565b348015610c4557600080fd5b5061048b63ffffffff600435166024356126bb565b348015610c6657600080fd5b5061061263ffffffff60043516600160a060020a03602435166126d6565b348015610c9057600080fd5b5061041763ffffffff600435166129d5565b348015610cae57600080fd5b5061061263ffffffff60043581169060243516612a42565b348015610cd257600080fd5b50610546600160a060020a0360043581169060243516612ab8565b348015610cf957600080fd5b5061054663ffffffff60043516600160a060020a0360243516612ae6565b348015610d2357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261061294369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750612b3f9650505050505050565b348015610df857600080fd5b5061061263ffffffff60043516612cfe565b348015610e1657600080fd5b50610612600160a060020a03600435811690602435166044351515612da4565b348015610e4257600080fd5b5061061263ffffffff60043516612df5565b348015610e6057600080fd5b50610e7263ffffffff60043516612ea8565b60408051948552602085019390935263ffffffff91821684840152166060830152519081900360800190f35b348015610eaa57600080fd5b5061061263ffffffff60043516612efa565b348015610ec857600080fd5b5061054663ffffffff60043516600160a060020a0360243516612fa8565b348015610ef257600080fd5b506103e4600160a060020a0360043516612fd1565b348015610f1357600080fd5b506103e4600160a060020a036004351663ffffffff60243516612fec565b348015610f3d57600080fd5b50610417600160a060020a0360043516613009565b348015610f5e57600080fd5b5061048b600160a060020a0360043516602435613079565b348015610f8257600080fd5b5061061263ffffffff60043516600160a060020a0360243516613094565b348015610fac57600080fd5b506103e4600160a060020a0360043516613328565b348015610fcd57600080fd5b5061054663ffffffff60043516600160a060020a0360243516613343565b348015610ff757600080fd5b5061100963ffffffff6004351661336f565b6040805161ffff9092168252519081900360200190f35b34801561102c57600080fd5b50611038600435613394565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561107257818101518382015260200161105a565b50505050905090810190601f16801561109f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156110b957600080fd5b50610612600160a060020a036004351661342f565b3480156110da57600080fd5b5061061263ffffffff60043516613452565b3480156110f857600080fd5b5061057863ffffffff60043516613508565b34801561111657600080fd5b5061048b63ffffffff6004351661352d565b34801561113457600080fd5b5061061263ffffffff600435811690602435906044359060643516613556565b34801561116057600080fd5b506103e4600160a060020a036004351661369b565b34801561118157600080fd5b5061054663ffffffff600435811690602435166136b6565b600a60209081526000928352604080842090915290825290205481565b600160a060020a0381166000908152600b602090815260409182902080548351818402810184019094528084526060939283018282801561124257602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116112055790505b505050505090505b919050565b60116020528160005260406000208181548110151561126a57fe5b9060005260206000209060089182820401919006600402915091509054906101000a900463ffffffff1681565b600260208190526000918252604090912080546001820154928201546003830154600490930154600160a060020a039283169483169391831692918216911685565b60136020528160005260406000208181548110151561126a57fe5b63ffffffff82166000908152600160205260408120600381015460ff1680156113305750600381015463ffffffff848116630100000090920416145b949350505050565b63ffffffff16600090815260026020526040902060010154600160a060020a031690565b63ffffffff90811660009081526001602052604090206003015473010000000000000000000000000000000000000090041690565b60076020528160005260406000208181548110151561126a57fe5b600160a060020a03166000908152600b602052604090205490565b60008054600160a060020a031633146113df57600080fd5b5063ffffffff81166000908152600160205260409020600381015462010000900460ff16151561140e57600080fd5b61142e8260018360030160079054906101000a900463ffffffff16613705565b61143a826000806139bf565b600381015460405163ffffffff63010000009092048216918416907f7e447c9b1bda4b174b0796e100bf7f34ebf36dbb7fe665490b1bfce6246a9da590600090a35050565b600160a060020a0382166000908152600b60205260408120805483106114a457600080fd5b80838154811015156114b257fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691505092915050565b63ffffffff16600090815260026020526040902060040154600160a060020a031690565b63ffffffff9190911660009081526002602081905260409091200154600160a060020a0391821691161490565b600b6020528160005260406000208181548110151561126a57fe5b600360209081526000928352604080842090915290825290205460ff1681565b63ffffffff8116600090815260016020526040812060020154640100000000811061159457fe5b92915050565b60008054819081908190819081908190600160a060020a031633146115be57600080fd5b63ffffffff8916600090815260026020819052604090912090810154909750600160a060020a03908116965088168614156115f857611891565b600160a060020a0386161561176d57600160a060020a038616600090815260106020908152604080832063ffffffff8d1684529091528120549550851161163b57fe5b600160a060020a0386166000908152600f60205260409020805460001996870196919550908101935084908490811061167057fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691508184868154811015156116a757fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a03891682526010835260408083209186168352925220600186019055835484908490811061170c57fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690558284816117419190613d06565b50600160a060020a038616600090815260106020908152604080832063ffffffff8d1684529091528120555b600160a060020a0388161561183f57600f600089600160a060020a0316600160a060020a0316815260200190815260200160002090508089908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050601060008a600160a060020a0316600160a060020a0316815260200190815260200160002060008b63ffffffff1663ffffffff168152602001908152602001600020819055505b600287018054600160a060020a031916600160a060020a038a1690811790915560405163ffffffff8b16907f902736af7b3cefe10d9e840aed0d687e35c84095122b25051a20ead8866f006d90600090a35b505050505050505050565b60008054819081908190819081908190600160a060020a031633146118c057600080fd5b63ffffffff891660009081526002602052604090206004810154909750600160a060020a03908116965088168614156118f857611891565b600160a060020a03861615611a6d57600160a060020a038616600090815260146020908152604080832063ffffffff8d1684529091528120549550851161193b57fe5b600160a060020a0386166000908152601360205260409020805460001996870196919550908101935084908490811061197057fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691508184868154811015156119a757fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a038916825260148352604080832091861683529252206001860190558354849084908110611a0c57fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff0219169055828481611a419190613d06565b50600160a060020a038616600090815260146020908152604080832063ffffffff8d1684529091528120555b600160a060020a03881615611b3f576013600089600160a060020a0316600160a060020a0316815260200190815260200160002090508089908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050601460008a600160a060020a0316600160a060020a0316815260200190815260200160002060008b63ffffffff1663ffffffff168152602001908152602001600020819055505b600487018054600160a060020a031916600160a060020a038a1690811790915560405163ffffffff8b16907fcfe369b7197e7f0cf06793ae2472a9b13583fecbed2f78dfa14d1f10796b847c90600090a3505050505050505050565b600860209081526000928352604080842090915290825290205481565b63ffffffff91909116600090815260026020526040902060040154600160a060020a0391821691161490565b63ffffffff16600090815260026020526040902060030154600160a060020a031690565b63ffffffff91909116600090815260026020526040902060010154600160a060020a0391821691161490565b601260209081526000928352604080842090915290825290205481565b63ffffffff81166000908152600160205260408120805415801590611c795750600181015415155b8015611c9d575060038101546b010000000000000000000000900463ffffffff1615155b9392505050565b63ffffffff8116600090815260096020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b63ffffffff908116600090815260016020526040902060030154630100000090041690565b63ffffffff1660009081526009602052604090205490565b600c60209081526000928352604080842090915290825290205481565b600160a060020a0381166000908152600d6020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b600e60209081526000928352604080842090915290825290205481565b600d6020528160005260406000208181548110151561126a57fe5b63ffffffff16600090815260016020526040902060030154610100900460ff1690565b63ffffffff16600090815260026020526040902054600160a060020a031690565b600160208190526000918252604090912080549181015460039091015460ff808216916101008104821691620100008204169063ffffffff6301000000820481169167010000000000000081048216916b01000000000000000000000082048116916f010000000000000000000000000000008104821691730100000000000000000000000000000000000000909104168a565b600160a060020a03166000908152600f602052604090205490565b63ffffffff9081166000908152600160205260408120600301546f0100000000000000000000000000000090049091161190565b600054600160a060020a03163314611f5157600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a260008054600160a060020a0319169055565b63ffffffff82166000908152600260205260408120600160a060020a0383161580159061133057508054600160a060020a0384811691161480611feb57506004810154600160a060020a038481169116145b8061133057508054600160a060020a0390811660009081526003602090815260408083209387168352929052205460ff1691505092915050565b601060209081526000928352604080842090915290825290205481565b63ffffffff1660009081526001602052604090206003015460ff1690565b60008054600160a060020a0316331461207857600080fd5b5063ffffffff811660009081526001602052604090206003810154610100900460ff16156120a557600080fd5b60038101805461ff0019166101001790556120ce8260016120c58261336f565b61ffff16613705565b60405163ffffffff8316907fe74c03809d0769e1b1f706cc8414258cd1f3b6fe020cd15d0165c210ba503a0f90600090a25050565b63ffffffff8116600090815260016020908152604091829020600201805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b60008054819081908190819081908190600160a060020a0316331461219757600080fd5b63ffffffff891660009081526002602052604090206001810154909750600160a060020a03908116965088168614156121cf57611891565b600160a060020a0386161561234457600160a060020a0386166000908152600e6020908152604080832063ffffffff8d1684529091528120549550851161221257fe5b600160a060020a0386166000908152600d60205260409020805460001996870196919550908101935084908490811061224757fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16915081848681548110151561227e57fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a0389168252600e83526040808320918616835292522060018601905583548490849081106122e357fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690558284816123189190613d06565b50600160a060020a0386166000908152600e6020908152604080832063ffffffff8d1684529091528120555b600160a060020a0388161561241657600d600089600160a060020a0316600160a060020a0316815260200190815260200160002090508089908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050600e60008a600160a060020a0316600160a060020a0316815260200190815260200160002060008b63ffffffff1663ffffffff168152602001908152602001600020819055505b600187018054600160a060020a031916600160a060020a038a1690811790915560405163ffffffff8b16907fab9c9327cffd2acc168fafedbe06139f5f55cb84c761df05e0511c251e2ee9bf90600090a3505050505050505050565b63ffffffff82166000908152600260205260408120600160a060020a0383161580159061133057508054600160a060020a0384811691161480611330575060020154600160a060020a0390811692169190911492915050565b63ffffffff9081166000908152600160205260409020600301546f0100000000000000000000000000000090041690565b600054600160a060020a031681565b63ffffffff82166000908152600260205260408120600160a060020a0383161580159061133057508054600160a060020a0384811691161480611330575060010154600160a060020a0390811692169190911492915050565b600160a060020a038116600090815260136020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b60006101008263ffffffff1610156125ee5750600061124a565b620100008263ffffffff1610156126075750600161124a565b506002919050565b63ffffffff1660009081526007602052604090205490565b600160a060020a0381166000908152600f6020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b63ffffffff1660009081526001602052604090206003015462010000900460ff1690565b60096020528160005260406000208181548110151561126a57fe5b60008054819081908190819081908190600160a060020a031633146126fa57600080fd5b63ffffffff891660009081526002602052604090206003810154909750600160a060020a039081169650881686141561273257611891565b600160a060020a038616156128a757600160a060020a038616600090815260126020908152604080832063ffffffff8d1684529091528120549550851161277557fe5b600160a060020a038616600090815260116020526040902080546000199687019691955090810193508490849081106127aa57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691508184868154811015156127e157fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a03891682526012835260408083209186168352925220600186019055835484908490811061284657fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff021916905582848161287b9190613d06565b50600160a060020a038616600090815260126020908152604080832063ffffffff8d1684529091528120555b600160a060020a03881615612979576011600089600160a060020a0316600160a060020a0316815260200190815260200160002090508089908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050601260008a600160a060020a0316600160a060020a0316815260200190815260200160002060008b63ffffffff1663ffffffff168152602001908152602001600020819055505b600387018054600160a060020a031916600160a060020a038a1690811790915560405163ffffffff8b16907fcbd6269ec71457f2c7b1a22774f246f6c5a2eae3795ed7300db517680c61c80590600090a3505050505050505050565b63ffffffff8116600090815260076020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b600054600160a060020a03163314612a5957600080fd5b612a6382826136b6565b15612a6d57612ab4565b612a79826001836139bf565b8063ffffffff168263ffffffff167fb4d4850b8f218218141c5665cba379e53e9bb015b51e8d934be70210aead874a60405160405180910390a35b5050565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205460ff1690565b63ffffffff82166000908152600260205260408120600160a060020a0383161580159061133057508054600160a060020a0384811691161480611330575060030154600160a060020a0390811692169190911492915050565b600054600160a060020a03163314612b5657600080fd5b8251612b69906004906020860190613d3a565b508151612b7d906005906020850190613d3a565b508051612b91906006906020840190613d3a565b507ffafd04ade1daae2e1fdb0fc1cc6a899fd424063ed5c92120e67e073053b9489883838360405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b83811015612bfb578181015183820152602001612be3565b50505050905090810190601f168015612c285780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b83811015612c5b578181015183820152602001612c43565b50505050905090810190601f168015612c885780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b83811015612cbb578181015183820152602001612ca3565b50505050905090810190601f168015612ce85780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1505050565b60008054600160a060020a03163314612d1657600080fd5b5063ffffffff81166000908152600160205260409020600381015460ff161515612d3f57612ab4565b612d5f8260008360030160039054906101000a900463ffffffff16613705565b600381015460405163ffffffff63010000009092048216918416907fd7704f9a25193dbd0b0cb4a809feffffa7f19d1aae8817a71346c194448210d590600090a35050565b600054600160a060020a03163314612dbb57600080fd5b600160a060020a03928316600090815260036020908152604080832094909516825292909252919020805460ff1916911515919091179055565b60008054600160a060020a03163314612e0d57600080fd5b612e168261336f565b61ffff16905063ffffffff8216811415612e2f57612ab4565b63ffffffff80821660008181526001602081815260408084206002018054938401815584529083206008830401805488871660046007909516949094026101000a848102970219169590951790945592517fb2d3a6e7a339f5c8ff96265e2f03a010a8541070f3744a2470909644150815469190a35050565b63ffffffff9081166000908152600160208190526040909120805491810154600390910154919390926b01000000000000000000000083048116926f0100000000000000000000000000000090041690565b600080548190600160a060020a03163314612f1457600080fd5b63ffffffff83166000908152600160205260409020600381015490925062010000900460ff161515612f4557612fa3565b506003810154670100000000000000900463ffffffff16612f68836000806139bf565b8063ffffffff168363ffffffff167fd653bb0e0bb7ce8393e624d98fbf17cda5902c8328ed0cd09988f36890d9932a60405160405180910390a35b505050565b63ffffffff91909116600090815260026020526040902054600160a060020a0391821691161490565b600160a060020a03166000908152600d602052604090205490565b601460209081526000928352604080842090915290825290205481565b600160a060020a038116600090815260116020908152604091829020805483518184028101840190945280845260609392830182828015611242576000918252602091829020805463ffffffff168452908202830192909160049101808411611205575094979650505050505050565b600f6020528160005260406000208181548110151561126a57fe5b600080548190819081908190600160a060020a031633146130b457600080fd5b600160a060020a03861615156130c957600080fd5b63ffffffff8716600090815260026020526040902054600160a060020a03908116955086168514156130fa5761331f565b600160a060020a0385161561326f57600160a060020a0385166000908152600c6020908152604080832063ffffffff8b1684529091528120549450841161313d57fe5b600160a060020a0385166000908152600b60205260409020805460001995860195919450908101925083908390811061317257fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1690508083858154811015156131a957fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff818102199094169584160294909417909355600160a060020a0388168252600c835260408083209185168352925220600185019055825483908390811061320e57fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690558183816132439190613d06565b50600160a060020a0385166000908152600c6020908152604080832063ffffffff8b1684529091528120555b63ffffffff87811660008181526002602090815260408083208054600160a060020a031916600160a060020a038d16908117909155808452600b835281842080546001810182558186528486206008820401805460079092166004026101000a98890219909116978702979097179096558084529454600c835281842085855290925280832091909155517f16d0f539d49c6cad822b767a9445bfb1cf7ea6f2a6c2b120a7ea4cc7660d8fda9190a35b50505050505050565b600160a060020a031660009081526013602052604090205490565b63ffffffff91909116600090815260026020526040902060030154600160a060020a0391821691161490565b6000620100008263ffffffff16101561338c575060ff811661124a565b5061ffff1690565b600481600381106133a157fe5b018054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815293508301828280156134275780601f106133fc57610100808354040283529160200191613427565b820191906000526020600020905b81548152906001019060200180831161340a57829003601f168201915b505050505081565b600054600160a060020a0316331461344657600080fd5b61344f81613c96565b50565b60008054600160a060020a0316331461346a57600080fd5b5063ffffffff80821660008181526001602081815260409283902060038101805473010000000000000000000000000000000000000080820489169095018816850276ffffffff000000000000000000000000000000000000001990911617908190558451939004909516825291517f29294799f1c21a37ef838e15f79dd91bcee2df99d63cd1c18ac968b129514e6e929181900390910190a25050565b63ffffffff1660009081526002602081905260409091200154600160a060020a031690565b63ffffffff90811660009081526001602052604090206003015467010000000000000090041690565b60008054600160a060020a0316331461356e57600080fd5b5063ffffffff841660009081526001602052604090208054841480156135975750600181015483145b80156135be5750600381015463ffffffff8381166b01000000000000000000000090920416145b156135c857613694565b83815560018082018490556003820180546f0100000000000000000000000000000063ffffffff8087166b01000000000000000000000081026effffffff0000000000000000000000199094169390931782810482169095018116820272ffffffff0000000000000000000000000000001990951694909417928390556040805189815260208101899052808201939093529204831660608201529051918716917faa10e7a0117d4323f1d99d630ec169bebb3a988e895770e351987e01ff5423d59181900360800190a25b5050505050565b600160a060020a031660009081526011602052604090205490565b63ffffffff82166000908152600160205260408120600381015462010000900460ff16801561133057506003810154670100000000000000900463ffffffff9081169084161491505092915050565b63ffffffff80841660009081526001602052604081206003810154909260ff821692630100000090920416908080808086158015613741575089155b8061376857508680156137515750895b801561376857508863ffffffff168663ffffffff16145b15613772576139b2565b86156138cc5763ffffffff8087166000908152600860209081526040808320938f16835292905290812054955085116137a757fe5b63ffffffff8616600090815260076020526040902080546000199687019691955090810193508490849081106137d957fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16915081848681548110151561381057fe5b600091825260208083206008808404909101805460079094166004026101000a63ffffffff818102199095169685160295909517909455898216835292835260408083209186168352925220600186019055835484908490811061387057fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff02191690558284816138a59190613d06565b5063ffffffff8087166000908152600860209081526040808320938f168352929052908120555b891561398957600760008a63ffffffff1663ffffffff1681526020019081526020016000209050808b908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050600860008b63ffffffff1663ffffffff16815260200190815260200160002060008d63ffffffff1663ffffffff168152602001908152602001600020819055505b60038801805466ffffffff0000001916630100000063ffffffff8c16021760ff19168b15151790555b5050505050505050505050565b63ffffffff80841660009081526001602052604081206003810154909260ff620100008304169267010000000000000090920416908080808086158015613a04575089155b80613a2b5750868015613a145750895b8015613a2b57508863ffffffff168663ffffffff16145b15613a35576139b2565b8615613b8d5763ffffffff8087166000908152600a60209081526040808320938f1683529290529081205495508511613a6a57fe5b63ffffffff861660009081526009602052604090208054600019968701969195509081019350849084908110613a9c57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff169150818486815481101515613ad357fe5b600091825260208083206008830401805460079093166004026101000a63ffffffff8181021990941695841602949094179093558881168252600a8352604080832091861683529252206001860190558354849084908110613b3157fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff0219169055828481613b669190613d06565b5063ffffffff8087166000908152600a60209081526040808320938f168352929052908120555b8915613c4a57600960008a63ffffffff1663ffffffff1681526020019081526020016000209050808b908060018154018082558091505090600182039060005260206000209060089182820401919006600402909192909190916101000a81548163ffffffff021916908363ffffffff160217905550508080549050600a60008b63ffffffff1663ffffffff16815260200190815260200160002060008d63ffffffff1663ffffffff168152602001908152602001600020819055505b6003880180548b1515620100000262ff00001963ffffffff8d16670100000000000000026affffffff000000000000001990931692909217919091161790555050505050505050505050565b600160a060020a0381161515613cab57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a031916600160a060020a0392909216919091179055565b815481835581811115612fa3576007016008900481600701600890048360005260206000209182019101612fa39190613db8565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613d7b57805160ff1916838001178555613da8565b82800160010185558215613da8579182015b82811115613da8578251825591602001919060010190613d8d565b50613db4929150613db8565b5090565b613dd291905b80821115613db45760008155600101613dbe565b905600a165627a7a72305820e17b29d41082d92ff3fcb77ee16ddd9cee4ce75a55eb3bc727ed72ff0e59df930029

Swarm Source

bzzr://e17b29d41082d92ff3fcb77ee16ddd9cee4ce75a55eb3bc727ed72ff0e59df93

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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