Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
0 AZP
Holders
589
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 AZPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Ecliptic
Compiler Version
v0.4.24+commit.e67f0147
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-09 */ // the azimuth logic contract // 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's SafeMath8.sol /** * @title SafeMath8 * @dev Math operations for uint8 with safety checks that throw on error */ library SafeMath8 { function mul(uint8 a, uint8 b) internal pure returns (uint8) { uint8 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint8 a, uint8 b) internal pure returns (uint8) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint8 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint8 a, uint8 b) internal pure returns (uint8) { assert(b <= a); return a - b; } function add(uint8 a, uint8 b) internal pure returns (uint8) { uint8 c = a + b; assert(c >= a); return c; } } // Azimuth's SafeMath16.sol /** * @title SafeMath16 * @dev Math operations for uint16 with safety checks that throw on error */ library SafeMath16 { function mul(uint16 a, uint16 b) internal pure returns (uint16) { uint16 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint16 a, uint16 b) internal pure returns (uint16) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint16 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint16 a, uint16 b) internal pure returns (uint16) { assert(b <= a); return a - b; } function add(uint16 a, uint16 b) internal pure returns (uint16) { uint16 c = a + b; assert(c >= a); return c; } } // OpenZeppelin's SafeMath.sol /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (_a == 0) { return 0; } c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 _a, uint256 _b) internal pure returns (uint256) { // assert(_b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return _a / _b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { c = _a + _b; assert(c >= _a); return c; } } // OpenZeppelin's ERC165.sol /** * @title ERC165 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md */ interface ERC165 { /** * @notice Query if a contract implements an interface * @param _interfaceId The interface identifier, as specified in ERC-165 * @dev Interface identification is specified in ERC-165. This function * uses less than 30,000 gas. */ function supportsInterface(bytes4 _interfaceId) external view returns (bool); } // OpenZeppelin's SupportsInterfaceWithLookup.sol /** * @title SupportsInterfaceWithLookup * @author Matt Condon (@shrugs) * @dev Implements ERC165 using a lookup table. */ contract SupportsInterfaceWithLookup is ERC165 { bytes4 public constant InterfaceId_ERC165 = 0x01ffc9a7; /** * 0x01ffc9a7 === * bytes4(keccak256('supportsInterface(bytes4)')) */ /** * @dev a mapping of interface id to whether or not it's supported */ mapping(bytes4 => bool) internal supportedInterfaces; /** * @dev A contract implementing SupportsInterfaceWithLookup * implement ERC165 itself */ constructor() public { _registerInterface(InterfaceId_ERC165); } /** * @dev implement supportsInterface(bytes4) using a lookup table */ function supportsInterface(bytes4 _interfaceId) external view returns (bool) { return supportedInterfaces[_interfaceId]; } /** * @dev private method for registering an interface */ function _registerInterface(bytes4 _interfaceId) internal { require(_interfaceId != 0xffffffff); supportedInterfaces[_interfaceId] = true; } } // OpenZeppelin's ERC721Basic.sol /** * @title ERC721 Non-Fungible Token Standard basic interface * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Basic is ERC165 { bytes4 internal constant InterfaceId_ERC721 = 0x80ac58cd; /* * 0x80ac58cd === * bytes4(keccak256('balanceOf(address)')) ^ * bytes4(keccak256('ownerOf(uint256)')) ^ * bytes4(keccak256('approve(address,uint256)')) ^ * bytes4(keccak256('getApproved(uint256)')) ^ * bytes4(keccak256('setApprovalForAll(address,bool)')) ^ * bytes4(keccak256('isApprovedForAll(address,address)')) ^ * bytes4(keccak256('transferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) */ bytes4 internal constant InterfaceId_ERC721Exists = 0x4f558e79; /* * 0x4f558e79 === * bytes4(keccak256('exists(uint256)')) */ bytes4 internal constant InterfaceId_ERC721Enumerable = 0x780e9d63; /** * 0x780e9d63 === * bytes4(keccak256('totalSupply()')) ^ * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^ * bytes4(keccak256('tokenByIndex(uint256)')) */ bytes4 internal constant InterfaceId_ERC721Metadata = 0x5b5e139f; /** * 0x5b5e139f === * bytes4(keccak256('name()')) ^ * bytes4(keccak256('symbol()')) ^ * bytes4(keccak256('tokenURI(uint256)')) */ event Transfer( address indexed _from, address indexed _to, uint256 indexed _tokenId ); event Approval( address indexed _owner, address indexed _approved, uint256 indexed _tokenId ); event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); function balanceOf(address _owner) public view returns (uint256 _balance); function ownerOf(uint256 _tokenId) public view returns (address _owner); function exists(uint256 _tokenId) public view returns (bool _exists); function approve(address _to, uint256 _tokenId) public; function getApproved(uint256 _tokenId) public view returns (address _operator); function setApprovalForAll(address _operator, bool _approved) public; function isApprovedForAll(address _owner, address _operator) public view returns (bool); function transferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) public; } // OpenZeppelin's ERC721.sol /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Enumerable is ERC721Basic { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex( address _owner, uint256 _index ) public view returns (uint256 _tokenId); function tokenByIndex(uint256 _index) public view returns (uint256); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Metadata is ERC721Basic { function name() external view returns (string _name); function symbol() external view returns (string _symbol); function tokenURI(uint256 _tokenId) public view returns (string); } /** * @title ERC-721 Non-Fungible Token Standard, full implementation interface * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata { } // OpenZeppelin's ERC721Receiver.sol /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract ERC721Receiver { /** * @dev Magic value to be returned upon successful reception of an NFT * Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`, * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector` */ bytes4 internal constant ERC721_RECEIVED = 0x150b7a02; /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safetransfer`. This function MAY throw to revert and reject the * transfer. Return of other than the magic value MUST result in the * transaction being reverted. * Note: the contract address is always the message sender. * @param _operator The address which called `safeTransferFrom` function * @param _from The address which previously owned the token * @param _tokenId The NFT identifier which is being transferred * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes _data ) public returns(bytes4); } // OpenZeppelin's AddressUtils.sol /** * Utility library of inline functions on addresses */ library AddressUtils { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param _addr address to check * @return whether the target address is a contract */ function isContract(address _addr) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. // solium-disable-next-line security/no-inline-assembly assembly { size := extcodesize(_addr) } return size > 0; } } // Azimuth's Azimuth.sol // 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; } } // Azimuth's ReadsAzimuth.sol // ReadsAzimuth: referring to and testing against the Azimuth // data contract // // To avoid needless repetition, this contract provides common // checks and operations using the Azimuth contract. // contract ReadsAzimuth { // azimuth: points data storage contract. // Azimuth public azimuth; // constructor(): set the Azimuth data contract's address // constructor(Azimuth _azimuth) public { azimuth = _azimuth; } // activePointOwner(): require that :msg.sender is the owner of _point, // and that _point is active // modifier activePointOwner(uint32 _point) { require( azimuth.isOwner(_point, msg.sender) && azimuth.isActive(_point) ); _; } // activePointManager(): require that :msg.sender can manage _point, // and that _point is active // modifier activePointManager(uint32 _point) { require( azimuth.canManage(_point, msg.sender) && azimuth.isActive(_point) ); _; } // activePointSpawner(): require that :msg.sender can spawn as _point, // and that _point is active // modifier activePointSpawner(uint32 _point) { require( azimuth.canSpawnAs(_point, msg.sender) && azimuth.isActive(_point) ); _; } // activePointVoter(): require that :msg.sender can vote as _point, // and that _point is active // modifier activePointVoter(uint32 _point) { require( azimuth.canVoteAs(_point, msg.sender) && azimuth.isActive(_point) ); _; } } // Azimuth's Polls.sol // Polls: proposals & votes data contract // // This contract is used for storing all data related to the proposals // of the senate (galaxy owners) and their votes on those proposals. // It keeps track of votes and uses them to calculate whether a majority // is in favor of a proposal. // // Every galaxy can only vote on a proposal exactly once. Votes cannot // be changed. If a proposal fails to achieve majority within its // duration, it can be restarted after its cooldown period has passed. // // The requirements for a proposal to achieve majority are as follows: // - At least 1/4 of the currently active voters (rounded down) must have // voted in favor of the proposal, // - More than half of the votes cast must be in favor of the proposal, // and this can no longer change, either because // - the poll duration has passed, or // - not enough voters remain to take away the in-favor majority. // As soon as these conditions are met, no further interaction with // the proposal is possible. Achieving majority is permanent. // // Since data stores are difficult to upgrade, all of the logic unrelated // to the voting itself (that is, determining who is eligible to vote) // is expected to be implemented by this contract's owner. // // This contract will be owned by the Ecliptic contract. // contract Polls is Ownable { using SafeMath for uint256; using SafeMath16 for uint16; using SafeMath8 for uint8; // UpgradePollStarted: a poll on :proposal has opened // event UpgradePollStarted(address proposal); // DocumentPollStarted: a poll on :proposal has opened // event DocumentPollStarted(bytes32 proposal); // UpgradeMajority: :proposal has achieved majority // event UpgradeMajority(address proposal); // DocumentMajority: :proposal has achieved majority // event DocumentMajority(bytes32 proposal); // Poll: full poll state // struct Poll { // start: the timestamp at which the poll was started // uint256 start; // voted: per galaxy, whether they have voted on this poll // bool[256] voted; // yesVotes: amount of votes in favor of the proposal // uint16 yesVotes; // noVotes: amount of votes against the proposal // uint16 noVotes; // duration: amount of time during which the poll can be voted on // uint256 duration; // cooldown: amount of time before the (non-majority) poll can be reopened // uint256 cooldown; } // pollDuration: duration set for new polls. see also Poll.duration above // uint256 public pollDuration; // pollCooldown: cooldown set for new polls. see also Poll.cooldown above // uint256 public pollCooldown; // totalVoters: amount of active galaxies // uint16 public totalVoters; // upgradeProposals: list of all upgrades ever proposed // // this allows clients to discover the existence of polls. // from there, they can do liveness checks on the polls themselves. // address[] public upgradeProposals; // upgradePolls: per address, poll held to determine if that address // will become the new ecliptic // mapping(address => Poll) public upgradePolls; // upgradeHasAchievedMajority: per address, whether that address // has ever achieved majority // // If we did not store this, we would have to look at old poll data // to see whether or not a proposal has ever achieved majority. // Since the outcome of a poll is calculated based on :totalVoters, // which may not be consistent across time, we need to store outcomes // explicitly instead of re-calculating them. This allows us to always // tell with certainty whether or not a majority was achieved, // regardless of the current :totalVoters. // mapping(address => bool) public upgradeHasAchievedMajority; // documentProposals: list of all documents ever proposed // // this allows clients to discover the existence of polls. // from there, they can do liveness checks on the polls themselves. // bytes32[] public documentProposals; // documentPolls: per hash, poll held to determine if the corresponding // document is accepted by the galactic senate // mapping(bytes32 => Poll) public documentPolls; // documentHasAchievedMajority: per hash, whether that hash has ever // achieved majority // // the note for upgradeHasAchievedMajority above applies here as well // mapping(bytes32 => bool) public documentHasAchievedMajority; // documentMajorities: all hashes that have achieved majority // bytes32[] public documentMajorities; // constructor(): initial contract configuration // constructor(uint256 _pollDuration, uint256 _pollCooldown) public { reconfigure(_pollDuration, _pollCooldown); } // reconfigure(): change poll duration and cooldown // function reconfigure(uint256 _pollDuration, uint256 _pollCooldown) public onlyOwner { require( (5 days <= _pollDuration) && (_pollDuration <= 90 days) && (5 days <= _pollCooldown) && (_pollCooldown <= 90 days) ); pollDuration = _pollDuration; pollCooldown = _pollCooldown; } // incrementTotalVoters(): increase the amount of registered voters // function incrementTotalVoters() external onlyOwner { require(totalVoters < 256); totalVoters = totalVoters.add(1); } // getAllUpgradeProposals(): return array of all upgrade proposals ever made // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getUpgradeProposals() external view returns (address[] proposals) { return upgradeProposals; } // getUpgradeProposalCount(): get the number of unique proposed upgrades // function getUpgradeProposalCount() external view returns (uint256 count) { return upgradeProposals.length; } // getAllDocumentProposals(): return array of all upgrade proposals ever made // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getDocumentProposals() external view returns (bytes32[] proposals) { return documentProposals; } // getDocumentProposalCount(): get the number of unique proposed upgrades // function getDocumentProposalCount() external view returns (uint256 count) { return documentProposals.length; } // getDocumentMajorities(): return array of all document majorities // // Note: only useful for clients, as Solidity does not currently // support returning dynamic arrays. // function getDocumentMajorities() external view returns (bytes32[] majorities) { return documentMajorities; } // hasVotedOnUpgradePoll(): returns true if _galaxy has voted // on the _proposal // function hasVotedOnUpgradePoll(uint8 _galaxy, address _proposal) external view returns (bool result) { return upgradePolls[_proposal].voted[_galaxy]; } // hasVotedOnDocumentPoll(): returns true if _galaxy has voted // on the _proposal // function hasVotedOnDocumentPoll(uint8 _galaxy, bytes32 _proposal) external view returns (bool result) { return documentPolls[_proposal].voted[_galaxy]; } // startUpgradePoll(): open a poll on making _proposal the new ecliptic // function startUpgradePoll(address _proposal) external onlyOwner { // _proposal must not have achieved majority before // require(!upgradeHasAchievedMajority[_proposal]); Poll storage poll = upgradePolls[_proposal]; // if the proposal is being made for the first time, register it. // if (0 == poll.start) { upgradeProposals.push(_proposal); } startPoll(poll); emit UpgradePollStarted(_proposal); } // startDocumentPoll(): open a poll on accepting the document // whose hash is _proposal // function startDocumentPoll(bytes32 _proposal) external onlyOwner { // _proposal must not have achieved majority before // require(!documentHasAchievedMajority[_proposal]); Poll storage poll = documentPolls[_proposal]; // if the proposal is being made for the first time, register it. // if (0 == poll.start) { documentProposals.push(_proposal); } startPoll(poll); emit DocumentPollStarted(_proposal); } // startPoll(): open a new poll, or re-open an old one // function startPoll(Poll storage _poll) internal { // check that the poll has cooled down enough to be started again // // for completely new polls, the values used will be zero // require( block.timestamp > ( _poll.start.add( _poll.duration.add( _poll.cooldown )) ) ); // set started poll state // _poll.start = block.timestamp; delete _poll.voted; _poll.yesVotes = 0; _poll.noVotes = 0; _poll.duration = pollDuration; _poll.cooldown = pollCooldown; } // castUpgradeVote(): as galaxy _as, cast a vote on the _proposal // // _vote is true when in favor of the proposal, false otherwise // function castUpgradeVote(uint8 _as, address _proposal, bool _vote) external onlyOwner returns (bool majority) { Poll storage poll = upgradePolls[_proposal]; processVote(poll, _as, _vote); return updateUpgradePoll(_proposal); } // castDocumentVote(): as galaxy _as, cast a vote on the _proposal // // _vote is true when in favor of the proposal, false otherwise // function castDocumentVote(uint8 _as, bytes32 _proposal, bool _vote) external onlyOwner returns (bool majority) { Poll storage poll = documentPolls[_proposal]; processVote(poll, _as, _vote); return updateDocumentPoll(_proposal); } // processVote(): record a vote from _as on the _poll // function processVote(Poll storage _poll, uint8 _as, bool _vote) internal { // assist symbolic execution tools // assert(block.timestamp >= _poll.start); require( // may only vote once // !_poll.voted[_as] && // // may only vote when the poll is open // (block.timestamp < _poll.start.add(_poll.duration)) ); // update poll state to account for the new vote // _poll.voted[_as] = true; if (_vote) { _poll.yesVotes = _poll.yesVotes.add(1); } else { _poll.noVotes = _poll.noVotes.add(1); } } // updateUpgradePoll(): check whether the _proposal has achieved // majority, updating state, sending an event, // and returning true if it has // function updateUpgradePoll(address _proposal) public onlyOwner returns (bool majority) { // _proposal must not have achieved majority before // require(!upgradeHasAchievedMajority[_proposal]); // check for majority in the poll // Poll storage poll = upgradePolls[_proposal]; majority = checkPollMajority(poll); // if majority was achieved, update the state and send an event // if (majority) { upgradeHasAchievedMajority[_proposal] = true; emit UpgradeMajority(_proposal); } return majority; } // updateDocumentPoll(): check whether the _proposal has achieved majority, // updating the state and sending an event if it has // // this can be called by anyone, because the ecliptic does not // need to be aware of the result // function updateDocumentPoll(bytes32 _proposal) public returns (bool majority) { // _proposal must not have achieved majority before // require(!documentHasAchievedMajority[_proposal]); // check for majority in the poll // Poll storage poll = documentPolls[_proposal]; majority = checkPollMajority(poll); // if majority was achieved, update state and send an event // if (majority) { documentHasAchievedMajority[_proposal] = true; documentMajorities.push(_proposal); emit DocumentMajority(_proposal); } return majority; } // checkPollMajority(): returns true if the majority is in favor of // the subject of the poll // function checkPollMajority(Poll _poll) internal view returns (bool majority) { return ( // poll must have at least the minimum required yes-votes // (_poll.yesVotes >= (totalVoters / 4)) && // // and have a majority... // (_poll.yesVotes > _poll.noVotes) && // // ...that is indisputable // ( // either because the poll has ended // (block.timestamp > _poll.start.add(_poll.duration)) || // // or there are more yes votes than there can be no votes // ( _poll.yesVotes > totalVoters.sub(_poll.yesVotes) ) ) ); } } // Azimuth's Claims.sol // Claims: simple identity management // // This contract allows points to document claims about their owner. // Most commonly, these are about identity, with a claim's protocol // defining the context or platform of the claim, and its dossier // containing proof of its validity. // Points are limited to a maximum of 16 claims. // // For existing claims, the dossier can be updated, or the claim can // be removed entirely. It is recommended to remove any claims associated // with a point when it is about to be transferred to a new owner. // For convenience, the owner of the Azimuth contract (the Ecliptic) // is allowed to clear claims for any point, allowing it to do this for // you on-transfer. // contract Claims is ReadsAzimuth { // ClaimAdded: a claim was added by :by // event ClaimAdded( uint32 indexed by, string _protocol, string _claim, bytes _dossier ); // ClaimRemoved: a claim was removed by :by // event ClaimRemoved(uint32 indexed by, string _protocol, string _claim); // maxClaims: the amount of claims that can be registered per point // uint8 constant maxClaims = 16; // Claim: claim details // struct Claim { // protocol: context of the claim // string protocol; // claim: the claim itself // string claim; // dossier: data relating to the claim, as proof // bytes dossier; } // per point, list of claims // mapping(uint32 => Claim[maxClaims]) public claims; // constructor(): register the azimuth contract. // constructor(Azimuth _azimuth) ReadsAzimuth(_azimuth) public { // } // addClaim(): register a claim as _point // function addClaim(uint32 _point, string _protocol, string _claim, bytes _dossier) external activePointManager(_point) { // require non-empty protocol and claim fields // require( ( 0 < bytes(_protocol).length ) && ( 0 < bytes(_claim).length ) ); // cur: index + 1 of the claim if it already exists, 0 otherwise // uint8 cur = findClaim(_point, _protocol, _claim); // if the claim doesn't yet exist, store it in state // if (cur == 0) { // if there are no empty slots left, this throws // uint8 empty = findEmptySlot(_point); claims[_point][empty] = Claim(_protocol, _claim, _dossier); } // // if the claim has been made before, update the version in state // else { claims[_point][cur-1] = Claim(_protocol, _claim, _dossier); } emit ClaimAdded(_point, _protocol, _claim, _dossier); } // removeClaim(): unregister a claim as _point // function removeClaim(uint32 _point, string _protocol, string _claim) external activePointManager(_point) { // i: current index + 1 in _point's list of claims // uint256 i = findClaim(_point, _protocol, _claim); // we store index + 1, because 0 is the eth default value // can only delete an existing claim // require(i > 0); i--; // clear out the claim // delete claims[_point][i]; emit ClaimRemoved(_point, _protocol, _claim); } // clearClaims(): unregister all of _point's claims // // can also be called by the ecliptic during point transfer // function clearClaims(uint32 _point) external { // both point owner and ecliptic may do this // // We do not necessarily need to check for _point's active flag here, // since inactive points cannot have claims set. Doing the check // anyway would make this function slightly harder to think about due // to its relation to Ecliptic's transferPoint(). // require( azimuth.canManage(_point, msg.sender) || ( msg.sender == azimuth.owner() ) ); Claim[maxClaims] storage currClaims = claims[_point]; // clear out all claims // for (uint8 i = 0; i < maxClaims; i++) { // only emit the removed event if there was a claim here // if ( 0 < bytes(currClaims[i].claim).length ) { emit ClaimRemoved(_point, currClaims[i].protocol, currClaims[i].claim); } delete currClaims[i]; } } // findClaim(): find the index of the specified claim // // returns 0 if not found, index + 1 otherwise // function findClaim(uint32 _whose, string _protocol, string _claim) public view returns (uint8 index) { // we use hashes of the string because solidity can't do string // comparison yet // bytes32 protocolHash = keccak256(bytes(_protocol)); bytes32 claimHash = keccak256(bytes(_claim)); Claim[maxClaims] storage theirClaims = claims[_whose]; for (uint8 i = 0; i < maxClaims; i++) { Claim storage thisClaim = theirClaims[i]; if ( ( protocolHash == keccak256(bytes(thisClaim.protocol)) ) && ( claimHash == keccak256(bytes(thisClaim.claim)) ) ) { return i+1; } } return 0; } // findEmptySlot(): find the index of the first empty claim slot // // returns the index of the slot, throws if there are no empty slots // function findEmptySlot(uint32 _whose) internal view returns (uint8 index) { Claim[maxClaims] storage theirClaims = claims[_whose]; for (uint8 i = 0; i < maxClaims; i++) { Claim storage thisClaim = theirClaims[i]; if ( (0 == bytes(thisClaim.claim).length) ) { return i; } } revert(); } } // Azimuth's EclipticBase.sol // EclipticBase: upgradable ecliptic // // This contract implements the upgrade logic for the Ecliptic. // Newer versions of the Ecliptic are expected to provide at least // the onUpgrade() function. If they don't, upgrading to them will // fail. // // Note that even though this contract doesn't specify any required // interface members aside from upgrade() and onUpgrade(), contracts // and clients may still rely on the presence of certain functions // provided by the Ecliptic proper. Keep this in mind when writing // new versions of it. // contract EclipticBase is Ownable, ReadsAzimuth { // Upgraded: _to is the new canonical Ecliptic // event Upgraded(address to); // polls: senate voting contract // Polls public polls; // previousEcliptic: address of the previous ecliptic this // instance expects to upgrade from, stored and // checked for to prevent unexpected upgrade paths // address public previousEcliptic; constructor( address _previous, Azimuth _azimuth, Polls _polls ) ReadsAzimuth(_azimuth) internal { previousEcliptic = _previous; polls = _polls; } // onUpgrade(): called by previous ecliptic when upgrading // // in future ecliptics, this might perform more logic than // just simple checks and verifications. // when overriding this, make sure to call this original as well. // function onUpgrade() external { // make sure this is the expected upgrade path, // and that we have gotten the ownership we require // require( msg.sender == previousEcliptic && this == azimuth.owner() && this == polls.owner() ); } // upgrade(): transfer ownership of the ecliptic data to the new // ecliptic contract, notify it, then self-destruct. // // Note: any eth that have somehow ended up in this contract // are also sent to the new ecliptic. // function upgrade(EclipticBase _new) internal { // transfer ownership of the data contracts // azimuth.transferOwnership(_new); polls.transferOwnership(_new); // trigger upgrade logic on the target contract // _new.onUpgrade(); // emit event and destroy this contract // emit Upgraded(_new); selfdestruct(_new); } } //////////////////////////////////////////////////////////////////////////////// // Ecliptic //////////////////////////////////////////////////////////////////////////////// // Ecliptic: logic for interacting with the Azimuth ledger // // This contract is the point of entry for all operations on the Azimuth // ledger as stored in the Azimuth data contract. The functions herein // are responsible for performing all necessary business logic. // Examples of such logic include verifying permissions of the caller // and ensuring a requested change is actually valid. // Point owners can always operate on their own points. Ethereum addresses // can also perform specific operations if they've been given the // appropriate permissions. (For example, managers for general management, // spawn proxies for spawning child points, etc.) // // This contract uses external contracts (Azimuth, Polls) for data storage // so that it itself can easily be replaced in case its logic needs to // be changed. In other words, it can be upgraded. It does this by passing // ownership of the data contracts to a new Ecliptic contract. // // Because of this, it is advised for clients to not store this contract's // address directly, but rather ask the Azimuth contract for its owner // attribute to ensure transactions get sent to the latest Ecliptic. // Alternatively, the ENS name ecliptic.eth will resolve to the latest // Ecliptic as well. // // Upgrading happens based on polls held by the senate (galaxy owners). // Through this contract, the senate can submit proposals, opening polls // for the senate to cast votes on. These proposals can be either hashes // of documents or addresses of new Ecliptics. // If an ecliptic proposal gains majority, this contract will transfer // ownership of the data storage contracts to that address, so that it may // operate on the data they contain. This contract will selfdestruct at // the end of the upgrade process. // // This contract implements the ERC721 interface for non-fungible tokens, // allowing points to be managed using generic clients that support the // standard. It also implements ERC165 to allow this to be discovered. // contract Ecliptic is EclipticBase, SupportsInterfaceWithLookup, ERC721Metadata { using SafeMath for uint256; using AddressUtils for address; // Transfer: This emits when ownership of any NFT changes by any mechanism. // This event emits when NFTs are created (`from` == 0) and // destroyed (`to` == 0). At the time of any transfer, the // approved address for that NFT (if any) is reset to none. // event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); // Approval: This emits when the approved address for an NFT is changed or // reaffirmed. The zero address indicates there is no approved // address. When a Transfer event emits, this also indicates that // the approved address for that NFT (if any) is reset to none. // event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); // ApprovalForAll: This emits when an operator is enabled or disabled for an // owner. The operator can manage all NFTs of the owner. // event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); // erc721Received: equal to: // bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")) // which can be also obtained as: // ERC721Receiver(0).onERC721Received.selector` bytes4 constant erc721Received = 0x150b7a02; // depositAddress: Special address respresenting L2. Ships sent to // this address are controlled on L2 instead of here. // address constant public depositAddress = 0x1111111111111111111111111111111111111111; // claims: contract reference, for clearing claims on-transfer // Claims public claims; // constructor(): set data contract addresses and signal interface support // // Note: during first deploy, ownership of these data contracts must // be manually transferred to this contract. // constructor(address _previous, Azimuth _azimuth, Polls _polls, Claims _claims) EclipticBase(_previous, _azimuth, _polls) public { claims = _claims; // register supported interfaces for ERC165 // _registerInterface(0x80ac58cd); // ERC721 _registerInterface(0x5b5e139f); // ERC721Metadata _registerInterface(0x7f5828d0); // ERC173 (ownership) } // // ERC721 interface // // balanceOf(): get the amount of points owned by _owner // function balanceOf(address _owner) public view returns (uint256 balance) { require(0x0 != _owner); return azimuth.getOwnedPointCount(_owner); } // ownerOf(): get the current owner of point _tokenId // function ownerOf(uint256 _tokenId) public view validPointId(_tokenId) returns (address owner) { uint32 id = uint32(_tokenId); // this will throw if the owner is the zero address, // active points always have a valid owner. // require(azimuth.isActive(id)); return azimuth.getOwner(id); } // exists(): returns true if point _tokenId is active // function exists(uint256 _tokenId) public view returns (bool doesExist) { return ( (_tokenId < 0x100000000) && azimuth.isActive(uint32(_tokenId)) ); } // safeTransferFrom(): transfer point _tokenId from _from to _to // function safeTransferFrom(address _from, address _to, uint256 _tokenId) public { // transfer with empty data // safeTransferFrom(_from, _to, _tokenId, ""); } // safeTransferFrom(): transfer point _tokenId from _from to _to, // and call recipient if it's a contract // function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) public { // perform raw transfer // transferFrom(_from, _to, _tokenId); // do the callback last to avoid re-entrancy // if (_to.isContract()) { bytes4 retval = ERC721Receiver(_to) .onERC721Received(msg.sender, _from, _tokenId, _data); // // standard return idiom to confirm contract semantics // require(retval == erc721Received); } } // transferFrom(): transfer point _tokenId from _from to _to, // WITHOUT notifying recipient contract // function transferFrom(address _from, address _to, uint256 _tokenId) public validPointId(_tokenId) { uint32 id = uint32(_tokenId); require(azimuth.isOwner(id, _from)); // the ERC721 operator/approved address (if any) is // accounted for in transferPoint() // transferPoint(id, _to, true); } // approve(): allow _approved to transfer ownership of point // _tokenId // function approve(address _approved, uint256 _tokenId) public validPointId(_tokenId) { setTransferProxy(uint32(_tokenId), _approved); } // setApprovalForAll(): allow or disallow _operator to // transfer ownership of ALL points // owned by :msg.sender // function setApprovalForAll(address _operator, bool _approved) public { require(0x0 != _operator); azimuth.setOperator(msg.sender, _operator, _approved); emit ApprovalForAll(msg.sender, _operator, _approved); } // getApproved(): get the approved address for point _tokenId // function getApproved(uint256 _tokenId) public view validPointId(_tokenId) returns (address approved) { //NOTE redundant, transfer proxy cannot be set for // inactive points // require(azimuth.isActive(uint32(_tokenId))); return azimuth.getTransferProxy(uint32(_tokenId)); } // isApprovedForAll(): returns true if _operator is an // operator for _owner // function isApprovedForAll(address _owner, address _operator) public view returns (bool result) { return azimuth.isOperator(_owner, _operator); } // // ERC721Metadata interface // // name(): returns the name of a collection of points // function name() external view returns (string) { return "Azimuth Points"; } // symbol(): returns an abbreviates name for points // function symbol() external view returns (string) { return "AZP"; } // tokenURI(): returns a URL to an ERC-721 standard JSON file // function tokenURI(uint256 _tokenId) public view validPointId(_tokenId) returns (string _tokenURI) { _tokenURI = "https://azimuth.network/erc721/0000000000.json"; bytes memory _tokenURIBytes = bytes(_tokenURI); _tokenURIBytes[31] = byte(48+(_tokenId / 1000000000) % 10); _tokenURIBytes[32] = byte(48+(_tokenId / 100000000) % 10); _tokenURIBytes[33] = byte(48+(_tokenId / 10000000) % 10); _tokenURIBytes[34] = byte(48+(_tokenId / 1000000) % 10); _tokenURIBytes[35] = byte(48+(_tokenId / 100000) % 10); _tokenURIBytes[36] = byte(48+(_tokenId / 10000) % 10); _tokenURIBytes[37] = byte(48+(_tokenId / 1000) % 10); _tokenURIBytes[38] = byte(48+(_tokenId / 100) % 10); _tokenURIBytes[39] = byte(48+(_tokenId / 10) % 10); _tokenURIBytes[40] = byte(48+(_tokenId / 1) % 10); } // // Points interface // // configureKeys(): configure _point with network public keys // _encryptionKey, _authenticationKey, // and corresponding _cryptoSuiteVersion, // incrementing the point's continuity number if needed // function configureKeys(uint32 _point, bytes32 _encryptionKey, bytes32 _authenticationKey, uint32 _cryptoSuiteVersion, bool _discontinuous) external activePointManager(_point) onL1(_point) { if (_discontinuous) { azimuth.incrementContinuityNumber(_point); } azimuth.setKeys(_point, _encryptionKey, _authenticationKey, _cryptoSuiteVersion); } // spawn(): spawn _point, then either give, or allow _target to take, // ownership of _point // // if _target is the :msg.sender, _targets owns the _point right away. // otherwise, _target becomes the transfer proxy of _point. // // Requirements: // - _point must not be active // - _point must not be a planet with a galaxy prefix // - _point's prefix must be linked and under its spawn limit // - :msg.sender must be either the owner of _point's prefix, // or an authorized spawn proxy for it // function spawn(uint32 _point, address _target) external { // only currently unowned (and thus also inactive) points can be spawned // require(azimuth.isOwner(_point, 0x0)); // prefix: half-width prefix of _point // uint16 prefix = azimuth.getPrefix(_point); // can't spawn if we deposited ownership or spawn rights to L2 // require( depositAddress != azimuth.getOwner(prefix) ); require( depositAddress != azimuth.getSpawnProxy(prefix) ); // only allow spawning of points of the size directly below the prefix // // this is possible because of how the address space works, // but supporting it introduces complexity through broken assumptions. // // example: // 0x0000.0000 - galaxy zero // 0x0000.0100 - the first star of galaxy zero // 0x0001.0100 - the first planet of the first star // 0x0001.0000 - the first planet of galaxy zero // require( (uint8(azimuth.getPointSize(prefix)) + 1) == uint8(azimuth.getPointSize(_point)) ); // prefix point must be linked and able to spawn // require( (azimuth.hasBeenLinked(prefix)) && ( azimuth.getSpawnCount(prefix) < getSpawnLimit(prefix, block.timestamp) ) ); // the owner of a prefix can always spawn its children; // other addresses need explicit permission (the role // of "spawnProxy" in the Azimuth contract) // require( azimuth.canSpawnAs(prefix, msg.sender) ); // if the caller is spawning the point to themselves, // assume it knows what it's doing and resolve right away // if (msg.sender == _target) { doSpawn(_point, _target, true, 0x0); } // // when sending to a "foreign" address, enforce a withdraw pattern // making the _point prefix's owner the _point owner in the mean time // else { doSpawn(_point, _target, false, azimuth.getOwner(prefix)); } } // doSpawn(): actual spawning logic, used in spawn(). creates _point, // making the _target its owner if _direct, or making the // _holder the owner and the _target the transfer proxy // if not _direct. // function doSpawn( uint32 _point, address _target, bool _direct, address _holder ) internal { // register the spawn for _point's prefix, incrementing spawn count // azimuth.registerSpawned(_point); // if the spawn is _direct, assume _target knows what they're doing // and resolve right away // if (_direct) { // make the point active and set its new owner // azimuth.activatePoint(_point); azimuth.setOwner(_point, _target); emit Transfer(0x0, _target, uint256(_point)); } // // when spawning indirectly, enforce a withdraw pattern by approving // the _target for transfer of the _point instead. // we make the _holder the owner of this _point in the mean time, // so that it may cancel the transfer (un-approve) if _target flakes. // we don't make _point active yet, because it still doesn't really // belong to anyone. // else { // have _holder hold on to the _point while _target gets to transfer // ownership of it // azimuth.setOwner(_point, _holder); azimuth.setTransferProxy(_point, _target); emit Transfer(0x0, _holder, uint256(_point)); emit Approval(_holder, _target, uint256(_point)); } } // transferPoint(): transfer _point to _target, clearing all permissions // data and keys if _reset is true // // Note: the _reset flag is useful when transferring the point to // a recipient who doesn't trust the previous owner. // // We know _point is not on L2, since otherwise its owner would be // depositAddress (which has no operator) and its transfer proxy // would be zero. // // Requirements: // - :msg.sender must be either _point's current owner, authorized // to transfer _point, or authorized to transfer the current // owner's points (as in ERC721's operator) // - _target must not be the zero address // function transferPoint(uint32 _point, address _target, bool _reset) public { // transfer is legitimate if the caller is the current owner, or // an operator for the current owner, or the _point's transfer proxy // require(azimuth.canTransfer(_point, msg.sender)); // can't deposit galaxy to L2 // can't deposit contract-owned point to L2 // require( depositAddress != _target || ( azimuth.getPointSize(_point) != Azimuth.Size.Galaxy && !azimuth.getOwner(_point).isContract() ) ); // if the point wasn't active yet, that means transferring it // is part of the "spawn" flow, so we need to activate it // if ( !azimuth.isActive(_point) ) { azimuth.activatePoint(_point); } // if the owner would actually change, change it // // the only time this deliberately wouldn't be the case is when a // prefix owner wants to activate a spawned but untransferred child. // if ( !azimuth.isOwner(_point, _target) ) { // remember the previous owner, to be included in the Transfer event // address old = azimuth.getOwner(_point); azimuth.setOwner(_point, _target); // according to ERC721, the approved address (here, transfer proxy) // gets cleared during every Transfer event // // we also rely on this so that transfer-related functions don't need // to verify the point is on L1 // azimuth.setTransferProxy(_point, 0); emit Transfer(old, _target, uint256(_point)); } // if we're depositing to L2, clear L1 data so that no proxies // can be used // if ( depositAddress == _target ) { azimuth.setKeys(_point, 0, 0, 0); azimuth.setManagementProxy(_point, 0); azimuth.setVotingProxy(_point, 0); azimuth.setTransferProxy(_point, 0); azimuth.setSpawnProxy(_point, 0); claims.clearClaims(_point); azimuth.cancelEscape(_point); } // reset sensitive data // used when transferring the point to a new owner // else if ( _reset ) { // clear the network public keys and break continuity, // but only if the point has already been linked // if ( azimuth.hasBeenLinked(_point) ) { azimuth.incrementContinuityNumber(_point); azimuth.setKeys(_point, 0, 0, 0); } // clear management proxy // azimuth.setManagementProxy(_point, 0); // clear voting proxy // azimuth.setVotingProxy(_point, 0); // clear transfer proxy // // in most cases this is done above, during the ownership transfer, // but we might not hit that and still be expected to reset the // transfer proxy. // doing it a second time is a no-op in Azimuth. // azimuth.setTransferProxy(_point, 0); // clear spawning proxy // // don't clear if the spawn rights have been deposited to L2, // if ( depositAddress != azimuth.getSpawnProxy(_point) ) { azimuth.setSpawnProxy(_point, 0); } // clear claims // claims.clearClaims(_point); } } // escape(): request escape as _point to _sponsor // // if an escape request is already active, this overwrites // the existing request // // Requirements: // - :msg.sender must be the owner or manager of _point, // - _point must be able to escape to _sponsor as per to canEscapeTo() // function escape(uint32 _point, uint32 _sponsor) external activePointManager(_point) onL1(_point) { // if the sponsor is on L2, we need to escape using L2 // require( depositAddress != azimuth.getOwner(_sponsor) ); require(canEscapeTo(_point, _sponsor)); azimuth.setEscapeRequest(_point, _sponsor); } // cancelEscape(): cancel the currently set escape for _point // function cancelEscape(uint32 _point) external activePointManager(_point) { azimuth.cancelEscape(_point); } // adopt(): as the relevant sponsor, accept the _point // // Requirements: // - :msg.sender must be the owner or management proxy // of _point's requested sponsor // function adopt(uint32 _point) external onL1(_point) { uint32 request = azimuth.getEscapeRequest(_point); require( azimuth.isEscaping(_point) && azimuth.canManage( request, msg.sender ) ); require( depositAddress != azimuth.getOwner(request) ); // _sponsor becomes _point's sponsor // its escape request is reset to "not escaping" // azimuth.doEscape(_point); } // reject(): as the relevant sponsor, deny the _point's request // // Requirements: // - :msg.sender must be the owner or management proxy // of _point's requested sponsor // function reject(uint32 _point) external { uint32 request = azimuth.getEscapeRequest(_point); require( azimuth.isEscaping(_point) && azimuth.canManage( request, msg.sender ) ); require( depositAddress != azimuth.getOwner(request) ); // reset the _point's escape request to "not escaping" // azimuth.cancelEscape(_point); } // detach(): as the _sponsor, stop sponsoring the _point // // Requirements: // - :msg.sender must be the owner or management proxy // of _point's current sponsor // // We allow detachment even of points that are on L2. This is // so that a star controlled by a contract can detach from a // planet which was on L1 originally but now is on L2. L2 will // ignore this if this is not the actual sponsor anymore (i.e. if // they later changed their sponsor on L2). // function detach(uint32 _point) external { uint32 sponsor = azimuth.getSponsor(_point); require( azimuth.hasSponsor(_point) && azimuth.canManage(sponsor, msg.sender) ); require( depositAddress != azimuth.getOwner(sponsor) ); // signal that its sponsor no longer supports _point // azimuth.loseSponsor(_point); } // // Point rules // // getSpawnLimit(): returns the total number of children the _point // is allowed to spawn at _time. // function getSpawnLimit(uint32 _point, uint256 _time) public view returns (uint32 limit) { Azimuth.Size size = azimuth.getPointSize(_point); if ( size == Azimuth.Size.Galaxy ) { return 255; } else if ( size == Azimuth.Size.Star ) { // in 2019, stars may spawn at most 1024 planets. this limit doubles // for every subsequent year. // // Note: 1546300800 corresponds to 2019-01-01 // uint256 yearsSince2019 = (_time - 1546300800) / 365 days; if (yearsSince2019 < 6) { limit = uint32( 1024 * (2 ** yearsSince2019) ); } else { limit = 65535; } return limit; } else // size == Azimuth.Size.Planet { // planets can create moons, but moons aren't on the chain // return 0; } } // canEscapeTo(): true if _point could try to escape to _sponsor // function canEscapeTo(uint32 _point, uint32 _sponsor) public view returns (bool canEscape) { // can't escape to a sponsor that hasn't been linked // if ( !azimuth.hasBeenLinked(_sponsor) ) return false; // Can only escape to a point one size higher than ourselves, // except in the special case where the escaping point hasn't // been linked yet -- in that case we may escape to points of // the same size, to support lightweight invitation chains. // // The use case for lightweight invitations is that a planet // owner should be able to invite their friends onto an // Azimuth network in a two-party transaction, without a new // star relationship. // The lightweight invitation process works by escaping your // own active (but never linked) point to one of your own // points, then transferring the point to your friend. // // These planets can, in turn, sponsor other unlinked planets, // so the "planet sponsorship chain" can grow to arbitrary // length. Most users, especially deep down the chain, will // want to improve their performance by switching to direct // star sponsors eventually. // Azimuth.Size pointSize = azimuth.getPointSize(_point); Azimuth.Size sponsorSize = azimuth.getPointSize(_sponsor); return ( // normal hierarchical escape structure // ( (uint8(sponsorSize) + 1) == uint8(pointSize) ) || // // special peer escape // ( (sponsorSize == pointSize) && // // peer escape is only for points that haven't been linked // yet, because it's only for lightweight invitation chains // !azimuth.hasBeenLinked(_point) ) ); } // // Permission management // // setManagementProxy(): configure the management proxy for _point // // The management proxy may perform "reversible" operations on // behalf of the owner. This includes public key configuration and // operations relating to sponsorship. // function setManagementProxy(uint32 _point, address _manager) external activePointManager(_point) onL1(_point) { azimuth.setManagementProxy(_point, _manager); } // setSpawnProxy(): give _spawnProxy the right to spawn points // with the prefix _prefix // // takes a uint16 so that we can't set spawn proxy for a planet // // fails if spawn rights have been deposited to L2 // function setSpawnProxy(uint16 _prefix, address _spawnProxy) external activePointSpawner(_prefix) onL1(_prefix) { require( depositAddress != azimuth.getSpawnProxy(_prefix) ); azimuth.setSpawnProxy(_prefix, _spawnProxy); } // setVotingProxy(): configure the voting proxy for _galaxy // // the voting proxy is allowed to start polls and cast votes // on the point's behalf. // function setVotingProxy(uint8 _galaxy, address _voter) external activePointVoter(_galaxy) { azimuth.setVotingProxy(_galaxy, _voter); } // setTransferProxy(): give _transferProxy the right to transfer _point // // Requirements: // - :msg.sender must be either _point's current owner, // or be an operator for the current owner // function setTransferProxy(uint32 _point, address _transferProxy) public onL1(_point) { // owner: owner of _point // address owner = azimuth.getOwner(_point); // caller must be :owner, or an operator designated by the owner. // require((owner == msg.sender) || azimuth.isOperator(owner, msg.sender)); // set transfer proxy field in Azimuth contract // azimuth.setTransferProxy(_point, _transferProxy); // emit Approval event // emit Approval(owner, _transferProxy, uint256(_point)); } // // Poll actions // // startUpgradePoll(): as _galaxy, start a poll for the ecliptic // upgrade _proposal // // Requirements: // - :msg.sender must be the owner or voting proxy of _galaxy, // - the _proposal must expect to be upgraded from this specific // contract, as indicated by its previousEcliptic attribute // function startUpgradePoll(uint8 _galaxy, EclipticBase _proposal) external activePointVoter(_galaxy) { // ensure that the upgrade target expects this contract as the source // require(_proposal.previousEcliptic() == address(this)); polls.startUpgradePoll(_proposal); } // startDocumentPoll(): as _galaxy, start a poll for the _proposal // // the _proposal argument is the keccak-256 hash of any arbitrary // document or string of text // function startDocumentPoll(uint8 _galaxy, bytes32 _proposal) external activePointVoter(_galaxy) { polls.startDocumentPoll(_proposal); } // castUpgradeVote(): as _galaxy, cast a _vote on the ecliptic // upgrade _proposal // // _vote is true when in favor of the proposal, false otherwise // // If this vote results in a majority for the _proposal, it will // be upgraded to immediately. // function castUpgradeVote(uint8 _galaxy, EclipticBase _proposal, bool _vote) external activePointVoter(_galaxy) { // majority: true if the vote resulted in a majority, false otherwise // bool majority = polls.castUpgradeVote(_galaxy, _proposal, _vote); // if a majority is in favor of the upgrade, it happens as defined // in the ecliptic base contract // if (majority) { upgrade(_proposal); } } // castDocumentVote(): as _galaxy, cast a _vote on the _proposal // // _vote is true when in favor of the proposal, false otherwise // function castDocumentVote(uint8 _galaxy, bytes32 _proposal, bool _vote) external activePointVoter(_galaxy) { polls.castDocumentVote(_galaxy, _proposal, _vote); } // updateUpgradePoll(): check whether the _proposal has achieved // majority, upgrading to it if it has // function updateUpgradePoll(EclipticBase _proposal) external { // majority: true if the poll ended in a majority, false otherwise // bool majority = polls.updateUpgradePoll(_proposal); // if a majority is in favor of the upgrade, it happens as defined // in the ecliptic base contract // if (majority) { upgrade(_proposal); } } // updateDocumentPoll(): check whether the _proposal has achieved majority // // Note: the polls contract publicly exposes the function this calls, // but we offer it in the ecliptic interface as a convenience // function updateDocumentPoll(bytes32 _proposal) external { polls.updateDocumentPoll(_proposal); } // // Contract owner operations // // createGalaxy(): grant _target ownership of the _galaxy and register // it for voting // function createGalaxy(uint8 _galaxy, address _target) external onlyOwner { // only currently unowned (and thus also inactive) galaxies can be // created, and only to non-zero addresses // require( azimuth.isOwner(_galaxy, 0x0) && 0x0 != _target ); // new galaxy means a new registered voter // polls.incrementTotalVoters(); // if the caller is sending the galaxy to themselves, // assume it knows what it's doing and resolve right away // if (msg.sender == _target) { doSpawn(_galaxy, _target, true, 0x0); } // // when sending to a "foreign" address, enforce a withdraw pattern, // making the caller the owner in the mean time // else { doSpawn(_galaxy, _target, false, msg.sender); } } function setDnsDomains(string _primary, string _secondary, string _tertiary) external onlyOwner { azimuth.setDnsDomains(_primary, _secondary, _tertiary); } // // Function modifiers for this contract // // validPointId(): require that _id is a valid point // modifier validPointId(uint256 _id) { require(_id < 0x100000000); _; } // onL1(): require that ship is not deposited modifier onL1(uint32 _point) { require( depositAddress != azimuth.getOwner(_point) ); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_galaxy","type":"uint8"},{"name":"_proposal","type":"bytes32"}],"name":"startDocumentPoll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"detach","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"approved","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_proposal","type":"bytes32"}],"name":"updateDocumentPoll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"onUpgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"InterfaceId_ERC165","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_target","type":"address"},{"name":"_reset","type":"bool"}],"name":"transferPoint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_galaxy","type":"uint8"},{"name":"_target","type":"address"}],"name":"createGalaxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"depositAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_transferProxy","type":"address"}],"name":"setTransferProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_encryptionKey","type":"bytes32"},{"name":"_authenticationKey","type":"bytes32"},{"name":"_cryptoSuiteVersion","type":"uint32"},{"name":"_discontinuous","type":"bool"}],"name":"configureKeys","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_sponsor","type":"uint32"}],"name":"canEscapeTo","outputs":[{"name":"canEscape","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"doesExist","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_galaxy","type":"uint8"},{"name":"_proposal","type":"address"},{"name":"_vote","type":"bool"}],"name":"castUpgradeVote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_proposal","type":"address"}],"name":"updateUpgradePoll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_galaxy","type":"uint8"},{"name":"_proposal","type":"bytes32"},{"name":"_vote","type":"bool"}],"name":"castDocumentVote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_manager","type":"address"}],"name":"setManagementProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_galaxy","type":"uint8"},{"name":"_proposal","type":"address"}],"name":"startUpgradePoll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_target","type":"address"}],"name":"spawn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_galaxy","type":"uint8"},{"name":"_voter","type":"address"}],"name":"setVotingProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_prefix","type":"uint16"},{"name":"_spawnProxy","type":"address"}],"name":"setSpawnProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":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":"reject","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"},{"name":"_sponsor","type":"uint32"}],"name":"escape","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"adopt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_point","type":"uint32"}],"name":"cancelEscape","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"_tokenURI","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"azimuth","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"claims","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"polls","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"previousEcliptic","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_point","type":"uint32"},{"name":"_time","type":"uint256"}],"name":"getSpawnLimit","outputs":[{"name":"limit","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_previous","type":"address"},{"name":"_azimuth","type":"address"},{"name":"_polls","type":"address"},{"name":"_claims","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"to","type":"address"}],"name":"Upgraded","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"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405160808062005a2a83398101604090815281516020830151918301516060909301516000805433600160a060020a031991821617909155600180548216600160a060020a038087169190911790915560038054831682861617905560028054909216908616179055909290620000b37f01ffc9a70000000000000000000000000000000000000000000000000000000064010000000062000174810204565b60058054600160a060020a031916600160a060020a038316179055620001027f80ac58cd0000000000000000000000000000000000000000000000000000000064010000000062000174810204565b620001367f5b5e139f0000000000000000000000000000000000000000000000000000000064010000000062000174810204565b6200016a7f7f5828d00000000000000000000000000000000000000000000000000000000064010000000062000174810204565b50505050620001e1565b7fffffffff000000000000000000000000000000000000000000000000000000008082161415620001a457600080fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152600460205260409020805460ff19166001179055565b61583980620001f16000396000f3006080604052600436106102165763ffffffff60e060020a60003504166301ffc9a7811461021b57806305bbf5db1461025157806306fdde0314610271578063073a7804146102fb578063081812fc14610319578063095ea7b31461034d578063172a735c146103715780631824a46b1461038957806319fa8f501461039e5780631e79a85b146103d057806323b872dd146103ff57806326295b521461042957806328f833b7146104505780632c7ba5641461046557806342842e0e1461048f5780634447e48c146104b95780634a013296146104ea5780634f558e791461050e57806351de5541146105265780635623715b146105525780636352211e146105735780636eb582241461058b57806370a08231146105ae578063715018a6146105e15780638866bb2c146105f65780638da5cb5b1461062057806395d89b41146106355780639e988d131461064a578063a0d3253f14610671578063a22cb4651461069b578063a60e8bd6146106c1578063ae326221146106e8578063b88d4fde14610710578063bac55edd1461077f578063bbe21ca5146107b7578063bf5772b9146107d5578063c1b9d98b146107f9578063c6d761d414610817578063c87b56dd14610835578063d40ffacb1461084d578063dcc59b6f14610862578063e64853c414610877578063e985e9c51461088c578063ed969f68146108b3578063ef20bff8146108c8578063f2fde38b14610902575b600080fd5b34801561022757600080fd5b5061023d600160e060020a031960043516610923565b604080519115158252519081900360200190f35b34801561025d57600080fd5b5061026f60ff60043516602435610942565b005b34801561027d57600080fd5b50610286610ae1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102c05781810151838201526020016102a8565b50505050905090810190601f1680156102ed5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030757600080fd5b5061026f63ffffffff60043516610b18565b34801561032557600080fd5b50610331600435610e11565b60408051600160a060020a039092168252519081900360200190f35b34801561035957600080fd5b5061026f600160a060020a0360043516602435610f51565b34801561037d57600080fd5b5061026f600435610f72565b34801561039557600080fd5b5061026f611003565b3480156103aa57600080fd5b506103b3611142565b60408051600160e060020a03199092168252519081900360200190f35b3480156103dc57600080fd5b5061026f63ffffffff60043516600160a060020a03602435166044351515611166565b34801561040b57600080fd5b5061026f600160a060020a0360043581169060243516604435611f7d565b34801561043557600080fd5b5061026f60ff60043516600160a060020a036024351661203c565b34801561045c57600080fd5b506103316121a1565b34801561047157600080fd5b5061026f63ffffffff60043516600160a060020a03602435166121b3565b34801561049b57600080fd5b5061026f600160a060020a036004358116906024351660443561245a565b3480156104c557600080fd5b5061026f63ffffffff6004358116906024359060443590606435166084351515612476565b3480156104f657600080fd5b5061023d63ffffffff60043581169060243516612762565b34801561051a57600080fd5b5061023d6004356129d9565b34801561053257600080fd5b5061026f60ff60043516600160a060020a03602435166044351515612a73565b34801561055e57600080fd5b5061026f600160a060020a0360043516612c44565b34801561057f57600080fd5b50610331600435612cec565b34801561059757600080fd5b5061026f60ff600435166024356044351515612e1b565b3480156105ba57600080fd5b506105cf600160a060020a0360043516612fd9565b60408051918252519081900360200190f35b3480156105ed57600080fd5b5061026f613058565b34801561060257600080fd5b5061026f63ffffffff60043516600160a060020a03602435166130c4565b34801561062c57600080fd5b506103316132f7565b34801561064157600080fd5b50610286613306565b34801561065657600080fd5b5061026f60ff60043516600160a060020a036024351661333d565b34801561067d57600080fd5b5061026f63ffffffff60043516600160a060020a0360243516613547565b3480156106a757600080fd5b5061026f600160a060020a03600435166024351515613ba3565b3480156106cd57600080fd5b5061026f60ff60043516600160a060020a0360243516613c8b565b3480156106f457600080fd5b5061026f61ffff60043516600160a060020a0360243516613e17565b34801561071c57600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261026f94600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506141199650505050505050565b34801561078b57600080fd5b5061026f6024600480358281019290820135918135808301929082013591604435918201910135614283565b3480156107c357600080fd5b5061026f63ffffffff6004351661437c565b3480156107e157600080fd5b5061026f63ffffffff60043581169060243516614659565b34801561080557600080fd5b5061026f63ffffffff60043516614946565b34801561082357600080fd5b5061026f63ffffffff60043516614ccd565b34801561084157600080fd5b50610286600435614de9565b34801561085957600080fd5b5061033161509c565b34801561086e57600080fd5b506103316150ab565b34801561088357600080fd5b506103316150ba565b34801561089857600080fd5b5061023d600160a060020a03600435811690602435166150c9565b3480156108bf57600080fd5b5061033161513c565b3480156108d457600080fd5b506108e963ffffffff6004351660243561514b565b6040805163ffffffff9092168252519081900360200190f35b34801561090e57600080fd5b5061026f600160a060020a0360043516615241565b600160e060020a03191660009081526004602052604090205460ff1690565b6001546040805160e060020a63b65afedd02815260ff85166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b15801561099d57600080fd5b505af11580156109b1573d6000803e3d6000fd5b505050506040513d60208110156109c757600080fd5b50518015610a5357506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015610a2657600080fd5b505af1158015610a3a573d6000803e3d6000fd5b505050506040513d6020811015610a5057600080fd5b50515b1515610a5e57600080fd5b600254604080517f9a33aff9000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a0390921691639a33aff99160248082019260009290919082900301818387803b158015610ac457600080fd5b505af1158015610ad8573d6000803e3d6000fd5b50505050505050565b60408051808201909152600e81527f417a696d75746820506f696e7473000000000000000000000000000000000000602082015290565b600154604080517f439f7d3c00000000000000000000000000000000000000000000000000000000815263ffffffff841660048201529051600092600160a060020a03169163439f7d3c91602480830192602092919082900301818787803b158015610b8357600080fd5b505af1158015610b97573d6000803e3d6000fd5b505050506040513d6020811015610bad57600080fd5b5051600154604080517f77eb4c5000000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051929350600160a060020a03909116916377eb4c50916024808201926020929091908290030181600087803b158015610c1e57600080fd5b505af1158015610c32573d6000803e3d6000fd5b505050506040513d6020811015610c4857600080fd5b50518015610cda57506001546040805160e160020a63489bff0502815263ffffffff841660048201523360248201529051600160a060020a0390921691639137fe0a916044808201926020929091908290030181600087803b158015610cad57600080fd5b505af1158015610cc1573d6000803e3d6000fd5b505050506040513d6020811015610cd757600080fd5b50515b1515610ce557600080fd5b6001546040805160e160020a63310d91f102815263ffffffff841660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015610d3b57600080fd5b505af1158015610d4f573d6000803e3d6000fd5b505050506040513d6020811015610d6557600080fd5b5051600160a060020a03166000805160206157ee8339815191521415610d8a57600080fd5b600154604080517fbc562b9e00000000000000000000000000000000000000000000000000000000815263ffffffff851660048201529051600160a060020a039092169163bc562b9e9160248082019260009290919082900301818387803b158015610df557600080fd5b505af1158015610e09573d6000803e3d6000fd5b505050505050565b6000816401000000008110610e2557600080fd5b6001546040805160e060020a635e19b30502815263ffffffff861660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015610e7b57600080fd5b505af1158015610e8f573d6000803e3d6000fd5b505050506040513d6020811015610ea557600080fd5b50511515610eb257600080fd5b600154604080517f24541f7800000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a03909216916324541f78916024808201926020929091908290030181600087803b158015610f1e57600080fd5b505af1158015610f32573d6000803e3d6000fd5b505050506040513d6020811015610f4857600080fd5b50519392505050565b806401000000008110610f6357600080fd5b610f6d82846121b3565b505050565b600254604080517f172a735c000000000000000000000000000000000000000000000000000000008152600481018490529051600160a060020a039092169163172a735c916024808201926020929091908290030181600087803b158015610fd957600080fd5b505af1158015610fed573d6000803e3d6000fd5b505050506040513d6020811015610f6d57600080fd5b600354600160a060020a0316331480156110a35750600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b505050506040513d602081101561109557600080fd5b5051600160a060020a031630145b80156111355750600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110fd57600080fd5b505af1158015611111573d6000803e3d6000fd5b505050506040513d602081101561112757600080fd5b5051600160a060020a031630145b151561114057600080fd5b565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b600154604080517f728aa85700000000000000000000000000000000000000000000000000000000815263ffffffff861660048201523360248201529051600092600160a060020a03169163728aa85791604480830192602092919082900301818787803b1580156111d757600080fd5b505af11580156111eb573d6000803e3d6000fd5b505050506040513d602081101561120157600080fd5b5051151561120e57600080fd5b6000805160206157ee833981519152600160a060020a03841614158061135757506001546040805160e060020a639397640502815263ffffffff871660048201529051600092600160a060020a031691639397640591602480830192602092919082900301818787803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050506040513d60208110156112ae57600080fd5b505160028111156112bb57fe5b1415801561135757506001546040805160e160020a63310d91f102815263ffffffff87166004820152905161135592600160a060020a03169163621b23e29160248083019260209291908290030181600087803b15801561131b57600080fd5b505af115801561132f573d6000803e3d6000fd5b505050506040513d602081101561134557600080fd5b5051600160a060020a0316615264565b155b151561136257600080fd5b6001546040805160e060020a635e19b30502815263ffffffff871660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b1580156113b857600080fd5b505af11580156113cc573d6000803e3d6000fd5b505050506040513d60208110156113e257600080fd5b5051151561146e57600154604080517f7bc702a100000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a0390921691637bc702a19160248082019260009290919082900301818387803b15801561145557600080fd5b505af1158015611469573d6000803e3d6000fd5b505050505b6001546040805160e060020a63caf590f902815263ffffffff87166004820152600160a060020a0386811660248301529151919092169163caf590f99160448083019260209291908290030181600087803b1580156114cc57600080fd5b505af11580156114e0573d6000803e3d6000fd5b505050506040513d60208110156114f657600080fd5b505115156116c6576001546040805160e160020a63310d91f102815263ffffffff871660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b15801561155457600080fd5b505af1158015611568573d6000803e3d6000fd5b505050506040513d602081101561157e57600080fd5b5051600154604080517fddc3595000000000000000000000000000000000000000000000000000000000815263ffffffff88166004820152600160a060020a038781166024830152915193945091169163ddc359509160448082019260009290919082900301818387803b1580156115f557600080fd5b505af1158015611609573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632c7ba56493506044808201939182900301818387803b15801561166657600080fd5b505af115801561167a573d6000803e3d6000fd5b505050508363ffffffff1683600160a060020a031682600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b6000805160206157ee833981519152600160a060020a0384161415611a8d57600154604080517ff9b87d4000000000000000000000000000000000000000000000000000000000815263ffffffff8716600482015260006024820181905260448201819052606482018190529151600160a060020a039093169263f9b87d409260848084019391929182900301818387803b15801561176457600080fd5b505af1158015611778573d6000803e3d6000fd5b5050600154604080517f8866bb2c00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a039093169450638866bb2c93506044808201939182900301818387803b1580156117eb57600080fd5b505af11580156117ff573d6000803e3d6000fd5b5050600154604080517fa297c1d800000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a03909316945063a297c1d893506044808201939182900301818387803b15801561187257600080fd5b505af1158015611886573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632c7ba56493506044808201939182900301818387803b1580156118e357600080fd5b505af11580156118f7573d6000803e3d6000fd5b5050600154604080517f2a19642c00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632a19642c93506044808201939182900301818387803b15801561196a57600080fd5b505af115801561197e573d6000803e3d6000fd5b5050600554604080517feaae46e500000000000000000000000000000000000000000000000000000000815263ffffffff891660048201529051600160a060020a03909216935063eaae46e5925060248082019260009290919082900301818387803b1580156119ed57600080fd5b505af1158015611a01573d6000803e3d6000fd5b5050600154604080517fc6d761d400000000000000000000000000000000000000000000000000000000815263ffffffff891660048201529051600160a060020a03909216935063c6d761d4925060248082019260009290919082900301818387803b158015611a7057600080fd5b505af1158015611a84573d6000803e3d6000fd5b50505050611f77565b8115611f77576001546040805160e060020a636d09887b02815263ffffffff871660048201529051600160a060020a0390921691636d09887b916024808201926020929091908290030181600087803b158015611ae957600080fd5b505af1158015611afd573d6000803e3d6000fd5b505050506040513d6020811015611b1357600080fd5b505115611c3357600154604080517ff491491900000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a039092169163f49149199160248082019260009290919082900301818387803b158015611b8557600080fd5b505af1158015611b99573d6000803e3d6000fd5b5050600154604080517ff9b87d4000000000000000000000000000000000000000000000000000000000815263ffffffff8916600482015260006024820181905260448201819052606482018190529151600160a060020a03909316945063f9b87d4093506084808201939182900301818387803b158015611c1a57600080fd5b505af1158015611c2e573d6000803e3d6000fd5b505050505b600154604080517f8866bb2c00000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526000602482018190529151600160a060020a0390931692638866bb2c9260448084019391929182900301818387803b158015611ca457600080fd5b505af1158015611cb8573d6000803e3d6000fd5b5050600154604080517fa297c1d800000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a03909316945063a297c1d893506044808201939182900301818387803b158015611d2b57600080fd5b505af1158015611d3f573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632c7ba56493506044808201939182900301818387803b158015611d9c57600080fd5b505af1158015611db0573d6000803e3d6000fd5b5050600154604080517ff4e3be2d00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201529051600160a060020a03909216935063f4e3be2d92506024808201926020929091908290030181600087803b158015611e2057600080fd5b505af1158015611e34573d6000803e3d6000fd5b505050506040513d6020811015611e4a57600080fd5b5051600160a060020a03166000805160206157ee83398151915214611ef357600154604080517f2a19642c00000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526000602482018190529151600160a060020a0390931692632a19642c9260448084019391929182900301818387803b158015611eda57600080fd5b505af1158015611eee573d6000803e3d6000fd5b505050505b600554604080517feaae46e500000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a039092169163eaae46e59160248082019260009290919082900301818387803b158015611f5e57600080fd5b505af1158015611f72573d6000803e3d6000fd5b505050505b50505050565b6000816401000000008110611f9157600080fd5b6001546040805160e060020a63caf590f902815263ffffffff86166004820152600160a060020a0388811660248301529151869550919092169163caf590f99160448083019260209291908290030181600087803b158015611ff257600080fd5b505af1158015612006573d6000803e3d6000fd5b505050506040513d602081101561201c57600080fd5b5051151561202957600080fd5b61203582856001611166565b5050505050565b600054600160a060020a0316331461205357600080fd5b6001546040805160e060020a63caf590f902815260ff851660048201526000602482018190529151600160a060020a039093169263caf590f992604480840193602093929083900390910190829087803b1580156120b057600080fd5b505af11580156120c4573d6000803e3d6000fd5b505050506040513d60208110156120da57600080fd5b505180156120f05750600160a060020a03811615155b15156120fb57600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a031663246d41a96040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561214e57600080fd5b505af1158015612162573d6000803e3d6000fd5b50505050600160a060020a03811633141561218d576121888260ff16826001600061526c565b61219d565b61219d8260ff168260003361526c565b5050565b6000805160206157ee83398151915281565b6001546040805160e160020a63310d91f102815263ffffffff8516600482015290516000928592600160a060020a039091169163621b23e29160248082019260209290919082900301818887803b15801561220d57600080fd5b505af1158015612221573d6000803e3d6000fd5b505050506040513d602081101561223757600080fd5b5051600160a060020a03166000805160206157ee833981519152141561225c57600080fd5b6001546040805160e160020a63310d91f102815263ffffffff871660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b1580156122b257600080fd5b505af11580156122c6573d6000803e3d6000fd5b505050506040513d60208110156122dc57600080fd5b50519150600160a060020a03821633148061238d5750600154604080517fb6363cf2000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301523360248301529151919092169163b6363cf29160448083019260209291908290030181600087803b15801561236057600080fd5b505af1158015612374573d6000803e3d6000fd5b505050506040513d602081101561238a57600080fd5b50515b151561239857600080fd5b6001546040805160e260020a630b1ee95902815263ffffffff87166004820152600160a060020a03868116602483015291519190921691632c7ba56491604480830192600092919082900301818387803b1580156123f557600080fd5b505af1158015612409573d6000803e3d6000fd5b505050508363ffffffff1683600160a060020a031683600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b610f6d8383836020604051908101604052806000815250614119565b6001546040805160e160020a63489bff0502815263ffffffff8816600482015233602482015290518792600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b1580156124d157600080fd5b505af11580156124e5573d6000803e3d6000fd5b505050506040513d60208110156124fb57600080fd5b5051801561258757506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561255a57600080fd5b505af115801561256e573d6000803e3d6000fd5b505050506040513d602081101561258457600080fd5b50515b151561259257600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8916600482015290518892600160a060020a03169163621b23e29160248083019260209291908290030181600087803b1580156125e757600080fd5b505af11580156125fb573d6000803e3d6000fd5b505050506040513d602081101561261157600080fd5b5051600160a060020a03166000805160206157ee833981519152141561263657600080fd5b82156126c057600154604080517ff491491900000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201529051600160a060020a039092169163f49149199160248082019260009290919082900301818387803b1580156126a757600080fd5b505af11580156126bb573d6000803e3d6000fd5b505050505b600154604080517ff9b87d4000000000000000000000000000000000000000000000000000000000815263ffffffff808b166004830152602482018a905260448201899052871660648201529051600160a060020a039092169163f9b87d409160848082019260009290919082900301818387803b15801561274157600080fd5b505af1158015612755573d6000803e3d6000fd5b5050505050505050505050565b6001546040805160e060020a636d09887b02815263ffffffff84166004820152905160009283928392600160a060020a0390921691636d09887b9160248082019260209290919082900301818787803b1580156127be57600080fd5b505af11580156127d2573d6000803e3d6000fd5b505050506040513d60208110156127e857600080fd5b505115156127f957600092506129d1565b6001546040805160e060020a639397640502815263ffffffff881660048201529051600160a060020a03909216916393976405916024808201926020929091908290030181600087803b15801561284f57600080fd5b505af1158015612863573d6000803e3d6000fd5b505050506040513d602081101561287957600080fd5b50516001546040805160e060020a639397640502815263ffffffff881660048201529051929450600160a060020a03909116916393976405916024808201926020929091908290030181600087803b1580156128d457600080fd5b505af11580156128e8573d6000803e3d6000fd5b505050506040513d60208110156128fe57600080fd5b5051905081600281111561290e57fe5b60ff1681600281111561291d57fe5b60010160ff1614806129ce575081600281111561293657fe5b81600281111561294257fe5b1480156129ce57506001546040805160e060020a636d09887b02815263ffffffff881660048201529051600160a060020a0390921691636d09887b916024808201926020929091908290030181600087803b1580156129a057600080fd5b505af11580156129b4573d6000803e3d6000fd5b505050506040513d60208110156129ca57600080fd5b5051155b92505b505092915050565b600064010000000082108015612a6d57506001546040805160e060020a635e19b30502815263ffffffff851660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612a4057600080fd5b505af1158015612a54573d6000803e3d6000fd5b505050506040513d6020811015612a6a57600080fd5b50515b92915050565b6001546040805160e060020a63b65afedd02815260ff8616600482018190523360248301529151600093600160a060020a03169163b65afedd91604480830192602092919082900301818887803b158015612acd57600080fd5b505af1158015612ae1573d6000803e3d6000fd5b505050506040513d6020811015612af757600080fd5b50518015612b8357506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612b5657600080fd5b505af1158015612b6a573d6000803e3d6000fd5b505050506040513d6020811015612b8057600080fd5b50515b1515612b8e57600080fd5b600254604080517f51de554100000000000000000000000000000000000000000000000000000000815260ff88166004820152600160a060020a0387811660248301528615156044830152915191909216916351de55419160648083019260209291908290030181600087803b158015612c0757600080fd5b505af1158015612c1b573d6000803e3d6000fd5b505050506040513d6020811015612c3157600080fd5b50519150811561203557612035846155d3565b600254604080517f5623715b000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000939290921691635623715b9160248082019260209290919082900301818787803b158015612caf57600080fd5b505af1158015612cc3573d6000803e3d6000fd5b505050506040513d6020811015612cd957600080fd5b50519050801561219d5761219d826155d3565b600080826401000000008110612d0157600080fd5b6001546040805160e060020a635e19b30502815263ffffffff871660048201529051869450600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612d5a57600080fd5b505af1158015612d6e573d6000803e3d6000fd5b505050506040513d6020811015612d8457600080fd5b50511515612d9157600080fd5b6001546040805160e160020a63310d91f102815263ffffffff851660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015612de757600080fd5b505af1158015612dfb573d6000803e3d6000fd5b505050506040513d6020811015612e1157600080fd5b5051949350505050565b6001546040805160e060020a63b65afedd02815260ff86166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b158015612e7657600080fd5b505af1158015612e8a573d6000803e3d6000fd5b505050506040513d6020811015612ea057600080fd5b50518015612f2c57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612eff57600080fd5b505af1158015612f13573d6000803e3d6000fd5b505050506040513d6020811015612f2957600080fd5b50515b1515612f3757600080fd5b600254604080517f6eb5822400000000000000000000000000000000000000000000000000000000815260ff871660048201526024810186905284151560448201529051600160a060020a0390921691636eb58224916064808201926020929091908290030181600087803b158015612faf57600080fd5b505af1158015612fc3573d6000803e3d6000fd5b505050506040513d6020811015610e0957600080fd5b6000600160a060020a0382161515612ff057600080fd5b600154604080517f12afbc78000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915191909216916312afbc789160248083019260209291908290030181600087803b158015612a4057600080fd5b600054600160a060020a0316331461306f57600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6001546040805160e160020a63489bff0502815263ffffffff8516600482015233602482015290518492600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b15801561311f57600080fd5b505af1158015613133573d6000803e3d6000fd5b505050506040513d602081101561314957600080fd5b505180156131d557506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b1580156131a857600080fd5b505af11580156131bc573d6000803e3d6000fd5b505050506040513d60208110156131d257600080fd5b50515b15156131e057600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8616600482015290518592600160a060020a03169163621b23e29160248083019260209291908290030181600087803b15801561323557600080fd5b505af1158015613249573d6000803e3d6000fd5b505050506040513d602081101561325f57600080fd5b5051600160a060020a03166000805160206157ee833981519152141561328457600080fd5b600154604080517f8866bb2c00000000000000000000000000000000000000000000000000000000815263ffffffff87166004820152600160a060020a03868116602483015291519190921691638866bb2c91604480830192600092919082900301818387803b158015611f5e57600080fd5b600054600160a060020a031681565b60408051808201909152600381527f415a500000000000000000000000000000000000000000000000000000000000602082015290565b6001546040805160e060020a63b65afedd02815260ff85166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b15801561339857600080fd5b505af11580156133ac573d6000803e3d6000fd5b505050506040513d60208110156133c257600080fd5b5051801561344e57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561342157600080fd5b505af1158015613435573d6000803e3d6000fd5b505050506040513d602081101561344b57600080fd5b50515b151561345957600080fd5b30600160a060020a031682600160a060020a031663ed969f686040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156134a157600080fd5b505af11580156134b5573d6000803e3d6000fd5b505050506040513d60208110156134cb57600080fd5b5051600160a060020a0316146134e057600080fd5b600254604080517fe31f3e0c000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301529151919092169163e31f3e0c91602480830192600092919082900301818387803b158015610ac457600080fd5b6001546040805160e060020a63caf590f902815263ffffffff8516600482015260006024820181905291519192600160a060020a03169163caf590f99160448082019260209290919082900301818787803b1580156135a557600080fd5b505af11580156135b9573d6000803e3d6000fd5b505050506040513d60208110156135cf57600080fd5b505115156135dc57600080fd5b600154604080517fe4a358d700000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a039092169163e4a358d7916024808201926020929091908290030181600087803b15801561364857600080fd5b505af115801561365c573d6000803e3d6000fd5b505050506040513d602081101561367257600080fd5b50516001546040805160e160020a63310d91f102815261ffff841660048201529051929350600160a060020a039091169163621b23e2916024808201926020929091908290030181600087803b1580156136cb57600080fd5b505af11580156136df573d6000803e3d6000fd5b505050506040513d60208110156136f557600080fd5b5051600160a060020a03166000805160206157ee833981519152141561371a57600080fd5b600154604080517ff4e3be2d00000000000000000000000000000000000000000000000000000000815261ffff841660048201529051600160a060020a039092169163f4e3be2d916024808201926020929091908290030181600087803b15801561378457600080fd5b505af1158015613798573d6000803e3d6000fd5b505050506040513d60208110156137ae57600080fd5b5051600160a060020a03166000805160206157ee83398151915214156137d357600080fd5b6001546040805160e060020a639397640502815263ffffffff861660048201529051600160a060020a03909216916393976405916024808201926020929091908290030181600087803b15801561382957600080fd5b505af115801561383d573d6000803e3d6000fd5b505050506040513d602081101561385357600080fd5b5051600281111561386057fe5b6001546040805160e060020a639397640502815261ffff85166004820152905160ff9390931692600160a060020a03909216916393976405916024808201926020929091908290030181600087803b1580156138bb57600080fd5b505af11580156138cf573d6000803e3d6000fd5b505050506040513d60208110156138e557600080fd5b505160028111156138f257fe5b60010160ff1614151561390457600080fd5b6001546040805160e060020a636d09887b02815261ffff841660048201529051600160a060020a0390921691636d09887b916024808201926020929091908290030181600087803b15801561395857600080fd5b505af115801561396c573d6000803e3d6000fd5b505050506040513d602081101561398257600080fd5b50518015613a4157506139998161ffff164261514b565b600154604080517f293a916900000000000000000000000000000000000000000000000000000000815261ffff85166004820152905163ffffffff9390931692600160a060020a039092169163293a9169916024808201926020929091908290030181600087803b158015613a0d57600080fd5b505af1158015613a21573d6000803e3d6000fd5b505050506040513d6020811015613a3757600080fd5b505163ffffffff16105b1515613a4c57600080fd5b600154604080517f8a27bf5900000000000000000000000000000000000000000000000000000000815261ffff841660048201523360248201529051600160a060020a0390921691638a27bf59916044808201926020929091908290030181600087803b158015613abc57600080fd5b505af1158015613ad0573d6000803e3d6000fd5b505050506040513d6020811015613ae657600080fd5b50511515613af357600080fd5b33600160a060020a0383161415613b1757613b1283836001600061526c565b610f6d565b6001546040805160e160020a63310d91f102815261ffff841660048201529051610f6d9286928692600092600160a060020a03169163621b23e291602480830192602092919082900301818787803b158015613b7257600080fd5b505af1158015613b86573d6000803e3d6000fd5b505050506040513d6020811015613b9c57600080fd5b505161526c565b600160a060020a0382161515613bb857600080fd5b600154604080517fbc735d90000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a03858116602483015284151560448301529151919092169163bc735d9091606480830192600092919082900301818387803b158015613c2d57600080fd5b505af1158015613c41573d6000803e3d6000fd5b50506040805184151581529051600160a060020a03861693503392507f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6001546040805160e060020a63b65afedd02815260ff85166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b158015613ce657600080fd5b505af1158015613cfa573d6000803e3d6000fd5b505050506040513d6020811015613d1057600080fd5b50518015613d9c57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015613d6f57600080fd5b505af1158015613d83573d6000803e3d6000fd5b505050506040513d6020811015613d9957600080fd5b50515b1515613da757600080fd5b600154604080517fa297c1d800000000000000000000000000000000000000000000000000000000815260ff86166004820152600160a060020a0385811660248301529151919092169163a297c1d891604480830192600092919082900301818387803b158015610ac457600080fd5b600154604080517f8a27bf5900000000000000000000000000000000000000000000000000000000815261ffff85166004820181905233602483015291519192600160a060020a031691638a27bf59916044808201926020929091908290030181600087803b158015613e8957600080fd5b505af1158015613e9d573d6000803e3d6000fd5b505050506040513d6020811015613eb357600080fd5b50518015613f3f57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015613f1257600080fd5b505af1158015613f26573d6000803e3d6000fd5b505050506040513d6020811015613f3c57600080fd5b50515b1515613f4a57600080fd5b6001546040805160e160020a63310d91f102815261ffff86166004820181905291519192600160a060020a03169163621b23e2916024808201926020929091908290030181600087803b158015613fa057600080fd5b505af1158015613fb4573d6000803e3d6000fd5b505050506040513d6020811015613fca57600080fd5b5051600160a060020a03166000805160206157ee8339815191521415613fef57600080fd5b600154604080517ff4e3be2d00000000000000000000000000000000000000000000000000000000815261ffff871660048201529051600160a060020a039092169163f4e3be2d916024808201926020929091908290030181600087803b15801561405957600080fd5b505af115801561406d573d6000803e3d6000fd5b505050506040513d602081101561408357600080fd5b5051600160a060020a03166000805160206157ee83398151915214156140a857600080fd5b600154604080517f2a19642c00000000000000000000000000000000000000000000000000000000815261ffff87166004820152600160a060020a03868116602483015291519190921691632a19642c91604480830192600092919082900301818387803b158015611f5e57600080fd5b6000614126858585611f7d565b61413884600160a060020a0316615264565b15612035576040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a038881166024850152604484018790526080606485019081528651608486015286519189169463150b7a0294938b938a938a93909160a490910190602085019080838360005b838110156141d05781810151838201526020016141b8565b50505050905090810190601f1680156141fd5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561421f57600080fd5b505af1158015614233573d6000803e3d6000fd5b505050506040513d602081101561424957600080fd5b50519050600160e060020a031981167f150b7a02000000000000000000000000000000000000000000000000000000001461203557600080fd5b600054600160a060020a0316331461429a57600080fd5b6001546040517fbac55edd00000000000000000000000000000000000000000000000000000000815260606004820190815260648201889052600160a060020a039092169163bac55edd918991899189918991899189918190602481019060448101906084018a8a80828437909101858103845288815260200190508888808284379091018581038352868152602001905086868082843782019150509950505050505050505050600060405180830381600087803b15801561435c57600080fd5b505af1158015614370573d6000803e3d6000fd5b50505050505050505050565b600154604080517ff5af662100000000000000000000000000000000000000000000000000000000815263ffffffff841660048201529051600092600160a060020a03169163f5af662191602480830192602092919082900301818787803b1580156143e757600080fd5b505af11580156143fb573d6000803e3d6000fd5b505050506040513d602081101561441157600080fd5b5051600154604080517f9b350e1200000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051929350600160a060020a0390911691639b350e12916024808201926020929091908290030181600087803b15801561448257600080fd5b505af1158015614496573d6000803e3d6000fd5b505050506040513d60208110156144ac57600080fd5b5051801561453e57506001546040805160e160020a63489bff0502815263ffffffff841660048201523360248201529051600160a060020a0390921691639137fe0a916044808201926020929091908290030181600087803b15801561451157600080fd5b505af1158015614525573d6000803e3d6000fd5b505050506040513d602081101561453b57600080fd5b50515b151561454957600080fd5b6001546040805160e160020a63310d91f102815263ffffffff841660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b15801561459f57600080fd5b505af11580156145b3573d6000803e3d6000fd5b505050506040513d60208110156145c957600080fd5b5051600160a060020a03166000805160206157ee83398151915214156145ee57600080fd5b600154604080517fc6d761d400000000000000000000000000000000000000000000000000000000815263ffffffff851660048201529051600160a060020a039092169163c6d761d49160248082019260009290919082900301818387803b158015610df557600080fd5b6001546040805160e160020a63489bff0502815263ffffffff8516600482015233602482015290518492600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b1580156146b457600080fd5b505af11580156146c8573d6000803e3d6000fd5b505050506040513d60208110156146de57600080fd5b5051801561476a57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561473d57600080fd5b505af1158015614751573d6000803e3d6000fd5b505050506040513d602081101561476757600080fd5b50515b151561477557600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8616600482015290518592600160a060020a03169163621b23e29160248083019260209291908290030181600087803b1580156147ca57600080fd5b505af11580156147de573d6000803e3d6000fd5b505050506040513d60208110156147f457600080fd5b5051600160a060020a03166000805160206157ee833981519152141561481957600080fd5b6001546040805160e160020a63310d91f102815263ffffffff861660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b15801561486f57600080fd5b505af1158015614883573d6000803e3d6000fd5b505050506040513d602081101561489957600080fd5b5051600160a060020a03166000805160206157ee83398151915214156148be57600080fd5b6148c88484612762565b15156148d357600080fd5b600154604080517fa634585900000000000000000000000000000000000000000000000000000000815263ffffffff8088166004830152861660248201529051600160a060020a039092169163a63458599160448082019260009290919082900301818387803b158015611f5e57600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8416600482015290516000928492600160a060020a039091169163621b23e29160248082019260209290919082900301818887803b1580156149a057600080fd5b505af11580156149b4573d6000803e3d6000fd5b505050506040513d60208110156149ca57600080fd5b5051600160a060020a03166000805160206157ee83398151915214156149ef57600080fd5b600154604080517ff5af662100000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a039092169163f5af6621916024808201926020929091908290030181600087803b158015614a5b57600080fd5b505af1158015614a6f573d6000803e3d6000fd5b505050506040513d6020811015614a8557600080fd5b5051600154604080517f9b350e1200000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051929450600160a060020a0390911691639b350e12916024808201926020929091908290030181600087803b158015614af657600080fd5b505af1158015614b0a573d6000803e3d6000fd5b505050506040513d6020811015614b2057600080fd5b50518015614bb257506001546040805160e160020a63489bff0502815263ffffffff851660048201523360248201529051600160a060020a0390921691639137fe0a916044808201926020929091908290030181600087803b158015614b8557600080fd5b505af1158015614b99573d6000803e3d6000fd5b505050506040513d6020811015614baf57600080fd5b50515b1515614bbd57600080fd5b6001546040805160e160020a63310d91f102815263ffffffff851660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015614c1357600080fd5b505af1158015614c27573d6000803e3d6000fd5b505050506040513d6020811015614c3d57600080fd5b5051600160a060020a03166000805160206157ee8339815191521415614c6257600080fd5b600154604080517f1306318000000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a039092169163130631809160248082019260009290919082900301818387803b158015610ac457600080fd5b6001546040805160e160020a63489bff0502815263ffffffff8416600482015233602482015290518392600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b158015614d2857600080fd5b505af1158015614d3c573d6000803e3d6000fd5b505050506040513d6020811015614d5257600080fd5b50518015614dde57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015614db157600080fd5b505af1158015614dc5573d6000803e3d6000fd5b505050506040513d6020811015614ddb57600080fd5b50515b15156145ee57600080fd5b606080826401000000008110614dfe57600080fd5b60408051606081018252602e81527f68747470733a2f2f617a696d7574682e6e6574776f726b2f6572633732312f3060208201527f3030303030303030302e6a736f6e0000000000000000000000000000000000009181019190915292508291507fff00000000000000000000000000000000000000000000000000000000000000600a633b9aca0086040660300160f860020a0216600081901a603f84015350600a6305f5e10085040660300160f860020a02826020815181101515614ec157fe5b906020010190600160f860020a031916908160001a905350600a6298968085040660300160f860020a02826021815181101515614efa57fe5b906020010190600160f860020a031916908160001a905350600a620f424085040660300160f860020a02826022815181101515614f3357fe5b906020010190600160f860020a031916908160001a905350600a620186a085040660300160f860020a02826023815181101515614f6c57fe5b906020010190600160f860020a031916908160001a905350600a61271085040660300160f860020a02826024815181101515614fa457fe5b906020010190600160f860020a031916908160001a905350600a6103e885040660300160f860020a02826025815181101515614fdc57fe5b906020010190600160f860020a031916908160001a905350600a606485040660300160f860020a0282602681518110151561501357fe5b906020010190600160f860020a031916908160001a905350600a8085040660300160f860020a0282602781518110151561504957fe5b906020010190600160f860020a031916908160001a905350600a840660300160f860020a0282602881518110151561507d57fe5b906020010190600160f860020a031916908160001a9053505050919050565b600154600160a060020a031681565b600554600160a060020a031681565b600254600160a060020a031681565b600154604080517fb6363cf2000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015284811660248301529151600093929092169163b6363cf29160448082019260209290919082900301818787803b158015610f1e57600080fd5b600354600160a060020a031681565b6001546040805160e060020a639397640502815263ffffffff85166004820152905160009283928392600160a060020a039092169163939764059160248082019260209290919082900301818787803b1580156151a757600080fd5b505af11580156151bb573d6000803e3d6000fd5b505050506040513d60208110156151d157600080fd5b5051915060008260028111156151e357fe5b14156151f25760ff92506129d1565b600182600281111561520057fe5b141561523857506301e13380635c2aad7f19840104600681101561522d578060020a610400029250615233565b61ffff92505b6129d1565b600092506129d1565b600054600160a060020a0316331461525857600080fd5b61526181615770565b50565b6000903b1190565b600154604080517fc17ad9d800000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a039092169163c17ad9d89160248082019260009290919082900301818387803b1580156152d757600080fd5b505af11580156152eb573d6000803e3d6000fd5b50505050811561544757600154604080517f7bc702a100000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a0390921691637bc702a19160248082019260009290919082900301818387803b15801561536057600080fd5b505af1158015615374573d6000803e3d6000fd5b5050600154604080517fddc3595000000000000000000000000000000000000000000000000000000000815263ffffffff89166004820152600160a060020a038881166024830152915191909216935063ddc359509250604480830192600092919082900301818387803b1580156153eb57600080fd5b505af11580156153ff573d6000803e3d6000fd5b505050508363ffffffff1683600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f77565b600154604080517fddc3595000000000000000000000000000000000000000000000000000000000815263ffffffff87166004820152600160a060020a0384811660248301529151919092169163ddc3595091604480830192600092919082900301818387803b1580156154ba57600080fd5b505af11580156154ce573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff89166004820152600160a060020a0388811660248301529151919092169350632c7ba5649250604480830192600092919082900301818387803b15801561552f57600080fd5b505af1158015615543573d6000803e3d6000fd5b505050508363ffffffff1681600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48363ffffffff1683600160a060020a031682600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b600154604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b15801561563a57600080fd5b505af115801561564e573d6000803e3d6000fd5b5050600254604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b1580156156b957600080fd5b505af11580156156cd573d6000803e3d6000fd5b5050505080600160a060020a0316631824a46b6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561570f57600080fd5b505af1158015615723573d6000803e3d6000fd5b505060408051600160a060020a038516815290517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9350908190036020019150a180600160a060020a0316ff5b600160a060020a038116151561578557600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905556000000000000000000000000001111111111111111111111111111111111111111a165627a7a723058209715be9a1e6921ddf1d293fcc3c2fc481241433aaa74738c5c2ff43607d2d09e00290000000000000000000000009ef27de616154ff8b38893c59522b69c7ba8a81c000000000000000000000000223c067f8cf28ae173ee5cafea60ca44c335fecb0000000000000000000000007fecab617c868bb5996d99d95200d2fa708218e40000000000000000000000001df4ea30e0b1359c9692a161c5f30cd1a6b64ebf
Deployed Bytecode
0x6080604052600436106102165763ffffffff60e060020a60003504166301ffc9a7811461021b57806305bbf5db1461025157806306fdde0314610271578063073a7804146102fb578063081812fc14610319578063095ea7b31461034d578063172a735c146103715780631824a46b1461038957806319fa8f501461039e5780631e79a85b146103d057806323b872dd146103ff57806326295b521461042957806328f833b7146104505780632c7ba5641461046557806342842e0e1461048f5780634447e48c146104b95780634a013296146104ea5780634f558e791461050e57806351de5541146105265780635623715b146105525780636352211e146105735780636eb582241461058b57806370a08231146105ae578063715018a6146105e15780638866bb2c146105f65780638da5cb5b1461062057806395d89b41146106355780639e988d131461064a578063a0d3253f14610671578063a22cb4651461069b578063a60e8bd6146106c1578063ae326221146106e8578063b88d4fde14610710578063bac55edd1461077f578063bbe21ca5146107b7578063bf5772b9146107d5578063c1b9d98b146107f9578063c6d761d414610817578063c87b56dd14610835578063d40ffacb1461084d578063dcc59b6f14610862578063e64853c414610877578063e985e9c51461088c578063ed969f68146108b3578063ef20bff8146108c8578063f2fde38b14610902575b600080fd5b34801561022757600080fd5b5061023d600160e060020a031960043516610923565b604080519115158252519081900360200190f35b34801561025d57600080fd5b5061026f60ff60043516602435610942565b005b34801561027d57600080fd5b50610286610ae1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102c05781810151838201526020016102a8565b50505050905090810190601f1680156102ed5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030757600080fd5b5061026f63ffffffff60043516610b18565b34801561032557600080fd5b50610331600435610e11565b60408051600160a060020a039092168252519081900360200190f35b34801561035957600080fd5b5061026f600160a060020a0360043516602435610f51565b34801561037d57600080fd5b5061026f600435610f72565b34801561039557600080fd5b5061026f611003565b3480156103aa57600080fd5b506103b3611142565b60408051600160e060020a03199092168252519081900360200190f35b3480156103dc57600080fd5b5061026f63ffffffff60043516600160a060020a03602435166044351515611166565b34801561040b57600080fd5b5061026f600160a060020a0360043581169060243516604435611f7d565b34801561043557600080fd5b5061026f60ff60043516600160a060020a036024351661203c565b34801561045c57600080fd5b506103316121a1565b34801561047157600080fd5b5061026f63ffffffff60043516600160a060020a03602435166121b3565b34801561049b57600080fd5b5061026f600160a060020a036004358116906024351660443561245a565b3480156104c557600080fd5b5061026f63ffffffff6004358116906024359060443590606435166084351515612476565b3480156104f657600080fd5b5061023d63ffffffff60043581169060243516612762565b34801561051a57600080fd5b5061023d6004356129d9565b34801561053257600080fd5b5061026f60ff60043516600160a060020a03602435166044351515612a73565b34801561055e57600080fd5b5061026f600160a060020a0360043516612c44565b34801561057f57600080fd5b50610331600435612cec565b34801561059757600080fd5b5061026f60ff600435166024356044351515612e1b565b3480156105ba57600080fd5b506105cf600160a060020a0360043516612fd9565b60408051918252519081900360200190f35b3480156105ed57600080fd5b5061026f613058565b34801561060257600080fd5b5061026f63ffffffff60043516600160a060020a03602435166130c4565b34801561062c57600080fd5b506103316132f7565b34801561064157600080fd5b50610286613306565b34801561065657600080fd5b5061026f60ff60043516600160a060020a036024351661333d565b34801561067d57600080fd5b5061026f63ffffffff60043516600160a060020a0360243516613547565b3480156106a757600080fd5b5061026f600160a060020a03600435166024351515613ba3565b3480156106cd57600080fd5b5061026f60ff60043516600160a060020a0360243516613c8b565b3480156106f457600080fd5b5061026f61ffff60043516600160a060020a0360243516613e17565b34801561071c57600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261026f94600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506141199650505050505050565b34801561078b57600080fd5b5061026f6024600480358281019290820135918135808301929082013591604435918201910135614283565b3480156107c357600080fd5b5061026f63ffffffff6004351661437c565b3480156107e157600080fd5b5061026f63ffffffff60043581169060243516614659565b34801561080557600080fd5b5061026f63ffffffff60043516614946565b34801561082357600080fd5b5061026f63ffffffff60043516614ccd565b34801561084157600080fd5b50610286600435614de9565b34801561085957600080fd5b5061033161509c565b34801561086e57600080fd5b506103316150ab565b34801561088357600080fd5b506103316150ba565b34801561089857600080fd5b5061023d600160a060020a03600435811690602435166150c9565b3480156108bf57600080fd5b5061033161513c565b3480156108d457600080fd5b506108e963ffffffff6004351660243561514b565b6040805163ffffffff9092168252519081900360200190f35b34801561090e57600080fd5b5061026f600160a060020a0360043516615241565b600160e060020a03191660009081526004602052604090205460ff1690565b6001546040805160e060020a63b65afedd02815260ff85166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b15801561099d57600080fd5b505af11580156109b1573d6000803e3d6000fd5b505050506040513d60208110156109c757600080fd5b50518015610a5357506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015610a2657600080fd5b505af1158015610a3a573d6000803e3d6000fd5b505050506040513d6020811015610a5057600080fd5b50515b1515610a5e57600080fd5b600254604080517f9a33aff9000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a0390921691639a33aff99160248082019260009290919082900301818387803b158015610ac457600080fd5b505af1158015610ad8573d6000803e3d6000fd5b50505050505050565b60408051808201909152600e81527f417a696d75746820506f696e7473000000000000000000000000000000000000602082015290565b600154604080517f439f7d3c00000000000000000000000000000000000000000000000000000000815263ffffffff841660048201529051600092600160a060020a03169163439f7d3c91602480830192602092919082900301818787803b158015610b8357600080fd5b505af1158015610b97573d6000803e3d6000fd5b505050506040513d6020811015610bad57600080fd5b5051600154604080517f77eb4c5000000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051929350600160a060020a03909116916377eb4c50916024808201926020929091908290030181600087803b158015610c1e57600080fd5b505af1158015610c32573d6000803e3d6000fd5b505050506040513d6020811015610c4857600080fd5b50518015610cda57506001546040805160e160020a63489bff0502815263ffffffff841660048201523360248201529051600160a060020a0390921691639137fe0a916044808201926020929091908290030181600087803b158015610cad57600080fd5b505af1158015610cc1573d6000803e3d6000fd5b505050506040513d6020811015610cd757600080fd5b50515b1515610ce557600080fd5b6001546040805160e160020a63310d91f102815263ffffffff841660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015610d3b57600080fd5b505af1158015610d4f573d6000803e3d6000fd5b505050506040513d6020811015610d6557600080fd5b5051600160a060020a03166000805160206157ee8339815191521415610d8a57600080fd5b600154604080517fbc562b9e00000000000000000000000000000000000000000000000000000000815263ffffffff851660048201529051600160a060020a039092169163bc562b9e9160248082019260009290919082900301818387803b158015610df557600080fd5b505af1158015610e09573d6000803e3d6000fd5b505050505050565b6000816401000000008110610e2557600080fd5b6001546040805160e060020a635e19b30502815263ffffffff861660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015610e7b57600080fd5b505af1158015610e8f573d6000803e3d6000fd5b505050506040513d6020811015610ea557600080fd5b50511515610eb257600080fd5b600154604080517f24541f7800000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a03909216916324541f78916024808201926020929091908290030181600087803b158015610f1e57600080fd5b505af1158015610f32573d6000803e3d6000fd5b505050506040513d6020811015610f4857600080fd5b50519392505050565b806401000000008110610f6357600080fd5b610f6d82846121b3565b505050565b600254604080517f172a735c000000000000000000000000000000000000000000000000000000008152600481018490529051600160a060020a039092169163172a735c916024808201926020929091908290030181600087803b158015610fd957600080fd5b505af1158015610fed573d6000803e3d6000fd5b505050506040513d6020811015610f6d57600080fd5b600354600160a060020a0316331480156110a35750600160009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b505050506040513d602081101561109557600080fd5b5051600160a060020a031630145b80156111355750600260009054906101000a9004600160a060020a0316600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110fd57600080fd5b505af1158015611111573d6000803e3d6000fd5b505050506040513d602081101561112757600080fd5b5051600160a060020a031630145b151561114057600080fd5b565b7f01ffc9a70000000000000000000000000000000000000000000000000000000081565b600154604080517f728aa85700000000000000000000000000000000000000000000000000000000815263ffffffff861660048201523360248201529051600092600160a060020a03169163728aa85791604480830192602092919082900301818787803b1580156111d757600080fd5b505af11580156111eb573d6000803e3d6000fd5b505050506040513d602081101561120157600080fd5b5051151561120e57600080fd5b6000805160206157ee833981519152600160a060020a03841614158061135757506001546040805160e060020a639397640502815263ffffffff871660048201529051600092600160a060020a031691639397640591602480830192602092919082900301818787803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050506040513d60208110156112ae57600080fd5b505160028111156112bb57fe5b1415801561135757506001546040805160e160020a63310d91f102815263ffffffff87166004820152905161135592600160a060020a03169163621b23e29160248083019260209291908290030181600087803b15801561131b57600080fd5b505af115801561132f573d6000803e3d6000fd5b505050506040513d602081101561134557600080fd5b5051600160a060020a0316615264565b155b151561136257600080fd5b6001546040805160e060020a635e19b30502815263ffffffff871660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b1580156113b857600080fd5b505af11580156113cc573d6000803e3d6000fd5b505050506040513d60208110156113e257600080fd5b5051151561146e57600154604080517f7bc702a100000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a0390921691637bc702a19160248082019260009290919082900301818387803b15801561145557600080fd5b505af1158015611469573d6000803e3d6000fd5b505050505b6001546040805160e060020a63caf590f902815263ffffffff87166004820152600160a060020a0386811660248301529151919092169163caf590f99160448083019260209291908290030181600087803b1580156114cc57600080fd5b505af11580156114e0573d6000803e3d6000fd5b505050506040513d60208110156114f657600080fd5b505115156116c6576001546040805160e160020a63310d91f102815263ffffffff871660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b15801561155457600080fd5b505af1158015611568573d6000803e3d6000fd5b505050506040513d602081101561157e57600080fd5b5051600154604080517fddc3595000000000000000000000000000000000000000000000000000000000815263ffffffff88166004820152600160a060020a038781166024830152915193945091169163ddc359509160448082019260009290919082900301818387803b1580156115f557600080fd5b505af1158015611609573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632c7ba56493506044808201939182900301818387803b15801561166657600080fd5b505af115801561167a573d6000803e3d6000fd5b505050508363ffffffff1683600160a060020a031682600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b6000805160206157ee833981519152600160a060020a0384161415611a8d57600154604080517ff9b87d4000000000000000000000000000000000000000000000000000000000815263ffffffff8716600482015260006024820181905260448201819052606482018190529151600160a060020a039093169263f9b87d409260848084019391929182900301818387803b15801561176457600080fd5b505af1158015611778573d6000803e3d6000fd5b5050600154604080517f8866bb2c00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a039093169450638866bb2c93506044808201939182900301818387803b1580156117eb57600080fd5b505af11580156117ff573d6000803e3d6000fd5b5050600154604080517fa297c1d800000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a03909316945063a297c1d893506044808201939182900301818387803b15801561187257600080fd5b505af1158015611886573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632c7ba56493506044808201939182900301818387803b1580156118e357600080fd5b505af11580156118f7573d6000803e3d6000fd5b5050600154604080517f2a19642c00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632a19642c93506044808201939182900301818387803b15801561196a57600080fd5b505af115801561197e573d6000803e3d6000fd5b5050600554604080517feaae46e500000000000000000000000000000000000000000000000000000000815263ffffffff891660048201529051600160a060020a03909216935063eaae46e5925060248082019260009290919082900301818387803b1580156119ed57600080fd5b505af1158015611a01573d6000803e3d6000fd5b5050600154604080517fc6d761d400000000000000000000000000000000000000000000000000000000815263ffffffff891660048201529051600160a060020a03909216935063c6d761d4925060248082019260009290919082900301818387803b158015611a7057600080fd5b505af1158015611a84573d6000803e3d6000fd5b50505050611f77565b8115611f77576001546040805160e060020a636d09887b02815263ffffffff871660048201529051600160a060020a0390921691636d09887b916024808201926020929091908290030181600087803b158015611ae957600080fd5b505af1158015611afd573d6000803e3d6000fd5b505050506040513d6020811015611b1357600080fd5b505115611c3357600154604080517ff491491900000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a039092169163f49149199160248082019260009290919082900301818387803b158015611b8557600080fd5b505af1158015611b99573d6000803e3d6000fd5b5050600154604080517ff9b87d4000000000000000000000000000000000000000000000000000000000815263ffffffff8916600482015260006024820181905260448201819052606482018190529151600160a060020a03909316945063f9b87d4093506084808201939182900301818387803b158015611c1a57600080fd5b505af1158015611c2e573d6000803e3d6000fd5b505050505b600154604080517f8866bb2c00000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526000602482018190529151600160a060020a0390931692638866bb2c9260448084019391929182900301818387803b158015611ca457600080fd5b505af1158015611cb8573d6000803e3d6000fd5b5050600154604080517fa297c1d800000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526000602482018190529151600160a060020a03909316945063a297c1d893506044808201939182900301818387803b158015611d2b57600080fd5b505af1158015611d3f573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff891660048201526000602482018190529151600160a060020a039093169450632c7ba56493506044808201939182900301818387803b158015611d9c57600080fd5b505af1158015611db0573d6000803e3d6000fd5b5050600154604080517ff4e3be2d00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201529051600160a060020a03909216935063f4e3be2d92506024808201926020929091908290030181600087803b158015611e2057600080fd5b505af1158015611e34573d6000803e3d6000fd5b505050506040513d6020811015611e4a57600080fd5b5051600160a060020a03166000805160206157ee83398151915214611ef357600154604080517f2a19642c00000000000000000000000000000000000000000000000000000000815263ffffffff871660048201526000602482018190529151600160a060020a0390931692632a19642c9260448084019391929182900301818387803b158015611eda57600080fd5b505af1158015611eee573d6000803e3d6000fd5b505050505b600554604080517feaae46e500000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a039092169163eaae46e59160248082019260009290919082900301818387803b158015611f5e57600080fd5b505af1158015611f72573d6000803e3d6000fd5b505050505b50505050565b6000816401000000008110611f9157600080fd5b6001546040805160e060020a63caf590f902815263ffffffff86166004820152600160a060020a0388811660248301529151869550919092169163caf590f99160448083019260209291908290030181600087803b158015611ff257600080fd5b505af1158015612006573d6000803e3d6000fd5b505050506040513d602081101561201c57600080fd5b5051151561202957600080fd5b61203582856001611166565b5050505050565b600054600160a060020a0316331461205357600080fd5b6001546040805160e060020a63caf590f902815260ff851660048201526000602482018190529151600160a060020a039093169263caf590f992604480840193602093929083900390910190829087803b1580156120b057600080fd5b505af11580156120c4573d6000803e3d6000fd5b505050506040513d60208110156120da57600080fd5b505180156120f05750600160a060020a03811615155b15156120fb57600080fd5b600260009054906101000a9004600160a060020a0316600160a060020a031663246d41a96040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561214e57600080fd5b505af1158015612162573d6000803e3d6000fd5b50505050600160a060020a03811633141561218d576121888260ff16826001600061526c565b61219d565b61219d8260ff168260003361526c565b5050565b6000805160206157ee83398151915281565b6001546040805160e160020a63310d91f102815263ffffffff8516600482015290516000928592600160a060020a039091169163621b23e29160248082019260209290919082900301818887803b15801561220d57600080fd5b505af1158015612221573d6000803e3d6000fd5b505050506040513d602081101561223757600080fd5b5051600160a060020a03166000805160206157ee833981519152141561225c57600080fd5b6001546040805160e160020a63310d91f102815263ffffffff871660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b1580156122b257600080fd5b505af11580156122c6573d6000803e3d6000fd5b505050506040513d60208110156122dc57600080fd5b50519150600160a060020a03821633148061238d5750600154604080517fb6363cf2000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301523360248301529151919092169163b6363cf29160448083019260209291908290030181600087803b15801561236057600080fd5b505af1158015612374573d6000803e3d6000fd5b505050506040513d602081101561238a57600080fd5b50515b151561239857600080fd5b6001546040805160e260020a630b1ee95902815263ffffffff87166004820152600160a060020a03868116602483015291519190921691632c7ba56491604480830192600092919082900301818387803b1580156123f557600080fd5b505af1158015612409573d6000803e3d6000fd5b505050508363ffffffff1683600160a060020a031683600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b610f6d8383836020604051908101604052806000815250614119565b6001546040805160e160020a63489bff0502815263ffffffff8816600482015233602482015290518792600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b1580156124d157600080fd5b505af11580156124e5573d6000803e3d6000fd5b505050506040513d60208110156124fb57600080fd5b5051801561258757506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561255a57600080fd5b505af115801561256e573d6000803e3d6000fd5b505050506040513d602081101561258457600080fd5b50515b151561259257600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8916600482015290518892600160a060020a03169163621b23e29160248083019260209291908290030181600087803b1580156125e757600080fd5b505af11580156125fb573d6000803e3d6000fd5b505050506040513d602081101561261157600080fd5b5051600160a060020a03166000805160206157ee833981519152141561263657600080fd5b82156126c057600154604080517ff491491900000000000000000000000000000000000000000000000000000000815263ffffffff8a1660048201529051600160a060020a039092169163f49149199160248082019260009290919082900301818387803b1580156126a757600080fd5b505af11580156126bb573d6000803e3d6000fd5b505050505b600154604080517ff9b87d4000000000000000000000000000000000000000000000000000000000815263ffffffff808b166004830152602482018a905260448201899052871660648201529051600160a060020a039092169163f9b87d409160848082019260009290919082900301818387803b15801561274157600080fd5b505af1158015612755573d6000803e3d6000fd5b5050505050505050505050565b6001546040805160e060020a636d09887b02815263ffffffff84166004820152905160009283928392600160a060020a0390921691636d09887b9160248082019260209290919082900301818787803b1580156127be57600080fd5b505af11580156127d2573d6000803e3d6000fd5b505050506040513d60208110156127e857600080fd5b505115156127f957600092506129d1565b6001546040805160e060020a639397640502815263ffffffff881660048201529051600160a060020a03909216916393976405916024808201926020929091908290030181600087803b15801561284f57600080fd5b505af1158015612863573d6000803e3d6000fd5b505050506040513d602081101561287957600080fd5b50516001546040805160e060020a639397640502815263ffffffff881660048201529051929450600160a060020a03909116916393976405916024808201926020929091908290030181600087803b1580156128d457600080fd5b505af11580156128e8573d6000803e3d6000fd5b505050506040513d60208110156128fe57600080fd5b5051905081600281111561290e57fe5b60ff1681600281111561291d57fe5b60010160ff1614806129ce575081600281111561293657fe5b81600281111561294257fe5b1480156129ce57506001546040805160e060020a636d09887b02815263ffffffff881660048201529051600160a060020a0390921691636d09887b916024808201926020929091908290030181600087803b1580156129a057600080fd5b505af11580156129b4573d6000803e3d6000fd5b505050506040513d60208110156129ca57600080fd5b5051155b92505b505092915050565b600064010000000082108015612a6d57506001546040805160e060020a635e19b30502815263ffffffff851660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612a4057600080fd5b505af1158015612a54573d6000803e3d6000fd5b505050506040513d6020811015612a6a57600080fd5b50515b92915050565b6001546040805160e060020a63b65afedd02815260ff8616600482018190523360248301529151600093600160a060020a03169163b65afedd91604480830192602092919082900301818887803b158015612acd57600080fd5b505af1158015612ae1573d6000803e3d6000fd5b505050506040513d6020811015612af757600080fd5b50518015612b8357506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612b5657600080fd5b505af1158015612b6a573d6000803e3d6000fd5b505050506040513d6020811015612b8057600080fd5b50515b1515612b8e57600080fd5b600254604080517f51de554100000000000000000000000000000000000000000000000000000000815260ff88166004820152600160a060020a0387811660248301528615156044830152915191909216916351de55419160648083019260209291908290030181600087803b158015612c0757600080fd5b505af1158015612c1b573d6000803e3d6000fd5b505050506040513d6020811015612c3157600080fd5b50519150811561203557612035846155d3565b600254604080517f5623715b000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000939290921691635623715b9160248082019260209290919082900301818787803b158015612caf57600080fd5b505af1158015612cc3573d6000803e3d6000fd5b505050506040513d6020811015612cd957600080fd5b50519050801561219d5761219d826155d3565b600080826401000000008110612d0157600080fd5b6001546040805160e060020a635e19b30502815263ffffffff871660048201529051869450600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612d5a57600080fd5b505af1158015612d6e573d6000803e3d6000fd5b505050506040513d6020811015612d8457600080fd5b50511515612d9157600080fd5b6001546040805160e160020a63310d91f102815263ffffffff851660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015612de757600080fd5b505af1158015612dfb573d6000803e3d6000fd5b505050506040513d6020811015612e1157600080fd5b5051949350505050565b6001546040805160e060020a63b65afedd02815260ff86166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b158015612e7657600080fd5b505af1158015612e8a573d6000803e3d6000fd5b505050506040513d6020811015612ea057600080fd5b50518015612f2c57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015612eff57600080fd5b505af1158015612f13573d6000803e3d6000fd5b505050506040513d6020811015612f2957600080fd5b50515b1515612f3757600080fd5b600254604080517f6eb5822400000000000000000000000000000000000000000000000000000000815260ff871660048201526024810186905284151560448201529051600160a060020a0390921691636eb58224916064808201926020929091908290030181600087803b158015612faf57600080fd5b505af1158015612fc3573d6000803e3d6000fd5b505050506040513d6020811015610e0957600080fd5b6000600160a060020a0382161515612ff057600080fd5b600154604080517f12afbc78000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915191909216916312afbc789160248083019260209291908290030181600087803b158015612a4057600080fd5b600054600160a060020a0316331461306f57600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6001546040805160e160020a63489bff0502815263ffffffff8516600482015233602482015290518492600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b15801561311f57600080fd5b505af1158015613133573d6000803e3d6000fd5b505050506040513d602081101561314957600080fd5b505180156131d557506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b1580156131a857600080fd5b505af11580156131bc573d6000803e3d6000fd5b505050506040513d60208110156131d257600080fd5b50515b15156131e057600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8616600482015290518592600160a060020a03169163621b23e29160248083019260209291908290030181600087803b15801561323557600080fd5b505af1158015613249573d6000803e3d6000fd5b505050506040513d602081101561325f57600080fd5b5051600160a060020a03166000805160206157ee833981519152141561328457600080fd5b600154604080517f8866bb2c00000000000000000000000000000000000000000000000000000000815263ffffffff87166004820152600160a060020a03868116602483015291519190921691638866bb2c91604480830192600092919082900301818387803b158015611f5e57600080fd5b600054600160a060020a031681565b60408051808201909152600381527f415a500000000000000000000000000000000000000000000000000000000000602082015290565b6001546040805160e060020a63b65afedd02815260ff85166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b15801561339857600080fd5b505af11580156133ac573d6000803e3d6000fd5b505050506040513d60208110156133c257600080fd5b5051801561344e57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561342157600080fd5b505af1158015613435573d6000803e3d6000fd5b505050506040513d602081101561344b57600080fd5b50515b151561345957600080fd5b30600160a060020a031682600160a060020a031663ed969f686040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156134a157600080fd5b505af11580156134b5573d6000803e3d6000fd5b505050506040513d60208110156134cb57600080fd5b5051600160a060020a0316146134e057600080fd5b600254604080517fe31f3e0c000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301529151919092169163e31f3e0c91602480830192600092919082900301818387803b158015610ac457600080fd5b6001546040805160e060020a63caf590f902815263ffffffff8516600482015260006024820181905291519192600160a060020a03169163caf590f99160448082019260209290919082900301818787803b1580156135a557600080fd5b505af11580156135b9573d6000803e3d6000fd5b505050506040513d60208110156135cf57600080fd5b505115156135dc57600080fd5b600154604080517fe4a358d700000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a039092169163e4a358d7916024808201926020929091908290030181600087803b15801561364857600080fd5b505af115801561365c573d6000803e3d6000fd5b505050506040513d602081101561367257600080fd5b50516001546040805160e160020a63310d91f102815261ffff841660048201529051929350600160a060020a039091169163621b23e2916024808201926020929091908290030181600087803b1580156136cb57600080fd5b505af11580156136df573d6000803e3d6000fd5b505050506040513d60208110156136f557600080fd5b5051600160a060020a03166000805160206157ee833981519152141561371a57600080fd5b600154604080517ff4e3be2d00000000000000000000000000000000000000000000000000000000815261ffff841660048201529051600160a060020a039092169163f4e3be2d916024808201926020929091908290030181600087803b15801561378457600080fd5b505af1158015613798573d6000803e3d6000fd5b505050506040513d60208110156137ae57600080fd5b5051600160a060020a03166000805160206157ee83398151915214156137d357600080fd5b6001546040805160e060020a639397640502815263ffffffff861660048201529051600160a060020a03909216916393976405916024808201926020929091908290030181600087803b15801561382957600080fd5b505af115801561383d573d6000803e3d6000fd5b505050506040513d602081101561385357600080fd5b5051600281111561386057fe5b6001546040805160e060020a639397640502815261ffff85166004820152905160ff9390931692600160a060020a03909216916393976405916024808201926020929091908290030181600087803b1580156138bb57600080fd5b505af11580156138cf573d6000803e3d6000fd5b505050506040513d60208110156138e557600080fd5b505160028111156138f257fe5b60010160ff1614151561390457600080fd5b6001546040805160e060020a636d09887b02815261ffff841660048201529051600160a060020a0390921691636d09887b916024808201926020929091908290030181600087803b15801561395857600080fd5b505af115801561396c573d6000803e3d6000fd5b505050506040513d602081101561398257600080fd5b50518015613a4157506139998161ffff164261514b565b600154604080517f293a916900000000000000000000000000000000000000000000000000000000815261ffff85166004820152905163ffffffff9390931692600160a060020a039092169163293a9169916024808201926020929091908290030181600087803b158015613a0d57600080fd5b505af1158015613a21573d6000803e3d6000fd5b505050506040513d6020811015613a3757600080fd5b505163ffffffff16105b1515613a4c57600080fd5b600154604080517f8a27bf5900000000000000000000000000000000000000000000000000000000815261ffff841660048201523360248201529051600160a060020a0390921691638a27bf59916044808201926020929091908290030181600087803b158015613abc57600080fd5b505af1158015613ad0573d6000803e3d6000fd5b505050506040513d6020811015613ae657600080fd5b50511515613af357600080fd5b33600160a060020a0383161415613b1757613b1283836001600061526c565b610f6d565b6001546040805160e160020a63310d91f102815261ffff841660048201529051610f6d9286928692600092600160a060020a03169163621b23e291602480830192602092919082900301818787803b158015613b7257600080fd5b505af1158015613b86573d6000803e3d6000fd5b505050506040513d6020811015613b9c57600080fd5b505161526c565b600160a060020a0382161515613bb857600080fd5b600154604080517fbc735d90000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a03858116602483015284151560448301529151919092169163bc735d9091606480830192600092919082900301818387803b158015613c2d57600080fd5b505af1158015613c41573d6000803e3d6000fd5b50506040805184151581529051600160a060020a03861693503392507f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6001546040805160e060020a63b65afedd02815260ff85166004820181905233602483015291519192600160a060020a03169163b65afedd916044808201926020929091908290030181600087803b158015613ce657600080fd5b505af1158015613cfa573d6000803e3d6000fd5b505050506040513d6020811015613d1057600080fd5b50518015613d9c57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015613d6f57600080fd5b505af1158015613d83573d6000803e3d6000fd5b505050506040513d6020811015613d9957600080fd5b50515b1515613da757600080fd5b600154604080517fa297c1d800000000000000000000000000000000000000000000000000000000815260ff86166004820152600160a060020a0385811660248301529151919092169163a297c1d891604480830192600092919082900301818387803b158015610ac457600080fd5b600154604080517f8a27bf5900000000000000000000000000000000000000000000000000000000815261ffff85166004820181905233602483015291519192600160a060020a031691638a27bf59916044808201926020929091908290030181600087803b158015613e8957600080fd5b505af1158015613e9d573d6000803e3d6000fd5b505050506040513d6020811015613eb357600080fd5b50518015613f3f57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015613f1257600080fd5b505af1158015613f26573d6000803e3d6000fd5b505050506040513d6020811015613f3c57600080fd5b50515b1515613f4a57600080fd5b6001546040805160e160020a63310d91f102815261ffff86166004820181905291519192600160a060020a03169163621b23e2916024808201926020929091908290030181600087803b158015613fa057600080fd5b505af1158015613fb4573d6000803e3d6000fd5b505050506040513d6020811015613fca57600080fd5b5051600160a060020a03166000805160206157ee8339815191521415613fef57600080fd5b600154604080517ff4e3be2d00000000000000000000000000000000000000000000000000000000815261ffff871660048201529051600160a060020a039092169163f4e3be2d916024808201926020929091908290030181600087803b15801561405957600080fd5b505af115801561406d573d6000803e3d6000fd5b505050506040513d602081101561408357600080fd5b5051600160a060020a03166000805160206157ee83398151915214156140a857600080fd5b600154604080517f2a19642c00000000000000000000000000000000000000000000000000000000815261ffff87166004820152600160a060020a03868116602483015291519190921691632a19642c91604480830192600092919082900301818387803b158015611f5e57600080fd5b6000614126858585611f7d565b61413884600160a060020a0316615264565b15612035576040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a038881166024850152604484018790526080606485019081528651608486015286519189169463150b7a0294938b938a938a93909160a490910190602085019080838360005b838110156141d05781810151838201526020016141b8565b50505050905090810190601f1680156141fd5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561421f57600080fd5b505af1158015614233573d6000803e3d6000fd5b505050506040513d602081101561424957600080fd5b50519050600160e060020a031981167f150b7a02000000000000000000000000000000000000000000000000000000001461203557600080fd5b600054600160a060020a0316331461429a57600080fd5b6001546040517fbac55edd00000000000000000000000000000000000000000000000000000000815260606004820190815260648201889052600160a060020a039092169163bac55edd918991899189918991899189918190602481019060448101906084018a8a80828437909101858103845288815260200190508888808284379091018581038352868152602001905086868082843782019150509950505050505050505050600060405180830381600087803b15801561435c57600080fd5b505af1158015614370573d6000803e3d6000fd5b50505050505050505050565b600154604080517ff5af662100000000000000000000000000000000000000000000000000000000815263ffffffff841660048201529051600092600160a060020a03169163f5af662191602480830192602092919082900301818787803b1580156143e757600080fd5b505af11580156143fb573d6000803e3d6000fd5b505050506040513d602081101561441157600080fd5b5051600154604080517f9b350e1200000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051929350600160a060020a0390911691639b350e12916024808201926020929091908290030181600087803b15801561448257600080fd5b505af1158015614496573d6000803e3d6000fd5b505050506040513d60208110156144ac57600080fd5b5051801561453e57506001546040805160e160020a63489bff0502815263ffffffff841660048201523360248201529051600160a060020a0390921691639137fe0a916044808201926020929091908290030181600087803b15801561451157600080fd5b505af1158015614525573d6000803e3d6000fd5b505050506040513d602081101561453b57600080fd5b50515b151561454957600080fd5b6001546040805160e160020a63310d91f102815263ffffffff841660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b15801561459f57600080fd5b505af11580156145b3573d6000803e3d6000fd5b505050506040513d60208110156145c957600080fd5b5051600160a060020a03166000805160206157ee83398151915214156145ee57600080fd5b600154604080517fc6d761d400000000000000000000000000000000000000000000000000000000815263ffffffff851660048201529051600160a060020a039092169163c6d761d49160248082019260009290919082900301818387803b158015610df557600080fd5b6001546040805160e160020a63489bff0502815263ffffffff8516600482015233602482015290518492600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b1580156146b457600080fd5b505af11580156146c8573d6000803e3d6000fd5b505050506040513d60208110156146de57600080fd5b5051801561476a57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b15801561473d57600080fd5b505af1158015614751573d6000803e3d6000fd5b505050506040513d602081101561476757600080fd5b50515b151561477557600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8616600482015290518592600160a060020a03169163621b23e29160248083019260209291908290030181600087803b1580156147ca57600080fd5b505af11580156147de573d6000803e3d6000fd5b505050506040513d60208110156147f457600080fd5b5051600160a060020a03166000805160206157ee833981519152141561481957600080fd5b6001546040805160e160020a63310d91f102815263ffffffff861660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b15801561486f57600080fd5b505af1158015614883573d6000803e3d6000fd5b505050506040513d602081101561489957600080fd5b5051600160a060020a03166000805160206157ee83398151915214156148be57600080fd5b6148c88484612762565b15156148d357600080fd5b600154604080517fa634585900000000000000000000000000000000000000000000000000000000815263ffffffff8088166004830152861660248201529051600160a060020a039092169163a63458599160448082019260009290919082900301818387803b158015611f5e57600080fd5b6001546040805160e160020a63310d91f102815263ffffffff8416600482015290516000928492600160a060020a039091169163621b23e29160248082019260209290919082900301818887803b1580156149a057600080fd5b505af11580156149b4573d6000803e3d6000fd5b505050506040513d60208110156149ca57600080fd5b5051600160a060020a03166000805160206157ee83398151915214156149ef57600080fd5b600154604080517ff5af662100000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a039092169163f5af6621916024808201926020929091908290030181600087803b158015614a5b57600080fd5b505af1158015614a6f573d6000803e3d6000fd5b505050506040513d6020811015614a8557600080fd5b5051600154604080517f9b350e1200000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051929450600160a060020a0390911691639b350e12916024808201926020929091908290030181600087803b158015614af657600080fd5b505af1158015614b0a573d6000803e3d6000fd5b505050506040513d6020811015614b2057600080fd5b50518015614bb257506001546040805160e160020a63489bff0502815263ffffffff851660048201523360248201529051600160a060020a0390921691639137fe0a916044808201926020929091908290030181600087803b158015614b8557600080fd5b505af1158015614b99573d6000803e3d6000fd5b505050506040513d6020811015614baf57600080fd5b50515b1515614bbd57600080fd5b6001546040805160e160020a63310d91f102815263ffffffff851660048201529051600160a060020a039092169163621b23e2916024808201926020929091908290030181600087803b158015614c1357600080fd5b505af1158015614c27573d6000803e3d6000fd5b505050506040513d6020811015614c3d57600080fd5b5051600160a060020a03166000805160206157ee8339815191521415614c6257600080fd5b600154604080517f1306318000000000000000000000000000000000000000000000000000000000815263ffffffff861660048201529051600160a060020a039092169163130631809160248082019260009290919082900301818387803b158015610ac457600080fd5b6001546040805160e160020a63489bff0502815263ffffffff8416600482015233602482015290518392600160a060020a031691639137fe0a9160448083019260209291908290030181600087803b158015614d2857600080fd5b505af1158015614d3c573d6000803e3d6000fd5b505050506040513d6020811015614d5257600080fd5b50518015614dde57506001546040805160e060020a635e19b30502815263ffffffff841660048201529051600160a060020a0390921691635e19b305916024808201926020929091908290030181600087803b158015614db157600080fd5b505af1158015614dc5573d6000803e3d6000fd5b505050506040513d6020811015614ddb57600080fd5b50515b15156145ee57600080fd5b606080826401000000008110614dfe57600080fd5b60408051606081018252602e81527f68747470733a2f2f617a696d7574682e6e6574776f726b2f6572633732312f3060208201527f3030303030303030302e6a736f6e0000000000000000000000000000000000009181019190915292508291507fff00000000000000000000000000000000000000000000000000000000000000600a633b9aca0086040660300160f860020a0216600081901a603f84015350600a6305f5e10085040660300160f860020a02826020815181101515614ec157fe5b906020010190600160f860020a031916908160001a905350600a6298968085040660300160f860020a02826021815181101515614efa57fe5b906020010190600160f860020a031916908160001a905350600a620f424085040660300160f860020a02826022815181101515614f3357fe5b906020010190600160f860020a031916908160001a905350600a620186a085040660300160f860020a02826023815181101515614f6c57fe5b906020010190600160f860020a031916908160001a905350600a61271085040660300160f860020a02826024815181101515614fa457fe5b906020010190600160f860020a031916908160001a905350600a6103e885040660300160f860020a02826025815181101515614fdc57fe5b906020010190600160f860020a031916908160001a905350600a606485040660300160f860020a0282602681518110151561501357fe5b906020010190600160f860020a031916908160001a905350600a8085040660300160f860020a0282602781518110151561504957fe5b906020010190600160f860020a031916908160001a905350600a840660300160f860020a0282602881518110151561507d57fe5b906020010190600160f860020a031916908160001a9053505050919050565b600154600160a060020a031681565b600554600160a060020a031681565b600254600160a060020a031681565b600154604080517fb6363cf2000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015284811660248301529151600093929092169163b6363cf29160448082019260209290919082900301818787803b158015610f1e57600080fd5b600354600160a060020a031681565b6001546040805160e060020a639397640502815263ffffffff85166004820152905160009283928392600160a060020a039092169163939764059160248082019260209290919082900301818787803b1580156151a757600080fd5b505af11580156151bb573d6000803e3d6000fd5b505050506040513d60208110156151d157600080fd5b5051915060008260028111156151e357fe5b14156151f25760ff92506129d1565b600182600281111561520057fe5b141561523857506301e13380635c2aad7f19840104600681101561522d578060020a610400029250615233565b61ffff92505b6129d1565b600092506129d1565b600054600160a060020a0316331461525857600080fd5b61526181615770565b50565b6000903b1190565b600154604080517fc17ad9d800000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a039092169163c17ad9d89160248082019260009290919082900301818387803b1580156152d757600080fd5b505af11580156152eb573d6000803e3d6000fd5b50505050811561544757600154604080517f7bc702a100000000000000000000000000000000000000000000000000000000815263ffffffff871660048201529051600160a060020a0390921691637bc702a19160248082019260009290919082900301818387803b15801561536057600080fd5b505af1158015615374573d6000803e3d6000fd5b5050600154604080517fddc3595000000000000000000000000000000000000000000000000000000000815263ffffffff89166004820152600160a060020a038881166024830152915191909216935063ddc359509250604480830192600092919082900301818387803b1580156153eb57600080fd5b505af11580156153ff573d6000803e3d6000fd5b505050508363ffffffff1683600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f77565b600154604080517fddc3595000000000000000000000000000000000000000000000000000000000815263ffffffff87166004820152600160a060020a0384811660248301529151919092169163ddc3595091604480830192600092919082900301818387803b1580156154ba57600080fd5b505af11580156154ce573d6000803e3d6000fd5b50506001546040805160e260020a630b1ee95902815263ffffffff89166004820152600160a060020a0388811660248301529151919092169350632c7ba5649250604480830192600092919082900301818387803b15801561552f57600080fd5b505af1158015615543573d6000803e3d6000fd5b505050508363ffffffff1681600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48363ffffffff1683600160a060020a031682600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b600154604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b15801561563a57600080fd5b505af115801561564e573d6000803e3d6000fd5b5050600254604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b1580156156b957600080fd5b505af11580156156cd573d6000803e3d6000fd5b5050505080600160a060020a0316631824a46b6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561570f57600080fd5b505af1158015615723573d6000803e3d6000fd5b505060408051600160a060020a038516815290517fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b9350908190036020019150a180600160a060020a0316ff5b600160a060020a038116151561578557600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905556000000000000000000000000001111111111111111111111111111111111111111a165627a7a723058209715be9a1e6921ddf1d293fcc3c2fc481241433aaa74738c5c2ff43607d2d09e0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009ef27de616154ff8b38893c59522b69c7ba8a81c000000000000000000000000223c067f8cf28ae173ee5cafea60ca44c335fecb0000000000000000000000007fecab617c868bb5996d99d95200d2fa708218e40000000000000000000000001df4ea30e0b1359c9692a161c5f30cd1a6b64ebf
-----Decoded View---------------
Arg [0] : _previous (address): 0x9ef27de616154FF8B38893C59522b69c7Ba8A81c
Arg [1] : _azimuth (address): 0x223c067F8CF28ae173EE5CafEa60cA44C335fecB
Arg [2] : _polls (address): 0x7fEcaB617c868Bb5996d99D95200D2Fa708218e4
Arg [3] : _claims (address): 0x1Df4eA30e0b1359C9692a161c5F30CD1a6b64ebf
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000009ef27de616154ff8b38893c59522b69c7ba8a81c
Arg [1] : 000000000000000000000000223c067f8cf28ae173ee5cafea60ca44c335fecb
Arg [2] : 0000000000000000000000007fecab617c868bb5996d99d95200d2fa708218e4
Arg [3] : 0000000000000000000000001df4ea30e0b1359c9692a161c5f30cd1a6b64ebf
Deployed Bytecode Sourcemap
81630:31258:0:-;;;;;;;;;-1:-1:-1;;;81630:31258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6419:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6419:148:0;-1:-1:-1;;;;;;6419:148:0;;;;;;;;;;;;;;;;;;;;;;;108860:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;108860:166:0;;;;;;;;;;;88345:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;88345:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;88345:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102067:388;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;102067:388:0;;;;;;;87563:352;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;87563:352:0;;;;;;;;;-1:-1:-1;;;;;87563:352:0;;;;;;;;;;;;;;86876:165;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;86876:165:0;-1:-1:-1;;;;;86876:165:0;;;;;;;111098:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;111098:120:0;;;;;78369:292;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78369:292:0;;;;5850:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5850:54:0;;;;;;;;-1:-1:-1;;;;;;5850:54:0;;;;;;;;;;;;;;95761:3505;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;95761:3505:0;;;;;-1:-1:-1;;;;;95761:3505:0;;;;;;;;;86405:359;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;86405:359:0;-1:-1:-1;;;;;86405:359:0;;;;;;;;;;;;111397:895;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;111397:895:0;;;;;-1:-1:-1;;;;;111397:895:0;;;;;83342:88;;8:9:-1;5:2;;;30:1;27;20:12;5:2;83342:88:0;;;;107315:601;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;107315:601:0;;;;;-1:-1:-1;;;;;107315:601:0;;;;;85310:196;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;85310:196:0;-1:-1:-1;;;;;85310:196:0;;;;;;;;;;;;89936:589;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;89936:589:0;;;;;;;;;;;;;;;;;;;;;;103676:1958;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;103676:1958:0;;;;;;;;;;;;85020:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;85020:203:0;;;;;109357:557;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;109357:557:0;;;;;-1:-1:-1;;;;;109357:557:0;;;;;;;;;110425:420;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;110425:420:0;-1:-1:-1;;;;;110425:420:0;;;;;84571:373;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;84571:373:0;;;;;110081:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;110081:192:0;;;;;;;;;;;;;84307:188;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;84307:188:0;-1:-1:-1;;;;;84307:188:0;;;;;;;;;;;;;;;;;;;;;1314:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1314:114:0;;;;105967:197;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;105967:197:0;;;;;-1:-1:-1;;;;;105967:197:0;;;;;519:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;519:20:0;;;;88532:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;88532:104:0;;;;108331:320;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;108331:320:0;;;;;-1:-1:-1;;;;;108331:320:0;;;;;91133:2140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;91133:2140:0;;;;;-1:-1:-1;;;;;91133:2140:0;;;;;87232:247;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;87232:247:0;-1:-1:-1;;;;;87232:247:0;;;;;;;;;106906:165;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;106906:165:0;;;;;-1:-1:-1;;;;;106906:165:0;;;;;106446:267;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;106446:267:0;;;;;-1:-1:-1;;;;;106446:267:0;;;;;85661:598;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;85661:598:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;85661:598:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;85661:598:0;;-1:-1:-1;85661:598:0;;-1:-1:-1;;;;;;;85661:598:0;112300:186;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;112300:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101105:399;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;101105:399:0;;;;;;;99622:368;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;99622:368:0;;;;;;;;;;;;100427:453;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;100427:453:0;;;;;;;100074:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;100074:137:0;;;;;;;88720:888;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;88720:888:0;;;;;55654:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55654:22:0;;;;83510:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;83510:20:0;;;;77625:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77625:18:0;;;;88041:182;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;88041:182:0;-1:-1:-1;;;;;88041:182:0;;;;;;;;;;77862:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;77862:31:0;;;;102634:955;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;102634:955:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1596:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1596:105:0;-1:-1:-1;;;;;1596:105:0;;;;;6419:148;-1:-1:-1;;;;;;6528:33:0;6505:4;6528:33;;;:19;:33;;;;;;;;;6419:148::o;108860:166::-;56917:7;;:37;;;-1:-1:-1;;;;;56917:37:0;;56857:155;;;56917:37;;;;;;56943:10;56917:37;;;;;;56857:155;;-1:-1:-1;;;;;56917:7:0;;:17;;:37;;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56917:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56917:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56917:37:0;:79;;;;-1:-1:-1;56972:7:0;;:24;;;-1:-1:-1;;;;;56972:24:0;;;;;;;;;;;-1:-1:-1;;;;;56972:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56972:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56972:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56972:24:0;56917:79;56908:90;;;;;;;;108984:5;;:34;;;;;;;;;;;;;;-1:-1:-1;;;;;108984:5:0;;;;:23;;:34;;;;;:5;;:34;;;;;;;;:5;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;108984:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;108984:34:0;;;;108860:166;;;:::o;88345:113::-;88427:23;;;;;;;;;;;;;;;;;88345:113;:::o;102067:388::-;102145:7;;:26;;;;;;;;;;;;;;;102128:14;;-1:-1:-1;;;;;102145:7:0;;:18;;:26;;;;;;;;;;;;;;102128:14;102145:7;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;102145:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;102145:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;102145:26:0;102189:7;;:26;;;;;;;;;;;;;;;102145;;-1:-1:-1;;;;;;102189:7:0;;;;:18;;:26;;;;;102145;;102189;;;;;;;;:7;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;102189:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;102189:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;102189:26:0;:84;;;;-1:-1:-1;102235:7:0;;:38;;;-1:-1:-1;;;;;102235:38:0;;;;;;;;;102262:10;102235:38;;;;;;-1:-1:-1;;;;;102235:7:0;;;;:17;;:38;;;;;;;;;;;;;;;:7;;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;102235:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;102235:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;102235:38:0;102189:84;102180:95;;;;;;;;102311:7;;:25;;;-1:-1:-1;;;;;102311:25:0;;;;;;;;;;;-1:-1:-1;;;;;102311:7:0;;;;:16;;:25;;;;;;;;;;;;;;;:7;;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;102311:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;102311:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;102311:25:0;-1:-1:-1;;;;;102293:43:0;-1:-1:-1;;;;;;;;;;;102293:43:0;;102284:54;;;;;;102420:7;;:27;;;;;;;;;;;;;;;-1:-1:-1;;;;;102420:7:0;;;;:19;;:27;;;;;:7;;:27;;;;;;;;:7;;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;102420:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;102420:27:0;;;;102067:388;;:::o;87563:352::-;87674:16;87648:8;112682:11;112676:17;;112668:26;;;;;;87814:7;;:34;;;-1:-1:-1;;;;;87814:34:0;;;;;;;;;;;-1:-1:-1;;;;;87814:7:0;;;;:16;;:34;;;;;;;;;;;;;;;:7;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;87814:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;87814:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;87814:34:0;87806:43;;;;;;;;87865:7;;:42;;;;;;;;;;;;;;;-1:-1:-1;;;;;87865:7:0;;;;:24;;:42;;;;;;;;;;;;;;;:7;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;87865:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;87865:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;87865:42:0;;87563:352;-1:-1:-1;;;87563:352:0:o;86876:165::-;86964:8;112682:11;112676:17;;112668:26;;;;;;86988:45;87012:8;87023:9;86988:16;:45::i;:::-;86876:165;;;:::o;111098:120::-;111175:5;;:35;;;;;;;;;;;;;;-1:-1:-1;;;;;111175:5:0;;;;:24;;:35;;;;;;;;;;;;;;;:5;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;111175:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;111175:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;78369:292:0;78557:16;;-1:-1:-1;;;;;78557:16:0;78543:10;:30;:71;;;;;78599:7;;;;;;;;;-1:-1:-1;;;;;78599:7:0;-1:-1:-1;;;;;78599:13:0;;:15;;;;;-1:-1:-1;;;78599:15:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78599:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;78599:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78599:15:0;-1:-1:-1;;;;;78591:23:0;:4;:23;78543:71;:110;;;;;78640:5;;;;;;;;;-1:-1:-1;;;;;78640:5:0;-1:-1:-1;;;;;78640:11:0;;:13;;;;;-1:-1:-1;;;78640:13:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;78640:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;78640:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;78640:13:0;-1:-1:-1;;;;;78632:21:0;:4;:21;78543:110;78534:121;;;;;;;;78369:292::o;5850:54::-;;;:::o;95761:3505::-;96025:7;;:39;;;;;;;;;;;;;96053:10;96025:39;;;;;;96986:11;;-1:-1:-1;;;;;96025:7:0;;:19;;:39;;;;;;;;;;;;;;96986:11;96025:7;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;96025:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;96025:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;96025:39:0;96017:48;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;96185:25:0;;;;;:160;;-1:-1:-1;96232:7:0;;:28;;;-1:-1:-1;;;;;96232:28:0;;;;;;;;;;;96264:19;;-1:-1:-1;;;;;96232:7:0;;:20;;:28;;;;;;;;;;;;;;96264:19;96232:7;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;96232:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;96232:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;96232:28:0;:51;;;;;;;;;;:111;;;;-1:-1:-1;96306:7:0;;:24;;;-1:-1:-1;;;;;96306:24:0;;;;;;;;;;;:37;;-1:-1:-1;;;;;96306:7:0;;:16;;:24;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;96306:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;96306:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;96306:24:0;-1:-1:-1;;;;;96306:35:0;;:37::i;:::-;96305:38;96232:111;96176:171;;;;;;;;96510:7;;:24;;;-1:-1:-1;;;;;96510:24:0;;;;;;;;;;;-1:-1:-1;;;;;96510:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;96510:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;96510:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;96510:24:0;96509:25;96504:90;;;96555:7;;:29;;;;;;;;;;;;;;;-1:-1:-1;;;;;96555:7:0;;;;:21;;:29;;;;;:7;;:29;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;96555:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;96555:29:0;;;;96504:90;96842:7;;:32;;;-1:-1:-1;;;;;96842:32:0;;;;;;;;;-1:-1:-1;;;;;96842:32:0;;;;;;;;;:7;;;;;:15;;:32;;;;;;;;;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;96842:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;96842:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;96842:32:0;96841:33;96836:627;;;97000:7;;:24;;;-1:-1:-1;;;;;97000:24:0;;;;;;;;;;;-1:-1:-1;;;;;97000:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;97000:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;97000:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;97000:24:0;97037:7;;:33;;;;;;;;;;;;;-1:-1:-1;;;;;97037:33:0;;;;;;;;;97000:24;;-1:-1:-1;97037:7:0;;;:16;;:33;;;;;:7;;:33;;;;;;;;:7;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;97037:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;97361:7:0;;:35;;;-1:-1:-1;;;;;97361:35:0;;;;;;;;;:7;:35;;;;;;;;-1:-1:-1;;;;;97361:7:0;;;;-1:-1:-1;97361:24:0;;-1:-1:-1;97361:35:0;;;;;;;;;;;:7;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;97361:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;97361:35:0;;;;97445:6;97437:15;;97428:7;-1:-1:-1;;;;;97414:39:0;97423:3;-1:-1:-1;;;;;97414:39:0;;;;;;;;;;;96836:627;-1:-1:-1;;;;;;;;;;;;;;;;97582:25:0;;;97577:1682;;;97628:7;;:32;;;;;;;;;;;;;:7;:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;97628:7:0;;;;:15;;:32;;;;;:7;;:32;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;97628:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;97671:7:0;;:37;;;;;;;;;;;;;:7;:37;;;;;;;;-1:-1:-1;;;;;97671:7:0;;;;-1:-1:-1;97671:26:0;;-1:-1:-1;97671:37:0;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;97671:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;97719:7:0;;:33;;;;;;;;;;;;;:7;:33;;;;;;;;-1:-1:-1;;;;;97719:7:0;;;;-1:-1:-1;97719:22:0;;-1:-1:-1;97719:33:0;;;;;;;;;;;:7;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;97719:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;97763:7:0;;:35;;;-1:-1:-1;;;;;97763:35:0;;;;;;;;;:7;:35;;;;;;;;-1:-1:-1;;;;;97763:7:0;;;;-1:-1:-1;97763:24:0;;-1:-1:-1;97763:35:0;;;;;;;;;;;:7;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;97763:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;97809:7:0;;:32;;;;;;;;;;;;;:7;:32;;;;;;;;-1:-1:-1;;;;;97809:7:0;;;;-1:-1:-1;97809:21:0;;-1:-1:-1;97809:32:0;;;;;;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;97809:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;97852:6:0;;:26;;;;;;;;;;;;;;;-1:-1:-1;;;;;97852:6:0;;;;-1:-1:-1;97852:18:0;;-1:-1:-1;97852:26:0;;;;;:6;;:26;;;;;;;;:6;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;97852:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;97889:7:0;;:28;;;;;;;;;;;;;;;-1:-1:-1;;;;;97889:7:0;;;;-1:-1:-1;97889:20:0;;-1:-1:-1;97889:28:0;;;;;:7;;:28;;;;;;;;:7;;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;97889:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;97889:28:0;;;;97577:1682;;;98046:6;98041:1218;;;98214:7;;:29;;;-1:-1:-1;;;;;98214:29:0;;;;;;;;;;;-1:-1:-1;;;;;98214:7:0;;;;:21;;:29;;;;;;;;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;98214:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;98214:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;98214:29:0;98209:157;;;98268:7;;:41;;;;;;;;;;;;;;;-1:-1:-1;;;;;98268:7:0;;;;:33;;:41;;;;;:7;;:41;;;;;;;;:7;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;98268:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;98322:7:0;;:32;;;;;;;;;;;;;:7;:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;98322:7:0;;;;-1:-1:-1;98322:15:0;;-1:-1:-1;98322:32:0;;;;;;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;98322:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;98322:32:0;;;;98209:157;98426:7;;:37;;;;;;;;;;;;;:7;:37;;;;;;;;-1:-1:-1;;;;;98426:7:0;;;;:26;;:37;;;;;:7;;:37;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;98426:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;98520:7:0;;:33;;;;;;;;;;;;;:7;:33;;;;;;;;-1:-1:-1;;;;;98520:7:0;;;;-1:-1:-1;98520:22:0;;-1:-1:-1;98520:33:0;;;;;;;;;;;:7;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;98520:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;98872:7:0;;:35;;;-1:-1:-1;;;;;98872:35:0;;;;;;;;;:7;:35;;;;;;;;-1:-1:-1;;;;;98872:7:0;;;;-1:-1:-1;98872:24:0;;-1:-1:-1;98872:35:0;;;;;;;;;;;:7;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;98872:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;99075:7:0;;:29;;;;;;;;;;;;;;;-1:-1:-1;;;;;99075:7:0;;;;-1:-1:-1;99075:21:0;;-1:-1:-1;99075:29:0;;;;;;;;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;99075:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;99075:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;99075:29:0;-1:-1:-1;;;;;99057:47:0;-1:-1:-1;;;;;;;;;;;99057:47:0;99052:121;;99129:7;;:32;;;;;;;;;;;;;:7;:32;;;;;;;;-1:-1:-1;;;;;99129:7:0;;;;:21;;:32;;;;;:7;;:32;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;99129:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;99129:32:0;;;;99052:121;99223:6;;:26;;;;;;;;;;;;;;;-1:-1:-1;;;;;99223:6:0;;;;:18;;:26;;;;;:6;;:26;;;;;;;;:6;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;99223:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;99223:26:0;;;;98041:1218;95761:3505;;;;:::o;86405:359::-;86531:9;86507:8;112682:11;112676:17;;112668:26;;;;;;86576:7;;:26;;;-1:-1:-1;;;;;86576:26:0;;;;;;;;;-1:-1:-1;;;;;86576:26:0;;;;;;;;;86550:8;;-1:-1:-1;86576:7:0;;;;;:15;;:26;;;;;;;;;;;;;;:7;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;86576:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;86576:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;86576:26:0;86568:35;;;;;;;;86728:28;86742:2;86746:3;86751:4;86728:13;:28::i;:::-;86405:359;;;;;:::o;111397:895::-;1022:5;;-1:-1:-1;;;;;1022:5:0;1008:10;:19;1000:28;;;;;;111643:7;;:29;;;-1:-1:-1;;;;;111643:29:0;;;;;;;;;:7;:29;;;;;;;;-1:-1:-1;;;;;111643:7:0;;;;:15;;:29;;;;;;;;;;;;;;;;;;:7;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;111643:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;111643:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;111643:29:0;:63;;;;-1:-1:-1;;;;;;111692:14:0;;;;111643:63;111634:74;;;;;;;;111780:5;;;;;;;;;-1:-1:-1;;;;;111780:5:0;-1:-1:-1;;;;;111780:26:0;;:28;;;;;-1:-1:-1;;;111780:28:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;111780:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;;;;111961:21:0;;:10;:21;111957:328;;;112002:36;112010:7;112002:36;;112019:7;112028:4;112034:3;112002:7;:36::i;:::-;111957:328;;;112231:44;112239:7;112231:44;;112248:7;112257:5;112264:10;112231:7;:44::i;:::-;111397:895;;:::o;83342:88::-;-1:-1:-1;;;;;;;;;;;83342:88:0;:::o;107315:601::-;112841:7;;:24;;;-1:-1:-1;;;;;112841:24:0;;;;;;;;;;;107472:13;;107406:6;;-1:-1:-1;;;;;112841:7:0;;;;:16;;:24;;;;;;;;;;;;;;;107472:13;112841:7;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;112841:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;112841:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;112841:24:0;-1:-1:-1;;;;;112823:42:0;-1:-1:-1;;;;;;;;;;;112823:42:0;;112814:53;;;;;;107488:7;;:24;;;-1:-1:-1;;;;;107488:24:0;;;;;;;;;;;-1:-1:-1;;;;;107488:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;107488:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;107488:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;107488:24:0;;-1:-1:-1;;;;;;107616:19:0;;107625:10;107616:19;;107615:62;;-1:-1:-1;107640:7:0;;:37;;;;;;-1:-1:-1;;;;;107640:37:0;;;;;;;107666:10;107640:37;;;;;;:7;;;;;:18;;:37;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;107640:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;107640:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;107640:37:0;107615:62;107607:71;;;;;;;;107755:7;;:48;;;-1:-1:-1;;;;;107755:48:0;;;;;;;;;-1:-1:-1;;;;;107755:48:0;;;;;;;;;:7;;;;;:24;;:48;;;;;:7;;:48;;;;;;;:7;;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;107755:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;107755:48:0;;;;107900:6;107892:15;;107876:14;-1:-1:-1;;;;;107860:48:0;107869:5;-1:-1:-1;;;;;107860:48:0;;;;;;;;;;;107315:601;;;;:::o;85310:196::-;85456:42;85473:5;85480:3;85485:8;85456:42;;;;;;;;;;;;;:16;:42::i;89936:589::-;56323:7;;:37;;;-1:-1:-1;;;;;56323:37:0;;;;;;;;;56349:10;56323:37;;;;;;90229:6;;-1:-1:-1;;;;;56323:7:0;;:17;;:37;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56323:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56323:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56323:37:0;:79;;;;-1:-1:-1;56378:7:0;;:24;;;-1:-1:-1;;;;;56378:24:0;;;;;;;;;;;-1:-1:-1;;;;;56378:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56378:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56378:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56378:24:0;56323:79;56314:90;;;;;;;;112841:7;;:24;;;-1:-1:-1;;;;;112841:24:0;;;;;;;;;;;90249:6;;-1:-1:-1;;;;;112841:7:0;;:16;;:24;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;112841:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;112841:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;112841:24:0;-1:-1:-1;;;;;112823:42:0;-1:-1:-1;;;;;;;;;;;112823:42:0;;112814:53;;;;;;90275:14;90271:89;;;90309:7;;:41;;;;;;;;;;;;;;;-1:-1:-1;;;;;90309:7:0;;;;:33;;:41;;;;;:7;;:41;;;;;;;;:7;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;90309:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;90309:41:0;;;;90271:89;90368:7;;:149;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;90368:7:0;;;;:15;;:149;;;;;:7;;:149;;;;;;;;:7;;:149;;;5:2:-1;;;;30:1;27;20:12;5:2;90368:149:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;90368:149:0;;;;56411:1;89936:589;;;;;;:::o;103676:1958::-;103878:7;;:31;;;-1:-1:-1;;;;;103878:31:0;;;;;;;;;;;103771:14;;;;;;-1:-1:-1;;;;;103878:7:0;;;;:21;;:31;;;;;;;;;;;;;;;103771:14;103878:7;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;103878:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;103878:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;103878:31:0;103877:32;103872:52;;;103919:5;103912:12;;;;103872:52;105009:7;;:28;;;-1:-1:-1;;;;;105009:28:0;;;;;;;;;;;-1:-1:-1;;;;;105009:7:0;;;;:20;;:28;;;;;;;;;;;;;;;:7;;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;105009:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;105009:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;105009:28:0;105073:7;;:30;;;-1:-1:-1;;;;;105073:30:0;;;;;;;;;;;105009:28;;-1:-1:-1;;;;;;105073:7:0;;;;:20;;:30;;;;;105009:28;;105073:30;;;;;;;;:7;;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;105073:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;105073:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;105073:30:0;;-1:-1:-1;105233:9:0;105227:16;;;;;;;;105199:44;;105206:11;105200:18;;;;;;;;105221:1;105200:22;105199:44;;;105197:427;;;;105361:9;105346:24;;;;;;;;:11;:24;;;;;;;;;105345:277;;;;-1:-1:-1;105593:7:0;;:29;;;-1:-1:-1;;;;;105593:29:0;;;;;;;;;;;-1:-1:-1;;;;;105593:7:0;;;;:21;;:29;;;;;;;;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;105593:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;105593:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;105593:29:0;105592:30;105345:277;105112:514;;103676:1958;;;;;;;:::o;85020:203::-;85096:14;85147:11;85136:8;:22;85135:78;;;;-1:-1:-1;85179:7:0;;:34;;;-1:-1:-1;;;;;85179:34:0;;;;;;;;;;;-1:-1:-1;;;;;85179:7:0;;;;:16;;:34;;;;;;;;;;;;;;;:7;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;85179:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;85179:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;85179:34:0;85135:78;85126:89;85020:203;-1:-1:-1;;85020:203:0:o;109357:557::-;56917:7;;:37;;;-1:-1:-1;;;;;56917:37:0;;56857:155;;;56917:37;;;;;;56943:10;56917:37;;;;;;109646:13;;-1:-1:-1;;;;;56917:7:0;;:17;;:37;;;;;;;;;;;;;;109646:13;56917:7;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56917:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56917:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56917:37:0;:79;;;;-1:-1:-1;56972:7:0;;:24;;;-1:-1:-1;;;;;56972:24:0;;;;;;;;;;;-1:-1:-1;;;;;56972:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56972:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56972:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56972:24:0;56917:79;56908:90;;;;;;;;109662:5;;:48;;;;;;;;;;;;;-1:-1:-1;;;;;109662:48:0;;;;;;;;;;;;;;;;:5;;;;;:21;;:48;;;;;;;;;;;;;;:5;;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;109662:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;109662:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;109662:48:0;;-1:-1:-1;109847:60:0;;;;109879:18;109887:9;109879:7;:18::i;110425:420::-;110607:5;;:34;;;;;;-1:-1:-1;;;;;110607:34:0;;;;;;;;;110591:13;;110607:5;;;;;:23;;:34;;;;;;;;;;;;;;;110591:13;110607:5;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;110607:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;110607:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;110607:34:0;;-1:-1:-1;110778:60:0;;;;110810:18;110818:9;110810:7;:18::i;84571:373::-;84678:13;;84652:8;112682:11;112676:17;;112668:26;;;;;;84877:7;;:20;;;-1:-1:-1;;;;;84877:20:0;;;;;;;;;;;84726:8;;-1:-1:-1;;;;;;84877:7:0;;;;:16;;:20;;;;;;;;;;;;;;;:7;;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;84877:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;84877:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;84877:20:0;84869:29;;;;;;;;84916:7;;:20;;;-1:-1:-1;;;;;84916:20:0;;;;;;;;;;;-1:-1:-1;;;;;84916:7:0;;;;:16;;:20;;;;;;;;;;;;;;;:7;;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;84916:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;84916:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;84916:20:0;;84571:373;-1:-1:-1;;;;84571:373:0:o;110081:192::-;56917:7;;:37;;;-1:-1:-1;;;;;56917:37:0;;56857:155;;;56917:37;;;;;;56943:10;56917:37;;;;;;56857:155;;-1:-1:-1;;;;;56917:7:0;;:17;;:37;;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56917:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56917:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56917:37:0;:79;;;;-1:-1:-1;56972:7:0;;:24;;;-1:-1:-1;;;;;56972:24:0;;;;;;;;;;;-1:-1:-1;;;;;56972:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56972:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56972:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56972:24:0;56917:79;56908:90;;;;;;;;110216:5;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;110216:5:0;;;;:22;;:49;;;;;;;;;;;;;;;:5;;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;110216:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;110216:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;84307:188:0;84384:15;-1:-1:-1;;;;;84423:13:0;;;;84415:22;;;;;;84453:7;;:34;;;;;;-1:-1:-1;;;;;84453:34:0;;;;;;;;;:7;;;;;:26;;:34;;;;;;;;;;;;;;:7;;:34;;;5:2:-1;;;;30:1;27;20:12;1314:114:0;1022:5;;-1:-1:-1;;;;;1022:5:0;1008:10;:19;1000:28;;;;;;1391:5;;;1372:25;;-1:-1:-1;;;;;1391:5:0;;;;1372:25;;;1420:1;1404:18;;-1:-1:-1;;1404:18:0;;;1314:114::o;105967:197::-;56323:7;;:37;;;-1:-1:-1;;;;;56323:37:0;;;;;;;;;56349:10;56323:37;;;;;;106070:6;;-1:-1:-1;;;;;56323:7:0;;:17;;:37;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56323:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56323:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56323:37:0;:79;;;;-1:-1:-1;56378:7:0;;:24;;;-1:-1:-1;;;;;56378:24:0;;;;;;;;;;;-1:-1:-1;;;;;56378:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56378:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56378:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56378:24:0;56323:79;56314:90;;;;;;;;112841:7;;:24;;;-1:-1:-1;;;;;112841:24:0;;;;;;;;;;;106090:6;;-1:-1:-1;;;;;112841:7:0;;:16;;:24;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;112841:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;112841:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;112841:24:0;-1:-1:-1;;;;;112823:42:0;-1:-1:-1;;;;;;;;;;;112823:42:0;;112814:53;;;;;;106112:7;;:44;;;;;;;;;;;;;-1:-1:-1;;;;;106112:44:0;;;;;;;;;:7;;;;;:26;;:44;;;;;:7;;:44;;;;;;;:7;;:44;;;5:2:-1;;;;30:1;27;20:12;519:20:0;;;-1:-1:-1;;;;;519:20:0;;:::o;88532:104::-;88616:12;;;;;;;;;;;;;;;;;88532:104;:::o;108331:320::-;56917:7;;:37;;;-1:-1:-1;;;;;56917:37:0;;56857:155;;;56917:37;;;;;;56943:10;56917:37;;;;;;56857:155;;-1:-1:-1;;;;;56917:7:0;;:17;;:37;;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56917:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56917:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56917:37:0;:79;;;;-1:-1:-1;56972:7:0;;:24;;;-1:-1:-1;;;;;56972:24:0;;;;;;;;;;;-1:-1:-1;;;;;56972:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56972:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56972:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56972:24:0;56917:79;56908:90;;;;;;;;108595:4;-1:-1:-1;;;;;108555:45:0;:9;-1:-1:-1;;;;;108555:26:0;;:28;;;;;-1:-1:-1;;;108555:28:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;108555:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;108555:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;108555:28:0;-1:-1:-1;;;;;108555:45:0;;108547:54;;;;;;108610:5;;:33;;;;;;-1:-1:-1;;;;;108610:33:0;;;;;;;;;:5;;;;;:22;;:33;;;;;:5;;:33;;;;;;;:5;;:33;;;5:2:-1;;;;30:1;27;20:12;91133:2140:0;91309:7;;:28;;;-1:-1:-1;;;;;91309:28:0;;;;;;;;;91406:13;91309:28;;;;;;;;91406:13;;-1:-1:-1;;;;;91309:7:0;;:15;;:28;;;;;;;;;;;;;;;91406:13;91309:7;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;91309:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;91309:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;91309:28:0;91301:37;;;;;;;;91422:7;;:25;;;;;;;;;;;;;;;-1:-1:-1;;;;;91422:7:0;;;;:17;;:25;;;;;;;;;;;;;;;:7;;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;91422:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;91422:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;91422:25:0;91566:7;;:24;;;-1:-1:-1;;;;;91566:24:0;;;;;;;;;;;91422:25;;-1:-1:-1;;;;;;91566:7:0;;;;:16;;:24;;;;;91422:25;;91566:24;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;91566:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;91566:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;91566:24:0;-1:-1:-1;;;;;91548:42:0;-1:-1:-1;;;;;;;;;;;91548:42:0;;91539:53;;;;;;91628:7;;:29;;;;;;;;;;;;;;;-1:-1:-1;;;;;91628:7:0;;;;:21;;:29;;;;;;;;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;91628:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;91628:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;91628:29:0;-1:-1:-1;;;;;91610:47:0;-1:-1:-1;;;;;;;;;;;91610:47:0;;91601:58;;;;;;92245:7;;:28;;;-1:-1:-1;;;;;92245:28:0;;;;;;;;;;;-1:-1:-1;;;;;92245:7:0;;;;:20;;:28;;;;;;;;;;;;;;;:7;;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;92245:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;92245:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;92245:28:0;92239:35;;;;;;;;92185:7;;:28;;;-1:-1:-1;;;;;92185:28:0;;;;;;;;;;;92178:96;;;;;;-1:-1:-1;;;;;92185:7:0;;;;:20;;:28;;;;;;;;;;;;;;;:7;;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;92185:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;92185:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;92185:28:0;92179:35;;;;;;;;92217:1;92179:39;92178:96;;;92169:107;;;;;;;;92364:7;;:29;;;-1:-1:-1;;;;;92364:29:0;;;;;;;;;;;-1:-1:-1;;;;;92364:7:0;;;;:21;;:29;;;;;;;;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;92364:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;92364:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;92364:29:0;92363:143;;;;;92466:38;92480:6;92466:38;;92488:15;92466:13;:38::i;:::-;92416:7;;:29;;;;;;;;;;;;;;;:88;;;;;;-1:-1:-1;;;;;92416:7:0;;;;:21;;:29;;;;;;;;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;92416:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;92416:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;92416:29:0;:88;;;92363:143;92354:154;;;;;;;;92716:7;;:38;;;;;;;;;;;;;92743:10;92716:38;;;;;;-1:-1:-1;;;;;92716:7:0;;;;:18;;:38;;;;;;;;;;;;;;;:7;;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;92716:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;92716:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;92716:38:0;92707:49;;;;;;;;92909:10;-1:-1:-1;;;;;92909:21:0;;;92905:361;;;92950:35;92958:6;92966:7;92975:4;92981:3;92950:7;:35::i;:::-;92905:361;;;93231:7;;:24;;;-1:-1:-1;;;;;93231:24:0;;;;;;;;;;;93199:57;;93207:6;;93215:7;;93224:5;;-1:-1:-1;;;;;93231:7:0;;:16;;:24;;;;;;;;;;;;;;93224:5;93231:7;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;93231:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;93231:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;93231:24:0;93199:7;:57::i;87232:247::-;-1:-1:-1;;;;;87330:16:0;;;;87322:25;;;;;;87356:7;;:53;;;;;;87376:10;87356:53;;;;-1:-1:-1;;;;;87356:53:0;;;;;;;;;;;;;;;;:7;;;;;:19;;:53;;;;;:7;;:53;;;;;;;:7;;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;87356:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;87423:48:0;;;;;;;;;;-1:-1:-1;;;;;87423:48:0;;;-1:-1:-1;87438:10:0;;-1:-1:-1;87423:48:0;;;;;;;;;87232:247;;:::o;106906:165::-;56917:7;;:37;;;-1:-1:-1;;;;;56917:37:0;;56857:155;;;56917:37;;;;;;56943:10;56917:37;;;;;;56857:155;;-1:-1:-1;;;;;56917:7:0;;:17;;:37;;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56917:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56917:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56917:37:0;:79;;;;-1:-1:-1;56972:7:0;;:24;;;-1:-1:-1;;;;;56972:24:0;;;;;;;;;;;-1:-1:-1;;;;;56972:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56972:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56972:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56972:24:0;56917:79;56908:90;;;;;;;;107024:7;;:39;;;;;;;;;;;;;-1:-1:-1;;;;;107024:39:0;;;;;;;;;:7;;;;;:22;;:39;;;;;:7;;:39;;;;;;;:7;;:39;;;5:2:-1;;;;30:1;27;20:12;106446:267:0;56622:7;;:38;;;;;;56560:158;;;56622:38;;;;;;56649:10;56622:38;;;;;;56560:158;;-1:-1:-1;;;;;56622:7:0;;:18;;:38;;;;;;;;;;;;;;;:7;;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;56622:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56622:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56622:38:0;:80;;;;-1:-1:-1;56678:7:0;;:24;;;-1:-1:-1;;;;;56678:24:0;;;;;;;;;;;-1:-1:-1;;;;;56678:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56678:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56678:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56678:24:0;56622:80;56613:91;;;;;;;;112841:7;;:24;;;-1:-1:-1;;;;;112841:24:0;;112771:114;;;112841:24;;;;;;;;112771:114;;-1:-1:-1;;;;;112841:7:0;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;112841:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;112841:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;112841:24:0;-1:-1:-1;;;;;112823:42:0;-1:-1:-1;;;;;;;;;;;112823:42:0;;112814:53;;;;;;106619:7;;:30;;;;;;;;;;;;;;;-1:-1:-1;;;;;106619:7:0;;;;:21;;:30;;;;;;;;;;;;;;;:7;;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;106619:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;106619:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;106619:30:0;-1:-1:-1;;;;;106601:48:0;-1:-1:-1;;;;;;;;;;;106601:48:0;;106592:59;;;;;;106662:7;;:43;;;;;;;;;;;;;-1:-1:-1;;;;;106662:43:0;;;;;;;;;:7;;;;;:21;;:43;;;;;:7;;:43;;;;;;;:7;;:43;;;5:2:-1;;;;30:1;27;20:12;85661:598:0;85995:13;85847:34;85860:5;85867:3;85872:8;85847:12;:34::i;:::-;85959:16;:3;-1:-1:-1;;;;;85959:14:0;;:16::i;:::-;85955:297;;;86011:98;;;;;86074:10;86011:98;;;;;;-1:-1:-1;;;;;86011:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:62;;;;;;86074:10;86086:5;;86093:8;;86103:5;;86011:98;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;86011:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;86011:98:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;86011:98:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;86011:98:0;;-1:-1:-1;;;;;;;86217:24:0;;86227:14;86217:24;86209:33;;;;;112300:186;1022:5;;-1:-1:-1;;;;;1022:5:0;1008:10;:19;1000:28;;;;;;112424:7;;:54;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;112424:7:0;;;;:21;;112446:8;;;;112456:10;;;;112468:9;;;;112424:54;;;;;;;;;;;;112446:8;;;;112424:54;;;;;;;;;;;;;;;;-1:-1:-1;112424:54:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112424:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;112424:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;112424:54:0;;;;112300:186;;;;;;:::o;101105:399::-;101183:7;;:32;;;;;;;;;;;;;;;101166:14;;-1:-1:-1;;;;;101183:7:0;;:24;;:32;;;;;;;;;;;;;;101166:14;101183:7;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;101183:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;101183:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;101183:32:0;101233:7;;:26;;;;;;;;;;;;;;;101183:32;;-1:-1:-1;;;;;;101233:7:0;;;;:18;;:26;;;;;101183:32;;101233:26;;;;;;;;:7;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;101233:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;101233:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;101233:26:0;:86;;;;-1:-1:-1;101279:7:0;;:40;;;-1:-1:-1;;;;;101279:40:0;;;;;;;;;101307:10;101279:40;;;;;;-1:-1:-1;;;;;101279:7:0;;;;:17;;:40;;;;;;;;;;;;;;;:7;;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;101279:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;101279:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;101279:40:0;101233:86;101224:97;;;;;;;;101357:7;;:25;;;-1:-1:-1;;;;;101357:25:0;;;;;;;;;;;-1:-1:-1;;;;;101357:7:0;;;;:16;;:25;;;;;;;;;;;;;;;:7;;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;101357:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;101357:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;101357:25:0;-1:-1:-1;;;;;101339:43:0;-1:-1:-1;;;;;;;;;;;101339:43:0;;101330:54;;;;;;101468:7;;:28;;;;;;;;;;;;;;;-1:-1:-1;;;;;101468:7:0;;;;:20;;:28;;;;;:7;;:28;;;;;;;;:7;;:28;;;5:2:-1;;;;30:1;27;20:12;99622:368:0;56323:7;;:37;;;-1:-1:-1;;;;;56323:37:0;;;;;;;;;56349:10;56323:37;;;;;;99712:6;;-1:-1:-1;;;;;56323:7:0;;:17;;:37;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56323:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56323:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56323:37:0;:79;;;;-1:-1:-1;56378:7:0;;:24;;;-1:-1:-1;;;;;56378:24:0;;;;;;;;;;;-1:-1:-1;;;;;56378:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56378:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56378:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56378:24:0;56323:79;56314:90;;;;;;;;112841:7;;:24;;;-1:-1:-1;;;;;112841:24:0;;;;;;;;;;;99732:6;;-1:-1:-1;;;;;112841:7:0;;:16;;:24;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;112841:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;112841:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;112841:24:0;-1:-1:-1;;;;;112823:42:0;-1:-1:-1;;;;;;;;;;;112823:42:0;;112814:53;;;;;;99854:7;;:26;;;-1:-1:-1;;;;;99854:26:0;;;;;;;;;;;-1:-1:-1;;;;;99854:7:0;;;;:16;;:26;;;;;;;;;;;;;;;:7;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;99854:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;99854:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;99854:26:0;-1:-1:-1;;;;;99836:44:0;-1:-1:-1;;;;;;;;;;;99836:44:0;;99827:55;;;;;;99901:29;99913:6;99921:8;99901:11;:29::i;:::-;99893:38;;;;;;;;99940:7;;:42;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;99940:7:0;;;;:24;;:42;;;;;:7;;:42;;;;;;;;:7;;:42;;;5:2:-1;;;;30:1;27;20:12;100427:453:0;112841:7;;:24;;;-1:-1:-1;;;;;112841:24:0;;;;;;;;;;;100507:14;;100485:6;;-1:-1:-1;;;;;112841:7:0;;;;:16;;:24;;;;;;;;;;;;;;;100507:14;112841:7;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;112841:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;112841:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;112841:24:0;-1:-1:-1;;;;;112823:42:0;-1:-1:-1;;;;;;;;;;;112823:42:0;;112814:53;;;;;;100524:7;;:32;;;;;;;;;;;;;;;-1:-1:-1;;;;;100524:7:0;;;;:24;;:32;;;;;;;;;;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;100524:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;100524:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;100524:32:0;100574:7;;:26;;;;;;;;;;;;;;;100524:32;;-1:-1:-1;;;;;;100574:7:0;;;;:18;;:26;;;;;100524:32;;100574:26;;;;;;;;:7;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;100574:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;100574:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;100574:26:0;:86;;;;-1:-1:-1;100620:7:0;;:40;;;-1:-1:-1;;;;;100620:40:0;;;;;;;;;100648:10;100620:40;;;;;;-1:-1:-1;;;;;100620:7:0;;;;:17;;:40;;;;;;;;;;;;;;;:7;;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;100620:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;100620:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;100620:40:0;100574:86;100565:97;;;;;;;;100698:7;;:25;;;-1:-1:-1;;;;;100698:25:0;;;;;;;;;;;-1:-1:-1;;;;;100698:7:0;;;;:16;;:25;;;;;;;;;;;;;;;:7;;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;100698:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;100698:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;100698:25:0;-1:-1:-1;;;;;100680:43:0;-1:-1:-1;;;;;;;;;;;100680:43:0;;100671:54;;;;;;100848:7;;:24;;;;;;;;;;;;;;;-1:-1:-1;;;;;100848:7:0;;;;:16;;:24;;;;;:7;;:24;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;100074:137:0;56323:7;;:37;;;-1:-1:-1;;;;;56323:37:0;;;;;;;;;56349:10;56323:37;;;;;;100153:6;;-1:-1:-1;;;;;56323:7:0;;:17;;:37;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;56323:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56323:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56323:37:0;:79;;;;-1:-1:-1;56378:7:0;;:24;;;-1:-1:-1;;;;;56378:24:0;;;;;;;;;;;-1:-1:-1;;;;;56378:7:0;;;;:16;;:24;;;;;;;;;;;;;;;:7;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;56378:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56378:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56378:24:0;56323:79;56314:90;;;;;;;88720:888;88828:16;;88802:8;112682:11;112676:17;;112668:26;;;;;;88860:60;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;88860:60:0;;-1:-1:-1;88984:58:0;89039:2;89025:10;89014:21;;89013:28;89010:2;:31;-1:-1:-1;;;89005:37:0;88984:58;-1:-1:-1;88984:58:0;;;:18;;;:58;-1:-1:-1;89105:2:0;89092:9;89081:20;;89080:27;89077:2;:30;-1:-1:-1;;;89072:36:0;89051:14;89066:2;89051:18;;;;;;;;;;;;;;:57;-1:-1:-1;;;;;89051:57:0;;;;;;;;-1:-1:-1;89170:2:0;89158:8;89147:19;;89146:26;89143:2;:29;-1:-1:-1;;;89138:35:0;89117:14;89132:2;89117:18;;;;;;;;;;;;;;:56;-1:-1:-1;;;;;89117:56:0;;;;;;;;-1:-1:-1;89234:2:0;89223:7;89212:18;;89211:25;89208:2;:28;-1:-1:-1;;;89203:34:0;89182:14;89197:2;89182:18;;;;;;;;;;;;;;:55;-1:-1:-1;;;;;89182:55:0;;;;;;;;-1:-1:-1;89297:2:0;89287:6;89276:17;;89275:24;89272:2;:27;-1:-1:-1;;;89267:33:0;89246:14;89261:2;89246:18;;;;;;;;;;;;;;:54;-1:-1:-1;;;;;89246:54:0;;;;;;;;-1:-1:-1;89359:2:0;89350:5;89339:16;;89338:23;89335:2;:26;-1:-1:-1;;;89330:32:0;89309:14;89324:2;89309:18;;;;;;;;;;;;;;:53;-1:-1:-1;;;;;89309:53:0;;;;;;;;-1:-1:-1;89420:2:0;89412:4;89401:15;;89400:22;89397:2;:25;-1:-1:-1;;;89392:31:0;89371:14;89386:2;89371:18;;;;;;;;;;;;;;:52;-1:-1:-1;;;;;89371:52:0;;;;;;;;-1:-1:-1;89480:2:0;89473:3;89462:14;;89461:21;89458:2;:24;-1:-1:-1;;;89453:30:0;89432:14;89447:2;89432:18;;;;;;;;;;;;;;:51;-1:-1:-1;;;;;89432:51:0;;;;;;;;-1:-1:-1;89539:2:0;89522:13;;;89521:20;89518:2;:23;-1:-1:-1;;;89513:29:0;89492:14;89507:2;89492:18;;;;;;;;;;;;;;:50;-1:-1:-1;;;;;89492:50:0;;;;;;;;-1:-1:-1;89597:2:0;89581:8;89580:19;89577:2;:22;-1:-1:-1;;;89572:28:0;89551:14;89566:2;89551:18;;;;;;;;;;;;;;:49;-1:-1:-1;;;;;89551:49:0;;;;;;;;;88720:888;;;;;:::o;55654:22::-;;;-1:-1:-1;;;;;55654:22:0;;:::o;83510:20::-;;;-1:-1:-1;;;;;83510:20:0;;:::o;77625:18::-;;;-1:-1:-1;;;;;77625:18:0;;:::o;88041:182::-;88178:7;;:37;;;;;;-1:-1:-1;;;;;88178:37:0;;;;;;;;;;;;;;;;88144:11;;88178:7;;;;;:18;;:37;;;;;;;;;;;;;;;88144:11;88178:7;:37;;;5:2:-1;;;;30:1;27;20:12;77862:31:0;;;-1:-1:-1;;;;;77862:31:0;;:::o;102634:955::-;102777:7;;:28;;;-1:-1:-1;;;;;102777:28:0;;;;;;;;;;;102729:12;;;;;;-1:-1:-1;;;;;102777:7:0;;;;:20;;:28;;;;;;;;;;;;;;;102729:12;102777:7;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;102777:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;102777:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;102777:28:0;;-1:-1:-1;102829:19:0;102821:4;:27;;;;;;;;;102816:766;;;102876:3;102869:10;;;;102816:766;102915:17;102907:4;:25;;;;;;;;;102902:680;;;-1:-1:-1;103202:8:0;-1:-1:-1;;103180:18:0;;103179:31;103242:1;103225:18;;103221:166;;;103296:14;103291:1;:19;103283:4;:28;103267:46;;103221:166;;;103370:5;103362:13;;103221:166;103397:12;;102902:680;103571:1;103564:8;;;;1596:105;1022:5;;-1:-1:-1;;;;;1022:5:0;1008:10;:19;1000:28;;;;;;1666:29;1685:9;1666:18;:29::i;:::-;1596:105;:::o;12557:589::-;12615:4;13099:18;;13132:8;;12557:589::o;93549:1451::-;93816:7;;:31;;;;;;;;;;;;;;;-1:-1:-1;;;;;93816:7:0;;;;:23;;:31;;;;;:7;;:31;;;;;;;;:7;;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;93816:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;93816:31:0;;;;93982:7;93978:1015;;;94078:7;;:29;;;;;;;;;;;;;;;-1:-1:-1;;;;;94078:7:0;;;;:21;;:29;;;;;:7;;:29;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;94078:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;94118:7:0;;:33;;;;;;;;;;;;;-1:-1:-1;;;;;94118:33:0;;;;;;;;;:7;;;;;-1:-1:-1;94118:16:0;;-1:-1:-1;94118:33:0;;;;;:7;;:33;;;;;;;:7;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;94118:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;94118:33:0;;;;94200:6;94192:15;;94183:7;-1:-1:-1;;;;;94169:39:0;94178:3;94169:39;;;;;;;;;;93978:1015;;;94782:7;;:33;;;;;;;;;;;;;-1:-1:-1;;;;;94782:33:0;;;;;;;;;:7;;;;;:16;;:33;;;;;:7;;:33;;;;;;;:7;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;94782:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;94826:7:0;;:41;;;-1:-1:-1;;;;;94826:41:0;;;;;;;;;-1:-1:-1;;;;;94826:41:0;;;;;;;;;:7;;;;;-1:-1:-1;94826:24:0;;-1:-1:-1;94826:41:0;;;;;:7;;:41;;;;;;;:7;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;94826:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;94826:41:0;;;;94916:6;94908:15;;94899:7;-1:-1:-1;;;;;94885:39:0;94894:3;94885:39;;;;;;;;;;94975:6;94967:15;;94958:7;-1:-1:-1;;;;;94940:43:0;94949:7;-1:-1:-1;;;;;94940:43:0;;;;;;;;;;;93549:1451;;;;:::o;78933:385::-;79051:7;;:31;;;;;;-1:-1:-1;;;;;79051:31:0;;;;;;;;;:7;;;;;:25;;:31;;;;;:7;;:31;;;;;;;:7;;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;79051:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;79089:5:0;;:29;;;;;;-1:-1:-1;;;;;79089:29:0;;;;;;;;;:5;;;;;-1:-1:-1;79089:23:0;;-1:-1:-1;79089:29:0;;;;;:5;;:29;;;;;;;:5;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;79089:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;79089:29:0;;;;79189:4;-1:-1:-1;;;;;79189:14:0;;:16;;;;;-1:-1:-1;;;79189:16:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;79189:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;79273:14:0;;;-1:-1:-1;;;;;79273:14:0;;;;;;;;-1:-1:-1;79273:14:0;;;;;;;-1:-1:-1;79273:14:0;79307:4;-1:-1:-1;;;;;79294:18:0;;1842:175;-1:-1:-1;;;;;1913:23:0;;;;1905:32;;;;;;1970:5;;;1949:38;;-1:-1:-1;;;;;1949:38:0;;;;1970:5;;;1949:38;;;1994:5;:17;;-1:-1:-1;;1994:17:0;-1:-1:-1;;;;;1994:17:0;;;;;;;;;;1842:175::o
Swarm Source
bzzr://9715be9a1e6921ddf1d293fcc3c2fc481241433aaa74738c5c2ff43607d2d09e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.