Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- ZoneIsolation
- Optimization enabled
- false
- Compiler version
- v0.8.28+commit.7893614a
- EVM Version
- shanghai
- Verified at
- 2025-01-25T12:32:41.437896Z
Contract source code
// File: bitpost-contracts/contracts-common/interfaces/upgrade/IInitializable.sol pragma solidity ^0.8.20; interface IInitializable { error InitializableAlreadyInitialized(); error InitializableRequiredVersion(uint256 currentVersion, uint256 requiredVersion); error InitializableMinimalVersion(uint256 currentVersion, uint256 minimalVersion); function getVersion() external view returns(uint256); } // File: bitpost-contracts/contracts-common/contracts/upgrade/Initializable.sol pragma solidity ^0.8.20; abstract contract Initializable is IInitializable { /// @custom:storage-location erc7201:bitpost.common.Initializable struct Storage_Initializable { uint256 version; } // keccak256(abi.encode(uint256(keccak256("bitpost.common.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant STORAGE_LOCATION_INITIALIZABLE = 0xf9388d16ccb89f8ceeb8bce5074db391472ebb34229a1051e19fc642d992d400; modifier initVer(uint256 version) { Storage_Initializable storage $ = _getStorage_Initializable(); require($.version == 0, InitializableAlreadyInitialized()); _; $.version = version; } modifier upVer(uint256 version) { Storage_Initializable storage $ = _getStorage_Initializable(); require($.version == version - 1, InitializableRequiredVersion($.version, version - 1)); _; $.version = version; } modifier minVer(uint256 version) { _checkMinVer(version); _; } function getVersion() public view returns(uint256) { Storage_Initializable storage $ = _getStorage_Initializable(); return $.version; } function _checkMinVer(uint256 version) private view { Storage_Initializable storage $ = _getStorage_Initializable(); require($.version >= version, InitializableMinimalVersion($.version, version)); } function _getStorage_Initializable() private pure returns(Storage_Initializable storage $) { assembly { $.slot := STORAGE_LOCATION_INITIALIZABLE } } } // File: bitpost-contracts/contracts-common/interfaces/access/IPermissions.sol pragma solidity ^0.8.20; interface IPermissions { error PermissionsUnauthorized(address user, uint16 permissions, uint16 required); error PermissionsInvalidUser(address user); error PermissionsNotChanged(address user, uint16 permissions); error PermissionsLockoutPrevented(address owner); function getUsers(uint8 limit, uint256 offset) external view returns(address[] memory); function getPermissions(address user) external view returns(uint16); function setPermissions(address user, uint16 permissions) external; } // File: bitpost-contracts/contracts-common/contracts/access/Permissions.sol pragma solidity >=0.8.0; abstract contract Permissions is IPermissions { /// @custom:storage-location erc7201:bitpost.common.Permissions struct Storage_Permissions { mapping(address => uint16) permissions; address[] users; mapping(address => uint256) userIndex; uint256 ownerCount; } // keccak256(abi.encode(uint256(keccak256("bitpost.common.Permissions")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant STORAGE_LOCATION_PERMISSIONS = 0x68fe19185e240d9214875be5b2b0c87a4a5a1d49f09c1a0b6456c42cbedb1e00; uint16 internal constant PERM_NONE = 0x0000; uint16 internal constant PERM_OWNER = 0x8000; uint8 internal constant SP_FLAG_INIT = 0x01; modifier perm(uint16 permissions) { _checkPermissions(permissions); _; } function _init_Permissions(address owner, uint16 ownerPermissions) internal { _setPermissions(owner, PERM_OWNER | ownerPermissions, SP_FLAG_INIT); } function getUsers(uint8 limit, uint256 offset) public view returns(address[] memory) { Storage_Permissions storage $ = _getStorage_Permissions(); uint256 totalCount = $.users.length; if(offset >= totalCount) { return new address[](0); } uint256 end = offset + limit; if(end > totalCount) { end = totalCount; } uint256 resultCount = end - offset; address[] memory result = new address[](resultCount); for(uint256 i = 0; i < resultCount; i++) { result[i] = $.users[offset + i]; } return result; } function getPermissions(address user) public view returns(uint16) { require(user != address(0), PermissionsInvalidUser(address(0))); Storage_Permissions storage $ = _getStorage_Permissions(); return $.permissions[user]; } function setPermissions(address user, uint16 permissions) external perm(PERM_OWNER) { _setPermissions(user, permissions, 0); } function _setPermissions(address user, uint16 permissions, uint8 flags) internal virtual { uint16 oldPermissions = getPermissions(user); require(oldPermissions != permissions, PermissionsNotChanged(user, oldPermissions)); Storage_Permissions storage $ = _getStorage_Permissions(); if((oldPermissions & PERM_OWNER != 0) && (permissions & PERM_OWNER == 0)) { require($.ownerCount > 1, PermissionsLockoutPrevented(user)); $.ownerCount--; } else if((oldPermissions & PERM_OWNER == 0) && (permissions & PERM_OWNER != 0)) { $.ownerCount++; } if(oldPermissions == PERM_NONE) { _addUser(user, flags); } else if(permissions == PERM_NONE) { _removeUser(user, flags); } $.permissions[user] = permissions; } function _addUser(address user, uint8) internal virtual { Storage_Permissions storage $ = _getStorage_Permissions(); $.userIndex[user] = $.users.length; $.users.push(user); } function _removeUser(address user, uint8) internal virtual { Storage_Permissions storage $ = _getStorage_Permissions(); address lastUser = $.users[$.users.length - 1]; if(user != lastUser) { uint256 midIndex = $.userIndex[user]; $.users[midIndex] = lastUser; $.userIndex[lastUser] = midIndex; } $.users.pop(); delete $.userIndex[user]; } function _checkPermissions(uint16 permissions) private view { Storage_Permissions storage $ = _getStorage_Permissions(); require( $.permissions[msg.sender] & permissions == permissions, PermissionsUnauthorized(msg.sender, $.permissions[msg.sender], permissions) ); } function _getStorage_Permissions() private pure returns(Storage_Permissions storage $) { assembly { $.slot := STORAGE_LOCATION_PERMISSIONS } } } // File: bitpost-contracts/contracts-zi/interfaces/IZoneIsolation.sol pragma solidity ^0.8.20; interface IZoneIsolation is IInitializable, IPermissions { enum Zone { CLEAN, PRIVATE, PUBLIC } error ZoneIsolationInvalidZone(Zone zone); error ZoneIsolationViolation(address user, Zone userZone, Zone requiredZone); function init() external; function getUserZone(address user) external view returns(Zone); function checkUserZone(address user, Zone zone) external; function assignUserZone(address user, Zone zone) external; } // File: bitpost-contracts/contracts-zi/contracts/ZoneIsolation.sol pragma solidity ^0.8.20; contract ZoneIsolation is Initializable, Permissions, IZoneIsolation { /// @custom:storage-location erc7201:bitpost.zi.ZoneIsolation struct Storage_ZoneIsolation { mapping(address => Zone) userZone; } // keccak256(abi.encode(uint256(keccak256("bitpost.zi.ZoneIsolation")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant STORAGE_LOCATION_ZONEISOLATION = 0x7c05d43dfa50a40ae7e3814ce9638445dbcd9d9ad2e164fbc4f4c052f0160d00; uint16 internal constant PERM_ASSIGN_ZONE = 0x0001; function init() external initVer(1) { _init_Permissions(msg.sender, PERM_NONE); } function getUserZone(address user) external view returns(Zone) { Storage_ZoneIsolation storage $ = _getStorage_ZoneIsolation(); return $.userZone[user]; } function checkUserZone(address user, Zone zone) external { _checkAssignUserZone(user, zone, false); } function assignUserZone(address user, Zone zone) external perm(PERM_ASSIGN_ZONE) { _checkAssignUserZone(user, zone, true); } function _checkAssignUserZone(address user, Zone zone, bool assign) private { require(zone != Zone.CLEAN, ZoneIsolationInvalidZone(Zone.CLEAN)); Storage_ZoneIsolation storage $ = _getStorage_ZoneIsolation(); Zone currentZone = $.userZone[user]; if(currentZone == Zone.CLEAN) { if(assign) { $.userZone[user] = zone; } } else { require(currentZone == zone, ZoneIsolationViolation(user, currentZone, zone)); } } function _getStorage_ZoneIsolation() private pure returns(Storage_ZoneIsolation storage $) { assembly { $.slot := STORAGE_LOCATION_ZONEISOLATION } } }
Contract ABI
[{"type":"error","name":"InitializableAlreadyInitialized","inputs":[]},{"type":"error","name":"InitializableMinimalVersion","inputs":[{"type":"uint256","name":"currentVersion","internalType":"uint256"},{"type":"uint256","name":"minimalVersion","internalType":"uint256"}]},{"type":"error","name":"InitializableRequiredVersion","inputs":[{"type":"uint256","name":"currentVersion","internalType":"uint256"},{"type":"uint256","name":"requiredVersion","internalType":"uint256"}]},{"type":"error","name":"PermissionsInvalidUser","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"error","name":"PermissionsLockoutPrevented","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"PermissionsNotChanged","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint16","name":"permissions","internalType":"uint16"}]},{"type":"error","name":"PermissionsUnauthorized","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint16","name":"permissions","internalType":"uint16"},{"type":"uint16","name":"required","internalType":"uint16"}]},{"type":"error","name":"ZoneIsolationInvalidZone","inputs":[{"type":"uint8","name":"zone","internalType":"enum IZoneIsolation.Zone"}]},{"type":"error","name":"ZoneIsolationViolation","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint8","name":"userZone","internalType":"enum IZoneIsolation.Zone"},{"type":"uint8","name":"requiredZone","internalType":"enum IZoneIsolation.Zone"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"assignUserZone","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint8","name":"zone","internalType":"enum IZoneIsolation.Zone"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"checkUserZone","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint8","name":"zone","internalType":"enum IZoneIsolation.Zone"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"getPermissions","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum IZoneIsolation.Zone"}],"name":"getUserZone","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"getUsers","inputs":[{"type":"uint8","name":"limit","internalType":"uint8"},{"type":"uint256","name":"offset","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getVersion","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"init","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPermissions","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint16","name":"permissions","internalType":"uint16"}]}]
Contract Creation Code
0x6080604052348015600e575f5ffd5b5061134e8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610086575f3560e01c8063bd18180211610059578063bd18180214610124578063e1c7392a14610140578063e5e23d1a1461014a578063f72789941461016657610086565b80630d8e6e2c1461008a5780630f27e4ae146100a8578063160a7925146100d85780639fe751ab14610108575b5f5ffd5b610092610196565b60405161009f9190610d36565b60405180910390f35b6100c260048036038101906100bd9190610dad565b6101ac565b6040516100cf9190610e4b565b60405180910390f35b6100f260048036038101906100ed9190610dad565b61020b565b6040516100ff9190610e80565b60405180910390f35b610122600480360381019061011d9190610ebc565b6102de565b005b61013e60048036038101906101399190610f24565b6102ed565b005b610148610309565b005b610164600480360381019061015f9190610ebc565b610368565b005b610180600480360381019061017b9190610fc2565b610384565b60405161018d91906110b7565b60405180910390f35b5f5f6101a061052e565b9050805f015491505090565b5f5f6101b6610555565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155f9061027e576040517f387c909300000000000000000000000000000000000000000000000000000000815260040161027591906110e6565b60405180910390fd5b505f61028861057c565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff16915050919050565b6102e982825f6105a3565b5050565b6180006102f98161077d565b61030483835f61087a565b505050565b60015f61031461052e565b90505f815f015414610352576040517f0fe5ade500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61035c335f610a48565b81815f01819055505050565b60016103738161077d565b61037f838360016105a3565b505050565b60605f61038f61057c565b90505f816001018054905090508084106103f5575f67ffffffffffffffff8111156103bd576103bc6110ff565b5b6040519080825280602002602001820160405280156103eb5781602001602082028036833780820191505090505b5092505050610528565b5f8560ff16856104059190611159565b905081811115610413578190505b5f8582610420919061118c565b90505f8167ffffffffffffffff81111561043d5761043c6110ff565b5b60405190808252806020026020018201604052801561046b5781602001602082028036833780820191505090505b5090505f5f90505b8281101561051e5785600101818961048b9190611159565b8154811061049c5761049b6111bf565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168282815181106104d7576104d66111bf565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610473565b5080955050505050505b92915050565b5f7ff9388d16ccb89f8ceeb8bce5074db391472ebb34229a1051e19fc642d992d400905090565b5f7f7c05d43dfa50a40ae7e3814ce9638445dbcd9d9ad2e164fbc4f4c052f0160d00905090565b5f7f68fe19185e240d9214875be5b2b0c87a4a5a1d49f09c1a0b6456c42cbedb1e00905090565b5f60028111156105b6576105b5610dd8565b5b8260028111156105c9576105c8610dd8565b5b14155f9061060d576040517f1322334a0000000000000000000000000000000000000000000000000000000081526004016106049190610e4b565b60405180910390fd5b505f610617610555565b90505f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f600281111561067a57610679610dd8565b5b81600281111561068d5761068c610dd8565b5b036107035782156106fe5783825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908360028111156106f8576106f7610dd8565b5b02179055505b610776565b83600281111561071657610715610dd8565b5b81600281111561072957610728610dd8565b5b14858286909192610772576040517f55e8586a000000000000000000000000000000000000000000000000000000008152600401610769939291906111ec565b60405180910390fd5b5050505b5050505050565b5f61078661057c565b90508161ffff1682825f015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff161661ffff161433825f015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff1684909192610873576040517f65c9b12700000000000000000000000000000000000000000000000000000000815260040161086a93929190611221565b60405180910390fd5b5050505050565b5f6108848461020b565b90508261ffff168161ffff161415848290916108d7576040517f7db81d9b0000000000000000000000000000000000000000000000000000000081526004016108ce929190611256565b60405180910390fd5b50505f6108e261057c565b90505f618000831661ffff161415801561090357505f618000851661ffff16145b156109715760018160030154118590610952576040517f226d4ad300000000000000000000000000000000000000000000000000000000815260040161094991906110e6565b60405180910390fd5b50806003015f8154809291906109679061127d565b91905055506109b0565b5f618000831661ffff1614801561099057505f618000851661ffff1614155b156109af57806003015f8154809291906109a9906112a4565b91905055505b5b5f61ffff168261ffff16036109ce576109c98584610a5c565b6109e9565b5f61ffff168461ffff16036109e8576109e78584610b19565b5b5b83815f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548161ffff021916908361ffff1602179055505050505050565b610a58828261800017600161087a565b5050565b5f610a6561057c565b90508060010180549050816002015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508060010183908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f610b2261057c565b90505f8160010160018360010180549050610b3d919061118c565b81548110610b4e57610b4d6111bf565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610c90575f826002015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081836001018281548110610c0557610c046111bf565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080836002015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b81600101805480610ca457610ca36112eb565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055816002015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f905550505050565b5f819050919050565b610d3081610d1e565b82525050565b5f602082019050610d495f830184610d27565b92915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610d7c82610d53565b9050919050565b610d8c81610d72565b8114610d96575f5ffd5b50565b5f81359050610da781610d83565b92915050565b5f60208284031215610dc257610dc1610d4f565b5b5f610dcf84828501610d99565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60038110610e1657610e15610dd8565b5b50565b5f819050610e2682610e05565b919050565b5f610e3582610e19565b9050919050565b610e4581610e2b565b82525050565b5f602082019050610e5e5f830184610e3c565b92915050565b5f61ffff82169050919050565b610e7a81610e64565b82525050565b5f602082019050610e935f830184610e71565b92915050565b60038110610ea5575f5ffd5b50565b5f81359050610eb681610e99565b92915050565b5f5f60408385031215610ed257610ed1610d4f565b5b5f610edf85828601610d99565b9250506020610ef085828601610ea8565b9150509250929050565b610f0381610e64565b8114610f0d575f5ffd5b50565b5f81359050610f1e81610efa565b92915050565b5f5f60408385031215610f3a57610f39610d4f565b5b5f610f4785828601610d99565b9250506020610f5885828601610f10565b9150509250929050565b5f60ff82169050919050565b610f7781610f62565b8114610f81575f5ffd5b50565b5f81359050610f9281610f6e565b92915050565b610fa181610d1e565b8114610fab575f5ffd5b50565b5f81359050610fbc81610f98565b92915050565b5f5f60408385031215610fd857610fd7610d4f565b5b5f610fe585828601610f84565b9250506020610ff685828601610fae565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61103281610d72565b82525050565b5f6110438383611029565b60208301905092915050565b5f602082019050919050565b5f61106582611000565b61106f818561100a565b935061107a8361101a565b805f5b838110156110aa5781516110918882611038565b975061109c8361104f565b92505060018101905061107d565b5085935050505092915050565b5f6020820190508181035f8301526110cf818461105b565b905092915050565b6110e081610d72565b82525050565b5f6020820190506110f95f8301846110d7565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61116382610d1e565b915061116e83610d1e565b92508282019050808211156111865761118561112c565b5b92915050565b5f61119682610d1e565b91506111a183610d1e565b92508282039050818111156111b9576111b861112c565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6060820190506111ff5f8301866110d7565b61120c6020830185610e3c565b6112196040830184610e3c565b949350505050565b5f6060820190506112345f8301866110d7565b6112416020830185610e71565b61124e6040830184610e71565b949350505050565b5f6040820190506112695f8301856110d7565b6112766020830184610e71565b9392505050565b5f61128782610d1e565b91505f82036112995761129861112c565b5b600182039050919050565b5f6112ae82610d1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036112e0576112df61112c565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea264697066735822122035696d822ee05206fe00a3a4385c2de5ec51d12ac6ad1900d13913c02cafd10064736f6c634300081c0033
Deployed ByteCode
0x608060405234801561000f575f5ffd5b5060043610610086575f3560e01c8063bd18180211610059578063bd18180214610124578063e1c7392a14610140578063e5e23d1a1461014a578063f72789941461016657610086565b80630d8e6e2c1461008a5780630f27e4ae146100a8578063160a7925146100d85780639fe751ab14610108575b5f5ffd5b610092610196565b60405161009f9190610d36565b60405180910390f35b6100c260048036038101906100bd9190610dad565b6101ac565b6040516100cf9190610e4b565b60405180910390f35b6100f260048036038101906100ed9190610dad565b61020b565b6040516100ff9190610e80565b60405180910390f35b610122600480360381019061011d9190610ebc565b6102de565b005b61013e60048036038101906101399190610f24565b6102ed565b005b610148610309565b005b610164600480360381019061015f9190610ebc565b610368565b005b610180600480360381019061017b9190610fc2565b610384565b60405161018d91906110b7565b60405180910390f35b5f5f6101a061052e565b9050805f015491505090565b5f5f6101b6610555565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16915050919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155f9061027e576040517f387c909300000000000000000000000000000000000000000000000000000000815260040161027591906110e6565b60405180910390fd5b505f61028861057c565b9050805f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff16915050919050565b6102e982825f6105a3565b5050565b6180006102f98161077d565b61030483835f61087a565b505050565b60015f61031461052e565b90505f815f015414610352576040517f0fe5ade500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61035c335f610a48565b81815f01819055505050565b60016103738161077d565b61037f838360016105a3565b505050565b60605f61038f61057c565b90505f816001018054905090508084106103f5575f67ffffffffffffffff8111156103bd576103bc6110ff565b5b6040519080825280602002602001820160405280156103eb5781602001602082028036833780820191505090505b5092505050610528565b5f8560ff16856104059190611159565b905081811115610413578190505b5f8582610420919061118c565b90505f8167ffffffffffffffff81111561043d5761043c6110ff565b5b60405190808252806020026020018201604052801561046b5781602001602082028036833780820191505090505b5090505f5f90505b8281101561051e5785600101818961048b9190611159565b8154811061049c5761049b6111bf565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168282815181106104d7576104d66111bf565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610473565b5080955050505050505b92915050565b5f7ff9388d16ccb89f8ceeb8bce5074db391472ebb34229a1051e19fc642d992d400905090565b5f7f7c05d43dfa50a40ae7e3814ce9638445dbcd9d9ad2e164fbc4f4c052f0160d00905090565b5f7f68fe19185e240d9214875be5b2b0c87a4a5a1d49f09c1a0b6456c42cbedb1e00905090565b5f60028111156105b6576105b5610dd8565b5b8260028111156105c9576105c8610dd8565b5b14155f9061060d576040517f1322334a0000000000000000000000000000000000000000000000000000000081526004016106049190610e4b565b60405180910390fd5b505f610617610555565b90505f815f015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f600281111561067a57610679610dd8565b5b81600281111561068d5761068c610dd8565b5b036107035782156106fe5783825f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908360028111156106f8576106f7610dd8565b5b02179055505b610776565b83600281111561071657610715610dd8565b5b81600281111561072957610728610dd8565b5b14858286909192610772576040517f55e8586a000000000000000000000000000000000000000000000000000000008152600401610769939291906111ec565b60405180910390fd5b5050505b5050505050565b5f61078661057c565b90508161ffff1682825f015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff161661ffff161433825f015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff1684909192610873576040517f65c9b12700000000000000000000000000000000000000000000000000000000815260040161086a93929190611221565b60405180910390fd5b5050505050565b5f6108848461020b565b90508261ffff168161ffff161415848290916108d7576040517f7db81d9b0000000000000000000000000000000000000000000000000000000081526004016108ce929190611256565b60405180910390fd5b50505f6108e261057c565b90505f618000831661ffff161415801561090357505f618000851661ffff16145b156109715760018160030154118590610952576040517f226d4ad300000000000000000000000000000000000000000000000000000000815260040161094991906110e6565b60405180910390fd5b50806003015f8154809291906109679061127d565b91905055506109b0565b5f618000831661ffff1614801561099057505f618000851661ffff1614155b156109af57806003015f8154809291906109a9906112a4565b91905055505b5b5f61ffff168261ffff16036109ce576109c98584610a5c565b6109e9565b5f61ffff168461ffff16036109e8576109e78584610b19565b5b5b83815f015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548161ffff021916908361ffff1602179055505050505050565b610a58828261800017600161087a565b5050565b5f610a6561057c565b90508060010180549050816002015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508060010183908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f610b2261057c565b90505f8160010160018360010180549050610b3d919061118c565b81548110610b4e57610b4d6111bf565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610c90575f826002015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081836001018281548110610c0557610c046111bf565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080836002015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b81600101805480610ca457610ca36112eb565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055816002015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f905550505050565b5f819050919050565b610d3081610d1e565b82525050565b5f602082019050610d495f830184610d27565b92915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610d7c82610d53565b9050919050565b610d8c81610d72565b8114610d96575f5ffd5b50565b5f81359050610da781610d83565b92915050565b5f60208284031215610dc257610dc1610d4f565b5b5f610dcf84828501610d99565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60038110610e1657610e15610dd8565b5b50565b5f819050610e2682610e05565b919050565b5f610e3582610e19565b9050919050565b610e4581610e2b565b82525050565b5f602082019050610e5e5f830184610e3c565b92915050565b5f61ffff82169050919050565b610e7a81610e64565b82525050565b5f602082019050610e935f830184610e71565b92915050565b60038110610ea5575f5ffd5b50565b5f81359050610eb681610e99565b92915050565b5f5f60408385031215610ed257610ed1610d4f565b5b5f610edf85828601610d99565b9250506020610ef085828601610ea8565b9150509250929050565b610f0381610e64565b8114610f0d575f5ffd5b50565b5f81359050610f1e81610efa565b92915050565b5f5f60408385031215610f3a57610f39610d4f565b5b5f610f4785828601610d99565b9250506020610f5885828601610f10565b9150509250929050565b5f60ff82169050919050565b610f7781610f62565b8114610f81575f5ffd5b50565b5f81359050610f9281610f6e565b92915050565b610fa181610d1e565b8114610fab575f5ffd5b50565b5f81359050610fbc81610f98565b92915050565b5f5f60408385031215610fd857610fd7610d4f565b5b5f610fe585828601610f84565b9250506020610ff685828601610fae565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61103281610d72565b82525050565b5f6110438383611029565b60208301905092915050565b5f602082019050919050565b5f61106582611000565b61106f818561100a565b935061107a8361101a565b805f5b838110156110aa5781516110918882611038565b975061109c8361104f565b92505060018101905061107d565b5085935050505092915050565b5f6020820190508181035f8301526110cf818461105b565b905092915050565b6110e081610d72565b82525050565b5f6020820190506110f95f8301846110d7565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61116382610d1e565b915061116e83610d1e565b92508282019050808211156111865761118561112c565b5b92915050565b5f61119682610d1e565b91506111a183610d1e565b92508282039050818111156111b9576111b861112c565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6060820190506111ff5f8301866110d7565b61120c6020830185610e3c565b6112196040830184610e3c565b949350505050565b5f6060820190506112345f8301866110d7565b6112416020830185610e71565b61124e6040830184610e71565b949350505050565b5f6040820190506112695f8301856110d7565b6112766020830184610e71565b9392505050565b5f61128782610d1e565b91505f82036112995761129861112c565b5b600182039050919050565b5f6112ae82610d1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036112e0576112df61112c565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea264697066735822122035696d822ee05206fe00a3a4385c2de5ec51d12ac6ad1900d13913c02cafd10064736f6c634300081c0033