diff --git a/README.md b/README.md index 27b75df..8798298 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,8 @@ This will start up MDNS via avahi for discovery by the commissioner and then rep ## Running a Matter commissioner +### chip-tool + The de facto standard implementation of Matter is open source as well. It is written in C++ and has many dependencies. It implements all of the different facets of the specification. We use this implementation via [ESP Matter](https://github.com/espressif/esp-matter) (tested on commit 9350d9d5f948d3b7c61c8659c4d6990d0ff00ea4) to run an introspectable (aka debug printable) commissioner. @@ -69,7 +71,11 @@ This will look up commissionable devices on the network via MDNS and then start Logs can be added into the chip sources to understand what is happening on the commissioner side. To rebuild, I've had to run `bash install.sh` again. -###Generate a certificate declaration +### Apple Home + +The Apple Home app can also discover and (attempt to) commission the device. Tap Add Accessory and the CircuitMatter device will show up as a nearby Matter Accessory. Tap it and then enter the setup code `67202583`. This will start the commissioning process from Apple Home. + +## Generate a certificate declaration Each Matter device has its own certificate to capture whether a device has been certified. (CircuitMatter declares itself as an uncertified test/development/hobby device.) This is referred to the Certificate Declaration (CD). CircuitMatter can generate a CD for you and the remaining certificates are loaded from the projectchip repositorry. The certificate generated by CircuitMatter is signed by a test private key. diff --git a/circuitmatter/__init__.py b/circuitmatter/__init__.py index 652c5b0..7305f1c 100644 --- a/circuitmatter/__init__.py +++ b/circuitmatter/__init__.py @@ -55,6 +55,10 @@ def __init__( self.socket.setblocking(False) self._endpoints = {} + self._next_endpoint = 0 + self._descriptor = data_model.DescriptorCluster() + self._descriptor.PartsList = [] + self.add_cluster(0, self._descriptor) basic_info = data_model.BasicInformationCluster() basic_info.vendor_id = vendor_id basic_info.product_id = product_id @@ -106,8 +110,15 @@ def start_commissioning(self): def add_cluster(self, endpoint, cluster): if endpoint not in self._endpoints: self._endpoints[endpoint] = {} + self._descriptor.PartsList.append(endpoint) + self._next_endpoint = max(self._next_endpoint, endpoint + 1) self._endpoints[endpoint][cluster.CLUSTER_ID] = cluster + def add_device(self, device): + self._endpoints[self._next_endpoint] = {} + self._descriptor.PartsList.append(self._next_endpoint) + self._next_endpoint += 1 + def process_packets(self): while True: try: @@ -148,6 +159,7 @@ def invoke(self, session, cluster, path, fields, command_ref): status = interaction_model.StatusIB() if cdata is None: status.Status = interaction_model.StatusCode.UNSUPPORTED_COMMAND + print("UNSUPPORTED_COMMAND") else: status.Status = cdata cstatus.Status = status @@ -303,7 +315,7 @@ def process_packet(self, address, data): sigma1, _ = case.Sigma1.decode( message.application_payload[0], message.application_payload[1:] ) - response = self.manager.reply_to_sigma1(sigma1) + response = self.manager.reply_to_sigma1(exchange, sigma1) opcode = SecureProtocolOpcode.STATUS_REPORT if isinstance(response, case.Sigma2Resume): @@ -322,7 +334,18 @@ def process_packet(self, address, data): sigma3, _ = case.Sigma3.decode( message.application_payload[0], message.application_payload[1:] ) - print(sigma3) + protocol_code = self.manager.reply_to_sigma3(exchange, sigma3) + + error_status = session.StatusReport() + general_code = session.GeneralCode.FAILURE + if ( + protocol_code + == session.SecureChannelProtocolCode.SESSION_ESTABLISHMENT_SUCCESS + ): + general_code = session.GeneralCode.SUCCESS + error_status.general_code = general_code + error_status.protocol_id = ProtocolId.SECURE_CHANNEL + error_status.protocol_code = protocol_code exchange.send( ProtocolId.SECURE_CHANNEL, SecureProtocolOpcode.STATUS_REPORT, diff --git a/circuitmatter/__main__.py b/circuitmatter/__main__.py index 72bd63b..03c237e 100644 --- a/circuitmatter/__main__.py +++ b/circuitmatter/__main__.py @@ -10,6 +10,8 @@ import circuitmatter as cm +from circuitmatter.device_types.lighting import extended_color + class ReplaySocket: def __init__(self, replay_data): @@ -208,6 +210,10 @@ def socket(self, *args, **kwargs): return RecordingSocket(self.record_file, socket.socket(*args, **kwargs)) +class NeoPixel(extended_color.ExtendedColorLight): + pass + + def run(replay_file=None): if replay_file: replay_lines = [] @@ -225,6 +231,8 @@ def run(replay_file=None): matter = cm.CircuitMatter( socketpool, mdns_server, random_source, "test_data/device_state.json" ) + led = NeoPixel() + matter.add_device(led) while True: matter.process_packets() diff --git a/circuitmatter/case.py b/circuitmatter/case.py index 504b82f..0d4325c 100644 --- a/circuitmatter/case.py +++ b/circuitmatter/case.py @@ -18,16 +18,16 @@ class Sigma1(tlv.Structure): class Sigma2TbsData(tlv.Structure): - responderNOC = tlv.OctetStringMember(1, 32) + responderNOC = tlv.OctetStringMember(1, crypto.CERTIFICATE_SIZE) responderICAC = tlv.OctetStringMember(2, crypto.CERTIFICATE_SIZE, optional=True) responderEphPubKey = tlv.OctetStringMember(3, crypto.PUBLIC_KEY_SIZE_BYTES) initiatorEphPubKey = tlv.OctetStringMember(4, crypto.PUBLIC_KEY_SIZE_BYTES) class Sigma2TbeData(tlv.Structure): - responderNOC = tlv.OctetStringMember(1, 32) + responderNOC = tlv.OctetStringMember(1, crypto.CERTIFICATE_SIZE) responderICAC = tlv.OctetStringMember(2, crypto.CERTIFICATE_SIZE, optional=True) - signature = tlv.OctetStringMember(3, 64) + signature = tlv.OctetStringMember(3, crypto.GROUP_SIZE_BYTES * 2) resumptionID = tlv.OctetStringMember(4, 16) @@ -42,16 +42,16 @@ class Sigma2(tlv.Structure): class Sigma3TbsData(tlv.Structure): - initiatorNOC = tlv.OctetStringMember(1, 32) + initiatorNOC = tlv.OctetStringMember(1, crypto.CERTIFICATE_SIZE) initiatorICAC = tlv.OctetStringMember(2, crypto.CERTIFICATE_SIZE, optional=True) initiatorEphPubKey = tlv.OctetStringMember(3, crypto.PUBLIC_KEY_SIZE_BYTES) responderEphPubKey = tlv.OctetStringMember(4, crypto.PUBLIC_KEY_SIZE_BYTES) class Sigma3TbeData(tlv.Structure): - initiatorNOC = tlv.OctetStringMember(1, 32) + initiatorNOC = tlv.OctetStringMember(1, crypto.CERTIFICATE_SIZE) initiatorICAC = tlv.OctetStringMember(2, crypto.CERTIFICATE_SIZE, optional=True) - signature = tlv.OctetStringMember(3, 64) + signature = tlv.OctetStringMember(3, crypto.GROUP_SIZE_BYTES * 2) class Sigma3(tlv.Structure): diff --git a/circuitmatter/clusters/core.py b/circuitmatter/clusters/core.py index a55cbcb..36544b6 100644 --- a/circuitmatter/clusters/core.py +++ b/circuitmatter/clusters/core.py @@ -48,6 +48,16 @@ def set_regulatory_config( response.ErrorCode = data_model.CommissioningErrorEnum.OK return response + def commissioning_complete( + self, session + ) -> data_model.GeneralCommissioningCluster.CommissioningCompleteResponse: + response = ( + data_model.GeneralCommissioningCluster.CommissioningCompleteResponse() + ) + response.ErrorCode = data_model.CommissioningErrorEnum.OK + print("Commissioning done!") + return response + class AttestationElements(tlv.Structure): certification_declaration = tlv.OctetStringMember(0x01, max_length=400) @@ -94,6 +104,7 @@ def __init__(self, group_key_manager, random_source, mdns_server, port): self.root_certs = [] self.compressed_fabric_ids = [] + self.noc_keys = [] self.mdns_server = mdns_server self.port = port @@ -268,11 +279,16 @@ def add_noc( noc_struct.ICAC = args.ICACValue self.nocs.append(noc_struct) + # Get the root cert public key so we can create the compressed fabric id. + root_cert, _ = crypto.MatterCertificate.decode( + self.pending_root_cert[0], memoryview(self.pending_root_cert)[1:] + ) + # Store the fabric new_fabric = ( data_model.NodeOperationalCredentialsCluster.FabricDescriptorStruct() ) - new_fabric.RootPublicKey = self.pending_root_cert + new_fabric.RootPublicKey = root_cert.ec_pub_key new_fabric.VendorID = args.AdminVendorId new_fabric.FabricID = noc.subject.matter_fabric_id new_fabric.NodeID = noc.subject.matter_node_id @@ -292,10 +308,8 @@ def add_noc( self.commissioned_fabrics += 1 - # Get the root cert public key so we can create the compressed fabric id. - root_cert, _ = crypto.MatterCertificate.decode( - self.pending_root_cert[0], memoryview(self.pending_root_cert)[1:] - ) + self.noc_keys.append(self.pending_signing_key) + self.root_certs.append(root_cert) fabric_id = struct.pack(">Q", noc.subject.matter_fabric_id) self.compressed_fabric_ids.append( diff --git a/circuitmatter/crypto.py b/circuitmatter/crypto.py index e7f5609..91c9624 100644 --- a/circuitmatter/crypto.py +++ b/circuitmatter/crypto.py @@ -117,8 +117,11 @@ class MatterCertificate(tlv.Structure): signature = tlv.OctetStringMember(11, GROUP_SIZE_BYTES * 2) -def Hash(message) -> bytes: - return hashlib.sha256(message).digest() +def Hash(*message) -> bytes: + h = hashlib.sha256() + for m in message: + h.update(m) + return h.digest() def HMAC(key, message) -> bytes: diff --git a/circuitmatter/data_model.py b/circuitmatter/data_model.py index a9dff07..c8bda9a 100644 --- a/circuitmatter/data_model.py +++ b/circuitmatter/data_model.py @@ -155,6 +155,7 @@ def get_attribute_data(self, path) -> interaction_model.AttributeDataIB: for field_name, descriptor in self._attributes(): if descriptor.id != path.Attribute: continue + print("reading", field_name) value = getattr(self, field_name) print("encoding anything", value) data.Data = descriptor.encode(value) @@ -180,12 +181,15 @@ def invoke( if descriptor.command_id != path.Command: continue - arg = descriptor.request_type.from_value(fields) print("invoke", self, field_name, descriptor) - print(arg) command = getattr(self, field_name) if callable(command): - result = command(session, arg) + if descriptor.request_type is not None: + arg = descriptor.request_type.from_value(fields) + print(arg) + result = command(session, arg) + else: + result = command(session) else: print(field_name, "not implemented") return None @@ -386,7 +390,9 @@ class SetRegulatoryConfig(tlv.Structure): 0x02, SetRegulatoryConfig, 0x03, SetRegulatoryConfigResponse ) - commissioning_complete = Command(0x04, None, 0x05, CommissioningResponse) + CommissioningCompleteResponse = CommissioningResponse + + commissioning_complete = Command(0x04, None, 0x05, CommissioningCompleteResponse) class NetworkCommissioningCluster(Cluster): diff --git a/circuitmatter/device_types/__init__.py b/circuitmatter/device_types/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/circuitmatter/device_types/lighting/__init__.py b/circuitmatter/device_types/lighting/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/circuitmatter/device_types/lighting/color_temperature.py b/circuitmatter/device_types/lighting/color_temperature.py new file mode 100644 index 0000000..9b042b7 --- /dev/null +++ b/circuitmatter/device_types/lighting/color_temperature.py @@ -0,0 +1,5 @@ +from .dimmable import DimmableLight + + +class ColorTemperatureLight(DimmableLight): + DEVICE_TYPE_ID = 0x010C diff --git a/circuitmatter/device_types/lighting/dimmable.py b/circuitmatter/device_types/lighting/dimmable.py new file mode 100644 index 0000000..41d3519 --- /dev/null +++ b/circuitmatter/device_types/lighting/dimmable.py @@ -0,0 +1,5 @@ +from .on_off import OnOffLight + + +class DimmableLight(OnOffLight): + DEVICE_TYPE_ID = 0x0101 diff --git a/circuitmatter/device_types/lighting/extended_color.py b/circuitmatter/device_types/lighting/extended_color.py new file mode 100644 index 0000000..fb9cc8d --- /dev/null +++ b/circuitmatter/device_types/lighting/extended_color.py @@ -0,0 +1,5 @@ +from .color_temperature import ColorTemperatureLight + + +class ExtendedColorLight(ColorTemperatureLight): + DEVICE_TYPE_ID = 0x010D diff --git a/circuitmatter/device_types/lighting/on_off.py b/circuitmatter/device_types/lighting/on_off.py new file mode 100644 index 0000000..b22e96e --- /dev/null +++ b/circuitmatter/device_types/lighting/on_off.py @@ -0,0 +1,2 @@ +class OnOffLight: + DEVICE_TYPE_ID = 0x0100 diff --git a/circuitmatter/exchange.py b/circuitmatter/exchange.py index 376428a..3007f76 100644 --- a/circuitmatter/exchange.py +++ b/circuitmatter/exchange.py @@ -49,6 +49,7 @@ def send(self, protocol_id, protocol_opcode, application_payload=None): self.send_standalone_time = None message.acknowledged_message_counter = self.pending_acknowledgement self.pending_acknowledgement = None + message.source_node_id = self.session.local_node_id message.protocol_id = protocol_id message.protocol_opcode = protocol_opcode message.exchange_id = self.exchange_id diff --git a/circuitmatter/message.py b/circuitmatter/message.py index a8955c1..a3bdfac 100644 --- a/circuitmatter/message.py +++ b/circuitmatter/message.py @@ -119,7 +119,7 @@ def encode_into(self, buffer, cipher=None): nonce_start = 3 nonce_end = nonce_start + 1 + 4 offset += 8 - if self.source_node_id > 0: + if self.flags & (1 << 2): struct.pack_into(" 0: - self.flags |= 1 << 2 - else: - self.flags &= ~(1 << 2) - @property def destination_node_id(self): return self._destination_node_id diff --git a/circuitmatter/session.py b/circuitmatter/session.py index 528537a..8fa820a 100644 --- a/circuitmatter/session.py +++ b/circuitmatter/session.py @@ -10,6 +10,7 @@ from .message import ExchangeFlags, SecurityFlags import cryptography +from cryptography.hazmat.primitives.ciphers.aead import AESCCM import ecdsa import hashlib import pathlib @@ -161,6 +162,8 @@ def __init__( self.node_ipaddress = node_ipaddress self.exchanges = {} + self.local_node_id = 0 + def send(self, message): message.destination_node_id = self.ephemeral_initiator_node_id if message.message_counter is None: @@ -205,6 +208,8 @@ def __init__(self, random_source, socket, local_session_id): self.session_active_threshold = None self.exchanges = {} + self.local_node_id = 0 + self._nonce = bytearray(crypto.AEAD_NONCE_LENGTH_BYTES) self.socket = socket self.node_ipaddress = None @@ -218,7 +223,6 @@ def decrypt_and_verify(self, message): if self.session_role_initiator: cipher = self.r2i try: - source_node_id = 0 # for secure unicast messages # TODO: Support group messages struct.pack_into( " SecureChannelProtocolCode: + s3k_cipher = AESCCM( + exchange.s3k, + tag_length=crypto.AEAD_MIC_LENGTH_BYTES, + ) + try: + decrypted = s3k_cipher.decrypt(b"NCASE_Sigma3N", sigma3.encrypted3, b"") + except cryptography.exceptions.InvalidTag: + return SecureChannelProtocolCode.INVALID_PARAMETER + sigma3_tbe, _ = case.Sigma3TbeData.decode(decrypted[0], decrypted[1:]) + + # TODO: Implement checks 4a-4d. INVALID_PARAMETER if they fail. + + # TODO: Verify NOC chain. Checks 6a-6b. INVALID_PARAMETER if they fail. + + # TODO: Verify with TBS data. Steps 8 and 9. INVALID_PARAMETER if they fail. + + secure_session_context = exchange.secure_session_context + + peer_noc = sigma3_tbe.initiatorNOC + peer_noc, _ = crypto.MatterCertificate.decode( + peer_noc[0], memoryview(peer_noc)[1:] + ) + secure_session_context.peer_node_id = peer_noc.subject.matter_node_id + + exchange.transcript_hash.update(sigma3.encode()) + + # Generate session keys + keys = crypto.KDF( + secure_session_context.shared_secret, + exchange.identity_protection_key + exchange.transcript_hash.digest(), + b"SessionKeys", + 3 * crypto.SYMMETRIC_KEY_LENGTH_BITS, + ) + secure_session_context.i2r_key = keys[: crypto.SYMMETRIC_KEY_LENGTH_BYTES] + secure_session_context.i2r = AESCCM( + secure_session_context.i2r_key, + tag_length=crypto.AEAD_MIC_LENGTH_BYTES, + ) + secure_session_context.r2i_key = keys[ + crypto.SYMMETRIC_KEY_LENGTH_BYTES : 2 * crypto.SYMMETRIC_KEY_LENGTH_BYTES + ] + secure_session_context.r2i = AESCCM( + secure_session_context.r2i_key, + tag_length=crypto.AEAD_MIC_LENGTH_BYTES, + ) + secure_session_context.attestation_challenge = keys[ + 2 * crypto.SYMMETRIC_KEY_LENGTH_BYTES : + ] + + secure_session_context.session_timestamp = time.monotonic() + return SecureChannelProtocolCode.SESSION_ESTABLISHMENT_SUCCESS diff --git a/circuitmatter/tlv.py b/circuitmatter/tlv.py index 3bd65b4..90ac2ac 100644 --- a/circuitmatter/tlv.py +++ b/circuitmatter/tlv.py @@ -76,9 +76,9 @@ def decode_element(control_octet, buffer, offset, depth): member_class = NumberMember elif element_type == 0b10100: # Null member_class = None - elif element_type == ElementType.UTF8_STRING: + elif element_category == (ElementType.UTF8_STRING >> 2): member_class = UTF8StringMember - elif element_type == ElementType.OCTET_STRING: + elif element_category == (ElementType.OCTET_STRING >> 2): member_class = OctetStringMember elif element_type == ElementType.STRUCTURE: member_class = StructMember @@ -86,6 +86,8 @@ def decode_element(control_octet, buffer, offset, depth): member_class = ArrayMember elif element_type == ElementType.LIST: member_class = ListMember + else: + raise ValueError(f"Unknown element type {element_type:b}") if member_class is None: value = None @@ -577,10 +579,11 @@ def __init__( nullable: _NULLABLE = False, **kwargs, ): - length_encoding = int(math.log(max_length, 256)) - self._element_type = self._base_element_type | length_encoding - self.length_format = INT_SIZE[length_encoding] - self.length_length = struct.calcsize(self.length_format) + self._element_type = self._base_element_type + + max_length_encoding = int(math.log(max_length, 256)) + max_length_format = INT_SIZE[max_length_encoding] + self.length_length = struct.calcsize(max_length_format) self.max_value_length = max_length + self.length_length super().__init__(tag, optional=optional, nullable=nullable, **kwargs) @@ -596,11 +599,23 @@ def __set__(self, obj, value): super().__set__(obj, value) # type: ignore # self inference issues def encode_element_type(self, value): - return self._element_type + # Log only works for 1+ so make 0 1 for length encoding. + value_length = len(value) + if value_length <= 0: + value_length = 1 + length_encoding = int(math.log(value_length, 256)) + return self._element_type | length_encoding def encode_value_into(self, value, buffer: bytearray, offset: int) -> int: - struct.pack_into(self.length_format, buffer, offset, len(value)) - offset += self.length_length + # Log only works for 1+ so make 0 1 for length encoding. + value_length = len(value) + if value_length <= 0: + value_length = 1 + length_encoding = int(math.log(value_length, 256)) + length_format = INT_SIZE[length_encoding] + length_length = struct.calcsize(length_format) + struct.pack_into(length_format, buffer, offset, len(value)) + offset += length_length buffer[offset : offset + len(value)] = value return offset + len(value) diff --git a/test_data/recorded_packets.jsonl b/test_data/recorded_packets.jsonl index ba69ce4..eecaa14 100644 --- a/test_data/recorded_packets.jsonl +++ b/test_data/recorded_packets.jsonl @@ -1,41 +1,47 @@ -["urandom", 22503210294044, 4, "gw+m3Q=="] -["urandom", 22503210312910, 4, "gZg0Rw=="] -["urandom", 22503210322528, 4, "ZCoy0g=="] -["urandom", 22503210328609, 4, "KgoSYw=="] -["urandom", 22503210343377, 8, "7dPe/zuZ3Y8="] -["receive", 22507050475903, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "BAAAAGRb1gwsb9v7ibnc1gUg0U8AABUwASC/yjzU3JaaRTpdpi9HbkE3320VuVDoRFjqG5bAJwcqCCUCuS0kAwAoBDUFJQH0ASUCLAElA6APJAQSJAULJgYAAAQBJAcBGBg="] -["urandom", 22507075530744, 32, "iD8B1HAOFd3LpcX1x6unn1/llvOu4X//TAHKojgBRNc="] -["urandom", 22507075548898, 4, "a/CtqA=="] -["send", 22507075638136, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AQAAAPpg2g0sb9v7ibnc1gIh0U8AAGRb1gwVMAEgv8o81NyWmkU6XaYvR25BN99tFblQ6ERY6huWwCcHKggwAiCIPwHUcA4V3culxfXHq6efX+WW867hf/9MAcqiOAFE1yQDATUEJQEQJzACIObgj9CEx2MyPagRHuoX1OB32N8u1aKUpNKjb4b854YkGBg="] -["receive", 22507081501977, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "BAAAAGVb1gwsb9v7ibnc1gUi0U8AABUwAUEE+j86ha21S0SmO3dpjWgFpRlun1iA5CU0o0h/FFMkXSWjhCAhlfAw16Jzd8V9LSc9UAbrxyjiJBw8na1TEtYkfxg="] -["randbelow", 22507081596455, 115792089210356248762697446949407573529996955224135760342422259061068512044369, 62472004151595145757509048425697483092818438490850040454525190268717681997267] -["send", 22507091264161, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AQAAAPtg2g0sb9v7ibnc1gIj0U8AAGVb1gwVMAFBBJxKsEIuM71sYxk00KpzvjwP/65EHVND1rK7ciXFIpXlotnM1TMxfAh6NrNc2PmonhF94n+zDz+63y1Xz+Nt1r0wAiCL2Z+uIIHw1Fhjc47j1AzCiAYBgZFH6BtByQxbudJkkhg="] -["receive", 22507091593282, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "BAAAAGZb1gwsb9v7ibnc1gUk0U8AABUwASABCJGKH9Rjsd8MHL3kuFs5+pEYb4Hc0DKrTo1fAmeLQBg="] -["send", 22507091658725, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AQAAAPxg2g0sb9v7ibnc1gJA0U8AAGZb1gwAAAAAAAAAAA=="] -["receive", 22507091846409, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AAEAALqdSggrF/X/ZBRAzab3pgSwK8SI7Msf+cTcw02ALr55mxkOx/6ph+ua7Q7UW4Epw4S73+mGrNnyqeK0TbKxl6JOdnEnyQbW5hAMR7fOyPzAWBLTIDURXoM5VNejFKSgsE7Nn0tRcl5+/ITzjqjIpZgSnQ1mmxnu/sS0zWflOqQ="] -["send", 22507092501114, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "ALktAAjfigo/p/oD0nKsOgFI7ZgMMImPCuaLStHvu0HNFLt8Ww7ueij2qWj9MAqAXhEhxoD6L03pwT1f54OwnfpgYa4hEu+qQXIMGQg/wfX8jEZghn8F/i0NEBoHR5c1HfDW7d+ksZNIj6gAcHkZP+SQ1oTMGVSlC2f4++WUEqH92z0ZkUyayM1ZFH8aNmq4fj3aN1j0851CL7GH8yId8fpnFyZN7cb22RSlycx17cv4hTeOWlHleTKJLWMYYebB/VJFEx5bPP2rTZivt4AD+RwNNPye+2bc1GZVnywkK32P0lO9gsFl6N4="] -["receive", 22507093335799, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AAEAALudSggGH+cl1AjydM3IPyPbnn6p4zcbI94FZtFu0lkds/M="] -["receive", 22507093428444, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AAEAALydSgghFyr/VfHh2hLD2W+GgL5RCyxt0LpgqAvymaxtIOh/lODnmmYPipR1Sad3gxCeXQW++ApMateWrgLSPIRXX+3B38PSx/oIybtcdcV1XjCADjmKVWkAp+ZNi/8hNPtFaHsngA=="] -["send", 22507093662846, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "ALktAAnfigqtAvjZkT4WRF4JI67y/YMaOv3r8MMGIc0wGEDhTU47I0XAnAjSUoAVFHWCu4whSTbRUpUnTg=="] -["receive", 22507093856160, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AAEAAL2dSgiOBMne1DG6VqMAVBHLcxE9lwwOS8oZTp1tI3R4OIE="] -["receive", 22507093967981, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AAEAAL6dSgiHvRriqCP3Z/9TWPmh9nNEEJRtrYAxRQnpMMAAlOo5BdJ3+Fs8IJW6ZQK/pjy2NjP/cdmwDN2XnZY="] -["send", 22507094204478, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "ALktAArfigr22++5L/5SrhYs+EFo9EeCUbILJKw+W3wbANzDQ0QtONGY7bsZzJFHTvxhYtSXzZwBjkm2jlpsT24v6w=="] -["receive", 22507094472834, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AAEAAL+dSgji3bHxzz9hhiFV9KLaYp3gFzBPH4s2sEi3qNfbjrG3niLdneTr+O/QGZGgiKvNu2hnPdXf8Zejd4eMUYPcGg=="] -["send", 22507094736671, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "ALktAAvfigrceOEu9pswtFo2bx48hurtU381FO0uz3tRUMkz5KUebD5oJM+xyV1gPDycPdOL77o5M7yFWWA9pu8qCQ=="] -["receive", 22507094967006, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AAEAAMCdSgiqROS51+7fmArRu4G5ezn2lKtyk1AeJLOhA87hC97TXPS1Kuo2RyCR9VeSoQ/Jbgv1rZzKmWc="] -["send", 22507095287420, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "ALktAAzfigo4OL1WZWWnXpPOXhUuWG3DPcKZiGEr1CYdtWNfQNL0a3U+OQ1qwn6JyLvLOogQr8TCkSvx3sth0GtSddZpnxl/YkiYtgc/b0z/K93YJJpv+pk+TDwhlokBBFCFyTVnttC9co3tWq96rQYDHujUtDIJ1H5sFNzZvVe7/47yndHOf0hcoxkETRdUC7ycgSVc4V9V7LWZ/H8nb+r6i+UDSl+1cGmrmlmniXdabDLnc/bXbNoe5tsilNo5MFTEjTG9Nq+qZ/1RQb+0lF64LNZedBY+UAQ4eQsI72ZQlnREN5Oxf8nqtYo9N0qkQnEtOq0MUqmHMKPy12spnVmqQVq3/4vy94ZxIzAX1yaVS3GleIss3/CG9DI8QGMqzFOTf4EYtTxs+eIh7PXWd/gxH+Ptj5LEhr47Z2ju53wyXO6BfVqeweoghgHwKOyZzQMbli+0ZsSxliy5unZuK91KDVuQOY2SzcqTlRcu969eSj7vc/1NR3X5Oc1SK7Q5bGTRZpL3T4pua5qWbiu3UOpGLQ+PTxS/b0HIqao28R1P1LaTHVu71+fNt7IH5lKCuSJ+WYcsomRUV6ny4kwCQd+AdjxzVskDMPlcKo1auSZG+qh/CJ/Sq5zb+wRWnlKkC09KilT8ZAQagdaegG60R5CBvu3PvsMmoF/8Pi94ycZPmfbgCZnuO46EqiSwLV2/EanVfKiwkAMp"] -["receive", 22507095535789, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AAEAAMGdSggi1W9GlNZAWPcCX+EYiMXcXKDm1I1aPDnR4lDvFxN4KCCGfLqA5fheCP5xFYMZVIPFpYGAJN8="] -["send", 22507095830445, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "ALktAA3figrFCVZeYTtaJpP8ai9S7f/izWlFABI+359zCj/GSJuyo056CWdeaIfN2a0tEDg5FybdckNe4yTpeniNzRshHIj4m0MY9tLOR9tqwBHiRZciIptaL7654Jt6L68m2h8BvHxUCdnggreRQSN8N6kePCdipEJIJxcjusuK6p/KcH1buBV52OtyV7mXOD5l606IJmeliGv2tWUtE20CX0vEyJZ7FiS+cIV5x25+5Kdffx44YFmKz3J3QotoN9oViupQQkNHI9QfyD2RI1sBngaNaZ6YZnwDRN9qLtTG4p6gYOBH6o3392cO3CJNz+eUTIi8ce/aidhMzKuP8vhWioBTvRMTnnI7SAt4IyqBNeWc9dRI8OhZHUXu6K41UCyeAnbU6dl8WHttQFEgwsLtzZnpDfkTgna+f+y5S0tQdkvrCARN7CXfYFe1uxfZ7bzktRHb3HPEzLbfUOcwHQpaXlHPZpZK8ny0yHPYYSd4tZ4rDrtz4Am1iSHArdIbpU2q1FWJgPy2uZC8AGidnrFlIaLmHJ0CBaXuac5GJzrrx5ALQyWj9mFX3UBB0tBD5rcNA71l395QSu5wxllb4c/R1OBkGDlOVsKHF4KQlbOAPdrp9CKU8lQuuGDBfCQxYUjYeaaypcsAFhNAkVZXflh+D3WJcirTDFHCP51Z6tUwCW0LVenlflAQTN07yvBrXZciIFqk0si+AltMbdbJspT4bAPX0XT/5x5REY36"] -["receive", 22507096074796, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AAEAAMKdSghWX0zEEVQflX9EFYvmJTJFhlriFFXrjZigajnrS5MbwuUnRYd+r8QK7zmYC6kOKymq/NQ1YjaPhSieRYydnACW/7215Qi9Dz2/3yGcZI5th24yZJpPLQ=="] -["send", 22507096797308, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "ALktAA7figqDb+Bk/FGJb9KPoVF87iXNfKHRm8GHqFrlV9FSVBVsP1a1w9sCqdFgNTvxPxdP9pBTAsjFPVHuVJanor8EvVOKx6iTtP2yIsKvJgJ9usbi/LJQRiiozHvqHAJpJVi12cksvQeiVi1sgGFiCBqDw8xX5h4nQhRBfL7dk3R+JRSIufDEoIBDenvtn5Gia0N4vNhghCAgVj7X29oDtxvQbt27I5k4ARvBxaOxoYncIuk02UuBmVQ/qJlRlfmOuD48jCfNlDHOJUZsN9FRsGymnEkpCQApd0x3AKb2vrRSjhsnL9TiVd/MxgeIVEdlFAoIMYxz7knNg5rVFCLLoJtIDN2QKq8gHapSPdjhvpqCujgtzegM7HcRqqN+X6RqIE/eWq8Jvbs23hatXPNY8WA3z7YIB4Uc8oezkKT3oGAJ3TtH4XGo+5eHoNBdhJNAYE4G1PXYUsMxZvHJAIaDDveT9KNTqS1+gXswy6c90F91eU3dqIkje7a1t2pUpP1ffwDRFnRxZp/JC5gbNUMVGarayre/6Y1ja49B"] -["receive", 22507098602584, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AAEAAMOdSgio3j5UwxMbJCf2Y7PFK2RXw1EwJi+vHElYeo0alzXo7xDMwtvPJNGFrYTp+GUPFwkhM006xe0wpGEg7HznYcVJPty2Jf8MIvf8b3m0SUEnS/oD3dgccg=="] -["urandom", 22507098742257, 33, "o0LyUJ+HJihmveHms4jfZaSdeAqcSqj7opMBGgEzVW4J"] -["send", 22507100204465, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "ALktAA/figqLyFEW/feIxe0MeKRIrB78PIB3WUDgoXkSQSpAizWgalIRoR7naJxWiG+WhFh9+NIOI36POgo6SMrM8L98Lc7cVdjHLcc6tA9qRUV8BwtUopGPTIECGc7yCDtBB/5SPdG+2b0ySgwMfbDlvyPaa5vncAIJ1AmR8Dg4PlcE/6Zgolnl/Gjz8+6/UxMTvrKsQGzlInSqtQcDN2HqYjmgdb0p+98DVlL30PC2eUCHpCuLQAAp+54mjn6XUCtUfbmP+YfHBQLJapL4bwGOSNNLf+j2JnqecBfiqXI250mhfhwYU54ECZyR4PywZZE4yML8TaHE5y86i+TgJO0FQIPsCrT+88+GKBFUu5MnFxCo1igCMSet70SwFytAjuFjgeSTpT6tzpdN62vQkDyix0C3Vuss6JxwEHw+siMVSk9tXMngLXifOi4drFKPL2tBPWYi2QqPOEBb883Uytt4KtLxXfbvPrJmhaUj8n/lwkWkg4jKng/3LrMh8K78Vkg1i9QyHa/v"] -["receive", 22507101253233, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AAEAAMSdSgj80ofn55y1v5WgMvgckD1J84qu/3bUqjVL1noGIA+GHatNSJvrh8sWJVzDlgzQAFFRAwvgOxyhLyYV9v9ZV32lIe5i1phCKER16l9DGR0BOwnJm/5YWf48V6KzosmHYQE2xpBZSUaK9Zv+MrGIcKpcYh/acx2aFT8B8SuewCAHWzj2epJ+ELVUHD/zfTX/hlFosoHMxOaRCGzKpbDdg9FcEyglSQwTW4fSYNIPJpoE0WjrCWrjL09+HFYsp1NlYBOO1Nkv/XRAEsR8ZIQCY99fZQyJbdAW/hZUnJLw8ty2JEnSwGme9Xv8cnkb0vKFqcxqB+pM1EoZbYml3no6HFCzOLnLvGaPR+M46wg9znkjiw9kJ5MPH9/ojwIwcx0="] -["send", 22507101485311, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "ALktABDfigqa+K2LleNkt1dm/kjoWkMDZ6TDemoRwV4dF9d85YdzOgLF9bPhFUvKK79nuZwgrXRM2N/WJT9JpQ=="] -["receive", 22507101796127, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "AAEAAMWdSgj4k+f37QACzhtYs6miWJZHVXYiy58OOto9PJmoepeXw53FrQiB9gxZAmICLbyTNpzX+CaVBjbbGfJvamDZFr4LMi5e41iWRamNnfQSIGi3Rv9/FQhXAK7wC4B7VJbJWSifAxi+zfGM1AuvMq+H5+MKzKstcu9ZtQe2lRaZZlESiG0+kAcanCJrVjKT+4ZrNvNPTnziqBhFnk3MOswwIv8j7W1Gycv2FFkY+7VWtTZrR6SJlMxrXJeMMHnEOzhjO80unL9Kc4w2uDJU22ZZUKM5acO0epbS8D4i7aKcB88U4IfBpG8H22iX/Vm+JaXqGcJ49v11A5tC1S+3JyiNBjkfjmoX7IJd8r2kMUadRvfL2WoYfZ6ufg4zE7KJbE4YIXNR4KUmAD1W5CXYtlEKVy69BgmslueUnwTms19AeLsm1CNOomR9bQJdli0vzMCia4XAdMws6wdNOOu4MOF/f6rTSj4TVRyARbhSfKRgvnVwyi5+e0LLyx/gxC0adshO3Z7XfK6FBRpO4PwmK06MuhiEwji7rhI09R0bZagUY3F5sCogw/085m68wBUJY+TMzEwGnOLf4o0wQ1uC2r7V74gOIUP0XJ5MuxSp+D+4TVZbZaND63nNVjMZlB1DUYubmEVW9G4HWBoryrAz8SIici6teeN8BY2LZBgFyHprj5bwWrDwC92TrMJZkD5CW2zPAXZz5o9yPuUeFeiXgbapLU0wz1CzjVc+y+d9miVyJqo="] -["send", 22507102592830, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "ALktABHfigouAc14QlQxP6dRBJ14JAtyU28/RWWZS6LKrASJHiS3Lj+czElVl3rIzX0Fz+vtu7QwIfjc0k66zA=="] -["receive", 22507926622151, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 49605, 0, 0], "BAAAAGdb1gyyOFx9f+ZaYQUw3E8AABUwASA4pzKsbPsDY1ouNoB+LLjQUTRX5QnwPdYAC0gPuzlgACUCui0wAyDR+koSc9SWzN9XWI7SLnaDgQOrL8bKwJkNraPCQsgyXjAEQQQh4gY7sNUSGZjDD79MajfLDiXRC/9/rpcJXbQ2MSdTk7gf4BJxk9UrmGE2/eN33LW6kdfP0IHXFOhcLf0jRfDoNQUlAfQBJQIsASUDoA8kBBIkBQsmBgAABAEkBwEYGA=="] -["urandom", 22507926870439, 4, "nG3kZQ=="] -["urandom", 22507926885487, 16, "IFiG68rTIVwufAcm8d7Itw=="] -["urandom", 22507926900606, 33, "ULf98G217CbVqx7xvQn1vcHUaD/uI2hYBftprQCNGSUg"] +["urandom", 111264152891456, 4, "JujXPw=="] +["urandom", 111264152910872, 4, "u1IIbA=="] +["urandom", 111264152923186, 4, "cx40xQ=="] +["urandom", 111264152930099, 4, "v8YVoQ=="] +["urandom", 111264152945267, 8, "qMXCM7jAZ00="] +["receive", 111294130107286, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "BAAAAJ6CuQK7q3SOsTUacwUgX0wAABUwASCvpif7AKizfGL3scsJ56uwTbIXb1PQt3wiPcQviUwaGiUCvI8kAwAoBDUFJQH0ASUCLAElA6APJAQSJAULJgYAAAQBJAcBGBg="] +["urandom", 111294131096901, 32, "vjKhGCtzvqtroR3sC1+rrwsyOxTDYOCBUbrtPSYL5D8="] +["urandom", 111294131115977, 4, "xTHVeQ=="] +["send", 111294131217969, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AQAAAIR+/QO7q3SOsTUacwIhX0wAAJ6CuQIVMAEgr6Yn+wCos3xi97HLCeersE2yF29T0Ld8Ij3EL4lMGhowAiC+MqEYK3O+q2uhHewLX6uvCzI7FMNg4IFRuu09JgvkPyQDATUEJQEQJzACIObgj9CEx2MyPagRHuoX1OB32N8u1aKUpNKjb4b854YkGBg="] +["receive", 111294137254698, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "BAAAAJ+CuQK7q3SOsTUacwUiX0wAABUwAUEEn1dvIguP4Hk64WzkG+R+ZlCI3/8gErUTirL0hqFY2Tb/AGjPmldvYz6TOAVu1TFntDfPUeAPtVHA897sMkNMnRg="] +["randbelow", 111294137361159, 115792089210356248762697446949407573529996955224135760342422259061068512044369, 17917335428103644639474033566520901857765130625286201180606319790209402273240] +["send", 111294147217937, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AQAAAIV+/QO7q3SOsTUacwIjX0wAAJ+CuQIVMAFBBJ47JXoaFx0tFkdnmS5riKFIminKkd0KOjvVySTMOzJ7pJSwxlvxG1RRPypEl5nDsc6krTqcYaUGFbySrDR7I2EwAiAxBCFKQAsD8PCAIb0B7BSwoqAjadrLtgng7hvnvUcKXBg="] +["receive", 111294147576573, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "BAAAAKCCuQK7q3SOsTUacwUkX0wAABUwASCq5fyqmx/K35qmrqTupHDadn9w05ly+nwJwBsLjbHWURg="] +["send", 111294147656033, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AQAAAIZ+/QO7q3SOsTUacwJAX0wAAKCCuQIAAAAAAAAAAA=="] +["receive", 111294147880236, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AAEAAD2ncgLjNgCloyzj3mS50RmQGnbL78elClWk+xLtUAS/AC8jw1N+ioxaK38VhGC/N6mg6t+CVs+y4kev0VnoVUafJQ/RpTVjlRm4Q4B9Tdi3jzeG5uXoxv3sKnPCc4usZKO6rXGUj9AAzyjF9WcxYhfUqUHrjZbmioHG6jt+w9Q="] +["send", 111294149365175, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "ALyPAB5TnQcxFgTTtDUJUpRbNjIJpfLdVBdfjMnyl1SV5EENCDlLbRL6mMhIAp+r0w/V1AQYaSgtIN5gAigT4urjoisXnGbN80vTXdzwKbuo79bD+RBWO4NDLX5rDE2OnWjglYWtnbUX+iUau1k1hKGH0yl/K80Pd1WDf8IYImInLkurFa7QZ1wlSLLZ+v0wr4909tlAto918QpUm1F6hCNOrqwWLKVk4q9g+ixc8ukvG9HaLS6+XnakyhS2nq28Rn1+ohdlTsDJ9dGE23Ipvg3Wv/bqRTlddl7JCACQ1NqH5+COaswlZrY="] +["receive", 111294150226768, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AAEAAD6ncgIxeTo2q2A7a+gI4k6hv0au+afH06DL5xDxphrdzSY="] +["receive", 111294150333379, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AAEAAD+ncgJ0JUAihMeSIZCK+yeIB7DLthP+TebqOOT8N2V2yFk9aCxjDjs5yOOTEc9LGnN1cPZIRkkoA8jqGiuj0K7XykVrbeyT0o5Ff7MzPmpQ/TjgmV5ZwTzIc7a2yKPEugaJamgLcQ=="] +["send", 111294150632914, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "ALyPAB9TnQe459KQdGiDnWXmcT7vZOGhRG1JtsfjTVHnIPKoBS3B7ShbGsYFEnxswLl/p2zeMFnJkbn2iQ=="] +["receive", 111294150872225, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AAEAAECncgJnzUuM5jD4YhRns76bc2tIVVhkNhZmAM1qRhsEdQY="] +["receive", 111294151010836, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AAEAAEGncgJwDhcKw/DOtUdDrV9mpOxHklgVkphBX9RsxGGTc2SxrJe30X+dXLSY8hO2rgszFSCW46jl4HQOJrc="] +["send", 111294151377147, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "ALyPACBTnQc8ye3JuNxcWZ01yoWHPH2fMUnGQslDkRAD2AqNhBdfLH1iS7mfA1s0PupQM+zlVM9gXNszb1dJrl8+JA=="] +["receive", 111294151613913, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AAEAAEKncgK/uNJrwNFSEELfsm43mpqjxmJu5GgfwN6lOaor10kFbzroEKIA6XTfaH02XyJJ3MjubDNXnXkpMVFnwbqhCA=="] +["send", 111294151953252, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "ALyPACFTnQezo6NKHu238JJXLPzVUTHv0grGyCuHTxz6Bz7NnCGdOtDwj8Nkf2BAsAwJOudPTtKQdnyq/5UB+jMXyA=="] +["receive", 111294152211389, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AAEAAEOncgIzl0FufpZ51dBd3WZpPyQ6biu+H1U813azprH+URblUB8CQJA2luNgYLO3xqh20ploeDYIHGs="] +["send", 111294152643974, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "ALyPACJTnQdyFiPkaeUZ+/bKvp5+hbae41MC8Szb/gKRfSo/5BYTa0CSqctkCxl8T5NgGgl99gWmlX/n/Lqid4sBaaFpuVDCQlsWo2uID5vkejhb8P9Cz+vxmYYW8Etl8gj0cvJY4ycyMnbXvfS7/D1FW1+tDAlXArN06GU5flUoIWCDTnWD0eNFzGafpgjIPfeDHkX7wldI/M7p6RgwY75rn/wf/RNjqS+fA8QtX2cTDolyOUm/J1MBsZ/kYuqOo986y5kX0Y4GGdXy44/JXSmWSEtTMHd5Ix+vuc3JmnNQWoGb6tQiGe0ldGW802rY9i4ylM/RA/hbEB5jRyyFUExKuN4731zHySbwahhHdlj9ZZTFCXNnVzgK6A4ajz3ZBLG4OBSV8h7hc+ote8ZeHmv6DKt3Wy/ejM+xyGDBOp4f0Dp44/rLZ5Ugoj9ZcC2hDAOOrofMLRZ+0fxPHsIqpfFBIDaHy9xYnhfbn/bj7dXoya8fb42EqVaveNfqSplCnCDTQBLhV/Gz4fySHBeLmzWYqoHfzoLLa3F7UyPwL7J3Go4/anb8rgrGuKhO4qq9nl63R1jOK4lIHl5LTQ8n65OFvUYdy6FVOEaqdIzaDP7q4v4/vweN7NndmRiKEVzdZeVg0686RUc0C4I7zv8CWufSvPEIR+M3lfCpTq40z6U3kihw+Ll6t1V0yrgLGzYsDdE0+BYpokkf"] +["receive", 111294152908032, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AAEAAESncgLpN1VlEKUfqKLte1FufPiMkmZg1g35vWk/d+dSdQdrBNGojY99vh24+J1l9XjbGHOgx0l/n1U="] +["send", 111294153230089, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "ALyPACNTnQeDCasiz0P3b+rIEzdHCiBtrOpYEY24jutvPSahdSWlaneJV4iqyW0HAIKYBt+TxNIvbeCbPHO5A3GK2N8o/NUJ9MhOXMNRHcV81C5NQABJAkEtLXVicBNAglY5HW/hg+8T1S2CVWHWCnL00a0FUHwlPyA3bVJva3c+iKBl6iHB+uUOJdqlPyA0nKrS4U+4h524Tyq2T2UL/ImoJriiozTR7Y/ISZzTGLpY5/mgBuR7N8PTUztAyZqvrEBgIr2a9oB6U36+0eE0tMD32nWg/sO7dnB2FmnvQddgw4L3NQixijLM/nXty+hYG0gsHLleVdhceHYnAqmLiA8GGkx6NlGg+ntO0qVCG2dCB5fF1Rnd00HS5xT3F5bRMkkhK3pKbf9bBXkcwEvlh7vdf2Cq0PKzH+KvS0WDMaqdFcOYAFxOhBYstFN+zmWAAFlxE9zlNSTV/lqBOERzDpGi6ErEuTq41JC+sQqIQwnwQpB7LSQe/ZYHbtac2dGrzP3HXgV5h/ssS8zGN9VmL2z3Dl+WTfh3HiNM/n6sy2QSoobVqFVGdNWb81Y3n514UFzx9YviYhbsV5EtnCObfmzNRAyiOD1zxEMiwV4YcG7hbkxeZWorbzFE2dOMsPI7R1mLh1iwA1aeO7lm02xqJlsuxXwy31/edY7grEk9z1o6gKnoBjsrN2pQSFGt8C/WeQq9XqUeaKfdbETmd1+lqXnTpplUzrof+opMT8eB"] +["receive", 111294153472546, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AAEAAEWncgJsQ5RwKC+pLWukZT/l4JIeqV76fCuB8OlGVY4OQ3/XwZy0mK7RyX/d59uFRcxErugvkISMSAGyBK8Y1ou88ZOYGIMp8dgWrD5aNxob1ZE3mJH1nQr68g=="] +["send", 111294154334030, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "ALyPACRTnQfU/gYMCljcfSOLN05N6vjqpR0HWfkyr16GNO79jY2i2o/pULI4LJWxrEoJIrY6mWFw/OlQZj8Z+x6dlzVCNuvoU6Z3daHvJlyKGuR5KXAqOUTxIaGRc8SvbcJvT1VzuxuCwlB1Ab3iFmME6YX9bynVNg9IOhOXhtUlBcF+vi/yTlQhs2sZv85Yl+uN9ah9olvJvpXQn9tLVsSh1yj2nflhILKnANSFnrt5IhgK9m/+KkksC/TIBLaHaqosyy/tu811WGlnV3TXQDqQj0D3YDc9NeJ9UI9pEzYhs7B/wwyh6A2omIqjrH3AoXMOVWebPrA5FQDH8ycmX7XZrJ2qROxedBeM35vk21khplauy0PG5pnLxPi/Zb1ficr/kiclxlqehb6dj3NZ8Tdck2h4ofDOFZzJAkbbOm7abeGUARZTalhRRH+ctMCeaBc0/Sh33peSs0F9/5RIjLD7W1yc5JPOfENq8bWmCdOsdnWXgF3tFxHVqdxGMSLQSpsyndBbC0+36Wq5RU/Pz++hKvZB4LlYjGHzlnU="] +["receive", 111294156168618, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AAEAAEancgKAjFw06eTXQO74iEiz4SrdJLQvKXHF7Dczyw6o1lt8cX6NpWuMkc5lwQ7TSZFsk1KL74Y/9pj9MUZpIUf1dFkt6fQ2q/Enla0FWovjWySR4wm6SV5b1Q=="] +["urandom", 111294156372843, 33, "jOI83bL214pQs5EayVuJel4Hu1+MeI7TfI78EqjVJfq1"] +["send", 111294158380407, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "ALyPACVTnQcpIxiaIDDzsbjIYZ7A2ignzs2XisihYRXGBkQzk+YkXjNo4aX+y+SnKPuhcUTMU27Xx5V6WvweePKvtvLrH6HccbCPxtnxUxB++JJTvsI8gtYYLxgRZxzQJxU3nS7ehBIQfjJabiqXxo+7KzZELj1wV4LVSPPjkbAspgPpRDu4TufhVhPumNcCM2RRpeGlev5LLho3HWM04t4wlUcFO/aSURF5NvheX/jzmYQvZptiweRNANJQRNabqH5CRsx0mVcWgVFml1DAJx0dSbK1tfwouGtCzFaf9alxbBibh9SSNo3VC8d7k7huUjIgnGZB2TLLlLqZLLMqhYzGkiz/bPVSkwQRr8wCIZ0ycwWfU0cD2sv+Yilg8SCM5ig5jIJ29o7Ciomj+7KBZzAIMLiPvjLr3Qp6t5tpXdzYvb3deW00DYeGufMjSSpKny9uTkGF8WXpHpo84Vt57Q1nbCTG5qMp4djPvwt1n5eaMG6geWJVOBdsLPZqkBqxp8NDft7oxoge"] +["receive", 111294159306192, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AAEAAEencgLNIjsq0v6GNsXja9EfcNuYk/FGp/DEHV8GyF41RI/bx/TpkN1YVXEjDzYQlPTU2xPlqpRQsPSflnpytDz28Uiv9zAKrGv/OlFX/vk0T9nkaxq15XpijD6ymLEnzY+itYMWoD6uUW8/BYN5u2I8U4bbWEuEJSLhVbqlpnHODn5cTaaG8O/6Wo3eWmJJeCkqOgeApOs3CcsMSIGmDQPCprmvZrSDhVxESVaut6SwUOwJR7fsj++mGmuLBmAkjv2GcDVh/80FwbDeCDCHa2KUAfXycxt7p3NVT0X/M+2koKfims/r2ODYaf8s3GhaaJ5yzYDBo1fRDKizWh/W69SKwrK9/f5FuNZAGf0PtqtRQcEioC2u5xyOZf/MmIQ5w24="] +["send", 111294159625243, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "ALyPACZTnQeSJlw62/mv3lzSxCNb1LGXAFqX17fRBrloT4OjGmFprGz8GFUnMxo8clwx9pzx2hvK2Dat9Jr2/w=="] +["receive", 111294159872219, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AAEAAEincgI7bclwJdk75JjuSJALFGFCW5FVnC7VEaHkUSZ5xBot6367n/AxjaueTUskMLqe5tPBvV145tBSieHOB2tC0ZdAgw6wSl5x1htGd8n3jAdlZQ5aezEJDquPVVCj+naDjys77Rp+tIIn7oSZtzb8Gj0nY+CJmfIH+fTGF3tIH2CydYnWavpxV3Y008hhXHhbgtNxXNR4jcZ7DzJb0n6WwNMj2PDlcmIf92ErD/Vwjqk22xsyHhqdphcReDato5kUIErdvHxquDMktRrOiWlXzgcau7xWjka88s1XAc6o2I4+QqU02Aksy6E9bEGi7jRmrdPk38Oscg1kwMoQ578emqlJUYJp3SLy6gLR5OpYm6hkoCvVRze+7aEVZqpCA0wej4erHRArLtWa0i+vadwSld9wwp+oTagn+QZnQJCDcGYNf49dAye0NobSC2IN/goCgLPsWzXcADY4C1TokMG+cgPqWO5k28kAZsvETgRq4AKtqojhyVjmFRPtse0AgTfIf8hV7MD+DV9XEohawIHwTPVIiLSOdaxPaLbavEDoB09yFkDkSwpObRMyf3z9e4sYj0KQe55/AwTGDezDBYELxN/onsvVrjM24M0BeUykPBqibvxRSrauzvzSdvNxNiQXYW85Tf4HV7Ij762D/uerMemqMdt3yX5FsOe6c5PHRJTZY2Mog7j4euUAistBy8jlpT8L/mP8Q/1DCpuR68SmXCm1nIT4x7tdFnuQxGS5E7s="] +["send", 111294160700169, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "ALyPACdTnQfIGt0GDtKPW0zF7sc2OfO4pdTL2K3BaE4PDcgEwqLcXg2RJ/qxZ9sLgF9lDZcc/ExMJJHEM8SDqg=="] +["receive", 111294941521785, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "BAAAAKGCuQJXK1fHo9Ab3wUwakwAABUwASDn+8jKvin+r/+vtH+ACF1yVSdFWJhoO+33sX1CmjP2JyUCvY8wAyCpVG9eWX/6PgdgfmPxQxx3d8EZ6FlktCltosP2rtz00TAEQQTTtyjCJv9esXf+T8nJCW3cgP6pM1uL1cKXz4SHO0uIrGLRrp7tHUFlmWH/lUel2Brriu5v6dmkEk3RRZJtbYuYNQUlAfQBJQIsASUDoA8kBBIkBQsmBgAABAEkBwEYGA=="] +["urandom", 111294941764963, 4, "2ziwzg=="] +["urandom", 111294941781144, 16, "N1Ox4PQqO5n9y+iyFzJhgQ=="] +["urandom", 111294941795821, 33, "RL586kbxWiBnhHwJqymgX4xHnApS9KxByG/Vc48ho2yG"] +["urandom", 111294943882144, 32, "AJJskIOaI00wMHR1ZziOSuPwplh9yqe7WxXQYQRaDD4="] +["send", 111294944218578, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AQAAAId+/QNXK1fHo9Ab3wIxakwAAKGCuQIVMAEgAJJskIOaI00wMHR1ZziOSuPwplh9yqe7WxXQYQRaDD4kAgIwA0EE7X6RftOk+CMLQ7aGhBFSy+nJo/wcVqwmdGG5iGwDLtz/lkv4+uRRbwTHsnQ3ulvktu6/Rl6NR7Cj5WqalgQz3TEERgKCpzLjdAqzVWDMi9MDBjiCPB2BLln1FztxnTQRmwpIXD//plFBIje3GeoQCOn7FMEIaAqXLXr+/vdADmk87Zcz3+N/WuodPKWMzYDYEYMW8zQWGoozcFHCpFyw+KZ7Gyi6rfptuM/dnQnb++/7bKy7cMsZrfKs7Mm5YiAeRAz0kcYfOxlPJ6rZr0F6KGnmpP3Q8dvFGDnUjOL5fsvqhsn1jSFXmCcURVki7CrAQ0LmKntkDJfnYZG/j/CM0/4IKPKOt+q9HE5wHRUmABSWLO7KCeSdSj7Os+Fwz8vC5WPHMOjJYWLEONUYNiJ9EwfaIQA2VwEvbO2sSOeIHKsaVSAsP65cAq1eTSHCZRJYYA4WzQ/3ec/oeFhNCLJSTEekGRV5a3Nlaup/SUS/VLfzbPpJLFgscxzmOJdhpah9GOdFLC3KktLZepTjeXhrmigDCrQOyflxhGnx6SFJkBKFZrdynNPxBTJVNJfBBRXwWxNAN5DsV7VCqlHVnyNHu8iM/y00lLdwbrWAx8P1F5cVZE+EF1sQmPVHfQuRMsjIY+e9Iwngfkr1drWJTjE/iScmneuYkEJFgvx10vuiNSz9PeM0Zx9ULnEImNhH8vPrRxyeIGQcSXwTy1Pf1HgHSX9fviKMbWuDB395J2urRPJQQkoImB/jfuIWd1rKkwQX5/gYRhwfBkiwjRluFaaHOr3Kk4PhUcQRvWNKzMBVY/IezRWNsK0zeJ3naJUIOfX1PnvloezNyEGd8/ZV0IoTgY1e2y0V7E0XDD4Y"] +["receive", 111294945305286, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "BAAAAKKCuQJXK1fHo9Ab3wUyakwAABUxATYCUh1ewjmLj/74gRpd+ctr/SSoJGOKp9B3XYnMV5QHx/RKls9zg/rENcaSCGGd0Z2LWGsaHsRKPGdZZhJu8vIRKubL5vkR/ELj5HnzoW1PbS2jgFGCZnT2QGwP47MGBEBPEpmh7l24ecPrOKvrmZwDi+ngEOWEFjuWqmGbeUNYIVqvv31KmxrKftA/I8EUh7t15g9WKs1E3Bmj+vYZS+ZtR/7WKflPXUXcTA6h9vC1m+SaVFpWs6xANMv+KCfNJ/v4fv4E+xhIUzvcRXzhgo8gfhlx1gSKPPGG1kkWoq7JrNy6l/ySzcbSllSBw4/4AE4T/uVI9tMDGYxgrXEwb/S7AjoqKCXYZxAxbavyu9vIPPWYf9/bzMJDRTbxsFyIGG/1tamrZlWpCfAJ2rR0E1yIJM8kTqgNwLgV1ws8fptJD3Ju1syrQdKpnL5jdH8IMGPi6VoDYA2XsGjsOX89YXMpyfyyFNkh28Q3bOP+gHKrJ0J1L2yFTC1C90KA9QUP3KGgThvQHNA7kz2o8JgtWqQD65+E+Zk2mJTDHwEU09MhO4qE8d9sIxVGFUkkZ7M456ehyQMuHliiYAMl44Z/bWGQ2snXh8HSax6AxzOjo64/27oxI+FlGqh5rLVcBqfmX1IjSfFtRxBhHmm0nsuHgpzwqs1v3iEFJOIyop5aFK5KnVkp8Ki1gSxYz3lvnItXgRBFqnbuDJ7g8G9rcc2blUYNRl+9Uwspl9SNBlY94TgxQi/G/gBUX2MY"] +["send", 111294945527726, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AQAAAIh+/QNXK1fHo9Ab3wJAakwAAKKCuQIAAAAAAAAAAA=="] +["receive", 111294946293068, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "AAIAAKQzPQtV5BBTZjucLTHWiH3E/nftpBZyjWGaP8urp/V6RLoML8LF1ipGLn7mO6Qq3yF7zmnIcVo="] +["send", 111294946546155, ["fd98:bbab:bd61:8040:642:1aff:fe0c:9f2a", 51241, 0, 0], "Ab2PAI8D6wxptgEAAAAAAPOXL8w6uNDB6/AdiC/vlwmb4DjgN1rOjdalN5padSANjC0riKrblU6u+RpwbEJFvU2xzR7N/rC6BvWy"]