Matter refactoring of IM messages (#18416)

This commit is contained in:
s-hadinger 2023-04-15 12:20:02 +02:00 committed by GitHub
parent ae5dd61b8a
commit 538b5a0aa6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 3358 additions and 2748 deletions

View File

@ -129,6 +129,7 @@ BE_FUNC_CTYPE_DECLARE(matter_get_ip_bytes, "&", "s")
#include "solidify/solidified_Matter_inspect.h"
extern const bclass be_class_Matter_TLV; // need to declare it upfront because of circular reference
#include "solidify/solidified_Matter_Path.h"
#include "solidify/solidified_Matter_TLV.h"
#include "solidify/solidified_Matter_IM_Data.h"
#include "solidify/solidified_Matter_UDPServer.h"
@ -299,6 +300,7 @@ module matter (scope: global, strings: weak) {
IM_ReportData, class(be_class_Matter_IM_ReportData)
IM_ReportDataSubscribed, class(be_class_Matter_IM_ReportDataSubscribed)
IM_SubscribeResponse, class(be_class_Matter_IM_SubscribeResponse)
IM_SubscribedHeartbeat, class(be_class_Matter_IM_SubscribedHeartbeat)
IM_Subscription, class(be_class_Matter_IM_Subscription)
IM_Subscription_Shop, class(be_class_Matter_IM_Subscription_Shop)
IM, class(be_class_Matter_IM)

View File

@ -83,8 +83,10 @@ class Matter_IM
#
# return `true` if handled
def process_incoming_ack(msg)
import string
# check if there is an exchange_id interested in receiving this
var message = self.find_sendqueue_by_exchangeid(msg.exchange_id)
tasmota.log(string.format("MTR: process_incoming_ack exch=%i message=%i", msg.exchange_id, message != nil ? 1 : 0), 3)
if message
return message.ack_received(msg) # dispatch to IM_Message
end
@ -109,13 +111,16 @@ class Matter_IM
while idx < size(self.send_queue)
var message = self.send_queue[idx]
var finish = message.send_im(responder) # send message
if finish
self.send_queue.remove(idx)
idx -= 1
if !message.finish && message.ready
message.send_im(responder) # send message
end
if message.finish
tasmota.log("MTR: remove IM message exch="+str(message.resp.exchange_id), 3)
self.send_queue.remove(idx)
else
idx += 1
end
idx += 1
end
end
@ -603,16 +608,11 @@ class Matter_IM
fake_read.attributes_requests.push(p1)
end
if size(fake_read.attributes_requests) > 0
tasmota.log(string.format("MTR: <Sub_Data (%6i) sub=%i", session.local_session_id, sub.subscription_id), 2)
sub.is_keep_alive = false # sending an actual data update
else
tasmota.log(string.format("MTR: <Sub_Alive (%6i) sub=%i", session.local_session_id, sub.subscription_id), 2)
sub.is_keep_alive = true # sending keep-alive
end
tasmota.log(string.format("MTR: <Sub_Data (%6i) sub=%i", session.local_session_id, sub.subscription_id), 2)
sub.is_keep_alive = false # sending an actual data update
var ret = self._inner_process_read_request(session, fake_read)
ret.suppress_response = (size(fake_read.attributes_requests) == 0) # ret is of class `ReportDataMessage`
ret.suppress_response = false
ret.subscription_id = sub.subscription_id
var report_data_msg = matter.IM_ReportDataSubscribed(session._message_handler, session, ret, sub)
@ -620,6 +620,26 @@ class Matter_IM
self.send_enqueued(session._message_handler) # and send queued messages now
end
#############################################################
# send regular update for data subscribed
#
def send_subscribe_heartbeat(sub)
import string
var session = sub.session
tasmota.log(string.format("MTR: <Sub_Alive (%6i) sub=%i", session.local_session_id, sub.subscription_id), 2)
sub.is_keep_alive = true # sending keep-alive
# prepare the response
var ret = matter.ReportDataMessage()
ret.suppress_response = true
ret.subscription_id = sub.subscription_id
var report_data_msg = matter.IM_SubscribedHeartbeat(session._message_handler, session, ret, sub)
self.send_queue.push(report_data_msg) # push message to queue
self.send_enqueued(session._message_handler) # and send queued messages now
end
#############################################################
# send_status
#

View File

@ -19,46 +19,15 @@
import matter
#@ solidify:Matter_Path,weak
#@ solidify:Matter_IM_Message,weak
#@ solidify:Matter_IM_Status,weak
#@ solidify:Matter_IM_InvokeResponse,weak
#@ solidify:Matter_IM_WriteResponse,weak
#@ solidify:Matter_IM_ReportData,weak
#@ solidify:Matter_IM_ReportDataSubscribed,weak
#@ solidify:Matter_IM_SubscribedHeartbeat,weak
#@ solidify:Matter_IM_SubscribeResponse,weak
#################################################################################
# Matter_Path
#
# Used to store all the elements of the reponse to an attribute or command
#################################################################################
class Matter_Path
var endpoint # endpoint or `nil` if expansion
var cluster # cluster or `nil` if expansion
var attribute # attribute or `nil` if expansion
var command # command
var status # status to be returned (matter.SUCCESS or matter.<ERROR>)
var log # any string that needs to be logged (used to show significant parameters for commands)
def tostring()
try
import string
var s = ""
s += (self.endpoint != nil ? string.format("[%02X]", self.endpoint) : "[**]")
s += (self.cluster != nil ? string.format("%04X/", self.cluster) : "****/")
s += (self.attribute != nil ? string.format("%04X", self.attribute) : "")
s += (self.command != nil ? string.format("%04X", self.command) : "")
if self.attribute == nil && self.command == nil s += "****" end
return s
except .. as e, m
return "Exception> " + str(e) + ", " + str(m)
end
end
end
matter.Path = Matter_Path
#################################################################################
# Matter_IM_Message
#
@ -69,6 +38,7 @@ class Matter_IM_Message
var expiration # expiration time for the reporting
var resp # response Frame object
var ready # bool: ready to send (true) or wait (false)
var finish # if true, the message is removed from the queue
var data # TLV data of the response (if any)
var last_counter # counter value of last sent packet (to match ack)
@ -78,6 +48,7 @@ class Matter_IM_Message
self.ready = true # by default send immediately
self.expiration = tasmota.millis() + self.MSG_TIMEOUT
self.last_counter = 0 # avoid `nil` value
self.finish = false
end
# the message is being removed due to expiration
@ -87,6 +58,7 @@ class Matter_IM_Message
# ack received for previous message, proceed to next (if any)
# return true if we manage the ack ourselves, false if it needs to be done upper
def ack_received(msg)
tasmota.log("MTR: IM_Message ack_received exch="+str(self.resp.exchange_id), 3)
self.expiration = tasmota.millis() + self.MSG_TIMEOUT # give more time
return false
end
@ -113,7 +85,6 @@ class Matter_IM_Message
return self.resp.exchange_id
end
# return true if transaction is complete (remove object from queue)
# default responder for data
def send_im(responder)
import string
@ -125,7 +96,7 @@ class Matter_IM_Message
tasmota.log(string.format("MTR: <snd (%6i) id=%i exch=%i rack=%s", resp.session.local_session_id, resp.message_counter, resp.exchange_id, resp.ack_message_counter),3)
responder.send_response_frame(resp)
self.last_counter = resp.message_counter
return true
self.finish = true # by default we remove the packet after it is sent
end
end
@ -191,7 +162,6 @@ class Matter_IM_ReportData : Matter_IM_Message
self.data = data
end
# return true if transaction is complete (remove object from queue)
# default responder for data
def send_im(responder)
import string
@ -204,11 +174,12 @@ class Matter_IM_ReportData : Matter_IM_Message
# compute the acceptable size
var msg_sz = 0 # message size up to now
var elements = 0 # number of elements added
if size(data.attribute_reports) > 0
var sz_attribute_reports = (data.attribute_reports != nil) ? size(data.attribute_reports) : 0
if sz_attribute_reports > 0
msg_sz = data.attribute_reports[0].to_TLV().encode_len()
elements = 1
end
while msg_sz < self.MAX_MESSAGE && elements < size(data.attribute_reports)
while msg_sz < self.MAX_MESSAGE && elements < sz_attribute_reports
var next_sz = data.attribute_reports[elements].to_TLV().encode_len()
if msg_sz + next_sz < self.MAX_MESSAGE
msg_sz += next_sz
@ -218,11 +189,15 @@ class Matter_IM_ReportData : Matter_IM_Message
end
end
tasmota.log(string.format("MTR: exch=%i elements=%i msg_sz=%i total=%i", self.get_exchangeid(), elements, msg_sz, size(data.attribute_reports)), 3)
var next_elemnts = data.attribute_reports[elements .. ]
data.attribute_reports = data.attribute_reports[0 .. elements - 1]
data.more_chunked_messages = (size(next_elemnts) > 0)
tasmota.log(string.format("MTR: exch=%i elements=%i msg_sz=%i total=%i", self.get_exchangeid(), elements, msg_sz, sz_attribute_reports), 3)
var next_elemnts = []
if data.attribute_reports != nil
next_elemnts = data.attribute_reports[elements .. ]
data.attribute_reports = data.attribute_reports[0 .. elements - 1]
data.more_chunked_messages = (size(next_elemnts) > 0)
else
data.more_chunked_messages = false
end
if was_chunked
tasmota.log(string.format("MTR: .Read_Attr next_chunk exch=%i", self.get_exchangeid()), 3)
@ -251,9 +226,9 @@ class Matter_IM_ReportData : Matter_IM_Message
data.attribute_reports = next_elemnts
tasmota.log(string.format("MTR: to_be_sent_later size=%i exch=%i", size(data.attribute_reports), resp.exchange_id), 3)
self.ready = false # wait for Status Report before continuing sending
return false # keep alive
# keep alive
else
return true # finished, remove
self.finish = true # finished, remove
end
end
@ -264,7 +239,7 @@ matter.IM_ReportData = Matter_IM_ReportData
#################################################################################
# Matter_IM_ReportDataSubscribed
#
# Main difference is that we are the spontaneous inititor
# Main difference is that we are the spontaneous initiator
#################################################################################
class Matter_IM_ReportDataSubscribed : Matter_IM_ReportData
var sub # subscription object
@ -326,14 +301,17 @@ class Matter_IM_ReportDataSubscribed : Matter_IM_ReportData
def send_im(responder)
import string
tasmota.log(string.format("MTR: IM_ReportDataSubscribed send sub=%i exch=%i ready=%i", self.sub.subscription_id, self.resp.exchange_id, self.ready ? 1 : 0), 3)
tasmota.log(string.format("MTR: ReportDataSubscribed::send_im size(self.data.attribute_reports)=%i ready=%s report_data_phase=%s", size(self.data.attribute_reports), str(self.ready), str(self.report_data_phase)), 3)
if !self.ready return false end
if size(self.data.attribute_reports) > 0
if size(self.data.attribute_reports) > 0 # do we have still attributes to send
if self.report_data_phase
var ret = super(self).send_im(responder)
if !ret return false end # ReportData needs to continue
super(self).send_im(responder)
tasmota.log(string.format("MTR: ReportDataSubscribed::send_im called super finish=%i", self.finish), 3)
if !self.finish return end # ReportData needs to continue
# ReportData is finished
self.report_data_phase = false
return false
self.ready = false
self.finish = false # while a ReadReport would stop here, we continue for subscription
else
# send a simple ACK
var resp = self.resp.build_standalone_ack(false)
@ -342,7 +320,7 @@ class Matter_IM_ReportDataSubscribed : Matter_IM_ReportData
tasmota.log(string.format("MTR: <Ack (%6i) ack=%i id=%i", resp.session.local_session_id, resp.ack_message_counter, resp.message_counter), 3)
responder.send_response_frame(resp)
self.last_counter = resp.message_counter
return true # we received a ack(), just finish
self.finish = true
end
else
@ -350,15 +328,74 @@ class Matter_IM_ReportDataSubscribed : Matter_IM_ReportData
if self.report_data_phase
super(self).send_im(responder)
self.report_data_phase = false
return false # don't expect any response
else
return true # we're done, remove message
self.finish = true
end
end
end
end
matter.IM_ReportDataSubscribed = Matter_IM_ReportDataSubscribed
#################################################################################
# Matter_IM_SubscribedHeartbeat
#
# Send a subscription heartbeat, which is an empty DataReport with no SuppressResponse
#
# Main difference is that we are the spontaneous initiator
#################################################################################
class Matter_IM_SubscribedHeartbeat : Matter_IM_ReportData
var sub # subscription object
def init(message_handler, session, data, sub)
self.resp = matter.Frame.initiate_response(message_handler, session, 0x05 #-Report Data-#, true)
self.data = data
self.ready = true # by default send immediately
self.expiration = tasmota.millis() + self.MSG_TIMEOUT
#
self.sub = sub
end
def reached_timeout()
self.sub.remove_self()
end
# ack received, confirm the heartbeat
def ack_received(msg)
import string
tasmota.log(string.format("MTR: Matter_IM_SubscribedHeartbeat ack_received sub=%i", self.sub.subscription_id), 3)
super(self).ack_received(msg)
self.finish = true
return true # proceed to calling send() which removes the message
end
# we received an ACK error, remove subscription
def status_error_received(msg)
import string
tasmota.log(string.format("MTR: Matter_IM_SubscribedHeartbeat status_error_received sub=%i exch=%i", self.sub.subscription_id, self.resp.exchange_id), 3)
self.sub.remove_self()
return false # let the caller to the ack
end
# ack received for previous message, proceed to next (if any)
# return true if we manage the ack ourselves, false if it needs to be done upper
def status_ok_received(msg)
import string
tasmota.log(string.format("MTR: Matter_IM_SubscribedHeartbeat status_ok_received sub=%i exch=%i", self.sub.subscription_id, self.resp.exchange_id), 3)
return false # let the caller to the ack
end
# default responder for data
def send_im(responder)
import string
tasmota.log(string.format("MTR: Matter_IM_SubscribedHeartbeat send sub=%i exch=%i ready=%i", self.sub.subscription_id, self.resp.exchange_id, self.ready ? 1 : 0), 3)
if !self.ready return false end
super(self).send_im(responder)
self.ready = false
end
end
matter.IM_SubscribedHeartbeat = Matter_IM_SubscribedHeartbeat
#################################################################################
# Matter_IM_SubscribeResponse
#
@ -374,20 +411,19 @@ class Matter_IM_SubscribeResponse : Matter_IM_ReportData
self.report_data_phase = true
end
# return true if transaction is complete (remove object from queue)
# default responder for data
def send_im(responder)
import string
tasmota.log(string.format("MTR: Matter_IM_SubscribeResponse send sub=%i ready=%i", self.sub.subscription_id, self.ready ? 1 : 0), 3)
if !self.ready return false end
if self.report_data_phase
var ret = super(self).send_im(responder)
if ret
super(self).send_im(responder)
if self.finish
# finished reporting of data, we still need to send SubscribeResponseMessage after next StatusReport
self.report_data_phase = false
self.finish = false # we continue to subscribe response
end
self.ready = false # wait for Status Report before continuing sending
return false
else
# send the final SubscribeReponse
@ -403,7 +439,7 @@ class Matter_IM_SubscribeResponse : Matter_IM_ReportData
self.last_counter = resp.message_counter
tasmota.log(string.format("MTR: Send SubscribeResponseMessage sub=%i id=%i", self.sub.subscription_id, resp.message_counter), 3)
self.sub.re_arm()
return true
self.finish = true # remove exchange
end
end

View File

@ -232,8 +232,9 @@ class Matter_IM_Subscription_Shop
while idx < size(self.subs)
var sub = self.subs[idx]
if !sub.wait_status && tasmota.time_reached(sub.expiration)
self.im.send_subscribe_update(sub)
self.im.send_subscribe_heartbeat(sub)
sub.clear_before_arm()
sub.re_arm() # signal that we can proceed to next sub report
end
idx += 1
end

View File

@ -80,7 +80,7 @@ class Matter_MessageHandler
var ret = false
try
tasmota.log("MTR: MessageHandler::msg_received raw="+raw.tohex(), 4)
# tasmota.log("MTR: MessageHandler::msg_received raw="+raw.tohex(), 4)
var frame = matter.Frame(self, raw, addr, port)
var ok = frame.decode_header()

View File

@ -0,0 +1,53 @@
#
# Matter_IM_Path.be - suppport for Matter simple Path object
#
# Copyright (C) 2023 Stephan Hadinger & Theo Arends
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import matter
#@ solidify:Matter_Path,weak
#################################################################################
# Matter_Path
#
# Used to store all the elements of the reponse to an attribute or command
#################################################################################
class Matter_Path
var endpoint # endpoint or `nil` if expansion
var cluster # cluster or `nil` if expansion
var attribute # attribute or `nil` if expansion
var command # command
var status # status to be returned (matter.SUCCESS or matter.<ERROR>)
var log # any string that needs to be logged (used to show significant parameters for commands)
def tostring()
try
import string
var s = ""
s += (self.endpoint != nil ? string.format("[%02X]", self.endpoint) : "[**]")
s += (self.cluster != nil ? string.format("%04X/", self.cluster) : "****/")
s += (self.attribute != nil ? string.format("%04X", self.attribute) : "")
s += (self.command != nil ? string.format("%04X", self.command) : "")
if self.attribute == nil && self.command == nil s += "****" end
return s
except .. as e, m
return "Exception> " + str(e) + ", " + str(m)
end
end
end
matter.Path = Matter_Path

File diff suppressed because it is too large Load Diff

View File

@ -441,7 +441,7 @@ be_local_closure(Matter_IM_Subscription_Shop_every_250ms, /* name */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[12]) { /* constants */
( &(const bvalue[14]) { /* constants */
/* K0 */ be_const_int(0),
/* K1 */ be_nested_str_weak(subs),
/* K2 */ be_nested_str_weak(wait_status),
@ -454,10 +454,12 @@ be_local_closure(Matter_IM_Subscription_Shop_every_250ms, /* name */
/* K9 */ be_nested_str_weak(clear_before_arm),
/* K10 */ be_const_int(1),
/* K11 */ be_nested_str_weak(expiration),
/* K12 */ be_nested_str_weak(send_subscribe_heartbeat),
/* K13 */ be_nested_str_weak(re_arm),
}),
be_str_weak(every_250ms),
&be_const_str_solidified,
( &(const binstruction[52]) { /* code */
( &(const binstruction[54]) { /* code */
0x58040000, // 0000 LDCONST R1 K0
0x6008000C, // 0001 GETGBL R2 G12
0x880C0101, // 0002 GETMBR R3 R0 K1
@ -491,25 +493,27 @@ be_local_closure(Matter_IM_Subscription_Shop_every_250ms, /* name */
0x880C0101, // 001E GETMBR R3 R0 K1
0x7C080200, // 001F CALL R2 1
0x14080202, // 0020 LT R2 R1 R2
0x780A0010, // 0021 JMPF R2 #0033
0x780A0012, // 0021 JMPF R2 #0035
0x88080101, // 0022 GETMBR R2 R0 K1
0x94080401, // 0023 GETIDX R2 R2 R1
0x880C0502, // 0024 GETMBR R3 R2 K2
0x740E000A, // 0025 JMPT R3 #0031
0x740E000C, // 0025 JMPT R3 #0033
0xB80E0800, // 0026 GETNGBL R3 K4
0x8C0C0705, // 0027 GETMET R3 R3 K5
0x8814050B, // 0028 GETMBR R5 R2 K11
0x7C0C0400, // 0029 CALL R3 2
0x780E0005, // 002A JMPF R3 #0031
0x780E0007, // 002A JMPF R3 #0033
0x880C0107, // 002B GETMBR R3 R0 K7
0x8C0C0708, // 002C GETMET R3 R3 K8
0x8C0C070C, // 002C GETMET R3 R3 K12
0x5C140400, // 002D MOVE R5 R2
0x7C0C0400, // 002E CALL R3 2
0x8C0C0509, // 002F GETMET R3 R2 K9
0x7C0C0200, // 0030 CALL R3 1
0x0004030A, // 0031 ADD R1 R1 K10
0x7001FFE9, // 0032 JMP #001D
0x80000000, // 0033 RET 0
0x8C0C050D, // 0031 GETMET R3 R2 K13
0x7C0C0200, // 0032 CALL R3 1
0x0004030A, // 0033 ADD R1 R1 K10
0x7001FFE7, // 0034 JMP #001D
0x80000000, // 0035 RET 0
})
)
);

View File

@ -221,490 +221,482 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[76]) { /* constants */
( &(const bvalue[75]) { /* constants */
/* K0 */ be_nested_str_weak(string),
/* K1 */ be_nested_str_weak(tasmota),
/* K2 */ be_nested_str_weak(log),
/* K3 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20raw_X3D),
/* K4 */ be_nested_str_weak(tohex),
/* K5 */ be_nested_str_weak(matter),
/* K6 */ be_nested_str_weak(Frame),
/* K7 */ be_nested_str_weak(decode_header),
/* K8 */ be_nested_str_weak(sec_p),
/* K9 */ be_nested_str_weak(MTR_X3A_X20CONTROL_X20MESSAGE_X3D),
/* K10 */ be_nested_str_weak(inspect),
/* K11 */ be_nested_str_weak(device),
/* K12 */ be_nested_str_weak(sessions),
/* K13 */ be_nested_str_weak(find_session_source_id_unsecure),
/* K14 */ be_nested_str_weak(source_node_id),
/* K15 */ be_nested_str_weak(MTR_X3A_X20find_X20session_X20by_X20source_node_id_X20_X3D_X20),
/* K16 */ be_nested_str_weak(_X20session_id_X20_X3D_X20),
/* K17 */ be_nested_str_weak(local_session_id),
/* K18 */ be_const_int(2),
/* K19 */ be_nested_str_weak(control_message),
/* K20 */ be_nested_str_weak(process_incoming_control_message),
/* K21 */ be_const_int(0),
/* K22 */ be_nested_str_weak(sec_sesstype),
/* K23 */ be_const_int(3),
/* K24 */ be_nested_str_weak(_ip),
/* K25 */ be_nested_str_weak(_port),
/* K26 */ be_nested_str_weak(_message_handler),
/* K27 */ be_nested_str_weak(session),
/* K28 */ be_nested_str_weak(_counter_insecure_rcv),
/* K29 */ be_nested_str_weak(validate),
/* K30 */ be_nested_str_weak(message_counter),
/* K31 */ be_nested_str_weak(format),
/* K32 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20unencrypted_X20message_X20_X3D_X20_X25i_X20ref_X20_X3D_X20_X25i),
/* K33 */ be_nested_str_weak(val),
/* K34 */ be_nested_str_weak(send_simple_ack),
/* K35 */ be_nested_str_weak(decode_payload),
/* K36 */ be_nested_str_weak(received_ack),
/* K37 */ be_nested_str_weak(opcode),
/* K38 */ be_nested_str_weak(get_opcode_name),
/* K39 */ be_nested_str_weak(0x_X2502X),
/* K40 */ be_nested_str_weak(MTR_X3A_X20_X3EReceived_X20_X20_X28_X256i_X29_X20_X25s_X20rid_X3D_X25i_X20exch_X3D_X25i_X20from_X20_X5B_X25s_X5D_X3A_X25i),
/* K41 */ be_nested_str_weak(exchange_id),
/* K42 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20Ack_X20_X20_X20_X28_X256i_X29_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i),
/* K43 */ be_nested_str_weak(x_flag_r),
/* K44 */ be_nested_str_weak(_X7Breliable_X7D_X20),
/* K45 */ be_nested_str_weak(),
/* K46 */ be_nested_str_weak(ack_message_counter),
/* K47 */ be_nested_str_weak(commissioning),
/* K48 */ be_nested_str_weak(process_incoming),
/* K49 */ be_nested_str_weak(MTR_X3A_X20decode_X20header_X3A_X20local_session_id_X3D_X25i_X20message_counter_X3D_X25i),
/* K50 */ be_nested_str_weak(get_session_by_local_session_id),
/* K51 */ be_nested_str_weak(MTR_X3A_X20unknown_X20local_session_id_X3D),
/* K52 */ be_nested_str_weak(counter_rcv_validate),
/* K53 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20encrypted_X20message_X20_X3D_X20),
/* K54 */ be_nested_str_weak(_X20counter_X3D),
/* K55 */ be_nested_str_weak(counter_rcv),
/* K56 */ be_nested_str_weak(send_encrypted_ack),
/* K57 */ be_nested_str_weak(decrypt),
/* K58 */ be_nested_str_weak(raw),
/* K59 */ be_nested_str_weak(payload_idx),
/* K60 */ be_const_int(1),
/* K61 */ be_nested_str_weak(MTR_X3A_X20idx_X3D_X25i_X20clear_X3D_X25s),
/* K62 */ be_nested_str_weak(MTR_X3A_X20_X3E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Decrypted_X20message_X3A_X20protocol_id_X3A),
/* K63 */ be_nested_str_weak(protocol_id),
/* K64 */ be_nested_str_weak(_X20opcode_X3D),
/* K65 */ be_nested_str_weak(_X20exchange_id_X3D),
/* K66 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20_X5B_X2502X_X2F_X2502X_X5D_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i),
/* K67 */ be_nested_str_weak(MTR_X3A_X20PROTOCOL_ID_SECURE_CHANNEL_X20),
/* K68 */ be_nested_str_weak(im),
/* K69 */ be_nested_str_weak(process_incoming_ack),
/* K70 */ be_nested_str_weak(send_enqueued),
/* K71 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A),
/* K72 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20),
/* K73 */ be_nested_str_weak(_X3B),
/* K74 */ be_nested_str_weak(debug),
/* K75 */ be_nested_str_weak(traceback),
/* K1 */ be_nested_str_weak(matter),
/* K2 */ be_nested_str_weak(Frame),
/* K3 */ be_nested_str_weak(decode_header),
/* K4 */ be_nested_str_weak(sec_p),
/* K5 */ be_nested_str_weak(tasmota),
/* K6 */ be_nested_str_weak(log),
/* K7 */ be_nested_str_weak(MTR_X3A_X20CONTROL_X20MESSAGE_X3D),
/* K8 */ be_nested_str_weak(inspect),
/* K9 */ be_nested_str_weak(device),
/* K10 */ be_nested_str_weak(sessions),
/* K11 */ be_nested_str_weak(find_session_source_id_unsecure),
/* K12 */ be_nested_str_weak(source_node_id),
/* K13 */ be_nested_str_weak(MTR_X3A_X20find_X20session_X20by_X20source_node_id_X20_X3D_X20),
/* K14 */ be_nested_str_weak(_X20session_id_X20_X3D_X20),
/* K15 */ be_nested_str_weak(local_session_id),
/* K16 */ be_const_int(2),
/* K17 */ be_nested_str_weak(control_message),
/* K18 */ be_nested_str_weak(process_incoming_control_message),
/* K19 */ be_const_int(0),
/* K20 */ be_nested_str_weak(sec_sesstype),
/* K21 */ be_const_int(3),
/* K22 */ be_nested_str_weak(_ip),
/* K23 */ be_nested_str_weak(_port),
/* K24 */ be_nested_str_weak(_message_handler),
/* K25 */ be_nested_str_weak(session),
/* K26 */ be_nested_str_weak(_counter_insecure_rcv),
/* K27 */ be_nested_str_weak(validate),
/* K28 */ be_nested_str_weak(message_counter),
/* K29 */ be_nested_str_weak(format),
/* K30 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20unencrypted_X20message_X20_X3D_X20_X25i_X20ref_X20_X3D_X20_X25i),
/* K31 */ be_nested_str_weak(val),
/* K32 */ be_nested_str_weak(send_simple_ack),
/* K33 */ be_nested_str_weak(decode_payload),
/* K34 */ be_nested_str_weak(received_ack),
/* K35 */ be_nested_str_weak(opcode),
/* K36 */ be_nested_str_weak(get_opcode_name),
/* K37 */ be_nested_str_weak(0x_X2502X),
/* K38 */ be_nested_str_weak(MTR_X3A_X20_X3EReceived_X20_X20_X28_X256i_X29_X20_X25s_X20rid_X3D_X25i_X20exch_X3D_X25i_X20from_X20_X5B_X25s_X5D_X3A_X25i),
/* K39 */ be_nested_str_weak(exchange_id),
/* K40 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20Ack_X20_X20_X20_X28_X256i_X29_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i),
/* K41 */ be_nested_str_weak(x_flag_r),
/* K42 */ be_nested_str_weak(_X7Breliable_X7D_X20),
/* K43 */ be_nested_str_weak(),
/* K44 */ be_nested_str_weak(ack_message_counter),
/* K45 */ be_nested_str_weak(commissioning),
/* K46 */ be_nested_str_weak(process_incoming),
/* K47 */ be_nested_str_weak(MTR_X3A_X20decode_X20header_X3A_X20local_session_id_X3D_X25i_X20message_counter_X3D_X25i),
/* K48 */ be_nested_str_weak(get_session_by_local_session_id),
/* K49 */ be_nested_str_weak(MTR_X3A_X20unknown_X20local_session_id_X3D),
/* K50 */ be_nested_str_weak(counter_rcv_validate),
/* K51 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20encrypted_X20message_X20_X3D_X20),
/* K52 */ be_nested_str_weak(_X20counter_X3D),
/* K53 */ be_nested_str_weak(counter_rcv),
/* K54 */ be_nested_str_weak(send_encrypted_ack),
/* K55 */ be_nested_str_weak(decrypt),
/* K56 */ be_nested_str_weak(raw),
/* K57 */ be_nested_str_weak(payload_idx),
/* K58 */ be_const_int(1),
/* K59 */ be_nested_str_weak(MTR_X3A_X20idx_X3D_X25i_X20clear_X3D_X25s),
/* K60 */ be_nested_str_weak(tohex),
/* K61 */ be_nested_str_weak(MTR_X3A_X20_X3E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Decrypted_X20message_X3A_X20protocol_id_X3A),
/* K62 */ be_nested_str_weak(protocol_id),
/* K63 */ be_nested_str_weak(_X20opcode_X3D),
/* K64 */ be_nested_str_weak(_X20exchange_id_X3D),
/* K65 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20_X5B_X2502X_X2F_X2502X_X5D_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i),
/* K66 */ be_nested_str_weak(MTR_X3A_X20PROTOCOL_ID_SECURE_CHANNEL_X20),
/* K67 */ be_nested_str_weak(im),
/* K68 */ be_nested_str_weak(process_incoming_ack),
/* K69 */ be_nested_str_weak(send_enqueued),
/* K70 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A),
/* K71 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20),
/* K72 */ be_nested_str_weak(_X3B),
/* K73 */ be_nested_str_weak(debug),
/* K74 */ be_nested_str_weak(traceback),
}),
be_str_weak(msg_received),
&be_const_str_solidified,
( &(const binstruction[403]) { /* code */
( &(const binstruction[396]) { /* code */
0xA4120000, // 0000 IMPORT R4 K0
0x50140000, // 0001 LDBOOL R5 0 0
0xA8020179, // 0002 EXBLK 0 #017D
0xA8020172, // 0002 EXBLK 0 #0176
0xB81A0200, // 0003 GETNGBL R6 K1
0x8C180D02, // 0004 GETMET R6 R6 K2
0x8C200304, // 0005 GETMET R8 R1 K4
0x7C200200, // 0006 CALL R8 1
0x00220608, // 0007 ADD R8 K3 R8
0x54260003, // 0008 LDINT R9 4
0x7C180600, // 0009 CALL R6 3
0xB81A0A00, // 000A GETNGBL R6 K5
0x8C180D06, // 000B GETMET R6 R6 K6
0x5C200000, // 000C MOVE R8 R0
0x5C240200, // 000D MOVE R9 R1
0x5C280400, // 000E MOVE R10 R2
0x5C2C0600, // 000F MOVE R11 R3
0x7C180A00, // 0010 CALL R6 5
0x8C1C0D07, // 0011 GETMET R7 R6 K7
0x7C1C0200, // 0012 CALL R7 1
0x5C200E00, // 0013 MOVE R8 R7
0x74220002, // 0014 JMPT R8 #0018
0x50200000, // 0015 LDBOOL R8 0 0
0xA8040001, // 0016 EXBLK 1 1
0x80041000, // 0017 RET 1 R8
0x88200D08, // 0018 GETMBR R8 R6 K8
0x78220021, // 0019 JMPF R8 #003C
0xB8220200, // 001A GETNGBL R8 K1
0x8C201102, // 001B GETMET R8 R8 K2
0xB82A0A00, // 001C GETNGBL R10 K5
0x8C28150A, // 001D GETMET R10 R10 K10
0x5C300C00, // 001E MOVE R12 R6
0x7C280400, // 001F CALL R10 2
0x002A120A, // 0020 ADD R10 K9 R10
0x7C200400, // 0021 CALL R8 2
0x8820010B, // 0022 GETMBR R8 R0 K11
0x8820110C, // 0023 GETMBR R8 R8 K12
0x8C20110D, // 0024 GETMET R8 R8 K13
0x88280D0E, // 0025 GETMBR R10 R6 K14
0x542E0059, // 0026 LDINT R11 90
0x7C200600, // 0027 CALL R8 3
0xB8260200, // 0028 GETNGBL R9 K1
0x8C241302, // 0029 GETMET R9 R9 K2
0x602C0008, // 002A GETGBL R11 G8
0x88300D0E, // 002B GETMBR R12 R6 K14
0x7C2C0200, // 002C CALL R11 1
0x002E1E0B, // 002D ADD R11 K15 R11
0x002C1710, // 002E ADD R11 R11 K16
0x60300008, // 002F GETGBL R12 G8
0x88341111, // 0030 GETMBR R13 R8 K17
0x7C300200, // 0031 CALL R12 1
0x002C160C, // 0032 ADD R11 R11 R12
0x58300012, // 0033 LDCONST R12 K18
0x7C240600, // 0034 CALL R9 3
0x88240113, // 0035 GETMBR R9 R0 K19
0x8C241314, // 0036 GETMET R9 R9 K20
0x5C2C0C00, // 0037 MOVE R11 R6
0x7C240400, // 0038 CALL R9 2
0xA8040001, // 0039 EXBLK 1 1
0x80041200, // 003A RET 1 R9
0x7002013C, // 003B JMP #0179
0x88200D11, // 003C GETMBR R8 R6 K17
0x1C201115, // 003D EQ R8 R8 K21
0x7822007D, // 003E JMPF R8 #00BD
0x88200D16, // 003F GETMBR R8 R6 K22
0x1C201115, // 0040 EQ R8 R8 K21
0x7822007A, // 0041 JMPF R8 #00BD
0x8820010B, // 0042 GETMBR R8 R0 K11
0x8820110C, // 0043 GETMBR R8 R8 K12
0x8C20110D, // 0044 GETMET R8 R8 K13
0x88280D0E, // 0045 GETMBR R10 R6 K14
0x542E0059, // 0046 LDINT R11 90
0x7C200600, // 0047 CALL R8 3
0xB8260200, // 0048 GETNGBL R9 K1
0x8C241302, // 0049 GETMET R9 R9 K2
0x602C0008, // 004A GETGBL R11 G8
0x88300D0E, // 004B GETMBR R12 R6 K14
0x7C2C0200, // 004C CALL R11 1
0x002E1E0B, // 004D ADD R11 K15 R11
0x002C1710, // 004E ADD R11 R11 K16
0x60300008, // 004F GETGBL R12 G8
0x88341111, // 0050 GETMBR R13 R8 K17
0x7C300200, // 0051 CALL R12 1
0x002C160C, // 0052 ADD R11 R11 R12
0x58300017, // 0053 LDCONST R12 K23
0x7C240600, // 0054 CALL R9 3
0x780A0000, // 0055 JMPF R2 #0057
0x90223002, // 0056 SETMBR R8 K24 R2
0x780E0000, // 0057 JMPF R3 #0059
0x90223203, // 0058 SETMBR R8 K25 R3
0x90223400, // 0059 SETMBR R8 K26 R0
0x901A3608, // 005A SETMBR R6 K27 R8
0x8824111C, // 005B GETMBR R9 R8 K28
0x8C24131D, // 005C GETMET R9 R9 K29
0x882C0D1E, // 005D GETMBR R11 R6 K30
0x50300000, // 005E LDBOOL R12 0 0
0x7C240600, // 005F CALL R9 3
0x74260011, // 0060 JMPT R9 #0073
0xB8260200, // 0061 GETNGBL R9 K1
0x8C241302, // 0062 GETMET R9 R9 K2
0x8C2C091F, // 0063 GETMET R11 R4 K31
0x58340020, // 0064 LDCONST R13 K32
0x88380D1E, // 0065 GETMBR R14 R6 K30
0x883C111C, // 0066 GETMBR R15 R8 K28
0x8C3C1F21, // 0067 GETMET R15 R15 K33
0x7C3C0200, // 0068 CALL R15 1
0x7C2C0800, // 0069 CALL R11 4
0x58300017, // 006A LDCONST R12 K23
0x7C240600, // 006B CALL R9 3
0x8C240122, // 006C GETMET R9 R0 K34
0x5C2C0C00, // 006D MOVE R11 R6
0x50300000, // 006E LDBOOL R12 0 0
0x7C240600, // 006F CALL R9 3
0x50240000, // 0070 LDBOOL R9 0 0
0xA8040001, // 0071 EXBLK 1 1
0x80041200, // 0072 RET 1 R9
0x8C240D23, // 0073 GETMET R9 R6 K35
0x7C240200, // 0074 CALL R9 1
0x74260002, // 0075 JMPT R9 #0079
0x50240000, // 0076 LDBOOL R9 0 0
0xA8040001, // 0077 EXBLK 1 1
0x80041200, // 0078 RET 1 R9
0x8824010B, // 0079 GETMBR R9 R0 K11
0x8C241324, // 007A GETMET R9 R9 K36
0x5C2C0C00, // 007B MOVE R11 R6
0x7C240400, // 007C CALL R9 2
0x88240D25, // 007D GETMBR R9 R6 K37
0x542A000F, // 007E LDINT R10 16
0x2024120A, // 007F NE R9 R9 R10
0x78260018, // 0080 JMPF R9 #009A
0xB8260A00, // 0081 GETNGBL R9 K5
0x8C241326, // 0082 GETMET R9 R9 K38
0x882C0D25, // 0083 GETMBR R11 R6 K37
0x7C240400, // 0084 CALL R9 2
0x5C281200, // 0085 MOVE R10 R9
0x742A0004, // 0086 JMPT R10 #008C
0x8C28091F, // 0087 GETMET R10 R4 K31
0x58300027, // 0088 LDCONST R12 K39
0x88340D25, // 0089 GETMBR R13 R6 K37
0x7C280600, // 008A CALL R10 3
0x5C241400, // 008B MOVE R9 R10
0xB82A0200, // 008C GETNGBL R10 K1
0x8C281502, // 008D GETMET R10 R10 K2
0x8C30091F, // 008E GETMET R12 R4 K31
0x58380028, // 008F LDCONST R14 K40
0x883C1111, // 0090 GETMBR R15 R8 K17
0x5C401200, // 0091 MOVE R16 R9
0x88440D1E, // 0092 GETMBR R17 R6 K30
0x88480D29, // 0093 GETMBR R18 R6 K41
0x5C4C0400, // 0094 MOVE R19 R2
0x5C500600, // 0095 MOVE R20 R3
0x7C301000, // 0096 CALL R12 8
0x58340012, // 0097 LDCONST R13 K18
0x7C280600, // 0098 CALL R10 3
0x70020013, // 0099 JMP #00AE
0xB8260200, // 009A GETNGBL R9 K1
0x8C241302, // 009B GETMET R9 R9 K2
0x8C2C091F, // 009C GETMET R11 R4 K31
0x5834002A, // 009D LDCONST R13 K42
0x88381111, // 009E GETMBR R14 R8 K17
0x883C0D1E, // 009F GETMBR R15 R6 K30
0x88400D2B, // 00A0 GETMBR R16 R6 K43
0x78420001, // 00A1 JMPF R16 #00A4
0x5840002C, // 00A2 LDCONST R16 K44
0x70020000, // 00A3 JMP #00A5
0x5840002D, // 00A4 LDCONST R16 K45
0x88440D29, // 00A5 GETMBR R17 R6 K41
0x60480008, // 00A6 GETGBL R18 G8
0x884C0D2E, // 00A7 GETMBR R19 R6 K46
0x7C480200, // 00A8 CALL R18 1
0x5C4C0400, // 00A9 MOVE R19 R2
0x5C500600, // 00AA MOVE R20 R3
0x7C2C1200, // 00AB CALL R11 9
0x58300017, // 00AC LDCONST R12 K23
0x7C240600, // 00AD CALL R9 3
0x8824012F, // 00AE GETMBR R9 R0 K47
0x8C241330, // 00AF GETMET R9 R9 K48
0x5C2C0C00, // 00B0 MOVE R11 R6
0x7C240400, // 00B1 CALL R9 2
0x5C141200, // 00B2 MOVE R5 R9
0x5C240A00, // 00B3 MOVE R9 R5
0x74260003, // 00B4 JMPT R9 #00B9
0x8C240122, // 00B5 GETMET R9 R0 K34
0x5C2C0C00, // 00B6 MOVE R11 R6
0x50300000, // 00B7 LDBOOL R12 0 0
0x7C240600, // 00B8 CALL R9 3
0x50240200, // 00B9 LDBOOL R9 1 0
0xA8040001, // 00BA EXBLK 1 1
0x80041200, // 00BB RET 1 R9
0x700200BB, // 00BC JMP #0179
0xB8220200, // 00BD GETNGBL R8 K1
0x8C201102, // 00BE GETMET R8 R8 K2
0x8C28091F, // 00BF GETMET R10 R4 K31
0x58300031, // 00C0 LDCONST R12 K49
0x88340D11, // 00C1 GETMBR R13 R6 K17
0x88380D1E, // 00C2 GETMBR R14 R6 K30
0x7C280800, // 00C3 CALL R10 4
0x582C0017, // 00C4 LDCONST R11 K23
0x7C200600, // 00C5 CALL R8 3
0x8820010B, // 00C6 GETMBR R8 R0 K11
0x8820110C, // 00C7 GETMBR R8 R8 K12
0x8C201132, // 00C8 GETMET R8 R8 K50
0x88280D11, // 00C9 GETMBR R10 R6 K17
0x7C200400, // 00CA CALL R8 2
0x4C240000, // 00CB LDNIL R9
0x1C241009, // 00CC EQ R9 R8 R9
0x7826000A, // 00CD JMPF R9 #00D9
0xB8260200, // 00CE GETNGBL R9 K1
0x8C241302, // 00CF GETMET R9 R9 K2
0x602C0008, // 00D0 GETGBL R11 G8
0x88300D11, // 00D1 GETMBR R12 R6 K17
0x7C2C0200, // 00D2 CALL R11 1
0x002E660B, // 00D3 ADD R11 K51 R11
0x58300012, // 00D4 LDCONST R12 K18
0x7C240600, // 00D5 CALL R9 3
0x50240000, // 00D6 LDBOOL R9 0 0
0xA8040001, // 00D7 EXBLK 1 1
0x80041200, // 00D8 RET 1 R9
0x780A0000, // 00D9 JMPF R2 #00DB
0x90223002, // 00DA SETMBR R8 K24 R2
0x780E0000, // 00DB JMPF R3 #00DD
0x90223203, // 00DC SETMBR R8 K25 R3
0x90223400, // 00DD SETMBR R8 K26 R0
0x901A3608, // 00DE SETMBR R6 K27 R8
0x8C241134, // 00DF GETMET R9 R8 K52
0x882C0D1E, // 00E0 GETMBR R11 R6 K30
0x50300200, // 00E1 LDBOOL R12 1 0
0x7C240600, // 00E2 CALL R9 3
0x74260013, // 00E3 JMPT R9 #00F8
0xB8260200, // 00E4 GETNGBL R9 K1
0x8C241302, // 00E5 GETMET R9 R9 K2
0x602C0008, // 00E6 GETGBL R11 G8
0x88300D1E, // 00E7 GETMBR R12 R6 K30
0x7C2C0200, // 00E8 CALL R11 1
0x002E6A0B, // 00E9 ADD R11 K53 R11
0x002C1736, // 00EA ADD R11 R11 K54
0x60300008, // 00EB GETGBL R12 G8
0x88341137, // 00EC GETMBR R13 R8 K55
0x7C300200, // 00ED CALL R12 1
0x002C160C, // 00EE ADD R11 R11 R12
0x58300017, // 00EF LDCONST R12 K23
0x7C240600, // 00F0 CALL R9 3
0x8C240138, // 00F1 GETMET R9 R0 K56
0x5C2C0C00, // 00F2 MOVE R11 R6
0x50300000, // 00F3 LDBOOL R12 0 0
0x7C240600, // 00F4 CALL R9 3
0x50240000, // 00F5 LDBOOL R9 0 0
0x5C200000, // 0005 MOVE R8 R0
0x5C240200, // 0006 MOVE R9 R1
0x5C280400, // 0007 MOVE R10 R2
0x5C2C0600, // 0008 MOVE R11 R3
0x7C180A00, // 0009 CALL R6 5
0x8C1C0D03, // 000A GETMET R7 R6 K3
0x7C1C0200, // 000B CALL R7 1
0x5C200E00, // 000C MOVE R8 R7
0x74220002, // 000D JMPT R8 #0011
0x50200000, // 000E LDBOOL R8 0 0
0xA8040001, // 000F EXBLK 1 1
0x80041000, // 0010 RET 1 R8
0x88200D04, // 0011 GETMBR R8 R6 K4
0x78220021, // 0012 JMPF R8 #0035
0xB8220A00, // 0013 GETNGBL R8 K5
0x8C201106, // 0014 GETMET R8 R8 K6
0xB82A0200, // 0015 GETNGBL R10 K1
0x8C281508, // 0016 GETMET R10 R10 K8
0x5C300C00, // 0017 MOVE R12 R6
0x7C280400, // 0018 CALL R10 2
0x002A0E0A, // 0019 ADD R10 K7 R10
0x7C200400, // 001A CALL R8 2
0x88200109, // 001B GETMBR R8 R0 K9
0x8820110A, // 001C GETMBR R8 R8 K10
0x8C20110B, // 001D GETMET R8 R8 K11
0x88280D0C, // 001E GETMBR R10 R6 K12
0x542E0059, // 001F LDINT R11 90
0x7C200600, // 0020 CALL R8 3
0xB8260A00, // 0021 GETNGBL R9 K5
0x8C241306, // 0022 GETMET R9 R9 K6
0x602C0008, // 0023 GETGBL R11 G8
0x88300D0C, // 0024 GETMBR R12 R6 K12
0x7C2C0200, // 0025 CALL R11 1
0x002E1A0B, // 0026 ADD R11 K13 R11
0x002C170E, // 0027 ADD R11 R11 K14
0x60300008, // 0028 GETGBL R12 G8
0x8834110F, // 0029 GETMBR R13 R8 K15
0x7C300200, // 002A CALL R12 1
0x002C160C, // 002B ADD R11 R11 R12
0x58300010, // 002C LDCONST R12 K16
0x7C240600, // 002D CALL R9 3
0x88240111, // 002E GETMBR R9 R0 K17
0x8C241312, // 002F GETMET R9 R9 K18
0x5C2C0C00, // 0030 MOVE R11 R6
0x7C240400, // 0031 CALL R9 2
0xA8040001, // 0032 EXBLK 1 1
0x80041200, // 0033 RET 1 R9
0x7002013C, // 0034 JMP #0172
0x88200D0F, // 0035 GETMBR R8 R6 K15
0x1C201113, // 0036 EQ R8 R8 K19
0x7822007D, // 0037 JMPF R8 #00B6
0x88200D14, // 0038 GETMBR R8 R6 K20
0x1C201113, // 0039 EQ R8 R8 K19
0x7822007A, // 003A JMPF R8 #00B6
0x88200109, // 003B GETMBR R8 R0 K9
0x8820110A, // 003C GETMBR R8 R8 K10
0x8C20110B, // 003D GETMET R8 R8 K11
0x88280D0C, // 003E GETMBR R10 R6 K12
0x542E0059, // 003F LDINT R11 90
0x7C200600, // 0040 CALL R8 3
0xB8260A00, // 0041 GETNGBL R9 K5
0x8C241306, // 0042 GETMET R9 R9 K6
0x602C0008, // 0043 GETGBL R11 G8
0x88300D0C, // 0044 GETMBR R12 R6 K12
0x7C2C0200, // 0045 CALL R11 1
0x002E1A0B, // 0046 ADD R11 K13 R11
0x002C170E, // 0047 ADD R11 R11 K14
0x60300008, // 0048 GETGBL R12 G8
0x8834110F, // 0049 GETMBR R13 R8 K15
0x7C300200, // 004A CALL R12 1
0x002C160C, // 004B ADD R11 R11 R12
0x58300015, // 004C LDCONST R12 K21
0x7C240600, // 004D CALL R9 3
0x780A0000, // 004E JMPF R2 #0050
0x90222C02, // 004F SETMBR R8 K22 R2
0x780E0000, // 0050 JMPF R3 #0052
0x90222E03, // 0051 SETMBR R8 K23 R3
0x90223000, // 0052 SETMBR R8 K24 R0
0x901A3208, // 0053 SETMBR R6 K25 R8
0x8824111A, // 0054 GETMBR R9 R8 K26
0x8C24131B, // 0055 GETMET R9 R9 K27
0x882C0D1C, // 0056 GETMBR R11 R6 K28
0x50300000, // 0057 LDBOOL R12 0 0
0x7C240600, // 0058 CALL R9 3
0x74260011, // 0059 JMPT R9 #006C
0xB8260A00, // 005A GETNGBL R9 K5
0x8C241306, // 005B GETMET R9 R9 K6
0x8C2C091D, // 005C GETMET R11 R4 K29
0x5834001E, // 005D LDCONST R13 K30
0x88380D1C, // 005E GETMBR R14 R6 K28
0x883C111A, // 005F GETMBR R15 R8 K26
0x8C3C1F1F, // 0060 GETMET R15 R15 K31
0x7C3C0200, // 0061 CALL R15 1
0x7C2C0800, // 0062 CALL R11 4
0x58300015, // 0063 LDCONST R12 K21
0x7C240600, // 0064 CALL R9 3
0x8C240120, // 0065 GETMET R9 R0 K32
0x5C2C0C00, // 0066 MOVE R11 R6
0x50300000, // 0067 LDBOOL R12 0 0
0x7C240600, // 0068 CALL R9 3
0x50240000, // 0069 LDBOOL R9 0 0
0xA8040001, // 006A EXBLK 1 1
0x80041200, // 006B RET 1 R9
0x8C240D21, // 006C GETMET R9 R6 K33
0x7C240200, // 006D CALL R9 1
0x74260002, // 006E JMPT R9 #0072
0x50240000, // 006F LDBOOL R9 0 0
0xA8040001, // 0070 EXBLK 1 1
0x80041200, // 0071 RET 1 R9
0x88240109, // 0072 GETMBR R9 R0 K9
0x8C241322, // 0073 GETMET R9 R9 K34
0x5C2C0C00, // 0074 MOVE R11 R6
0x7C240400, // 0075 CALL R9 2
0x88240D23, // 0076 GETMBR R9 R6 K35
0x542A000F, // 0077 LDINT R10 16
0x2024120A, // 0078 NE R9 R9 R10
0x78260018, // 0079 JMPF R9 #0093
0xB8260200, // 007A GETNGBL R9 K1
0x8C241324, // 007B GETMET R9 R9 K36
0x882C0D23, // 007C GETMBR R11 R6 K35
0x7C240400, // 007D CALL R9 2
0x5C281200, // 007E MOVE R10 R9
0x742A0004, // 007F JMPT R10 #0085
0x8C28091D, // 0080 GETMET R10 R4 K29
0x58300025, // 0081 LDCONST R12 K37
0x88340D23, // 0082 GETMBR R13 R6 K35
0x7C280600, // 0083 CALL R10 3
0x5C241400, // 0084 MOVE R9 R10
0xB82A0A00, // 0085 GETNGBL R10 K5
0x8C281506, // 0086 GETMET R10 R10 K6
0x8C30091D, // 0087 GETMET R12 R4 K29
0x58380026, // 0088 LDCONST R14 K38
0x883C110F, // 0089 GETMBR R15 R8 K15
0x5C401200, // 008A MOVE R16 R9
0x88440D1C, // 008B GETMBR R17 R6 K28
0x88480D27, // 008C GETMBR R18 R6 K39
0x5C4C0400, // 008D MOVE R19 R2
0x5C500600, // 008E MOVE R20 R3
0x7C301000, // 008F CALL R12 8
0x58340010, // 0090 LDCONST R13 K16
0x7C280600, // 0091 CALL R10 3
0x70020013, // 0092 JMP #00A7
0xB8260A00, // 0093 GETNGBL R9 K5
0x8C241306, // 0094 GETMET R9 R9 K6
0x8C2C091D, // 0095 GETMET R11 R4 K29
0x58340028, // 0096 LDCONST R13 K40
0x8838110F, // 0097 GETMBR R14 R8 K15
0x883C0D1C, // 0098 GETMBR R15 R6 K28
0x88400D29, // 0099 GETMBR R16 R6 K41
0x78420001, // 009A JMPF R16 #009D
0x5840002A, // 009B LDCONST R16 K42
0x70020000, // 009C JMP #009E
0x5840002B, // 009D LDCONST R16 K43
0x88440D27, // 009E GETMBR R17 R6 K39
0x60480008, // 009F GETGBL R18 G8
0x884C0D2C, // 00A0 GETMBR R19 R6 K44
0x7C480200, // 00A1 CALL R18 1
0x5C4C0400, // 00A2 MOVE R19 R2
0x5C500600, // 00A3 MOVE R20 R3
0x7C2C1200, // 00A4 CALL R11 9
0x58300015, // 00A5 LDCONST R12 K21
0x7C240600, // 00A6 CALL R9 3
0x8824012D, // 00A7 GETMBR R9 R0 K45
0x8C24132E, // 00A8 GETMET R9 R9 K46
0x5C2C0C00, // 00A9 MOVE R11 R6
0x7C240400, // 00AA CALL R9 2
0x5C141200, // 00AB MOVE R5 R9
0x5C240A00, // 00AC MOVE R9 R5
0x74260003, // 00AD JMPT R9 #00B2
0x8C240120, // 00AE GETMET R9 R0 K32
0x5C2C0C00, // 00AF MOVE R11 R6
0x50300000, // 00B0 LDBOOL R12 0 0
0x7C240600, // 00B1 CALL R9 3
0x50240200, // 00B2 LDBOOL R9 1 0
0xA8040001, // 00B3 EXBLK 1 1
0x80041200, // 00B4 RET 1 R9
0x700200BB, // 00B5 JMP #0172
0xB8220A00, // 00B6 GETNGBL R8 K5
0x8C201106, // 00B7 GETMET R8 R8 K6
0x8C28091D, // 00B8 GETMET R10 R4 K29
0x5830002F, // 00B9 LDCONST R12 K47
0x88340D0F, // 00BA GETMBR R13 R6 K15
0x88380D1C, // 00BB GETMBR R14 R6 K28
0x7C280800, // 00BC CALL R10 4
0x582C0015, // 00BD LDCONST R11 K21
0x7C200600, // 00BE CALL R8 3
0x88200109, // 00BF GETMBR R8 R0 K9
0x8820110A, // 00C0 GETMBR R8 R8 K10
0x8C201130, // 00C1 GETMET R8 R8 K48
0x88280D0F, // 00C2 GETMBR R10 R6 K15
0x7C200400, // 00C3 CALL R8 2
0x4C240000, // 00C4 LDNIL R9
0x1C241009, // 00C5 EQ R9 R8 R9
0x7826000A, // 00C6 JMPF R9 #00D2
0xB8260A00, // 00C7 GETNGBL R9 K5
0x8C241306, // 00C8 GETMET R9 R9 K6
0x602C0008, // 00C9 GETGBL R11 G8
0x88300D0F, // 00CA GETMBR R12 R6 K15
0x7C2C0200, // 00CB CALL R11 1
0x002E620B, // 00CC ADD R11 K49 R11
0x58300010, // 00CD LDCONST R12 K16
0x7C240600, // 00CE CALL R9 3
0x50240000, // 00CF LDBOOL R9 0 0
0xA8040001, // 00D0 EXBLK 1 1
0x80041200, // 00D1 RET 1 R9
0x780A0000, // 00D2 JMPF R2 #00D4
0x90222C02, // 00D3 SETMBR R8 K22 R2
0x780E0000, // 00D4 JMPF R3 #00D6
0x90222E03, // 00D5 SETMBR R8 K23 R3
0x90223000, // 00D6 SETMBR R8 K24 R0
0x901A3208, // 00D7 SETMBR R6 K25 R8
0x8C241132, // 00D8 GETMET R9 R8 K50
0x882C0D1C, // 00D9 GETMBR R11 R6 K28
0x50300200, // 00DA LDBOOL R12 1 0
0x7C240600, // 00DB CALL R9 3
0x74260013, // 00DC JMPT R9 #00F1
0xB8260A00, // 00DD GETNGBL R9 K5
0x8C241306, // 00DE GETMET R9 R9 K6
0x602C0008, // 00DF GETGBL R11 G8
0x88300D1C, // 00E0 GETMBR R12 R6 K28
0x7C2C0200, // 00E1 CALL R11 1
0x002E660B, // 00E2 ADD R11 K51 R11
0x002C1734, // 00E3 ADD R11 R11 K52
0x60300008, // 00E4 GETGBL R12 G8
0x88341135, // 00E5 GETMBR R13 R8 K53
0x7C300200, // 00E6 CALL R12 1
0x002C160C, // 00E7 ADD R11 R11 R12
0x58300015, // 00E8 LDCONST R12 K21
0x7C240600, // 00E9 CALL R9 3
0x8C240136, // 00EA GETMET R9 R0 K54
0x5C2C0C00, // 00EB MOVE R11 R6
0x50300000, // 00EC LDBOOL R12 0 0
0x7C240600, // 00ED CALL R9 3
0x50240000, // 00EE LDBOOL R9 0 0
0xA8040001, // 00EF EXBLK 1 1
0x80041200, // 00F0 RET 1 R9
0x8C240D37, // 00F1 GETMET R9 R6 K55
0x7C240200, // 00F2 CALL R9 1
0x5C281200, // 00F3 MOVE R10 R9
0x742A0002, // 00F4 JMPT R10 #00F8
0x50280000, // 00F5 LDBOOL R10 0 0
0xA8040001, // 00F6 EXBLK 1 1
0x80041200, // 00F7 RET 1 R9
0x8C240D39, // 00F8 GETMET R9 R6 K57
0x7C240200, // 00F9 CALL R9 1
0x5C281200, // 00FA MOVE R10 R9
0x742A0002, // 00FB JMPT R10 #00FF
0x50280000, // 00FC LDBOOL R10 0 0
0xA8040001, // 00FD EXBLK 1 1
0x80041400, // 00FE RET 1 R10
0x88280D3B, // 00FF GETMBR R10 R6 K59
0x0428153C, // 0100 SUB R10 R10 K60
0x402A2A0A, // 0101 CONNECT R10 K21 R10
0x882C0D3A, // 0102 GETMBR R11 R6 K58
0x9428160A, // 0103 GETIDX R10 R11 R10
0x901A740A, // 0104 SETMBR R6 K58 R10
0x88280D3A, // 0105 GETMBR R10 R6 K58
0x40281409, // 0106 CONNECT R10 R10 R9
0xB82A0200, // 0107 GETNGBL R10 K1
0x8C281502, // 0108 GETMET R10 R10 K2
0x8C30091F, // 0109 GETMET R12 R4 K31
0x5838003D, // 010A LDCONST R14 K61
0x883C0D3B, // 010B GETMBR R15 R6 K59
0x88400D3A, // 010C GETMBR R16 R6 K58
0x8C402104, // 010D GETMET R16 R16 K4
0x7C400200, // 010E CALL R16 1
0x7C300800, // 010F CALL R12 4
0x54360003, // 0110 LDINT R13 4
0x7C280600, // 0111 CALL R10 3
0x8C280D23, // 0112 GETMET R10 R6 K35
0x7C280200, // 0113 CALL R10 1
0xB82A0200, // 0114 GETNGBL R10 K1
0x8C281502, // 0115 GETMET R10 R10 K2
0x60300008, // 0116 GETGBL R12 G8
0x88340D3F, // 0117 GETMBR R13 R6 K63
0x7C300200, // 0118 CALL R12 1
0x00327C0C, // 0119 ADD R12 K62 R12
0x00301940, // 011A ADD R12 R12 K64
0x60340008, // 011B GETGBL R13 G8
0x88380D25, // 011C GETMBR R14 R6 K37
0x80041400, // 00F7 RET 1 R10
0x88280D39, // 00F8 GETMBR R10 R6 K57
0x0428153A, // 00F9 SUB R10 R10 K58
0x402A260A, // 00FA CONNECT R10 K19 R10
0x882C0D38, // 00FB GETMBR R11 R6 K56
0x9428160A, // 00FC GETIDX R10 R11 R10
0x901A700A, // 00FD SETMBR R6 K56 R10
0x88280D38, // 00FE GETMBR R10 R6 K56
0x40281409, // 00FF CONNECT R10 R10 R9
0xB82A0A00, // 0100 GETNGBL R10 K5
0x8C281506, // 0101 GETMET R10 R10 K6
0x8C30091D, // 0102 GETMET R12 R4 K29
0x5838003B, // 0103 LDCONST R14 K59
0x883C0D39, // 0104 GETMBR R15 R6 K57
0x88400D38, // 0105 GETMBR R16 R6 K56
0x8C40213C, // 0106 GETMET R16 R16 K60
0x7C400200, // 0107 CALL R16 1
0x7C300800, // 0108 CALL R12 4
0x54360003, // 0109 LDINT R13 4
0x7C280600, // 010A CALL R10 3
0x8C280D21, // 010B GETMET R10 R6 K33
0x7C280200, // 010C CALL R10 1
0xB82A0A00, // 010D GETNGBL R10 K5
0x8C281506, // 010E GETMET R10 R10 K6
0x60300008, // 010F GETGBL R12 G8
0x88340D3E, // 0110 GETMBR R13 R6 K62
0x7C300200, // 0111 CALL R12 1
0x00327A0C, // 0112 ADD R12 K61 R12
0x0030193F, // 0113 ADD R12 R12 K63
0x60340008, // 0114 GETGBL R13 G8
0x88380D23, // 0115 GETMBR R14 R6 K35
0x7C340200, // 0116 CALL R13 1
0x0030180D, // 0117 ADD R12 R12 R13
0x00301940, // 0118 ADD R12 R12 K64
0x60340008, // 0119 GETGBL R13 G8
0x88380D27, // 011A GETMBR R14 R6 K39
0x543EFFFE, // 011B LDINT R15 65535
0x2C381C0F, // 011C AND R14 R14 R15
0x7C340200, // 011D CALL R13 1
0x0030180D, // 011E ADD R12 R12 R13
0x00301941, // 011F ADD R12 R12 K65
0x60340008, // 0120 GETGBL R13 G8
0x88380D29, // 0121 GETMBR R14 R6 K41
0x543EFFFE, // 0122 LDINT R15 65535
0x2C381C0F, // 0123 AND R14 R14 R15
0x7C340200, // 0124 CALL R13 1
0x0030180D, // 0125 ADD R12 R12 R13
0x58340017, // 0126 LDCONST R13 K23
0x7C280600, // 0127 CALL R10 3
0xB82A0200, // 0128 GETNGBL R10 K1
0x8C281502, // 0129 GETMET R10 R10 K2
0x8C30091F, // 012A GETMET R12 R4 K31
0x58380042, // 012B LDCONST R14 K66
0x883C1111, // 012C GETMBR R15 R8 K17
0x88400D3F, // 012D GETMBR R16 R6 K63
0x88440D25, // 012E GETMBR R17 R6 K37
0x88480D1E, // 012F GETMBR R18 R6 K30
0x884C0D29, // 0130 GETMBR R19 R6 K41
0x60500008, // 0131 GETGBL R20 G8
0x88540D2E, // 0132 GETMBR R21 R6 K46
0x7C500200, // 0133 CALL R20 1
0x88540D2B, // 0134 GETMBR R21 R6 K43
0x78560001, // 0135 JMPF R21 #0138
0x5854002C, // 0136 LDCONST R21 K44
0x70020000, // 0137 JMP #0139
0x5854002D, // 0138 LDCONST R21 K45
0x5C580400, // 0139 MOVE R22 R2
0x5C5C0600, // 013A MOVE R23 R3
0x7C301600, // 013B CALL R12 11
0x58340017, // 013C LDCONST R13 K23
0x7C280600, // 013D CALL R10 3
0x8828010B, // 013E GETMBR R10 R0 K11
0x8C281524, // 013F GETMET R10 R10 K36
0x5C300C00, // 0140 MOVE R12 R6
0x7C280400, // 0141 CALL R10 2
0x88280D3F, // 0142 GETMBR R10 R6 K63
0x1C2C1515, // 0143 EQ R11 R10 K21
0x782E0018, // 0144 JMPF R11 #015E
0xB82E0200, // 0145 GETNGBL R11 K1
0x8C2C1702, // 0146 GETMET R11 R11 K2
0xB8360A00, // 0147 GETNGBL R13 K5
0x8C341B0A, // 0148 GETMET R13 R13 K10
0x5C3C0C00, // 0149 MOVE R15 R6
0x7C340400, // 014A CALL R13 2
0x0036860D, // 014B ADD R13 K67 R13
0x58380017, // 014C LDCONST R14 K23
0x7C2C0600, // 014D CALL R11 3
0x882C0D25, // 014E GETMBR R11 R6 K37
0x5432000F, // 014F LDINT R12 16
0x1C2C160C, // 0150 EQ R11 R11 R12
0x782E0009, // 0151 JMPF R11 #015C
0x882C0144, // 0152 GETMBR R11 R0 K68
0x8C2C1745, // 0153 GETMET R11 R11 K69
0x5C340C00, // 0154 MOVE R13 R6
0x7C2C0400, // 0155 CALL R11 2
0x5C141600, // 0156 MOVE R5 R11
0x78160003, // 0157 JMPF R5 #015C
0x882C0144, // 0158 GETMBR R11 R0 K68
0x8C2C1746, // 0159 GETMET R11 R11 K70
0x5C340000, // 015A MOVE R13 R0
0x7C2C0400, // 015B CALL R11 2
0x50140200, // 015C LDBOOL R5 1 0
0x7002001A, // 015D JMP #0179
0x1C2C153C, // 015E EQ R11 R10 K60
0x782E0010, // 015F JMPF R11 #0171
0x882C0144, // 0160 GETMBR R11 R0 K68
0x8C2C1730, // 0161 GETMET R11 R11 K48
0x5C340C00, // 0162 MOVE R13 R6
0x7C2C0400, // 0163 CALL R11 2
0x5C141600, // 0164 MOVE R5 R11
0x78160004, // 0165 JMPF R5 #016B
0x882C0144, // 0166 GETMBR R11 R0 K68
0x8C2C1746, // 0167 GETMET R11 R11 K70
0x5C340000, // 0168 MOVE R13 R0
0x7C2C0400, // 0169 CALL R11 2
0x70020003, // 016A JMP #016F
0x8C2C0138, // 016B GETMET R11 R0 K56
0x5C340C00, // 016C MOVE R13 R6
0x50380200, // 016D LDBOOL R14 1 0
0x7C2C0600, // 016E CALL R11 3
0x50140200, // 016F LDBOOL R5 1 0
0x70020007, // 0170 JMP #0179
0xB82E0200, // 0171 GETNGBL R11 K1
0x8C2C1702, // 0172 GETMET R11 R11 K2
0x60340008, // 0173 GETGBL R13 G8
0x5C381400, // 0174 MOVE R14 R10
0x7C340200, // 0175 CALL R13 1
0x00368E0D, // 0176 ADD R13 K71 R13
0x58380017, // 0177 LDCONST R14 K23
0x7C2C0600, // 0178 CALL R11 3
0xA8040001, // 0179 EXBLK 1 1
0x80040A00, // 017A RET 1 R5
0xA8040001, // 017B EXBLK 1 1
0x70020014, // 017C JMP #0192
0xAC180002, // 017D CATCH R6 0 2
0x70020011, // 017E JMP #0191
0xB8220200, // 017F GETNGBL R8 K1
0x8C201102, // 0180 GETMET R8 R8 K2
0x60280008, // 0181 GETGBL R10 G8
0x5C2C0C00, // 0182 MOVE R11 R6
0x7C280200, // 0183 CALL R10 1
0x002A900A, // 0184 ADD R10 K72 R10
0x00281549, // 0185 ADD R10 R10 K73
0x602C0008, // 0186 GETGBL R11 G8
0x5C300E00, // 0187 MOVE R12 R7
0x7C2C0200, // 0188 CALL R11 1
0x0028140B, // 0189 ADD R10 R10 R11
0x7C200400, // 018A CALL R8 2
0xA4229400, // 018B IMPORT R8 K74
0x8C24114B, // 018C GETMET R9 R8 K75
0x7C240200, // 018D CALL R9 1
0x50240000, // 018E LDBOOL R9 0 0
0x80041200, // 018F RET 1 R9
0x70020000, // 0190 JMP #0192
0xB0080000, // 0191 RAISE 2 R0 R0
0x80000000, // 0192 RET 0
0x58340015, // 011F LDCONST R13 K21
0x7C280600, // 0120 CALL R10 3
0xB82A0A00, // 0121 GETNGBL R10 K5
0x8C281506, // 0122 GETMET R10 R10 K6
0x8C30091D, // 0123 GETMET R12 R4 K29
0x58380041, // 0124 LDCONST R14 K65
0x883C110F, // 0125 GETMBR R15 R8 K15
0x88400D3E, // 0126 GETMBR R16 R6 K62
0x88440D23, // 0127 GETMBR R17 R6 K35
0x88480D1C, // 0128 GETMBR R18 R6 K28
0x884C0D27, // 0129 GETMBR R19 R6 K39
0x60500008, // 012A GETGBL R20 G8
0x88540D2C, // 012B GETMBR R21 R6 K44
0x7C500200, // 012C CALL R20 1
0x88540D29, // 012D GETMBR R21 R6 K41
0x78560001, // 012E JMPF R21 #0131
0x5854002A, // 012F LDCONST R21 K42
0x70020000, // 0130 JMP #0132
0x5854002B, // 0131 LDCONST R21 K43
0x5C580400, // 0132 MOVE R22 R2
0x5C5C0600, // 0133 MOVE R23 R3
0x7C301600, // 0134 CALL R12 11
0x58340015, // 0135 LDCONST R13 K21
0x7C280600, // 0136 CALL R10 3
0x88280109, // 0137 GETMBR R10 R0 K9
0x8C281522, // 0138 GETMET R10 R10 K34
0x5C300C00, // 0139 MOVE R12 R6
0x7C280400, // 013A CALL R10 2
0x88280D3E, // 013B GETMBR R10 R6 K62
0x1C2C1513, // 013C EQ R11 R10 K19
0x782E0018, // 013D JMPF R11 #0157
0xB82E0A00, // 013E GETNGBL R11 K5
0x8C2C1706, // 013F GETMET R11 R11 K6
0xB8360200, // 0140 GETNGBL R13 K1
0x8C341B08, // 0141 GETMET R13 R13 K8
0x5C3C0C00, // 0142 MOVE R15 R6
0x7C340400, // 0143 CALL R13 2
0x0036840D, // 0144 ADD R13 K66 R13
0x58380015, // 0145 LDCONST R14 K21
0x7C2C0600, // 0146 CALL R11 3
0x882C0D23, // 0147 GETMBR R11 R6 K35
0x5432000F, // 0148 LDINT R12 16
0x1C2C160C, // 0149 EQ R11 R11 R12
0x782E0009, // 014A JMPF R11 #0155
0x882C0143, // 014B GETMBR R11 R0 K67
0x8C2C1744, // 014C GETMET R11 R11 K68
0x5C340C00, // 014D MOVE R13 R6
0x7C2C0400, // 014E CALL R11 2
0x5C141600, // 014F MOVE R5 R11
0x78160003, // 0150 JMPF R5 #0155
0x882C0143, // 0151 GETMBR R11 R0 K67
0x8C2C1745, // 0152 GETMET R11 R11 K69
0x5C340000, // 0153 MOVE R13 R0
0x7C2C0400, // 0154 CALL R11 2
0x50140200, // 0155 LDBOOL R5 1 0
0x7002001A, // 0156 JMP #0172
0x1C2C153A, // 0157 EQ R11 R10 K58
0x782E0010, // 0158 JMPF R11 #016A
0x882C0143, // 0159 GETMBR R11 R0 K67
0x8C2C172E, // 015A GETMET R11 R11 K46
0x5C340C00, // 015B MOVE R13 R6
0x7C2C0400, // 015C CALL R11 2
0x5C141600, // 015D MOVE R5 R11
0x78160004, // 015E JMPF R5 #0164
0x882C0143, // 015F GETMBR R11 R0 K67
0x8C2C1745, // 0160 GETMET R11 R11 K69
0x5C340000, // 0161 MOVE R13 R0
0x7C2C0400, // 0162 CALL R11 2
0x70020003, // 0163 JMP #0168
0x8C2C0136, // 0164 GETMET R11 R0 K54
0x5C340C00, // 0165 MOVE R13 R6
0x50380200, // 0166 LDBOOL R14 1 0
0x7C2C0600, // 0167 CALL R11 3
0x50140200, // 0168 LDBOOL R5 1 0
0x70020007, // 0169 JMP #0172
0xB82E0A00, // 016A GETNGBL R11 K5
0x8C2C1706, // 016B GETMET R11 R11 K6
0x60340008, // 016C GETGBL R13 G8
0x5C381400, // 016D MOVE R14 R10
0x7C340200, // 016E CALL R13 1
0x00368C0D, // 016F ADD R13 K70 R13
0x58380015, // 0170 LDCONST R14 K21
0x7C2C0600, // 0171 CALL R11 3
0xA8040001, // 0172 EXBLK 1 1
0x80040A00, // 0173 RET 1 R5
0xA8040001, // 0174 EXBLK 1 1
0x70020014, // 0175 JMP #018B
0xAC180002, // 0176 CATCH R6 0 2
0x70020011, // 0177 JMP #018A
0xB8220A00, // 0178 GETNGBL R8 K5
0x8C201106, // 0179 GETMET R8 R8 K6
0x60280008, // 017A GETGBL R10 G8
0x5C2C0C00, // 017B MOVE R11 R6
0x7C280200, // 017C CALL R10 1
0x002A8E0A, // 017D ADD R10 K71 R10
0x00281548, // 017E ADD R10 R10 K72
0x602C0008, // 017F GETGBL R11 G8
0x5C300E00, // 0180 MOVE R12 R7
0x7C2C0200, // 0181 CALL R11 1
0x0028140B, // 0182 ADD R10 R10 R11
0x7C200400, // 0183 CALL R8 2
0xA4229200, // 0184 IMPORT R8 K73
0x8C24114A, // 0185 GETMET R9 R8 K74
0x7C240200, // 0186 CALL R9 1
0x50240000, // 0187 LDBOOL R9 0 0
0x80041200, // 0188 RET 1 R9
0x70020000, // 0189 JMP #018B
0xB0080000, // 018A RAISE 2 R0 R0
0x80000000, // 018B RET 0
})
)
);

View File

@ -0,0 +1,149 @@
/* Solidification of Matter_Path.h */
/********************************************************************\
* Generated code, don't edit *
\********************************************************************/
#include "be_constobj.h"
extern const bclass be_class_Matter_Path;
/********************************************************************
** Solidified function: tostring
********************************************************************/
be_local_closure(Matter_Path_tostring, /* name */
be_nested_proto(
7, /* nstack */
1, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[15]) { /* constants */
/* K0 */ be_nested_str_weak(string),
/* K1 */ be_nested_str_weak(),
/* K2 */ be_nested_str_weak(endpoint),
/* K3 */ be_nested_str_weak(format),
/* K4 */ be_nested_str_weak(_X5B_X2502X_X5D),
/* K5 */ be_nested_str_weak(_X5B_X2A_X2A_X5D),
/* K6 */ be_nested_str_weak(cluster),
/* K7 */ be_nested_str_weak(_X2504X_X2F),
/* K8 */ be_nested_str_weak(_X2A_X2A_X2A_X2A_X2F),
/* K9 */ be_nested_str_weak(attribute),
/* K10 */ be_nested_str_weak(_X2504X),
/* K11 */ be_nested_str_weak(command),
/* K12 */ be_nested_str_weak(_X2A_X2A_X2A_X2A),
/* K13 */ be_nested_str_weak(Exception_X3E_X20),
/* K14 */ be_nested_str_weak(_X2C_X20),
}),
be_str_weak(tostring),
&be_const_str_solidified,
( &(const binstruction[75]) { /* code */
0xA802003A, // 0000 EXBLK 0 #003C
0xA4060000, // 0001 IMPORT R1 K0
0x58080001, // 0002 LDCONST R2 K1
0x880C0102, // 0003 GETMBR R3 R0 K2
0x4C100000, // 0004 LDNIL R4
0x200C0604, // 0005 NE R3 R3 R4
0x780E0004, // 0006 JMPF R3 #000C
0x8C0C0303, // 0007 GETMET R3 R1 K3
0x58140004, // 0008 LDCONST R5 K4
0x88180102, // 0009 GETMBR R6 R0 K2
0x7C0C0600, // 000A CALL R3 3
0x70020000, // 000B JMP #000D
0x580C0005, // 000C LDCONST R3 K5
0x00080403, // 000D ADD R2 R2 R3
0x880C0106, // 000E GETMBR R3 R0 K6
0x4C100000, // 000F LDNIL R4
0x200C0604, // 0010 NE R3 R3 R4
0x780E0004, // 0011 JMPF R3 #0017
0x8C0C0303, // 0012 GETMET R3 R1 K3
0x58140007, // 0013 LDCONST R5 K7
0x88180106, // 0014 GETMBR R6 R0 K6
0x7C0C0600, // 0015 CALL R3 3
0x70020000, // 0016 JMP #0018
0x580C0008, // 0017 LDCONST R3 K8
0x00080403, // 0018 ADD R2 R2 R3
0x880C0109, // 0019 GETMBR R3 R0 K9
0x4C100000, // 001A LDNIL R4
0x200C0604, // 001B NE R3 R3 R4
0x780E0004, // 001C JMPF R3 #0022
0x8C0C0303, // 001D GETMET R3 R1 K3
0x5814000A, // 001E LDCONST R5 K10
0x88180109, // 001F GETMBR R6 R0 K9
0x7C0C0600, // 0020 CALL R3 3
0x70020000, // 0021 JMP #0023
0x580C0001, // 0022 LDCONST R3 K1
0x00080403, // 0023 ADD R2 R2 R3
0x880C010B, // 0024 GETMBR R3 R0 K11
0x4C100000, // 0025 LDNIL R4
0x200C0604, // 0026 NE R3 R3 R4
0x780E0004, // 0027 JMPF R3 #002D
0x8C0C0303, // 0028 GETMET R3 R1 K3
0x5814000A, // 0029 LDCONST R5 K10
0x8818010B, // 002A GETMBR R6 R0 K11
0x7C0C0600, // 002B CALL R3 3
0x70020000, // 002C JMP #002E
0x580C0001, // 002D LDCONST R3 K1
0x00080403, // 002E ADD R2 R2 R3
0x880C0109, // 002F GETMBR R3 R0 K9
0x4C100000, // 0030 LDNIL R4
0x1C0C0604, // 0031 EQ R3 R3 R4
0x780E0004, // 0032 JMPF R3 #0038
0x880C010B, // 0033 GETMBR R3 R0 K11
0x4C100000, // 0034 LDNIL R4
0x1C0C0604, // 0035 EQ R3 R3 R4
0x780E0000, // 0036 JMPF R3 #0038
0x0008050C, // 0037 ADD R2 R2 K12
0xA8040001, // 0038 EXBLK 1 1
0x80040400, // 0039 RET 1 R2
0xA8040001, // 003A EXBLK 1 1
0x7002000D, // 003B JMP #004A
0xAC040002, // 003C CATCH R1 0 2
0x7002000A, // 003D JMP #0049
0x600C0008, // 003E GETGBL R3 G8
0x5C100200, // 003F MOVE R4 R1
0x7C0C0200, // 0040 CALL R3 1
0x000E1A03, // 0041 ADD R3 K13 R3
0x000C070E, // 0042 ADD R3 R3 K14
0x60100008, // 0043 GETGBL R4 G8
0x5C140400, // 0044 MOVE R5 R2
0x7C100200, // 0045 CALL R4 1
0x000C0604, // 0046 ADD R3 R3 R4
0x80040600, // 0047 RET 1 R3
0x70020000, // 0048 JMP #004A
0xB0080000, // 0049 RAISE 2 R0 R0
0x80000000, // 004A RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified class: Matter_Path
********************************************************************/
be_local_class(Matter_Path,
6,
NULL,
be_nested_map(7,
( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key_weak(log, 4), be_const_var(5) },
{ be_const_key_weak(command, 2), be_const_var(3) },
{ be_const_key_weak(status, -1), be_const_var(4) },
{ be_const_key_weak(tostring, -1), be_const_closure(Matter_Path_tostring_closure) },
{ be_const_key_weak(cluster, 5), be_const_var(1) },
{ be_const_key_weak(endpoint, -1), be_const_var(0) },
{ be_const_key_weak(attribute, -1), be_const_var(2) },
})),
be_str_weak(Matter_Path)
);
/*******************************************************************/
void be_load_Matter_Path_class(bvm *vm) {
be_pushntvclass(vm, &be_class_Matter_Path);
be_setglobal(vm, "Matter_Path");
be_pop(vm, 1);
}
/********************************************************************/
/* End of solidification */