summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbt <bt@rctt.net>2026-03-10 22:50:53 +0100
committerbt <bt@rctt.net>2026-03-10 22:53:32 +0100
commit7cdd5c04d5e966b3c90a3d86720e0823b4f7ee2c (patch)
tree2da446610bed492542c1c3fe31145fcc1ca82081
parent69192d956aa2b6b3dbf87bac0e265e718b49dd70 (diff)
downloadsolec-7cdd5c04d5e966b3c90a3d86720e0823b4f7ee2c.tar.gz
solec-7cdd5c04d5e966b3c90a3d86720e0823b4f7ee2c.zip
Update spec
-rw-r--r--PROTOCOL.md74
-rw-r--r--README.md12
-rwxr-xr-xbuild_spec.sh2
-rw-r--r--solec.ksy54
-rw-r--r--solec.lua111
-rw-r--r--solec.svg699
6 files changed, 544 insertions, 408 deletions
diff --git a/PROTOCOL.md b/PROTOCOL.md
index 895d1df..886161c 100644
--- a/PROTOCOL.md
+++ b/PROTOCOL.md
@@ -2,48 +2,41 @@
# SOLEC protocol specification
+## Data format
+
* Payload can contain multiple numeric types or binary data in a single frame
* Numeric types are big endian
-* Numeric types names are same as in [Go](https://go.dev/ref/spec#Numeric_types)
* See [test payload](#Test) for an example of complex data structure
-## Frame
+### Frame structure
| Type | Description |
|----------|----------------|
| `uint8` | Payload type |
| `uint16` | Payload length |
-| `[]any` | Payload |
-
+| `any` | Payload |
-## Data types
-### Numeric types
+### Special types
-* `uint8`
-* `uint16`
-* `uint32`
-* `uint64`
+#### Strings and binary
-### `binary`
+Strings and binary data are prefixed wtith 2 bytes denoting their length.
+Strings are UTF-8 encoded.
-| Type | Description |
-|--------|----------------|
-| uint16 | Data length |
-| binary | Data |
+#### Timestamps
-### `string`
+Timestamps are stored as `uint64` in [Unix format](https://en.wikipedia.org/wiki/Unix_time).
+Timezone is always set to UTC.
-UTF-8 encoded string encapsulated in `bianry` type.
+### Payloads
-### `time`
+All payload types are described in following files:
-[Unix timestamp](https://en.wikipedia.org/wiki/Unix_time) stored in `uint16`.
-Timezone is always UTC.
+* [Kaitai Struct](https://git.sr.ht/~rctt/solec/blob/main/solec.ksy)
+* [SVG graph](https://git.sr.ht/~rctt/solec/blob/main/solec.svg)
-# Payloads
-
-## Payload prefixes
+### Payload types
| Type | Name |
|------|--------------|
@@ -53,39 +46,4 @@ Timezone is always UTC.
| 0x04 | Message |
| 0xFF | Test |
-## Payload types
-
-### Handshake
-
-| Type | Name | Description |
-|--------|---------------------|----------------------------------------------------------|
-| uint8 | ProtocolVersionMajor | Bumped if changes are incompatible with previous version |
-| uint8 | PrococolVersionMinor | Bumber if changes are backwards compatible |
-
-
-### Ping
-
-Can be send by client or server. Receiver shoudl reply with `Pong`.
-
-### Pong
-
-Reply to `ping`.
-
-| Type | Name | Description |
-|--------|------|-------------------------|
-| uint64 | Time | Set just before sending |
-
-### Test
-
-Used for testing purposes. Can change at any time.
-| Type | Name | Description |
-|--------|-------|-------------|
-| uint8 | Num1 | |
-| time | Time1 | |
-| string | Str1 | |
-| uint16 | Num2 | |
-| binary | Bin1 | |
-| uint32 | Num3 | |
-| string | Str2 | |
-| uint64 | Num4 | |
diff --git a/README.md b/README.md
index 24cb6c3..ee8e555 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,13 @@
-# solecd
+# solec
-## Running
+* [Protocol spec](https://git.sr.ht/~rctt/solec/tree/main/item/PROTOCOL.md)
+
+## Running the daemon
You'll need Go toolchain. Get it [here](https://go.dev/dl/)
```
-git clone https://git.sr.ht/~rctt/solecd
+git clone https://git.sr.ht/~rctt/solec
cd solecd
go run cmd/daemon/main.go
```
@@ -23,6 +25,7 @@ it into Wireshark plugins directory.
- Protocol
- Design handshake process
- Design basic messaging
+ - Maybe put payload type and length into same bytes?
- Server
- Put server stuff into a package
@@ -31,6 +34,3 @@ it into Wireshark plugins directory.
- Network library
- Handle partial TCP packets
- Better error handling
-
-- Tools
- - Generate Wireshark dissector from spec \ No newline at end of file
diff --git a/build_spec.sh b/build_spec.sh
index ae78b81..dfebbd2 100755
--- a/build_spec.sh
+++ b/build_spec.sh
@@ -13,7 +13,7 @@ rm solec.dot
~/bin/kaitai-struct-compiler-ws/bin/kaitai-struct-compiler -t wireshark --read-pos solec.ksy
${SED} -i -e '5s/.*/package.path = "kaitai_struct_lua_runtime\/?.lua" .. package.path/' solec.lua
-${SED} -i -e 's/, self.payload_type//' solec.lua
+${SED} -i -e 's/, self.type_payload//' solec.lua
cat <<EOT >> solec.lua
local tcp_port = DissectorTable.get("tcp.port")
diff --git a/solec.ksy b/solec.ksy
index 82f3bf7..e7c24e1 100644
--- a/solec.ksy
+++ b/solec.ksy
@@ -3,32 +3,39 @@ meta:
file-extension: hex
endian: be
-enums:
- type:
- 0x01: handshake
- 0x02: ping
- 0x03: pong
- 0x04: message
- 0xFF: test
+doc: |
+ SOLEC protocol uses big endian encoding. Frames uses type-length-value format.
+
+doc-ref: https://git.sr.ht/~rctt/solec/blob/main/solec.svg
seq:
- - id: payload_type
+ - id: type_payload
type: u1
enum: type
- - id: payload_length
+ - id: len_payload
type: u2
- id: payload
+ size: len_payload
type:
- switch-on: payload_type
+ switch-on: type_payload
cases:
'type::handshake': handshake
'type::ping': ping
'type::pong': pong
-# 'type::message': message
+ 'type::message': message
'type::test': test
+enums:
+ type:
+ 0x01: handshake
+ 0x02: ping
+ 0x03: pong
+ 0x04: message
+ 0xFF: test
+
types:
string:
+ doc: UTF-8 encoded string.
seq:
- id: len_payload
type: u2
@@ -38,6 +45,7 @@ types:
encoding: UTF-8
binary:
+ doc: Binary data of unspecifed type.
seq:
- id: len_payload
type: u2
@@ -45,19 +53,41 @@ types:
size: len_payload
handshake:
+ doc: |
+ Handshake is sent by the client during connection initialization.
+ If protocol_ver_major is different than version used by the server
+ connection will be aborted.
seq:
- id: proto_ver_major
type: u1
- id: proto_ver_minor
type: u1
- ping: {}
+ ping:
+ doc: Ping does not contain any payload.
pong:
seq:
- id: timestamp
+ doc: |
+ Timestamp is set just before sending the pong message. It can be used
+ to meassure packet's travel time between server and client.
type: u8
+ message:
+ doc: |
+ Source and target fields are addresses in user@server format.
+ seq:
+ - id: source
+ type: string
+ - id: target
+ type: string
+ - id: timestamp
+ doc: Set just before sending the message.
+ type: u8
+ - id: content
+ type: string
+
test:
doc: Test payload, used for parsers testing
seq:
diff --git a/solec.lua b/solec.lua
index e4c8514..a06a429 100644
--- a/solec.lua
+++ b/solec.lua
@@ -9,10 +9,10 @@ require("kaitaistruct")
local proto = Proto('solec', 'Solec')
proto.fields = {}
local enum = require("enum")
-local Solec_payload_type = ProtoField.new('payload_type', 'Solec.payload_type', ftypes.BYTES)
-table.insert(proto.fields, Solec_payload_type)
-local Solec_payload_length = ProtoField.new('payload_length', 'Solec.payload_length', ftypes.UINT32)
-table.insert(proto.fields, Solec_payload_length)
+local Solec_type_payload = ProtoField.new('type_payload', 'Solec.type_payload', ftypes.BYTES)
+table.insert(proto.fields, Solec_type_payload)
+local Solec_len_payload = ProtoField.new('len_payload', 'Solec.len_payload', ftypes.UINT32)
+table.insert(proto.fields, Solec_len_payload)
local Solec_Test_num1 = ProtoField.new('num1', 'Solec.Test.num1', ftypes.UINT8)
table.insert(proto.fields, Solec_Test_num1)
local Solec_Test_time1 = ProtoField.new('time1', 'Solec.Test.time1', ftypes.UINT32)
@@ -36,6 +36,8 @@ local Solec_Handshake_proto_ver_major = ProtoField.new('proto_ver_major', 'Solec
table.insert(proto.fields, Solec_Handshake_proto_ver_major)
local Solec_Handshake_proto_ver_minor = ProtoField.new('proto_ver_minor', 'Solec.Handshake.proto_ver_minor', ftypes.UINT8)
table.insert(proto.fields, Solec_Handshake_proto_ver_minor)
+local Solec_Message_timestamp = ProtoField.new('timestamp', 'Solec.Message.timestamp', ftypes.UINT32)
+table.insert(proto.fields, Solec_Message_timestamp)
local Solec_Pong_timestamp = ProtoField.new('timestamp', 'Solec.Pong.timestamp', ftypes.UINT32)
table.insert(proto.fields, Solec_Pong_timestamp)
@@ -46,6 +48,9 @@ function proto.dissector(tvb, pinfo, root)
local obj = Solec(io, tree)
end
+--
+-- SOLEC protocol uses big endian encoding. Frames uses type-length-value format.
+-- See also: Source (https://git.sr.ht/~rctt/solec/blob/main/solec.svg)
Solec = class.class(KaitaiStruct)
Solec.Type = enum.Enum {
@@ -66,29 +71,45 @@ end
function Solec:_read()
local _offset = self._io:pos()
- self.payload_type = Solec.Type(self._io:read_u1())
- self._tree:add(Solec_payload_type, self._io._io.tvb(_offset, self._io:pos() - _offset))
+ self.type_payload = Solec.Type(self._io:read_u1())
+ self._tree:add(Solec_type_payload, self._io._io.tvb(_offset, self._io:pos() - _offset))
local _offset = self._io:pos()
- self.payload_length = self._io:read_u2be()
- self._tree:add(Solec_payload_length, self._io._io.tvb(_offset, self._io:pos() - _offset), self.payload_length)
+ self.len_payload = self._io:read_u2be()
+ self._tree:add(Solec_len_payload, self._io._io.tvb(_offset, self._io:pos() - _offset), self.len_payload)
local _offset = self._io:pos()
- local _on = self.payload_type
- if _on == Solec.Type.handshake then
- local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'payload')
- self.payload = Solec.Handshake(self._io, _tree, self, self._root)
- _tree:set_len(self._io:pos() - _offset)
+ local _on = self.type_payload
+ if _on == Solec.Type.message then
+ self._raw_payload = self._io:read_bytes(self.len_payload)
+ local _tvb = self._io._io.tvb(_offset, self._io:pos() - _offset)
+ local _io = KaitaiStream(TVBStream(_tvb))
+ local _tree = self._tree:add(_tvb, 'payload')
+ self.payload = Solec.Message(_io, _tree, self, self._root)
elseif _on == Solec.Type.ping then
- local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'payload')
- self.payload = Solec.Ping(self._io, _tree, self, self._root)
- _tree:set_len(self._io:pos() - _offset)
+ self._raw_payload = self._io:read_bytes(self.len_payload)
+ local _tvb = self._io._io.tvb(_offset, self._io:pos() - _offset)
+ local _io = KaitaiStream(TVBStream(_tvb))
+ local _tree = self._tree:add(_tvb, 'payload')
+ self.payload = Solec.Ping(_io, _tree, self, self._root)
elseif _on == Solec.Type.pong then
- local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'payload')
- self.payload = Solec.Pong(self._io, _tree, self, self._root)
- _tree:set_len(self._io:pos() - _offset)
+ self._raw_payload = self._io:read_bytes(self.len_payload)
+ local _tvb = self._io._io.tvb(_offset, self._io:pos() - _offset)
+ local _io = KaitaiStream(TVBStream(_tvb))
+ local _tree = self._tree:add(_tvb, 'payload')
+ self.payload = Solec.Pong(_io, _tree, self, self._root)
elseif _on == Solec.Type.test then
- local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'payload')
- self.payload = Solec.Test(self._io, _tree, self, self._root)
- _tree:set_len(self._io:pos() - _offset)
+ self._raw_payload = self._io:read_bytes(self.len_payload)
+ local _tvb = self._io._io.tvb(_offset, self._io:pos() - _offset)
+ local _io = KaitaiStream(TVBStream(_tvb))
+ local _tree = self._tree:add(_tvb, 'payload')
+ self.payload = Solec.Test(_io, _tree, self, self._root)
+ elseif _on == Solec.Type.handshake then
+ self._raw_payload = self._io:read_bytes(self.len_payload)
+ local _tvb = self._io._io.tvb(_offset, self._io:pos() - _offset)
+ local _io = KaitaiStream(TVBStream(_tvb))
+ local _tree = self._tree:add(_tvb, 'payload')
+ self.payload = Solec.Handshake(_io, _tree, self, self._root)
+ else
+ self.payload = self._io:read_bytes(self.len_payload)
end
end
@@ -136,6 +157,8 @@ function Solec.Test:_read()
end
+--
+-- Binary data of unspecifed type.
Solec.Binary = class.class(KaitaiStruct)
function Solec.Binary:_init(io, tree, parent, root)
@@ -156,6 +179,8 @@ function Solec.Binary:_read()
end
+--
+-- UTF-8 encoded string.
Solec.String = class.class(KaitaiStruct)
function Solec.String:_init(io, tree, parent, root)
@@ -176,6 +201,8 @@ function Solec.String:_read()
end
+--
+-- Ping does not contain any payload.
Solec.Ping = class.class(KaitaiStruct)
function Solec.Ping:_init(io, tree, parent, root)
@@ -190,6 +217,10 @@ function Solec.Ping:_read()
end
+--
+-- Handshake is sent by the client during connection initialization.
+-- If protocol_ver_major is different than version used by the server
+-- connection will be aborted.
Solec.Handshake = class.class(KaitaiStruct)
function Solec.Handshake:_init(io, tree, parent, root)
@@ -210,6 +241,39 @@ function Solec.Handshake:_read()
end
+--
+-- Source and target fields are addresses in user@server format.
+Solec.Message = class.class(KaitaiStruct)
+
+function Solec.Message:_init(io, tree, parent, root)
+ KaitaiStruct._init(self, io)
+ self._parent = parent
+ self._root = root or self
+ self._tree = tree
+ self:_read()
+end
+
+function Solec.Message:_read()
+ local _offset = self._io:pos()
+ local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'source')
+ self.source = Solec.String(self._io, _tree, self, self._root)
+ _tree:set_len(self._io:pos() - _offset)
+ local _offset = self._io:pos()
+ local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'target')
+ self.target = Solec.String(self._io, _tree, self, self._root)
+ _tree:set_len(self._io:pos() - _offset)
+ local _offset = self._io:pos()
+ self.timestamp = self._io:read_u8be()
+ self._tree:add(Solec_Message_timestamp, self._io._io.tvb(_offset, self._io:pos() - _offset), self.timestamp)
+ local _offset = self._io:pos()
+ local _tree = self._tree:add(self._io._io.tvb(_offset, 0), 'content')
+ self.content = Solec.String(self._io, _tree, self, self._root)
+ _tree:set_len(self._io:pos() - _offset)
+end
+
+--
+-- Set just before sending the message.
+
Solec.Pong = class.class(KaitaiStruct)
function Solec.Pong:_init(io, tree, parent, root)
@@ -226,6 +290,9 @@ function Solec.Pong:_read()
self._tree:add(Solec_Pong_timestamp, self._io._io.tvb(_offset, self._io:pos() - _offset), self.timestamp)
end
+--
+-- Timestamp is set just before sending the pong message. It can be used
+-- to meassure packet's travel time between server and client.
local tcp_port = DissectorTable.get("tcp.port")
tcp_port:add(9999, proto)
diff --git a/solec.svg b/solec.svg
index 360c759..63e66fe 100644
--- a/solec.svg
+++ b/solec.svg
@@ -4,391 +4,472 @@
<!-- Generated by graphviz version 14.1.3 (20260303.0454)
-->
<!-- Pages: 1 -->
-<svg width="1064pt" height="627pt"
- viewBox="0.00 0.00 1064.00 627.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 623)">
-<polygon fill="white" stroke="none" points="-4,4 -4,-623 1059.75,-623 1059.75,4 -4,4"/>
+<svg width="1053pt" height="796pt"
+ viewBox="0.00 0.00 1053.00 796.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 792)">
+<polygon fill="white" stroke="none" points="-4,4 -4,-792 1049.25,-792 1049.25,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster__solec</title>
-<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="8,-8 8,-611 1047.75,-611 1047.75,-8 8,-8"/>
-<text xml:space="preserve" text-anchor="middle" x="527.88" y="-593.7" font-family="Times,serif" font-size="14.00">Solec</text>
+<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="8,-8 8,-780 1037.25,-780 1037.25,-8 8,-8"/>
+<text xml:space="preserve" text-anchor="middle" x="522.62" y="-762.7" font-family="Times,serif" font-size="14.00">Solec</text>
</g>
<g id="clust2" class="cluster">
<title>cluster__binary</title>
-<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="790.25,-16 790.25,-150 1023.25,-150 1023.25,-16 790.25,-16"/>
-<text xml:space="preserve" text-anchor="middle" x="906.75" y="-132.7" font-family="Times,serif" font-size="14.00">Solec::Binary</text>
+<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="779.75,-61 779.75,-195 1012.75,-195 1012.75,-61 779.75,-61"/>
+<text xml:space="preserve" text-anchor="middle" x="896.25" y="-177.7" font-family="Times,serif" font-size="14.00">Solec::Binary</text>
</g>
<g id="clust3" class="cluster">
<title>cluster__handshake</title>
-<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="542.5,-462 542.5,-578 753.75,-578 753.75,-462 542.5,-462"/>
-<text xml:space="preserve" text-anchor="middle" x="648.12" y="-560.7" font-family="Times,serif" font-size="14.00">Solec::Handshake</text>
+<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="532,-631 532,-747 743.25,-747 743.25,-631 532,-631"/>
+<text xml:space="preserve" text-anchor="middle" x="637.62" y="-729.7" font-family="Times,serif" font-size="14.00">Solec::Handshake</text>
</g>
<g id="clust4" class="cluster">
-<title>cluster__ping</title>
-<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="583.38,-377 583.38,-454 712.88,-454 712.88,-377 583.38,-377"/>
-<text xml:space="preserve" text-anchor="middle" x="648.12" y="-436.7" font-family="Times,serif" font-size="14.00">Solec::Ping</text>
+<title>cluster__message</title>
+<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="544.38,-462 544.38,-623 730.88,-623 730.88,-462 544.38,-462"/>
+<text xml:space="preserve" text-anchor="middle" x="637.62" y="-605.7" font-family="Times,serif" font-size="14.00">Solec::Message</text>
</g>
<g id="clust5" class="cluster">
-<title>cluster__pong</title>
-<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="558.25,-275 558.25,-369 738,-369 738,-275 558.25,-275"/>
-<text xml:space="preserve" text-anchor="middle" x="648.12" y="-351.7" font-family="Times,serif" font-size="14.00">Solec::Pong</text>
+<title>cluster__ping</title>
+<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="572.88,-377 572.88,-454 702.38,-454 702.38,-377 572.88,-377"/>
+<text xml:space="preserve" text-anchor="middle" x="637.62" y="-436.7" font-family="Times,serif" font-size="14.00">Solec::Ping</text>
</g>
<g id="clust6" class="cluster">
-<title>cluster__string</title>
-<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="773.75,-158 773.75,-292 1039.75,-292 1039.75,-158 773.75,-158"/>
-<text xml:space="preserve" text-anchor="middle" x="906.75" y="-274.7" font-family="Times,serif" font-size="14.00">Solec::String</text>
+<title>cluster__pong</title>
+<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="547.75,-275 547.75,-369 727.5,-369 727.5,-275 547.75,-275"/>
+<text xml:space="preserve" text-anchor="middle" x="637.62" y="-351.7" font-family="Times,serif" font-size="14.00">Solec::Pong</text>
</g>
<g id="clust7" class="cluster">
+<title>cluster__string</title>
+<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="763.25,-439 763.25,-573 1029.25,-573 1029.25,-439 763.25,-439"/>
+<text xml:space="preserve" text-anchor="middle" x="896.25" y="-555.7" font-family="Times,serif" font-size="14.00">Solec::String</text>
+</g>
+<g id="clust8" class="cluster">
<title>cluster__test</title>
-<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="566.12,-16 566.12,-267 730.12,-267 730.12,-16 566.12,-16"/>
-<text xml:space="preserve" text-anchor="middle" x="648.12" y="-249.7" font-family="Times,serif" font-size="14.00">Solec::Test</text>
+<polygon fill="none" stroke="black" stroke-dasharray="1,5" points="555.62,-16 555.62,-267 719.62,-267 719.62,-16 555.62,-16"/>
+<text xml:space="preserve" text-anchor="middle" x="637.62" y="-249.7" font-family="Times,serif" font-size="14.00">Solec::Test</text>
</g>
<!-- solec__seq -->
<g id="node1" class="node">
<title>solec__seq</title>
-<polygon fill="#e0ffe0" stroke="none" points="24,-422.5 24,-445 48.75,-445 48.75,-422.5 24,-422.5"/>
-<polygon fill="none" stroke="black" points="24,-422.5 24,-445 48.75,-445 48.75,-422.5 24,-422.5"/>
-<text xml:space="preserve" text-anchor="start" x="27" y="-429.25" font-family="Times,serif" font-size="14.00">pos</text>
-<polygon fill="#e0ffe0" stroke="none" points="48.75,-422.5 48.75,-445 75.75,-445 75.75,-422.5 48.75,-422.5"/>
-<polygon fill="none" stroke="black" points="48.75,-422.5 48.75,-445 75.75,-445 75.75,-422.5 48.75,-422.5"/>
-<text xml:space="preserve" text-anchor="start" x="51.75" y="-429.25" font-family="Times,serif" font-size="14.00">size</text>
-<polygon fill="#e0ffe0" stroke="none" points="75.75,-422.5 75.75,-445 202.5,-445 202.5,-422.5 75.75,-422.5"/>
-<polygon fill="none" stroke="black" points="75.75,-422.5 75.75,-445 202.5,-445 202.5,-422.5 75.75,-422.5"/>
-<text xml:space="preserve" text-anchor="start" x="127.5" y="-429.25" font-family="Times,serif" font-size="14.00">type</text>
-<polygon fill="#e0ffe0" stroke="none" points="202.5,-422.5 202.5,-445 291.75,-445 291.75,-422.5 202.5,-422.5"/>
-<polygon fill="none" stroke="black" points="202.5,-422.5 202.5,-445 291.75,-445 291.75,-422.5 202.5,-422.5"/>
-<text xml:space="preserve" text-anchor="start" x="241.88" y="-429.25" font-family="Times,serif" font-size="14.00">id</text>
-<polygon fill="none" stroke="black" points="24,-400 24,-422.5 48.75,-422.5 48.75,-400 24,-400"/>
-<text xml:space="preserve" text-anchor="start" x="33" y="-406.75" font-family="Times,serif" font-size="14.00">0</text>
-<polygon fill="none" stroke="black" points="48.75,-400 48.75,-422.5 75.75,-422.5 75.75,-400 48.75,-400"/>
-<text xml:space="preserve" text-anchor="start" x="58.88" y="-406.75" font-family="Times,serif" font-size="14.00">1</text>
-<polygon fill="none" stroke="black" points="75.75,-400 75.75,-422.5 202.5,-422.5 202.5,-400 75.75,-400"/>
-<text xml:space="preserve" text-anchor="start" x="111.38" y="-406.75" font-family="Times,serif" font-size="14.00">u1→Type</text>
-<polygon fill="none" stroke="black" points="202.5,-400 202.5,-422.5 291.75,-422.5 291.75,-400 202.5,-400"/>
-<text xml:space="preserve" text-anchor="start" x="210.75" y="-406.75" font-family="Times,serif" font-size="14.00">payload_type</text>
-<polygon fill="none" stroke="black" points="24,-377.5 24,-400 48.75,-400 48.75,-377.5 24,-377.5"/>
-<text xml:space="preserve" text-anchor="start" x="33" y="-384.25" font-family="Times,serif" font-size="14.00">1</text>
-<polygon fill="none" stroke="black" points="48.75,-377.5 48.75,-400 75.75,-400 75.75,-377.5 48.75,-377.5"/>
-<text xml:space="preserve" text-anchor="start" x="58.88" y="-384.25" font-family="Times,serif" font-size="14.00">2</text>
-<polygon fill="none" stroke="black" points="75.75,-377.5 75.75,-400 202.5,-400 202.5,-377.5 75.75,-377.5"/>
-<text xml:space="preserve" text-anchor="start" x="126" y="-384.25" font-family="Times,serif" font-size="14.00">u2be</text>
-<polygon fill="none" stroke="black" points="202.5,-377.5 202.5,-400 291.75,-400 291.75,-377.5 202.5,-377.5"/>
-<text xml:space="preserve" text-anchor="start" x="205.5" y="-384.25" font-family="Times,serif" font-size="14.00">payload_length</text>
-<polygon fill="none" stroke="black" points="24,-355 24,-377.5 48.75,-377.5 48.75,-355 24,-355"/>
-<text xml:space="preserve" text-anchor="start" x="33" y="-361.75" font-family="Times,serif" font-size="14.00">3</text>
-<polygon fill="none" stroke="black" points="48.75,-355 48.75,-377.5 75.75,-377.5 75.75,-355 48.75,-355"/>
-<text xml:space="preserve" text-anchor="start" x="56.62" y="-361.75" font-family="Times,serif" font-size="14.00">...</text>
-<polygon fill="none" stroke="black" points="75.75,-355 75.75,-377.5 202.5,-377.5 202.5,-355 75.75,-355"/>
-<text xml:space="preserve" text-anchor="start" x="78.75" y="-361.75" font-family="Times,serif" font-size="14.00">switch (payload_type)</text>
-<polygon fill="none" stroke="black" points="202.5,-355 202.5,-377.5 291.75,-377.5 291.75,-355 202.5,-355"/>
-<text xml:space="preserve" text-anchor="start" x="225.75" y="-361.75" font-family="Times,serif" font-size="14.00">payload</text>
+<polygon fill="#e0ffe0" stroke="none" points="24,-469.5 24,-492 48.75,-492 48.75,-469.5 24,-469.5"/>
+<polygon fill="none" stroke="black" points="24,-469.5 24,-492 48.75,-492 48.75,-469.5 24,-469.5"/>
+<text xml:space="preserve" text-anchor="start" x="27" y="-476.25" font-family="Times,serif" font-size="14.00">pos</text>
+<polygon fill="#e0ffe0" stroke="none" points="48.75,-469.5 48.75,-492 75.75,-492 75.75,-469.5 48.75,-469.5"/>
+<polygon fill="none" stroke="black" points="48.75,-469.5 48.75,-492 75.75,-492 75.75,-469.5 48.75,-469.5"/>
+<text xml:space="preserve" text-anchor="start" x="51.75" y="-476.25" font-family="Times,serif" font-size="14.00">size</text>
+<polygon fill="#e0ffe0" stroke="none" points="75.75,-469.5 75.75,-492 202.5,-492 202.5,-469.5 75.75,-469.5"/>
+<polygon fill="none" stroke="black" points="75.75,-469.5 75.75,-492 202.5,-492 202.5,-469.5 75.75,-469.5"/>
+<text xml:space="preserve" text-anchor="start" x="127.5" y="-476.25" font-family="Times,serif" font-size="14.00">type</text>
+<polygon fill="#e0ffe0" stroke="none" points="202.5,-469.5 202.5,-492 281.25,-492 281.25,-469.5 202.5,-469.5"/>
+<polygon fill="none" stroke="black" points="202.5,-469.5 202.5,-492 281.25,-492 281.25,-469.5 202.5,-469.5"/>
+<text xml:space="preserve" text-anchor="start" x="236.62" y="-476.25" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="24,-447 24,-469.5 48.75,-469.5 48.75,-447 24,-447"/>
+<text xml:space="preserve" text-anchor="start" x="33" y="-453.75" font-family="Times,serif" font-size="14.00">0</text>
+<polygon fill="none" stroke="black" points="48.75,-447 48.75,-469.5 75.75,-469.5 75.75,-447 48.75,-447"/>
+<text xml:space="preserve" text-anchor="start" x="58.88" y="-453.75" font-family="Times,serif" font-size="14.00">1</text>
+<polygon fill="none" stroke="black" points="75.75,-447 75.75,-469.5 202.5,-469.5 202.5,-447 75.75,-447"/>
+<text xml:space="preserve" text-anchor="start" x="111.38" y="-453.75" font-family="Times,serif" font-size="14.00">u1→Type</text>
+<polygon fill="none" stroke="black" points="202.5,-447 202.5,-469.5 281.25,-469.5 281.25,-447 202.5,-447"/>
+<text xml:space="preserve" text-anchor="start" x="205.5" y="-453.75" font-family="Times,serif" font-size="14.00">type_payload</text>
+<polygon fill="none" stroke="black" points="24,-424.5 24,-447 48.75,-447 48.75,-424.5 24,-424.5"/>
+<text xml:space="preserve" text-anchor="start" x="33" y="-431.25" font-family="Times,serif" font-size="14.00">1</text>
+<polygon fill="none" stroke="black" points="48.75,-424.5 48.75,-447 75.75,-447 75.75,-424.5 48.75,-424.5"/>
+<text xml:space="preserve" text-anchor="start" x="58.88" y="-431.25" font-family="Times,serif" font-size="14.00">2</text>
+<polygon fill="none" stroke="black" points="75.75,-424.5 75.75,-447 202.5,-447 202.5,-424.5 75.75,-424.5"/>
+<text xml:space="preserve" text-anchor="start" x="126" y="-431.25" font-family="Times,serif" font-size="14.00">u2be</text>
+<polygon fill="none" stroke="black" points="202.5,-424.5 202.5,-447 281.25,-447 281.25,-424.5 202.5,-424.5"/>
+<text xml:space="preserve" text-anchor="start" x="208.88" y="-431.25" font-family="Times,serif" font-size="14.00">len_payload</text>
+<polygon fill="none" stroke="black" points="24,-402 24,-424.5 48.75,-424.5 48.75,-402 24,-402"/>
+<text xml:space="preserve" text-anchor="start" x="33" y="-408.75" font-family="Times,serif" font-size="14.00">3</text>
+<polygon fill="none" stroke="black" points="48.75,-402 48.75,-424.5 75.75,-424.5 75.75,-402 48.75,-402"/>
+<text xml:space="preserve" text-anchor="start" x="56.62" y="-408.75" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="75.75,-402 75.75,-424.5 202.5,-424.5 202.5,-402 75.75,-402"/>
+<text xml:space="preserve" text-anchor="start" x="78.75" y="-408.75" font-family="Times,serif" font-size="14.00">switch (type_payload)</text>
+<polygon fill="none" stroke="black" points="202.5,-402 202.5,-424.5 281.25,-424.5 281.25,-402 202.5,-402"/>
+<text xml:space="preserve" text-anchor="start" x="220.5" y="-408.75" font-family="Times,serif" font-size="14.00">payload</text>
</g>
<!-- solec__seq&#45;&gt;solec__seq -->
-<g id="edge6" class="edge">
-<title>solec__seq:payload_type_type&#45;&gt;solec__seq:payload_type</title>
-<path fill="none" stroke="#404040" d="M220.7,-422.36C181.94,-443.21 190.75,-467 247.12,-467 301.01,-467 311.43,-416 278.41,-384.55"/>
-<polygon fill="#404040" stroke="#404040" points="280.77,-381.95 270.81,-378.35 276.35,-387.38 280.77,-381.95"/>
+<g id="edge7" class="edge">
+<title>solec__seq:type_payload_type&#45;&gt;solec__seq:payload_type</title>
+<path fill="none" stroke="#404040" d="M215.97,-469.36C177.97,-490.21 186.61,-514 241.88,-514 294.7,-514 304.92,-463 272.55,-431.55"/>
+<polygon fill="#404040" stroke="#404040" points="275.03,-429.06 265.1,-425.36 270.56,-434.44 275.03,-429.06"/>
</g>
<!-- solec__seq_payload_switch -->
<g id="node2" class="node">
<title>solec__seq_payload_switch</title>
-<polygon fill="#f0f2e4" stroke="none" points="343.75,-400.75 343.75,-423.25 440.5,-423.25 440.5,-400.75 343.75,-400.75"/>
-<polygon fill="none" stroke="black" points="343.75,-400.75 343.75,-423.25 440.5,-423.25 440.5,-400.75 343.75,-400.75"/>
-<text xml:space="preserve" text-anchor="start" x="380.5" y="-407.5" font-family="Times,serif" font-size="14.00">case</text>
-<polygon fill="#f0f2e4" stroke="none" points="440.5,-400.75 440.5,-423.25 506.5,-423.25 506.5,-400.75 440.5,-400.75"/>
-<polygon fill="none" stroke="black" points="440.5,-400.75 440.5,-423.25 506.5,-423.25 506.5,-400.75 440.5,-400.75"/>
-<text xml:space="preserve" text-anchor="start" x="461.88" y="-407.5" font-family="Times,serif" font-size="14.00">type</text>
-<polygon fill="none" stroke="black" points="343.75,-378.25 343.75,-400.75 440.5,-400.75 440.5,-378.25 343.75,-378.25"/>
-<text xml:space="preserve" text-anchor="start" x="346.75" y="-385" font-family="Times,serif" font-size="14.00">:type_handshake</text>
-<polygon fill="none" stroke="black" points="440.5,-378.25 440.5,-400.75 506.5,-400.75 506.5,-378.25 440.5,-378.25"/>
-<text xml:space="preserve" text-anchor="start" x="443.5" y="-385" font-family="Times,serif" font-size="14.00">Handshake</text>
-<polygon fill="none" stroke="black" points="343.75,-355.75 343.75,-378.25 440.5,-378.25 440.5,-355.75 343.75,-355.75"/>
-<text xml:space="preserve" text-anchor="start" x="363.25" y="-362.5" font-family="Times,serif" font-size="14.00">:type_ping</text>
-<polygon fill="none" stroke="black" points="440.5,-355.75 440.5,-378.25 506.5,-378.25 506.5,-355.75 440.5,-355.75"/>
-<text xml:space="preserve" text-anchor="start" x="461.12" y="-362.5" font-family="Times,serif" font-size="14.00">Ping</text>
-<polygon fill="none" stroke="black" points="343.75,-333.25 343.75,-355.75 440.5,-355.75 440.5,-333.25 343.75,-333.25"/>
-<text xml:space="preserve" text-anchor="start" x="361.75" y="-340" font-family="Times,serif" font-size="14.00">:type_pong</text>
-<polygon fill="none" stroke="black" points="440.5,-333.25 440.5,-355.75 506.5,-355.75 506.5,-333.25 440.5,-333.25"/>
-<text xml:space="preserve" text-anchor="start" x="459.62" y="-340" font-family="Times,serif" font-size="14.00">Pong</text>
-<polygon fill="none" stroke="black" points="343.75,-310.75 343.75,-333.25 440.5,-333.25 440.5,-310.75 343.75,-310.75"/>
-<text xml:space="preserve" text-anchor="start" x="365.88" y="-317.5" font-family="Times,serif" font-size="14.00">:type_test</text>
-<polygon fill="none" stroke="black" points="440.5,-310.75 440.5,-333.25 506.5,-333.25 506.5,-310.75 440.5,-310.75"/>
-<text xml:space="preserve" text-anchor="start" x="461.88" y="-317.5" font-family="Times,serif" font-size="14.00">Test</text>
+<polygon fill="#f0f2e4" stroke="none" points="333.25,-459 333.25,-481.5 430,-481.5 430,-459 333.25,-459"/>
+<polygon fill="none" stroke="black" points="333.25,-459 333.25,-481.5 430,-481.5 430,-459 333.25,-459"/>
+<text xml:space="preserve" text-anchor="start" x="370" y="-465.75" font-family="Times,serif" font-size="14.00">case</text>
+<polygon fill="#f0f2e4" stroke="none" points="430,-459 430,-481.5 496,-481.5 496,-459 430,-459"/>
+<polygon fill="none" stroke="black" points="430,-459 430,-481.5 496,-481.5 496,-459 430,-459"/>
+<text xml:space="preserve" text-anchor="start" x="451.38" y="-465.75" font-family="Times,serif" font-size="14.00">type</text>
+<polygon fill="none" stroke="black" points="333.25,-436.5 333.25,-459 430,-459 430,-436.5 333.25,-436.5"/>
+<text xml:space="preserve" text-anchor="start" x="336.25" y="-443.25" font-family="Times,serif" font-size="14.00">:type_handshake</text>
+<polygon fill="none" stroke="black" points="430,-436.5 430,-459 496,-459 496,-436.5 430,-436.5"/>
+<text xml:space="preserve" text-anchor="start" x="433" y="-443.25" font-family="Times,serif" font-size="14.00">Handshake</text>
+<polygon fill="none" stroke="black" points="333.25,-414 333.25,-436.5 430,-436.5 430,-414 333.25,-414"/>
+<text xml:space="preserve" text-anchor="start" x="341.5" y="-420.75" font-family="Times,serif" font-size="14.00">:type_message</text>
+<polygon fill="none" stroke="black" points="430,-414 430,-436.5 496,-436.5 496,-414 430,-414"/>
+<text xml:space="preserve" text-anchor="start" x="439" y="-420.75" font-family="Times,serif" font-size="14.00">Message</text>
+<polygon fill="none" stroke="black" points="333.25,-391.5 333.25,-414 430,-414 430,-391.5 333.25,-391.5"/>
+<text xml:space="preserve" text-anchor="start" x="352.75" y="-398.25" font-family="Times,serif" font-size="14.00">:type_ping</text>
+<polygon fill="none" stroke="black" points="430,-391.5 430,-414 496,-414 496,-391.5 430,-391.5"/>
+<text xml:space="preserve" text-anchor="start" x="450.62" y="-398.25" font-family="Times,serif" font-size="14.00">Ping</text>
+<polygon fill="none" stroke="black" points="333.25,-369 333.25,-391.5 430,-391.5 430,-369 333.25,-369"/>
+<text xml:space="preserve" text-anchor="start" x="351.25" y="-375.75" font-family="Times,serif" font-size="14.00">:type_pong</text>
+<polygon fill="none" stroke="black" points="430,-369 430,-391.5 496,-391.5 496,-369 430,-369"/>
+<text xml:space="preserve" text-anchor="start" x="449.12" y="-375.75" font-family="Times,serif" font-size="14.00">Pong</text>
+<polygon fill="none" stroke="black" points="333.25,-346.5 333.25,-369 430,-369 430,-346.5 333.25,-346.5"/>
+<text xml:space="preserve" text-anchor="start" x="355.38" y="-353.25" font-family="Times,serif" font-size="14.00">:type_test</text>
+<polygon fill="none" stroke="black" points="430,-346.5 430,-369 496,-369 496,-346.5 430,-346.5"/>
+<text xml:space="preserve" text-anchor="start" x="451.38" y="-353.25" font-family="Times,serif" font-size="14.00">Test</text>
</g>
<!-- solec__seq&#45;&gt;solec__seq_payload_switch -->
<g id="edge1" class="edge">
<title>solec__seq:payload_type&#45;&gt;solec__seq_payload_switch</title>
-<path fill="none" stroke="black" stroke-width="2" d="M292.75,-366.25C303.08,-366.25 313.86,-366.27 324.61,-366.31"/>
-<polygon fill="black" stroke="black" stroke-width="2" points="322.75,-369.8 332.76,-366.35 322.78,-362.8 322.75,-369.8"/>
+<path fill="none" stroke="black" stroke-width="2" d="M282.25,-413.25C292.58,-413.25 303.36,-413.27 314.11,-413.31"/>
+<polygon fill="black" stroke="black" stroke-width="2" points="312.25,-416.8 322.26,-413.35 312.28,-409.8 312.25,-416.8"/>
</g>
<!-- handshake__seq -->
<g id="node4" class="node">
<title>handshake__seq</title>
-<polygon fill="#e0ffe0" stroke="none" points="558.5,-519.25 558.5,-541.75 583.25,-541.75 583.25,-519.25 558.5,-519.25"/>
-<polygon fill="none" stroke="black" points="558.5,-519.25 558.5,-541.75 583.25,-541.75 583.25,-519.25 558.5,-519.25"/>
-<text xml:space="preserve" text-anchor="start" x="561.5" y="-526" font-family="Times,serif" font-size="14.00">pos</text>
-<polygon fill="#e0ffe0" stroke="none" points="583.25,-519.25 583.25,-541.75 610.25,-541.75 610.25,-519.25 583.25,-519.25"/>
-<polygon fill="none" stroke="black" points="583.25,-519.25 583.25,-541.75 610.25,-541.75 610.25,-519.25 583.25,-519.25"/>
-<text xml:space="preserve" text-anchor="start" x="586.25" y="-526" font-family="Times,serif" font-size="14.00">size</text>
-<polygon fill="#e0ffe0" stroke="none" points="610.25,-519.25 610.25,-541.75 639.5,-541.75 639.5,-519.25 610.25,-519.25"/>
-<polygon fill="none" stroke="black" points="610.25,-519.25 610.25,-541.75 639.5,-541.75 639.5,-519.25 610.25,-519.25"/>
-<text xml:space="preserve" text-anchor="start" x="613.25" y="-526" font-family="Times,serif" font-size="14.00">type</text>
-<polygon fill="#e0ffe0" stroke="none" points="639.5,-519.25 639.5,-541.75 737.75,-541.75 737.75,-519.25 639.5,-519.25"/>
-<polygon fill="none" stroke="black" points="639.5,-519.25 639.5,-541.75 737.75,-541.75 737.75,-519.25 639.5,-519.25"/>
-<text xml:space="preserve" text-anchor="start" x="683.38" y="-526" font-family="Times,serif" font-size="14.00">id</text>
-<polygon fill="none" stroke="black" points="558.5,-496.75 558.5,-519.25 583.25,-519.25 583.25,-496.75 558.5,-496.75"/>
-<text xml:space="preserve" text-anchor="start" x="567.5" y="-503.5" font-family="Times,serif" font-size="14.00">0</text>
-<polygon fill="none" stroke="black" points="583.25,-496.75 583.25,-519.25 610.25,-519.25 610.25,-496.75 583.25,-496.75"/>
-<text xml:space="preserve" text-anchor="start" x="593.38" y="-503.5" font-family="Times,serif" font-size="14.00">1</text>
-<polygon fill="none" stroke="black" points="610.25,-496.75 610.25,-519.25 639.5,-519.25 639.5,-496.75 610.25,-496.75"/>
-<text xml:space="preserve" text-anchor="start" x="618.12" y="-503.5" font-family="Times,serif" font-size="14.00">u1</text>
-<polygon fill="none" stroke="black" points="639.5,-496.75 639.5,-519.25 737.75,-519.25 737.75,-496.75 639.5,-496.75"/>
-<text xml:space="preserve" text-anchor="start" x="642.88" y="-503.5" font-family="Times,serif" font-size="14.00">proto_ver_major</text>
-<polygon fill="none" stroke="black" points="558.5,-474.25 558.5,-496.75 583.25,-496.75 583.25,-474.25 558.5,-474.25"/>
-<text xml:space="preserve" text-anchor="start" x="567.5" y="-481" font-family="Times,serif" font-size="14.00">1</text>
-<polygon fill="none" stroke="black" points="583.25,-474.25 583.25,-496.75 610.25,-496.75 610.25,-474.25 583.25,-474.25"/>
-<text xml:space="preserve" text-anchor="start" x="593.38" y="-481" font-family="Times,serif" font-size="14.00">1</text>
-<polygon fill="none" stroke="black" points="610.25,-474.25 610.25,-496.75 639.5,-496.75 639.5,-474.25 610.25,-474.25"/>
-<text xml:space="preserve" text-anchor="start" x="618.12" y="-481" font-family="Times,serif" font-size="14.00">u1</text>
-<polygon fill="none" stroke="black" points="639.5,-474.25 639.5,-496.75 737.75,-496.75 737.75,-474.25 639.5,-474.25"/>
-<text xml:space="preserve" text-anchor="start" x="642.5" y="-481" font-family="Times,serif" font-size="14.00">proto_ver_minor</text>
+<polygon fill="#e0ffe0" stroke="none" points="548,-688.25 548,-710.75 572.75,-710.75 572.75,-688.25 548,-688.25"/>
+<polygon fill="none" stroke="black" points="548,-688.25 548,-710.75 572.75,-710.75 572.75,-688.25 548,-688.25"/>
+<text xml:space="preserve" text-anchor="start" x="551" y="-695" font-family="Times,serif" font-size="14.00">pos</text>
+<polygon fill="#e0ffe0" stroke="none" points="572.75,-688.25 572.75,-710.75 599.75,-710.75 599.75,-688.25 572.75,-688.25"/>
+<polygon fill="none" stroke="black" points="572.75,-688.25 572.75,-710.75 599.75,-710.75 599.75,-688.25 572.75,-688.25"/>
+<text xml:space="preserve" text-anchor="start" x="575.75" y="-695" font-family="Times,serif" font-size="14.00">size</text>
+<polygon fill="#e0ffe0" stroke="none" points="599.75,-688.25 599.75,-710.75 629,-710.75 629,-688.25 599.75,-688.25"/>
+<polygon fill="none" stroke="black" points="599.75,-688.25 599.75,-710.75 629,-710.75 629,-688.25 599.75,-688.25"/>
+<text xml:space="preserve" text-anchor="start" x="602.75" y="-695" font-family="Times,serif" font-size="14.00">type</text>
+<polygon fill="#e0ffe0" stroke="none" points="629,-688.25 629,-710.75 727.25,-710.75 727.25,-688.25 629,-688.25"/>
+<polygon fill="none" stroke="black" points="629,-688.25 629,-710.75 727.25,-710.75 727.25,-688.25 629,-688.25"/>
+<text xml:space="preserve" text-anchor="start" x="672.88" y="-695" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="548,-665.75 548,-688.25 572.75,-688.25 572.75,-665.75 548,-665.75"/>
+<text xml:space="preserve" text-anchor="start" x="557" y="-672.5" font-family="Times,serif" font-size="14.00">0</text>
+<polygon fill="none" stroke="black" points="572.75,-665.75 572.75,-688.25 599.75,-688.25 599.75,-665.75 572.75,-665.75"/>
+<text xml:space="preserve" text-anchor="start" x="582.88" y="-672.5" font-family="Times,serif" font-size="14.00">1</text>
+<polygon fill="none" stroke="black" points="599.75,-665.75 599.75,-688.25 629,-688.25 629,-665.75 599.75,-665.75"/>
+<text xml:space="preserve" text-anchor="start" x="607.62" y="-672.5" font-family="Times,serif" font-size="14.00">u1</text>
+<polygon fill="none" stroke="black" points="629,-665.75 629,-688.25 727.25,-688.25 727.25,-665.75 629,-665.75"/>
+<text xml:space="preserve" text-anchor="start" x="632.38" y="-672.5" font-family="Times,serif" font-size="14.00">proto_ver_major</text>
+<polygon fill="none" stroke="black" points="548,-643.25 548,-665.75 572.75,-665.75 572.75,-643.25 548,-643.25"/>
+<text xml:space="preserve" text-anchor="start" x="557" y="-650" font-family="Times,serif" font-size="14.00">1</text>
+<polygon fill="none" stroke="black" points="572.75,-643.25 572.75,-665.75 599.75,-665.75 599.75,-643.25 572.75,-643.25"/>
+<text xml:space="preserve" text-anchor="start" x="582.88" y="-650" font-family="Times,serif" font-size="14.00">1</text>
+<polygon fill="none" stroke="black" points="599.75,-643.25 599.75,-665.75 629,-665.75 629,-643.25 599.75,-643.25"/>
+<text xml:space="preserve" text-anchor="start" x="607.62" y="-650" font-family="Times,serif" font-size="14.00">u1</text>
+<polygon fill="none" stroke="black" points="629,-643.25 629,-665.75 727.25,-665.75 727.25,-643.25 629,-643.25"/>
+<text xml:space="preserve" text-anchor="start" x="632" y="-650" font-family="Times,serif" font-size="14.00">proto_ver_minor</text>
</g>
<!-- solec__seq_payload_switch&#45;&gt;handshake__seq -->
<g id="edge2" class="edge">
<title>solec__seq_payload_switch:case0&#45;&gt;handshake__seq</title>
-<path fill="none" stroke="black" stroke-width="2" d="M507.5,-389.5C541.69,-389.5 518.01,-434.15 542.5,-458 544.35,-459.8 546.27,-461.54 548.26,-463.23"/>
-<polygon fill="black" stroke="black" stroke-width="2" points="544.91,-465.06 554.95,-468.43 549.21,-459.53 544.91,-465.06"/>
+<path fill="none" stroke="black" stroke-width="2" d="M497,-447.75C578.17,-447.75 482.3,-562.82 532,-627 533.19,-628.53 534.43,-630.02 535.73,-631.46"/>
+<polygon fill="black" stroke="black" stroke-width="2" points="531.94,-632.65 541.53,-637.15 536.84,-627.65 531.94,-632.65"/>
</g>
-<!-- ping__seq -->
+<!-- message__seq -->
<g id="node5" class="node">
+<title>message__seq</title>
+<polygon fill="#e0ffe0" stroke="none" points="560.38,-563.75 560.38,-586.25 585.12,-586.25 585.12,-563.75 560.38,-563.75"/>
+<polygon fill="none" stroke="black" points="560.38,-563.75 560.38,-586.25 585.12,-586.25 585.12,-563.75 560.38,-563.75"/>
+<text xml:space="preserve" text-anchor="start" x="563.38" y="-570.5" font-family="Times,serif" font-size="14.00">pos</text>
+<polygon fill="#e0ffe0" stroke="none" points="585.12,-563.75 585.12,-586.25 612.12,-586.25 612.12,-563.75 585.12,-563.75"/>
+<polygon fill="none" stroke="black" points="585.12,-563.75 585.12,-586.25 612.12,-586.25 612.12,-563.75 585.12,-563.75"/>
+<text xml:space="preserve" text-anchor="start" x="588.12" y="-570.5" font-family="Times,serif" font-size="14.00">size</text>
+<polygon fill="#e0ffe0" stroke="none" points="612.12,-563.75 612.12,-586.25 651.12,-586.25 651.12,-563.75 612.12,-563.75"/>
+<polygon fill="none" stroke="black" points="612.12,-563.75 612.12,-586.25 651.12,-586.25 651.12,-563.75 612.12,-563.75"/>
+<text xml:space="preserve" text-anchor="start" x="620" y="-570.5" font-family="Times,serif" font-size="14.00">type</text>
+<polygon fill="#e0ffe0" stroke="none" points="651.12,-563.75 651.12,-586.25 714.88,-586.25 714.88,-563.75 651.12,-563.75"/>
+<polygon fill="none" stroke="black" points="651.12,-563.75 651.12,-586.25 714.88,-586.25 714.88,-563.75 651.12,-563.75"/>
+<text xml:space="preserve" text-anchor="start" x="677.75" y="-570.5" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="560.38,-541.25 560.38,-563.75 585.12,-563.75 585.12,-541.25 560.38,-541.25"/>
+<text xml:space="preserve" text-anchor="start" x="569.38" y="-548" font-family="Times,serif" font-size="14.00">0</text>
+<polygon fill="none" stroke="black" points="585.12,-541.25 585.12,-563.75 612.12,-563.75 612.12,-541.25 585.12,-541.25"/>
+<text xml:space="preserve" text-anchor="start" x="593" y="-548" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="612.12,-541.25 612.12,-563.75 651.12,-563.75 651.12,-541.25 612.12,-541.25"/>
+<text xml:space="preserve" text-anchor="start" x="615.12" y="-548" font-family="Times,serif" font-size="14.00">String</text>
+<polygon fill="none" stroke="black" points="651.12,-541.25 651.12,-563.75 714.88,-563.75 714.88,-541.25 651.12,-541.25"/>
+<text xml:space="preserve" text-anchor="start" x="665.38" y="-548" font-family="Times,serif" font-size="14.00">source</text>
+<polygon fill="none" stroke="black" points="560.38,-518.75 560.38,-541.25 585.12,-541.25 585.12,-518.75 560.38,-518.75"/>
+<text xml:space="preserve" text-anchor="start" x="567.12" y="-525.5" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="585.12,-518.75 585.12,-541.25 612.12,-541.25 612.12,-518.75 585.12,-518.75"/>
+<text xml:space="preserve" text-anchor="start" x="593" y="-525.5" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="612.12,-518.75 612.12,-541.25 651.12,-541.25 651.12,-518.75 612.12,-518.75"/>
+<text xml:space="preserve" text-anchor="start" x="615.12" y="-525.5" font-family="Times,serif" font-size="14.00">String</text>
+<polygon fill="none" stroke="black" points="651.12,-518.75 651.12,-541.25 714.88,-541.25 714.88,-518.75 651.12,-518.75"/>
+<text xml:space="preserve" text-anchor="start" x="667.62" y="-525.5" font-family="Times,serif" font-size="14.00">target</text>
+<polygon fill="none" stroke="black" points="560.38,-496.25 560.38,-518.75 585.12,-518.75 585.12,-496.25 560.38,-496.25"/>
+<text xml:space="preserve" text-anchor="start" x="567.12" y="-503" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="585.12,-496.25 585.12,-518.75 612.12,-518.75 612.12,-496.25 585.12,-496.25"/>
+<text xml:space="preserve" text-anchor="start" x="595.25" y="-503" font-family="Times,serif" font-size="14.00">8</text>
+<polygon fill="none" stroke="black" points="612.12,-496.25 612.12,-518.75 651.12,-518.75 651.12,-496.25 612.12,-496.25"/>
+<text xml:space="preserve" text-anchor="start" x="618.5" y="-503" font-family="Times,serif" font-size="14.00">u8be</text>
+<polygon fill="none" stroke="black" points="651.12,-496.25 651.12,-518.75 714.88,-518.75 714.88,-496.25 651.12,-496.25"/>
+<text xml:space="preserve" text-anchor="start" x="654.12" y="-503" font-family="Times,serif" font-size="14.00">timestamp</text>
+<polygon fill="none" stroke="black" points="560.38,-473.75 560.38,-496.25 585.12,-496.25 585.12,-473.75 560.38,-473.75"/>
+<text xml:space="preserve" text-anchor="start" x="567.12" y="-480.5" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="585.12,-473.75 585.12,-496.25 612.12,-496.25 612.12,-473.75 585.12,-473.75"/>
+<text xml:space="preserve" text-anchor="start" x="593" y="-480.5" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="612.12,-473.75 612.12,-496.25 651.12,-496.25 651.12,-473.75 612.12,-473.75"/>
+<text xml:space="preserve" text-anchor="start" x="615.12" y="-480.5" font-family="Times,serif" font-size="14.00">String</text>
+<polygon fill="none" stroke="black" points="651.12,-473.75 651.12,-496.25 714.88,-496.25 714.88,-473.75 651.12,-473.75"/>
+<text xml:space="preserve" text-anchor="start" x="663.12" y="-480.5" font-family="Times,serif" font-size="14.00">content</text>
+</g>
+<!-- solec__seq_payload_switch&#45;&gt;message__seq -->
+<g id="edge3" class="edge">
+<title>solec__seq_payload_switch:case1&#45;&gt;message__seq</title>
+<path fill="none" stroke="black" stroke-width="2" d="M497,-425.25C518.3,-425.25 515.4,-444.65 532,-458 535.67,-460.95 539.46,-463.92 543.32,-466.87"/>
+<polygon fill="black" stroke="black" stroke-width="2" points="539.92,-468.69 550.01,-471.9 544.12,-463.09 539.92,-468.69"/>
+</g>
+<!-- ping__seq -->
+<g id="node6" class="node">
<title>ping__seq</title>
-<polygon fill="#e0ffe0" stroke="none" points="599.38,-391.75 599.38,-414.25 624.12,-414.25 624.12,-391.75 599.38,-391.75"/>
-<polygon fill="none" stroke="black" points="599.38,-391.75 599.38,-414.25 624.12,-414.25 624.12,-391.75 599.38,-391.75"/>
-<text xml:space="preserve" text-anchor="start" x="602.38" y="-398.5" font-family="Times,serif" font-size="14.00">pos</text>
-<polygon fill="#e0ffe0" stroke="none" points="624.12,-391.75 624.12,-414.25 651.12,-414.25 651.12,-391.75 624.12,-391.75"/>
-<polygon fill="none" stroke="black" points="624.12,-391.75 624.12,-414.25 651.12,-414.25 651.12,-391.75 624.12,-391.75"/>
-<text xml:space="preserve" text-anchor="start" x="627.12" y="-398.5" font-family="Times,serif" font-size="14.00">size</text>
-<polygon fill="#e0ffe0" stroke="none" points="651.12,-391.75 651.12,-414.25 680.38,-414.25 680.38,-391.75 651.12,-391.75"/>
-<polygon fill="none" stroke="black" points="651.12,-391.75 651.12,-414.25 680.38,-414.25 680.38,-391.75 651.12,-391.75"/>
-<text xml:space="preserve" text-anchor="start" x="654.12" y="-398.5" font-family="Times,serif" font-size="14.00">type</text>
-<polygon fill="#e0ffe0" stroke="none" points="680.38,-391.75 680.38,-414.25 696.88,-414.25 696.88,-391.75 680.38,-391.75"/>
-<polygon fill="none" stroke="black" points="680.38,-391.75 680.38,-414.25 696.88,-414.25 696.88,-391.75 680.38,-391.75"/>
-<text xml:space="preserve" text-anchor="start" x="683.38" y="-398.5" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="#e0ffe0" stroke="none" points="588.88,-391.75 588.88,-414.25 613.62,-414.25 613.62,-391.75 588.88,-391.75"/>
+<polygon fill="none" stroke="black" points="588.88,-391.75 588.88,-414.25 613.62,-414.25 613.62,-391.75 588.88,-391.75"/>
+<text xml:space="preserve" text-anchor="start" x="591.88" y="-398.5" font-family="Times,serif" font-size="14.00">pos</text>
+<polygon fill="#e0ffe0" stroke="none" points="613.62,-391.75 613.62,-414.25 640.62,-414.25 640.62,-391.75 613.62,-391.75"/>
+<polygon fill="none" stroke="black" points="613.62,-391.75 613.62,-414.25 640.62,-414.25 640.62,-391.75 613.62,-391.75"/>
+<text xml:space="preserve" text-anchor="start" x="616.62" y="-398.5" font-family="Times,serif" font-size="14.00">size</text>
+<polygon fill="#e0ffe0" stroke="none" points="640.62,-391.75 640.62,-414.25 669.88,-414.25 669.88,-391.75 640.62,-391.75"/>
+<polygon fill="none" stroke="black" points="640.62,-391.75 640.62,-414.25 669.88,-414.25 669.88,-391.75 640.62,-391.75"/>
+<text xml:space="preserve" text-anchor="start" x="643.62" y="-398.5" font-family="Times,serif" font-size="14.00">type</text>
+<polygon fill="#e0ffe0" stroke="none" points="669.88,-391.75 669.88,-414.25 686.38,-414.25 686.38,-391.75 669.88,-391.75"/>
+<polygon fill="none" stroke="black" points="669.88,-391.75 669.88,-414.25 686.38,-414.25 686.38,-391.75 669.88,-391.75"/>
+<text xml:space="preserve" text-anchor="start" x="672.88" y="-398.5" font-family="Times,serif" font-size="14.00">id</text>
</g>
<!-- solec__seq_payload_switch&#45;&gt;ping__seq -->
-<g id="edge3" class="edge">
-<title>solec__seq_payload_switch:case1&#45;&gt;ping__seq</title>
-<path fill="none" stroke="black" stroke-width="2" d="M507.5,-367C515.32,-367 548.73,-375.57 580.91,-384.34"/>
-<polygon fill="black" stroke="black" stroke-width="2" points="578.25,-387.24 588.82,-386.51 580.1,-380.49 578.25,-387.24"/>
+<g id="edge4" class="edge">
+<title>solec__seq_payload_switch:case2&#45;&gt;ping__seq</title>
+<path fill="none" stroke="black" stroke-width="2" d="M497,-402.75C520.64,-402.75 546.53,-402.79 569.53,-402.83"/>
+<polygon fill="black" stroke="black" stroke-width="2" points="567.88,-406.33 577.88,-402.85 567.89,-399.33 567.88,-406.33"/>
</g>
<!-- pong__seq -->
-<g id="node6" class="node">
+<g id="node7" class="node">
<title>pong__seq</title>
-<polygon fill="#e0ffe0" stroke="none" points="574.25,-310 574.25,-332.5 599,-332.5 599,-310 574.25,-310"/>
-<polygon fill="none" stroke="black" points="574.25,-310 574.25,-332.5 599,-332.5 599,-310 574.25,-310"/>
-<text xml:space="preserve" text-anchor="start" x="577.25" y="-316.75" font-family="Times,serif" font-size="14.00">pos</text>
-<polygon fill="#e0ffe0" stroke="none" points="599,-310 599,-332.5 626,-332.5 626,-310 599,-310"/>
-<polygon fill="none" stroke="black" points="599,-310 599,-332.5 626,-332.5 626,-310 599,-310"/>
-<text xml:space="preserve" text-anchor="start" x="602" y="-316.75" font-family="Times,serif" font-size="14.00">size</text>
-<polygon fill="#e0ffe0" stroke="none" points="626,-310 626,-332.5 658.25,-332.5 658.25,-310 626,-310"/>
-<polygon fill="none" stroke="black" points="626,-310 626,-332.5 658.25,-332.5 658.25,-310 626,-310"/>
-<text xml:space="preserve" text-anchor="start" x="630.5" y="-316.75" font-family="Times,serif" font-size="14.00">type</text>
-<polygon fill="#e0ffe0" stroke="none" points="658.25,-310 658.25,-332.5 722,-332.5 722,-310 658.25,-310"/>
-<polygon fill="none" stroke="black" points="658.25,-310 658.25,-332.5 722,-332.5 722,-310 658.25,-310"/>
-<text xml:space="preserve" text-anchor="start" x="684.88" y="-316.75" font-family="Times,serif" font-size="14.00">id</text>
-<polygon fill="none" stroke="black" points="574.25,-287.5 574.25,-310 599,-310 599,-287.5 574.25,-287.5"/>
-<text xml:space="preserve" text-anchor="start" x="583.25" y="-294.25" font-family="Times,serif" font-size="14.00">0</text>
-<polygon fill="none" stroke="black" points="599,-287.5 599,-310 626,-310 626,-287.5 599,-287.5"/>
-<text xml:space="preserve" text-anchor="start" x="609.12" y="-294.25" font-family="Times,serif" font-size="14.00">8</text>
-<polygon fill="none" stroke="black" points="626,-287.5 626,-310 658.25,-310 658.25,-287.5 626,-287.5"/>
-<text xml:space="preserve" text-anchor="start" x="629" y="-294.25" font-family="Times,serif" font-size="14.00">u8be</text>
-<polygon fill="none" stroke="black" points="658.25,-287.5 658.25,-310 722,-310 722,-287.5 658.25,-287.5"/>
-<text xml:space="preserve" text-anchor="start" x="661.25" y="-294.25" font-family="Times,serif" font-size="14.00">timestamp</text>
+<polygon fill="#e0ffe0" stroke="none" points="563.75,-310 563.75,-332.5 588.5,-332.5 588.5,-310 563.75,-310"/>
+<polygon fill="none" stroke="black" points="563.75,-310 563.75,-332.5 588.5,-332.5 588.5,-310 563.75,-310"/>
+<text xml:space="preserve" text-anchor="start" x="566.75" y="-316.75" font-family="Times,serif" font-size="14.00">pos</text>
+<polygon fill="#e0ffe0" stroke="none" points="588.5,-310 588.5,-332.5 615.5,-332.5 615.5,-310 588.5,-310"/>
+<polygon fill="none" stroke="black" points="588.5,-310 588.5,-332.5 615.5,-332.5 615.5,-310 588.5,-310"/>
+<text xml:space="preserve" text-anchor="start" x="591.5" y="-316.75" font-family="Times,serif" font-size="14.00">size</text>
+<polygon fill="#e0ffe0" stroke="none" points="615.5,-310 615.5,-332.5 647.75,-332.5 647.75,-310 615.5,-310"/>
+<polygon fill="none" stroke="black" points="615.5,-310 615.5,-332.5 647.75,-332.5 647.75,-310 615.5,-310"/>
+<text xml:space="preserve" text-anchor="start" x="620" y="-316.75" font-family="Times,serif" font-size="14.00">type</text>
+<polygon fill="#e0ffe0" stroke="none" points="647.75,-310 647.75,-332.5 711.5,-332.5 711.5,-310 647.75,-310"/>
+<polygon fill="none" stroke="black" points="647.75,-310 647.75,-332.5 711.5,-332.5 711.5,-310 647.75,-310"/>
+<text xml:space="preserve" text-anchor="start" x="674.38" y="-316.75" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="563.75,-287.5 563.75,-310 588.5,-310 588.5,-287.5 563.75,-287.5"/>
+<text xml:space="preserve" text-anchor="start" x="572.75" y="-294.25" font-family="Times,serif" font-size="14.00">0</text>
+<polygon fill="none" stroke="black" points="588.5,-287.5 588.5,-310 615.5,-310 615.5,-287.5 588.5,-287.5"/>
+<text xml:space="preserve" text-anchor="start" x="598.62" y="-294.25" font-family="Times,serif" font-size="14.00">8</text>
+<polygon fill="none" stroke="black" points="615.5,-287.5 615.5,-310 647.75,-310 647.75,-287.5 615.5,-287.5"/>
+<text xml:space="preserve" text-anchor="start" x="618.5" y="-294.25" font-family="Times,serif" font-size="14.00">u8be</text>
+<polygon fill="none" stroke="black" points="647.75,-287.5 647.75,-310 711.5,-310 711.5,-287.5 647.75,-287.5"/>
+<text xml:space="preserve" text-anchor="start" x="650.75" y="-294.25" font-family="Times,serif" font-size="14.00">timestamp</text>
</g>
<!-- solec__seq_payload_switch&#45;&gt;pong__seq -->
-<g id="edge4" class="edge">
-<title>solec__seq_payload_switch:case2&#45;&gt;pong__seq</title>
-<path fill="none" stroke="black" stroke-width="2" d="M507.5,-344.5C523.73,-344.5 540.72,-342.28 557.04,-338.96"/>
-<polygon fill="black" stroke="black" stroke-width="2" points="556.24,-342.72 565.25,-337.15 554.73,-335.88 556.24,-342.72"/>
+<g id="edge5" class="edge">
+<title>solec__seq_payload_switch:case3&#45;&gt;pong__seq</title>
+<path fill="none" stroke="black" stroke-width="2" d="M497,-380.25C515.38,-380.25 553.42,-360.57 585.15,-342.05"/>
+<polygon fill="black" stroke="black" stroke-width="2" points="585.34,-346 592.16,-337.9 581.77,-339.98 585.34,-346"/>
</g>
<!-- test__seq -->
-<g id="node8" class="node">
+<g id="node9" class="node">
<title>test__seq</title>
-<polygon fill="#e0ffe0" stroke="none" points="582.12,-207.75 582.12,-230.25 606.88,-230.25 606.88,-207.75 582.12,-207.75"/>
-<polygon fill="none" stroke="black" points="582.12,-207.75 582.12,-230.25 606.88,-230.25 606.88,-207.75 582.12,-207.75"/>
-<text xml:space="preserve" text-anchor="start" x="585.12" y="-214.5" font-family="Times,serif" font-size="14.00">pos</text>
-<polygon fill="#e0ffe0" stroke="none" points="606.88,-207.75 606.88,-230.25 633.88,-230.25 633.88,-207.75 606.88,-207.75"/>
-<polygon fill="none" stroke="black" points="606.88,-207.75 606.88,-230.25 633.88,-230.25 633.88,-207.75 606.88,-207.75"/>
-<text xml:space="preserve" text-anchor="start" x="609.88" y="-214.5" font-family="Times,serif" font-size="14.00">size</text>
-<polygon fill="#e0ffe0" stroke="none" points="633.88,-207.75 633.88,-230.25 676.62,-230.25 676.62,-207.75 633.88,-207.75"/>
-<polygon fill="none" stroke="black" points="633.88,-207.75 633.88,-230.25 676.62,-230.25 676.62,-207.75 633.88,-207.75"/>
-<text xml:space="preserve" text-anchor="start" x="643.62" y="-214.5" font-family="Times,serif" font-size="14.00">type</text>
-<polygon fill="#e0ffe0" stroke="none" points="676.62,-207.75 676.62,-230.25 714.12,-230.25 714.12,-207.75 676.62,-207.75"/>
-<polygon fill="none" stroke="black" points="676.62,-207.75 676.62,-230.25 714.12,-230.25 714.12,-207.75 676.62,-207.75"/>
-<text xml:space="preserve" text-anchor="start" x="690.12" y="-214.5" font-family="Times,serif" font-size="14.00">id</text>
-<polygon fill="none" stroke="black" points="582.12,-185.25 582.12,-207.75 606.88,-207.75 606.88,-185.25 582.12,-185.25"/>
-<text xml:space="preserve" text-anchor="start" x="591.12" y="-192" font-family="Times,serif" font-size="14.00">0</text>
-<polygon fill="none" stroke="black" points="606.88,-185.25 606.88,-207.75 633.88,-207.75 633.88,-185.25 606.88,-185.25"/>
-<text xml:space="preserve" text-anchor="start" x="617" y="-192" font-family="Times,serif" font-size="14.00">1</text>
-<polygon fill="none" stroke="black" points="633.88,-185.25 633.88,-207.75 676.62,-207.75 676.62,-185.25 633.88,-185.25"/>
-<text xml:space="preserve" text-anchor="start" x="648.5" y="-192" font-family="Times,serif" font-size="14.00">u1</text>
-<polygon fill="none" stroke="black" points="676.62,-185.25 676.62,-207.75 714.12,-207.75 714.12,-185.25 676.62,-185.25"/>
-<text xml:space="preserve" text-anchor="start" x="679.62" y="-192" font-family="Times,serif" font-size="14.00">num1</text>
-<polygon fill="none" stroke="black" points="582.12,-162.75 582.12,-185.25 606.88,-185.25 606.88,-162.75 582.12,-162.75"/>
-<text xml:space="preserve" text-anchor="start" x="591.12" y="-169.5" font-family="Times,serif" font-size="14.00">1</text>
-<polygon fill="none" stroke="black" points="606.88,-162.75 606.88,-185.25 633.88,-185.25 633.88,-162.75 606.88,-162.75"/>
-<text xml:space="preserve" text-anchor="start" x="617" y="-169.5" font-family="Times,serif" font-size="14.00">8</text>
-<polygon fill="none" stroke="black" points="633.88,-162.75 633.88,-185.25 676.62,-185.25 676.62,-162.75 633.88,-162.75"/>
-<text xml:space="preserve" text-anchor="start" x="642.12" y="-169.5" font-family="Times,serif" font-size="14.00">u8be</text>
-<polygon fill="none" stroke="black" points="676.62,-162.75 676.62,-185.25 714.12,-185.25 714.12,-162.75 676.62,-162.75"/>
-<text xml:space="preserve" text-anchor="start" x="679.62" y="-169.5" font-family="Times,serif" font-size="14.00">time1</text>
-<polygon fill="none" stroke="black" points="582.12,-140.25 582.12,-162.75 606.88,-162.75 606.88,-140.25 582.12,-140.25"/>
-<text xml:space="preserve" text-anchor="start" x="591.12" y="-147" font-family="Times,serif" font-size="14.00">9</text>
-<polygon fill="none" stroke="black" points="606.88,-140.25 606.88,-162.75 633.88,-162.75 633.88,-140.25 606.88,-140.25"/>
-<text xml:space="preserve" text-anchor="start" x="614.75" y="-147" font-family="Times,serif" font-size="14.00">...</text>
-<polygon fill="none" stroke="black" points="633.88,-140.25 633.88,-162.75 676.62,-162.75 676.62,-140.25 633.88,-140.25"/>
-<text xml:space="preserve" text-anchor="start" x="638.75" y="-147" font-family="Times,serif" font-size="14.00">String</text>
-<polygon fill="none" stroke="black" points="676.62,-140.25 676.62,-162.75 714.12,-162.75 714.12,-140.25 676.62,-140.25"/>
-<text xml:space="preserve" text-anchor="start" x="685.25" y="-147" font-family="Times,serif" font-size="14.00">str1</text>
-<polygon fill="none" stroke="black" points="582.12,-117.75 582.12,-140.25 606.88,-140.25 606.88,-117.75 582.12,-117.75"/>
-<text xml:space="preserve" text-anchor="start" x="588.88" y="-124.5" font-family="Times,serif" font-size="14.00">...</text>
-<polygon fill="none" stroke="black" points="606.88,-117.75 606.88,-140.25 633.88,-140.25 633.88,-117.75 606.88,-117.75"/>
-<text xml:space="preserve" text-anchor="start" x="617" y="-124.5" font-family="Times,serif" font-size="14.00">2</text>
-<polygon fill="none" stroke="black" points="633.88,-117.75 633.88,-140.25 676.62,-140.25 676.62,-117.75 633.88,-117.75"/>
-<text xml:space="preserve" text-anchor="start" x="642.12" y="-124.5" font-family="Times,serif" font-size="14.00">u2be</text>
-<polygon fill="none" stroke="black" points="676.62,-117.75 676.62,-140.25 714.12,-140.25 714.12,-117.75 676.62,-117.75"/>
-<text xml:space="preserve" text-anchor="start" x="679.62" y="-124.5" font-family="Times,serif" font-size="14.00">num2</text>
-<polygon fill="none" stroke="black" points="582.12,-95.25 582.12,-117.75 606.88,-117.75 606.88,-95.25 582.12,-95.25"/>
-<text xml:space="preserve" text-anchor="start" x="588.88" y="-102" font-family="Times,serif" font-size="14.00">...</text>
-<polygon fill="none" stroke="black" points="606.88,-95.25 606.88,-117.75 633.88,-117.75 633.88,-95.25 606.88,-95.25"/>
-<text xml:space="preserve" text-anchor="start" x="614.75" y="-102" font-family="Times,serif" font-size="14.00">...</text>
-<polygon fill="none" stroke="black" points="633.88,-95.25 633.88,-117.75 676.62,-117.75 676.62,-95.25 633.88,-95.25"/>
-<text xml:space="preserve" text-anchor="start" x="636.88" y="-102" font-family="Times,serif" font-size="14.00">Binary</text>
-<polygon fill="none" stroke="black" points="676.62,-95.25 676.62,-117.75 714.12,-117.75 714.12,-95.25 676.62,-95.25"/>
-<text xml:space="preserve" text-anchor="start" x="683.38" y="-102" font-family="Times,serif" font-size="14.00">bin1</text>
-<polygon fill="none" stroke="black" points="582.12,-72.75 582.12,-95.25 606.88,-95.25 606.88,-72.75 582.12,-72.75"/>
-<text xml:space="preserve" text-anchor="start" x="588.88" y="-79.5" font-family="Times,serif" font-size="14.00">...</text>
-<polygon fill="none" stroke="black" points="606.88,-72.75 606.88,-95.25 633.88,-95.25 633.88,-72.75 606.88,-72.75"/>
-<text xml:space="preserve" text-anchor="start" x="617" y="-79.5" font-family="Times,serif" font-size="14.00">4</text>
-<polygon fill="none" stroke="black" points="633.88,-72.75 633.88,-95.25 676.62,-95.25 676.62,-72.75 633.88,-72.75"/>
-<text xml:space="preserve" text-anchor="start" x="642.12" y="-79.5" font-family="Times,serif" font-size="14.00">u4be</text>
-<polygon fill="none" stroke="black" points="676.62,-72.75 676.62,-95.25 714.12,-95.25 714.12,-72.75 676.62,-72.75"/>
-<text xml:space="preserve" text-anchor="start" x="679.62" y="-79.5" font-family="Times,serif" font-size="14.00">num3</text>
-<polygon fill="none" stroke="black" points="582.12,-50.25 582.12,-72.75 606.88,-72.75 606.88,-50.25 582.12,-50.25"/>
-<text xml:space="preserve" text-anchor="start" x="588.88" y="-57" font-family="Times,serif" font-size="14.00">...</text>
-<polygon fill="none" stroke="black" points="606.88,-50.25 606.88,-72.75 633.88,-72.75 633.88,-50.25 606.88,-50.25"/>
-<text xml:space="preserve" text-anchor="start" x="614.75" y="-57" font-family="Times,serif" font-size="14.00">...</text>
-<polygon fill="none" stroke="black" points="633.88,-50.25 633.88,-72.75 676.62,-72.75 676.62,-50.25 633.88,-50.25"/>
-<text xml:space="preserve" text-anchor="start" x="638.75" y="-57" font-family="Times,serif" font-size="14.00">String</text>
-<polygon fill="none" stroke="black" points="676.62,-50.25 676.62,-72.75 714.12,-72.75 714.12,-50.25 676.62,-50.25"/>
-<text xml:space="preserve" text-anchor="start" x="685.25" y="-57" font-family="Times,serif" font-size="14.00">str2</text>
-<polygon fill="none" stroke="black" points="582.12,-27.75 582.12,-50.25 606.88,-50.25 606.88,-27.75 582.12,-27.75"/>
-<text xml:space="preserve" text-anchor="start" x="588.88" y="-34.5" font-family="Times,serif" font-size="14.00">...</text>
-<polygon fill="none" stroke="black" points="606.88,-27.75 606.88,-50.25 633.88,-50.25 633.88,-27.75 606.88,-27.75"/>
-<text xml:space="preserve" text-anchor="start" x="617" y="-34.5" font-family="Times,serif" font-size="14.00">8</text>
-<polygon fill="none" stroke="black" points="633.88,-27.75 633.88,-50.25 676.62,-50.25 676.62,-27.75 633.88,-27.75"/>
-<text xml:space="preserve" text-anchor="start" x="642.12" y="-34.5" font-family="Times,serif" font-size="14.00">u8be</text>
-<polygon fill="none" stroke="black" points="676.62,-27.75 676.62,-50.25 714.12,-50.25 714.12,-27.75 676.62,-27.75"/>
-<text xml:space="preserve" text-anchor="start" x="679.62" y="-34.5" font-family="Times,serif" font-size="14.00">num4</text>
+<polygon fill="#e0ffe0" stroke="none" points="571.62,-207.75 571.62,-230.25 596.38,-230.25 596.38,-207.75 571.62,-207.75"/>
+<polygon fill="none" stroke="black" points="571.62,-207.75 571.62,-230.25 596.38,-230.25 596.38,-207.75 571.62,-207.75"/>
+<text xml:space="preserve" text-anchor="start" x="574.62" y="-214.5" font-family="Times,serif" font-size="14.00">pos</text>
+<polygon fill="#e0ffe0" stroke="none" points="596.38,-207.75 596.38,-230.25 623.38,-230.25 623.38,-207.75 596.38,-207.75"/>
+<polygon fill="none" stroke="black" points="596.38,-207.75 596.38,-230.25 623.38,-230.25 623.38,-207.75 596.38,-207.75"/>
+<text xml:space="preserve" text-anchor="start" x="599.38" y="-214.5" font-family="Times,serif" font-size="14.00">size</text>
+<polygon fill="#e0ffe0" stroke="none" points="623.38,-207.75 623.38,-230.25 666.12,-230.25 666.12,-207.75 623.38,-207.75"/>
+<polygon fill="none" stroke="black" points="623.38,-207.75 623.38,-230.25 666.12,-230.25 666.12,-207.75 623.38,-207.75"/>
+<text xml:space="preserve" text-anchor="start" x="633.12" y="-214.5" font-family="Times,serif" font-size="14.00">type</text>
+<polygon fill="#e0ffe0" stroke="none" points="666.12,-207.75 666.12,-230.25 703.62,-230.25 703.62,-207.75 666.12,-207.75"/>
+<polygon fill="none" stroke="black" points="666.12,-207.75 666.12,-230.25 703.62,-230.25 703.62,-207.75 666.12,-207.75"/>
+<text xml:space="preserve" text-anchor="start" x="679.62" y="-214.5" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="571.62,-185.25 571.62,-207.75 596.38,-207.75 596.38,-185.25 571.62,-185.25"/>
+<text xml:space="preserve" text-anchor="start" x="580.62" y="-192" font-family="Times,serif" font-size="14.00">0</text>
+<polygon fill="none" stroke="black" points="596.38,-185.25 596.38,-207.75 623.38,-207.75 623.38,-185.25 596.38,-185.25"/>
+<text xml:space="preserve" text-anchor="start" x="606.5" y="-192" font-family="Times,serif" font-size="14.00">1</text>
+<polygon fill="none" stroke="black" points="623.38,-185.25 623.38,-207.75 666.12,-207.75 666.12,-185.25 623.38,-185.25"/>
+<text xml:space="preserve" text-anchor="start" x="638" y="-192" font-family="Times,serif" font-size="14.00">u1</text>
+<polygon fill="none" stroke="black" points="666.12,-185.25 666.12,-207.75 703.62,-207.75 703.62,-185.25 666.12,-185.25"/>
+<text xml:space="preserve" text-anchor="start" x="669.12" y="-192" font-family="Times,serif" font-size="14.00">num1</text>
+<polygon fill="none" stroke="black" points="571.62,-162.75 571.62,-185.25 596.38,-185.25 596.38,-162.75 571.62,-162.75"/>
+<text xml:space="preserve" text-anchor="start" x="580.62" y="-169.5" font-family="Times,serif" font-size="14.00">1</text>
+<polygon fill="none" stroke="black" points="596.38,-162.75 596.38,-185.25 623.38,-185.25 623.38,-162.75 596.38,-162.75"/>
+<text xml:space="preserve" text-anchor="start" x="606.5" y="-169.5" font-family="Times,serif" font-size="14.00">8</text>
+<polygon fill="none" stroke="black" points="623.38,-162.75 623.38,-185.25 666.12,-185.25 666.12,-162.75 623.38,-162.75"/>
+<text xml:space="preserve" text-anchor="start" x="631.62" y="-169.5" font-family="Times,serif" font-size="14.00">u8be</text>
+<polygon fill="none" stroke="black" points="666.12,-162.75 666.12,-185.25 703.62,-185.25 703.62,-162.75 666.12,-162.75"/>
+<text xml:space="preserve" text-anchor="start" x="669.12" y="-169.5" font-family="Times,serif" font-size="14.00">time1</text>
+<polygon fill="none" stroke="black" points="571.62,-140.25 571.62,-162.75 596.38,-162.75 596.38,-140.25 571.62,-140.25"/>
+<text xml:space="preserve" text-anchor="start" x="580.62" y="-147" font-family="Times,serif" font-size="14.00">9</text>
+<polygon fill="none" stroke="black" points="596.38,-140.25 596.38,-162.75 623.38,-162.75 623.38,-140.25 596.38,-140.25"/>
+<text xml:space="preserve" text-anchor="start" x="604.25" y="-147" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="623.38,-140.25 623.38,-162.75 666.12,-162.75 666.12,-140.25 623.38,-140.25"/>
+<text xml:space="preserve" text-anchor="start" x="628.25" y="-147" font-family="Times,serif" font-size="14.00">String</text>
+<polygon fill="none" stroke="black" points="666.12,-140.25 666.12,-162.75 703.62,-162.75 703.62,-140.25 666.12,-140.25"/>
+<text xml:space="preserve" text-anchor="start" x="674.75" y="-147" font-family="Times,serif" font-size="14.00">str1</text>
+<polygon fill="none" stroke="black" points="571.62,-117.75 571.62,-140.25 596.38,-140.25 596.38,-117.75 571.62,-117.75"/>
+<text xml:space="preserve" text-anchor="start" x="578.38" y="-124.5" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="596.38,-117.75 596.38,-140.25 623.38,-140.25 623.38,-117.75 596.38,-117.75"/>
+<text xml:space="preserve" text-anchor="start" x="606.5" y="-124.5" font-family="Times,serif" font-size="14.00">2</text>
+<polygon fill="none" stroke="black" points="623.38,-117.75 623.38,-140.25 666.12,-140.25 666.12,-117.75 623.38,-117.75"/>
+<text xml:space="preserve" text-anchor="start" x="631.62" y="-124.5" font-family="Times,serif" font-size="14.00">u2be</text>
+<polygon fill="none" stroke="black" points="666.12,-117.75 666.12,-140.25 703.62,-140.25 703.62,-117.75 666.12,-117.75"/>
+<text xml:space="preserve" text-anchor="start" x="669.12" y="-124.5" font-family="Times,serif" font-size="14.00">num2</text>
+<polygon fill="none" stroke="black" points="571.62,-95.25 571.62,-117.75 596.38,-117.75 596.38,-95.25 571.62,-95.25"/>
+<text xml:space="preserve" text-anchor="start" x="578.38" y="-102" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="596.38,-95.25 596.38,-117.75 623.38,-117.75 623.38,-95.25 596.38,-95.25"/>
+<text xml:space="preserve" text-anchor="start" x="604.25" y="-102" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="623.38,-95.25 623.38,-117.75 666.12,-117.75 666.12,-95.25 623.38,-95.25"/>
+<text xml:space="preserve" text-anchor="start" x="626.38" y="-102" font-family="Times,serif" font-size="14.00">Binary</text>
+<polygon fill="none" stroke="black" points="666.12,-95.25 666.12,-117.75 703.62,-117.75 703.62,-95.25 666.12,-95.25"/>
+<text xml:space="preserve" text-anchor="start" x="672.88" y="-102" font-family="Times,serif" font-size="14.00">bin1</text>
+<polygon fill="none" stroke="black" points="571.62,-72.75 571.62,-95.25 596.38,-95.25 596.38,-72.75 571.62,-72.75"/>
+<text xml:space="preserve" text-anchor="start" x="578.38" y="-79.5" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="596.38,-72.75 596.38,-95.25 623.38,-95.25 623.38,-72.75 596.38,-72.75"/>
+<text xml:space="preserve" text-anchor="start" x="606.5" y="-79.5" font-family="Times,serif" font-size="14.00">4</text>
+<polygon fill="none" stroke="black" points="623.38,-72.75 623.38,-95.25 666.12,-95.25 666.12,-72.75 623.38,-72.75"/>
+<text xml:space="preserve" text-anchor="start" x="631.62" y="-79.5" font-family="Times,serif" font-size="14.00">u4be</text>
+<polygon fill="none" stroke="black" points="666.12,-72.75 666.12,-95.25 703.62,-95.25 703.62,-72.75 666.12,-72.75"/>
+<text xml:space="preserve" text-anchor="start" x="669.12" y="-79.5" font-family="Times,serif" font-size="14.00">num3</text>
+<polygon fill="none" stroke="black" points="571.62,-50.25 571.62,-72.75 596.38,-72.75 596.38,-50.25 571.62,-50.25"/>
+<text xml:space="preserve" text-anchor="start" x="578.38" y="-57" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="596.38,-50.25 596.38,-72.75 623.38,-72.75 623.38,-50.25 596.38,-50.25"/>
+<text xml:space="preserve" text-anchor="start" x="604.25" y="-57" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="623.38,-50.25 623.38,-72.75 666.12,-72.75 666.12,-50.25 623.38,-50.25"/>
+<text xml:space="preserve" text-anchor="start" x="628.25" y="-57" font-family="Times,serif" font-size="14.00">String</text>
+<polygon fill="none" stroke="black" points="666.12,-50.25 666.12,-72.75 703.62,-72.75 703.62,-50.25 666.12,-50.25"/>
+<text xml:space="preserve" text-anchor="start" x="674.75" y="-57" font-family="Times,serif" font-size="14.00">str2</text>
+<polygon fill="none" stroke="black" points="571.62,-27.75 571.62,-50.25 596.38,-50.25 596.38,-27.75 571.62,-27.75"/>
+<text xml:space="preserve" text-anchor="start" x="578.38" y="-34.5" font-family="Times,serif" font-size="14.00">...</text>
+<polygon fill="none" stroke="black" points="596.38,-27.75 596.38,-50.25 623.38,-50.25 623.38,-27.75 596.38,-27.75"/>
+<text xml:space="preserve" text-anchor="start" x="606.5" y="-34.5" font-family="Times,serif" font-size="14.00">8</text>
+<polygon fill="none" stroke="black" points="623.38,-27.75 623.38,-50.25 666.12,-50.25 666.12,-27.75 623.38,-27.75"/>
+<text xml:space="preserve" text-anchor="start" x="631.62" y="-34.5" font-family="Times,serif" font-size="14.00">u8be</text>
+<polygon fill="none" stroke="black" points="666.12,-27.75 666.12,-50.25 703.62,-50.25 703.62,-27.75 666.12,-27.75"/>
+<text xml:space="preserve" text-anchor="start" x="669.12" y="-34.5" font-family="Times,serif" font-size="14.00">num4</text>
</g>
<!-- solec__seq_payload_switch&#45;&gt;test__seq -->
-<g id="edge5" class="edge">
-<title>solec__seq_payload_switch:case3&#45;&gt;test__seq</title>
-<path fill="none" stroke="black" stroke-width="2" d="M507.5,-322C534.99,-322 526.57,-293.4 542.5,-271 550.63,-259.57 559.21,-247.68 567.8,-235.86"/>
-<polygon fill="black" stroke="black" stroke-width="2" points="569.53,-239.44 572.59,-229.29 563.87,-235.31 569.53,-239.44"/>
+<g id="edge6" class="edge">
+<title>solec__seq_payload_switch:case4&#45;&gt;test__seq</title>
+<path fill="none" stroke="black" stroke-width="2" d="M497,-357.75C538.58,-357.75 511.73,-307.3 532,-271 539.58,-257.42 548.27,-243.64 557.33,-230.28"/>
+<polygon fill="black" stroke="black" stroke-width="2" points="559.15,-233.81 561.94,-223.59 553.38,-229.84 559.15,-233.81"/>
</g>
<!-- binary__seq -->
<g id="node3" class="node">
<title>binary__seq</title>
-<polygon fill="#e0ffe0" stroke="none" points="806.25,-73.25 806.25,-95.75 831,-95.75 831,-73.25 806.25,-73.25"/>
-<polygon fill="none" stroke="black" points="806.25,-73.25 806.25,-95.75 831,-95.75 831,-73.25 806.25,-73.25"/>
-<text xml:space="preserve" text-anchor="start" x="809.25" y="-80" font-family="Times,serif" font-size="14.00">pos</text>
-<polygon fill="#e0ffe0" stroke="none" points="831,-73.25 831,-95.75 903,-95.75 903,-73.25 831,-73.25"/>
-<polygon fill="none" stroke="black" points="831,-73.25 831,-95.75 903,-95.75 903,-73.25 831,-73.25"/>
-<text xml:space="preserve" text-anchor="start" x="856.5" y="-80" font-family="Times,serif" font-size="14.00">size</text>
-<polygon fill="#e0ffe0" stroke="none" points="903,-73.25 903,-95.75 935.25,-95.75 935.25,-73.25 903,-73.25"/>
-<polygon fill="none" stroke="black" points="903,-73.25 903,-95.75 935.25,-95.75 935.25,-73.25 903,-73.25"/>
-<text xml:space="preserve" text-anchor="start" x="907.5" y="-80" font-family="Times,serif" font-size="14.00">type</text>
-<polygon fill="#e0ffe0" stroke="none" points="935.25,-73.25 935.25,-95.75 1007.25,-95.75 1007.25,-73.25 935.25,-73.25"/>
-<polygon fill="none" stroke="black" points="935.25,-73.25 935.25,-95.75 1007.25,-95.75 1007.25,-73.25 935.25,-73.25"/>
-<text xml:space="preserve" text-anchor="start" x="966" y="-80" font-family="Times,serif" font-size="14.00">id</text>
-<polygon fill="none" stroke="black" points="806.25,-50.75 806.25,-73.25 831,-73.25 831,-50.75 806.25,-50.75"/>
-<text xml:space="preserve" text-anchor="start" x="815.25" y="-57.5" font-family="Times,serif" font-size="14.00">0</text>
-<polygon fill="none" stroke="black" points="831,-50.75 831,-73.25 903,-73.25 903,-50.75 831,-50.75"/>
-<text xml:space="preserve" text-anchor="start" x="863.62" y="-57.5" font-family="Times,serif" font-size="14.00">2</text>
-<polygon fill="none" stroke="black" points="903,-50.75 903,-73.25 935.25,-73.25 935.25,-50.75 903,-50.75"/>
-<text xml:space="preserve" text-anchor="start" x="906" y="-57.5" font-family="Times,serif" font-size="14.00">u2be</text>
-<polygon fill="none" stroke="black" points="935.25,-50.75 935.25,-73.25 1007.25,-73.25 1007.25,-50.75 935.25,-50.75"/>
-<text xml:space="preserve" text-anchor="start" x="938.25" y="-57.5" font-family="Times,serif" font-size="14.00">len_payload</text>
-<polygon fill="none" stroke="black" points="806.25,-28.25 806.25,-50.75 831,-50.75 831,-28.25 806.25,-28.25"/>
-<text xml:space="preserve" text-anchor="start" x="815.25" y="-35" font-family="Times,serif" font-size="14.00">2</text>
-<polygon fill="none" stroke="black" points="831,-28.25 831,-50.75 903,-50.75 903,-28.25 831,-28.25"/>
-<text xml:space="preserve" text-anchor="start" x="834" y="-35" font-family="Times,serif" font-size="14.00">len_payload</text>
-<polygon fill="none" stroke="black" points="903,-28.25 903,-50.75 935.25,-50.75 935.25,-28.25 903,-28.25"/>
-<polygon fill="none" stroke="black" points="935.25,-28.25 935.25,-50.75 1007.25,-50.75 1007.25,-28.25 935.25,-28.25"/>
-<text xml:space="preserve" text-anchor="start" x="949.88" y="-35" font-family="Times,serif" font-size="14.00">payload</text>
+<polygon fill="#e0ffe0" stroke="none" points="795.75,-118.25 795.75,-140.75 820.5,-140.75 820.5,-118.25 795.75,-118.25"/>
+<polygon fill="none" stroke="black" points="795.75,-118.25 795.75,-140.75 820.5,-140.75 820.5,-118.25 795.75,-118.25"/>
+<text xml:space="preserve" text-anchor="start" x="798.75" y="-125" font-family="Times,serif" font-size="14.00">pos</text>
+<polygon fill="#e0ffe0" stroke="none" points="820.5,-118.25 820.5,-140.75 892.5,-140.75 892.5,-118.25 820.5,-118.25"/>
+<polygon fill="none" stroke="black" points="820.5,-118.25 820.5,-140.75 892.5,-140.75 892.5,-118.25 820.5,-118.25"/>
+<text xml:space="preserve" text-anchor="start" x="846" y="-125" font-family="Times,serif" font-size="14.00">size</text>
+<polygon fill="#e0ffe0" stroke="none" points="892.5,-118.25 892.5,-140.75 924.75,-140.75 924.75,-118.25 892.5,-118.25"/>
+<polygon fill="none" stroke="black" points="892.5,-118.25 892.5,-140.75 924.75,-140.75 924.75,-118.25 892.5,-118.25"/>
+<text xml:space="preserve" text-anchor="start" x="897" y="-125" font-family="Times,serif" font-size="14.00">type</text>
+<polygon fill="#e0ffe0" stroke="none" points="924.75,-118.25 924.75,-140.75 996.75,-140.75 996.75,-118.25 924.75,-118.25"/>
+<polygon fill="none" stroke="black" points="924.75,-118.25 924.75,-140.75 996.75,-140.75 996.75,-118.25 924.75,-118.25"/>
+<text xml:space="preserve" text-anchor="start" x="955.5" y="-125" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="795.75,-95.75 795.75,-118.25 820.5,-118.25 820.5,-95.75 795.75,-95.75"/>
+<text xml:space="preserve" text-anchor="start" x="804.75" y="-102.5" font-family="Times,serif" font-size="14.00">0</text>
+<polygon fill="none" stroke="black" points="820.5,-95.75 820.5,-118.25 892.5,-118.25 892.5,-95.75 820.5,-95.75"/>
+<text xml:space="preserve" text-anchor="start" x="853.12" y="-102.5" font-family="Times,serif" font-size="14.00">2</text>
+<polygon fill="none" stroke="black" points="892.5,-95.75 892.5,-118.25 924.75,-118.25 924.75,-95.75 892.5,-95.75"/>
+<text xml:space="preserve" text-anchor="start" x="895.5" y="-102.5" font-family="Times,serif" font-size="14.00">u2be</text>
+<polygon fill="none" stroke="black" points="924.75,-95.75 924.75,-118.25 996.75,-118.25 996.75,-95.75 924.75,-95.75"/>
+<text xml:space="preserve" text-anchor="start" x="927.75" y="-102.5" font-family="Times,serif" font-size="14.00">len_payload</text>
+<polygon fill="none" stroke="black" points="795.75,-73.25 795.75,-95.75 820.5,-95.75 820.5,-73.25 795.75,-73.25"/>
+<text xml:space="preserve" text-anchor="start" x="804.75" y="-80" font-family="Times,serif" font-size="14.00">2</text>
+<polygon fill="none" stroke="black" points="820.5,-73.25 820.5,-95.75 892.5,-95.75 892.5,-73.25 820.5,-73.25"/>
+<text xml:space="preserve" text-anchor="start" x="823.5" y="-80" font-family="Times,serif" font-size="14.00">len_payload</text>
+<polygon fill="none" stroke="black" points="892.5,-73.25 892.5,-95.75 924.75,-95.75 924.75,-73.25 892.5,-73.25"/>
+<polygon fill="none" stroke="black" points="924.75,-73.25 924.75,-95.75 996.75,-95.75 996.75,-73.25 924.75,-73.25"/>
+<text xml:space="preserve" text-anchor="start" x="939.38" y="-80" font-family="Times,serif" font-size="14.00">payload</text>
</g>
<!-- binary__seq&#45;&gt;binary__seq -->
-<g id="edge7" class="edge">
+<g id="edge8" class="edge">
<title>binary__seq:len_payload_type&#45;&gt;binary__seq:payload_size</title>
-<path fill="none" stroke="#404040" d="M999.07,-73.22C1032.3,-92.5 1015.38,-117.75 919.12,-117.75 829.24,-117.75 808.54,-82.4 833.26,-57.64"/>
-<polygon fill="#404040" stroke="#404040" points="835.13,-60.63 840.7,-51.62 830.73,-55.19 835.13,-60.63"/>
+<path fill="none" stroke="#404040" d="M988.57,-118.22C1021.8,-137.5 1004.88,-162.75 908.62,-162.75 818.74,-162.75 798.04,-127.4 822.76,-102.64"/>
+<polygon fill="#404040" stroke="#404040" points="824.63,-105.63 830.2,-96.62 820.23,-100.19 824.63,-105.63"/>
</g>
<!-- string__seq -->
-<g id="node7" class="node">
+<g id="node8" class="node">
<title>string__seq</title>
-<polygon fill="#e0ffe0" stroke="none" points="789.75,-215.25 789.75,-237.75 814.5,-237.75 814.5,-215.25 789.75,-215.25"/>
-<polygon fill="none" stroke="black" points="789.75,-215.25 789.75,-237.75 814.5,-237.75 814.5,-215.25 789.75,-215.25"/>
-<text xml:space="preserve" text-anchor="start" x="792.75" y="-222" font-family="Times,serif" font-size="14.00">pos</text>
-<polygon fill="#e0ffe0" stroke="none" points="814.5,-215.25 814.5,-237.75 886.5,-237.75 886.5,-215.25 814.5,-215.25"/>
-<polygon fill="none" stroke="black" points="814.5,-215.25 814.5,-237.75 886.5,-237.75 886.5,-215.25 814.5,-215.25"/>
-<text xml:space="preserve" text-anchor="start" x="840" y="-222" font-family="Times,serif" font-size="14.00">size</text>
-<polygon fill="#e0ffe0" stroke="none" points="886.5,-215.25 886.5,-237.75 951.75,-237.75 951.75,-215.25 886.5,-215.25"/>
-<polygon fill="none" stroke="black" points="886.5,-215.25 886.5,-237.75 951.75,-237.75 951.75,-215.25 886.5,-215.25"/>
-<text xml:space="preserve" text-anchor="start" x="907.5" y="-222" font-family="Times,serif" font-size="14.00">type</text>
-<polygon fill="#e0ffe0" stroke="none" points="951.75,-215.25 951.75,-237.75 1023.75,-237.75 1023.75,-215.25 951.75,-215.25"/>
-<polygon fill="none" stroke="black" points="951.75,-215.25 951.75,-237.75 1023.75,-237.75 1023.75,-215.25 951.75,-215.25"/>
-<text xml:space="preserve" text-anchor="start" x="982.5" y="-222" font-family="Times,serif" font-size="14.00">id</text>
-<polygon fill="none" stroke="black" points="789.75,-192.75 789.75,-215.25 814.5,-215.25 814.5,-192.75 789.75,-192.75"/>
-<text xml:space="preserve" text-anchor="start" x="798.75" y="-199.5" font-family="Times,serif" font-size="14.00">0</text>
-<polygon fill="none" stroke="black" points="814.5,-192.75 814.5,-215.25 886.5,-215.25 886.5,-192.75 814.5,-192.75"/>
-<text xml:space="preserve" text-anchor="start" x="847.12" y="-199.5" font-family="Times,serif" font-size="14.00">2</text>
-<polygon fill="none" stroke="black" points="886.5,-192.75 886.5,-215.25 951.75,-215.25 951.75,-192.75 886.5,-192.75"/>
-<text xml:space="preserve" text-anchor="start" x="906" y="-199.5" font-family="Times,serif" font-size="14.00">u2be</text>
-<polygon fill="none" stroke="black" points="951.75,-192.75 951.75,-215.25 1023.75,-215.25 1023.75,-192.75 951.75,-192.75"/>
-<text xml:space="preserve" text-anchor="start" x="954.75" y="-199.5" font-family="Times,serif" font-size="14.00">len_payload</text>
-<polygon fill="none" stroke="black" points="789.75,-170.25 789.75,-192.75 814.5,-192.75 814.5,-170.25 789.75,-170.25"/>
-<text xml:space="preserve" text-anchor="start" x="798.75" y="-177" font-family="Times,serif" font-size="14.00">2</text>
-<polygon fill="none" stroke="black" points="814.5,-170.25 814.5,-192.75 886.5,-192.75 886.5,-170.25 814.5,-170.25"/>
-<text xml:space="preserve" text-anchor="start" x="817.5" y="-177" font-family="Times,serif" font-size="14.00">len_payload</text>
-<polygon fill="none" stroke="black" points="886.5,-170.25 886.5,-192.75 951.75,-192.75 951.75,-170.25 886.5,-170.25"/>
-<text xml:space="preserve" text-anchor="start" x="889.5" y="-177" font-family="Times,serif" font-size="14.00">str(UTF&#45;8)</text>
-<polygon fill="none" stroke="black" points="951.75,-170.25 951.75,-192.75 1023.75,-192.75 1023.75,-170.25 951.75,-170.25"/>
-<text xml:space="preserve" text-anchor="start" x="966.38" y="-177" font-family="Times,serif" font-size="14.00">payload</text>
+<polygon fill="#e0ffe0" stroke="none" points="779.25,-496.25 779.25,-518.75 804,-518.75 804,-496.25 779.25,-496.25"/>
+<polygon fill="none" stroke="black" points="779.25,-496.25 779.25,-518.75 804,-518.75 804,-496.25 779.25,-496.25"/>
+<text xml:space="preserve" text-anchor="start" x="782.25" y="-503" font-family="Times,serif" font-size="14.00">pos</text>
+<polygon fill="#e0ffe0" stroke="none" points="804,-496.25 804,-518.75 876,-518.75 876,-496.25 804,-496.25"/>
+<polygon fill="none" stroke="black" points="804,-496.25 804,-518.75 876,-518.75 876,-496.25 804,-496.25"/>
+<text xml:space="preserve" text-anchor="start" x="829.5" y="-503" font-family="Times,serif" font-size="14.00">size</text>
+<polygon fill="#e0ffe0" stroke="none" points="876,-496.25 876,-518.75 941.25,-518.75 941.25,-496.25 876,-496.25"/>
+<polygon fill="none" stroke="black" points="876,-496.25 876,-518.75 941.25,-518.75 941.25,-496.25 876,-496.25"/>
+<text xml:space="preserve" text-anchor="start" x="897" y="-503" font-family="Times,serif" font-size="14.00">type</text>
+<polygon fill="#e0ffe0" stroke="none" points="941.25,-496.25 941.25,-518.75 1013.25,-518.75 1013.25,-496.25 941.25,-496.25"/>
+<polygon fill="none" stroke="black" points="941.25,-496.25 941.25,-518.75 1013.25,-518.75 1013.25,-496.25 941.25,-496.25"/>
+<text xml:space="preserve" text-anchor="start" x="972" y="-503" font-family="Times,serif" font-size="14.00">id</text>
+<polygon fill="none" stroke="black" points="779.25,-473.75 779.25,-496.25 804,-496.25 804,-473.75 779.25,-473.75"/>
+<text xml:space="preserve" text-anchor="start" x="788.25" y="-480.5" font-family="Times,serif" font-size="14.00">0</text>
+<polygon fill="none" stroke="black" points="804,-473.75 804,-496.25 876,-496.25 876,-473.75 804,-473.75"/>
+<text xml:space="preserve" text-anchor="start" x="836.62" y="-480.5" font-family="Times,serif" font-size="14.00">2</text>
+<polygon fill="none" stroke="black" points="876,-473.75 876,-496.25 941.25,-496.25 941.25,-473.75 876,-473.75"/>
+<text xml:space="preserve" text-anchor="start" x="895.5" y="-480.5" font-family="Times,serif" font-size="14.00">u2be</text>
+<polygon fill="none" stroke="black" points="941.25,-473.75 941.25,-496.25 1013.25,-496.25 1013.25,-473.75 941.25,-473.75"/>
+<text xml:space="preserve" text-anchor="start" x="944.25" y="-480.5" font-family="Times,serif" font-size="14.00">len_payload</text>
+<polygon fill="none" stroke="black" points="779.25,-451.25 779.25,-473.75 804,-473.75 804,-451.25 779.25,-451.25"/>
+<text xml:space="preserve" text-anchor="start" x="788.25" y="-458" font-family="Times,serif" font-size="14.00">2</text>
+<polygon fill="none" stroke="black" points="804,-451.25 804,-473.75 876,-473.75 876,-451.25 804,-451.25"/>
+<text xml:space="preserve" text-anchor="start" x="807" y="-458" font-family="Times,serif" font-size="14.00">len_payload</text>
+<polygon fill="none" stroke="black" points="876,-451.25 876,-473.75 941.25,-473.75 941.25,-451.25 876,-451.25"/>
+<text xml:space="preserve" text-anchor="start" x="879" y="-458" font-family="Times,serif" font-size="14.00">str(UTF&#45;8)</text>
+<polygon fill="none" stroke="black" points="941.25,-451.25 941.25,-473.75 1013.25,-473.75 1013.25,-451.25 941.25,-451.25"/>
+<text xml:space="preserve" text-anchor="start" x="955.88" y="-458" font-family="Times,serif" font-size="14.00">payload</text>
+</g>
+<!-- message__seq&#45;&gt;string__seq -->
+<g id="edge9" class="edge">
+<title>message__seq:source_type&#45;&gt;string__seq</title>
+<path fill="none" stroke="black" stroke-width="2" d="M715.88,-552.5C751.15,-552.5 787.97,-540.92 819.01,-527.36"/>
+<polygon fill="black" stroke="black" stroke-width="2" points="818.88,-531.26 826.54,-523.95 815.99,-524.88 818.88,-531.26"/>
+</g>
+<!-- message__seq&#45;&gt;string__seq -->
+<g id="edge10" class="edge">
+<title>message__seq:target_type&#45;&gt;string__seq</title>
+<path fill="none" stroke="black" stroke-width="2" d="M715.88,-530C733.21,-530 751.21,-528 768.82,-524.84"/>
+<polygon fill="black" stroke="black" stroke-width="2" points="767.91,-528.58 777.06,-523.25 766.57,-521.71 767.91,-528.58"/>
+</g>
+<!-- message__seq&#45;&gt;string__seq -->
+<g id="edge11" class="edge">
+<title>message__seq:content_type&#45;&gt;string__seq</title>
+<path fill="none" stroke="black" stroke-width="2" d="M715.88,-485C730.14,-485 745.05,-485 759.91,-485"/>
+<polygon fill="black" stroke="black" stroke-width="2" points="758.23,-488.5 768.23,-485 758.23,-481.5 758.23,-488.5"/>
</g>
<!-- string__seq&#45;&gt;string__seq -->
-<g id="edge8" class="edge">
+<g id="edge12" class="edge">
<title>string__seq:len_payload_type&#45;&gt;string__seq:payload_size</title>
-<path fill="none" stroke="#404040" d="M1015.48,-215.22C1048.29,-234.5 1028.98,-259.75 919.12,-259.75 816.98,-259.75 793.12,-224.7 816.65,-199.96"/>
-<polygon fill="#404040" stroke="#404040" points="818.82,-202.71 824.28,-193.63 814.35,-197.33 818.82,-202.71"/>
+<path fill="none" stroke="#404040" d="M1004.98,-496.22C1037.79,-515.5 1018.48,-540.75 908.62,-540.75 806.48,-540.75 782.62,-505.7 806.15,-480.96"/>
+<polygon fill="#404040" stroke="#404040" points="808.32,-483.71 813.78,-474.63 803.85,-478.33 808.32,-483.71"/>
</g>
<!-- test__seq&#45;&gt;binary__seq -->
-<g id="edge10" class="edge">
+<g id="edge14" class="edge">
<title>test__seq:bin1_type&#45;&gt;binary__seq</title>
-<path fill="none" stroke="black" stroke-width="2" d="M715.12,-106.5C738.74,-106.5 763.58,-103.22 787.25,-98.44"/>
-<polygon fill="black" stroke="black" stroke-width="2" points="786.38,-102.21 795.43,-96.7 784.92,-95.36 786.38,-102.21"/>
+<path fill="none" stroke="black" stroke-width="2" d="M704.62,-106.5C727.91,-106.5 752.79,-106.54 776.64,-106.59"/>
+<polygon fill="black" stroke="black" stroke-width="2" points="774.85,-110.09 784.85,-106.61 774.86,-103.09 774.85,-110.09"/>
</g>
<!-- test__seq&#45;&gt;string__seq -->
-<g id="edge9" class="edge">
+<g id="edge13" class="edge">
<title>test__seq:str1_type&#45;&gt;string__seq</title>
-<path fill="none" stroke="black" stroke-width="2" d="M715.12,-151.5C742.13,-151.5 770.53,-156.46 796.93,-163.32"/>
-<polygon fill="black" stroke="black" stroke-width="2" points="794.23,-166.22 804.8,-165.47 796.07,-159.46 794.23,-166.22"/>
+<path fill="none" stroke="black" stroke-width="2" d="M704.62,-151.5C737.13,-151.5 830.71,-344.97 873.47,-437.2"/>
+<polygon fill="black" stroke="black" stroke-width="2" points="869.54,-437.03 876.91,-444.64 875.89,-434.1 869.54,-437.03"/>
</g>
<!-- test__seq&#45;&gt;string__seq -->
-<g id="edge11" class="edge">
+<g id="edge15" class="edge">
<title>test__seq:str2_type&#45;&gt;string__seq</title>
-<path fill="none" stroke="black" stroke-width="2" d="M715.12,-61.5C763.8,-61.5 736.03,-123.24 773.75,-154 776.42,-156.18 779.19,-158.26 782.05,-160.26"/>
-<polygon fill="black" stroke="black" stroke-width="2" points="778.61,-162.2 788.9,-164.72 782.43,-156.34 778.61,-162.2"/>
+<path fill="none" stroke="black" stroke-width="2" d="M704.62,-61.5C771.06,-61.5 736.3,-138.28 763.25,-199 800.74,-283.46 846.25,-381.04 872.86,-437.61"/>
+<polygon fill="black" stroke="black" stroke-width="2" points="868.89,-437.39 876.31,-444.94 875.22,-434.4 868.89,-437.39"/>
</g>
</g>
</svg>