From b911247a73cd150d7ba8b3bc0dc9941ad7f6e183 Mon Sep 17 00:00:00 2001 From: Rowan Date: Mon, 7 Sep 2026 05:51:15 -0400 Subject: [PATCH 1/9] tables: red first for the message form's LoadRetain (#525) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The pinned batch and the two rows that read it, before the function exists. RT2 writes a form-2 batch of two bodies over the same values the file rows read: the fields at three depths that are retained, the whole `parcel` table the resolving walk reads, and every class this form can put on the unknown arm — a field of kind 17, an array whose element kind is 17, a table whose payload meets a 17 three bodies down, an unknown enum variant reference, an unknown union arm id and an unknown keyed-array slot. The reference's row and the oracle's read that one vector and require the same counters and the same saved file. Both are RED: test/tables/retain_main.cpp:1023:20: error: no member named 'NodeLoadRetainMessages' in namespace 'tblrt1'; did you mean 'NodeSaveRetainMessages'? internal/tablewire/retain_test.go:716:29: undefined: tablewire.DecodeRetainMessages Co-Authored-By: Claude Opus 5 --- internal/tablewire/retain_test.go | 69 +++++++++ test/tables/retain_main.cpp | 194 ++++++++++++++++++++++++ testdata/wire/tables/retain_message.bin | Bin 0 -> 139 bytes 3 files changed, 263 insertions(+) create mode 100644 testdata/wire/tables/retain_message.bin diff --git a/internal/tablewire/retain_test.go b/internal/tablewire/retain_test.go index 0aaecdaae..f08f276f8 100644 --- a/internal/tablewire/retain_test.go +++ b/internal/tablewire/retain_test.go @@ -685,3 +685,72 @@ func TestRetainDroppedRecordSpendsNoId(t *testing.T) { } } } + +// THE MESSAGE FORM'S LoadRetain (docs/SPEC-TABLES.md §3.3, §6.6). `LoadRetain` +// reads a form-2 body as it reads a file's, the resolving walk replacing every +// reference with the id it names AGAINST THE CONNECTION'S VOCABULARY instead +// of a trailer, and `SaveRetain` writing form 2 refuses by name. So the round +// trip is form 2 in and form 1 out, and this row is the same pinned batch the +// reference's own gate reads, saved to the same bytes. +// +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3): each body +// carries its own node directory inside that one region, so a record's first +// step is an index into the directory of the body it came from. +func TestRetainMessageForm(t *testing.T) { + m := retainModel(t, "RT1.schema") + sender := retainModel(t, "RT2.schema") + + v := &tablewire.Vocabulary{} + var announced tabletext.Report + if err := v.AnnounceRead(ir.TableAnnouncement(sender.Unit), &announced); err != nil { + t.Fatalf("RT2's own announcement was refused: %v", err) + } + + batch := retainVector(t, "retain_message") + insts := []*tabletext.Instance{m.New(m.Lookup("Node")), m.New(m.Lookup("Node"))} + retains := []*tablewire.Retain{ + {Capacity: 8192, IdCapacity: 1024}, + {Capacity: 8192, IdCapacity: 1024}, + } + var report tabletext.Report + read, ok, err := tablewire.DecodeRetainMessages(m, insts, batch, v, retains, &report) + if err != nil { + t.Fatal(err) + } + if !ok || report.Malformed { + t.Fatalf("the load reported damage on a sound batch: %+v", report) + } + if read != 2 { + t.Fatalf("the batch carries 2 bodies and the load read %d", read) + } + // THE FIRST BODY carries eight retained fields and six unknowns of the + // excluded classes: the enum variant `tier` names, the union arm `pick` + // names, the keyed slot RT2's third variant writes, a field of kind 17, an + // array whose element kind is 17, and a table whose payload meets a 17 + // three bodies down. THE SECOND carries two retained fields and nothing + // excluded. + if report.Retained != 10 || report.RetainLost != 6 || report.Unknown != 16 { + t.Fatalf("retained=%d retain_lost=%d unknown=%d, want 10 / 6 / 16", + report.Retained, report.RetainLost, report.Unknown) + } + if report.KindMismatch != 0 || report.Clamped != 0 || report.Widened != 0 { + t.Fatalf("retention moved a read counter: %+v", report) + } + + // AND THE SAVE IS THE FILE FORM'S, byte for byte the reference's own pin + for i, inst := range insts { + var save tabletext.Report + out, err := tablewire.EncodeRetain(m, inst, retains[i], &save) + if err != nil { + t.Fatal(err) + } + if save.RetainLost != 0 { + t.Fatalf("body %d: the save lost %d records it had room for", i, save.RetainLost) + } + want := retainVector(t, []string{"retain_message_save_0", "retain_message_save_1"}[i]) + if !bytes.Equal(out, want) { + t.Fatalf("body %d: the save is %d bytes and the reference's pin is %d, and they differ", + i, len(out), len(want)) + } + } +} diff --git a/test/tables/retain_main.cpp b/test/tables/retain_main.cpp index 13382426f..5252e786c 100644 --- a/test/tables/retain_main.cpp +++ b/test/tables/retain_main.cpp @@ -891,6 +891,199 @@ static void walk_is_linear() } } +// ---- THE MESSAGE FORM'S LoadRetain (docs/SPEC-TABLES.md §3.3, §6.6) ---- +// +// RETENTION CROSSES THE FORMS IN ONE DIRECTION. `LoadRetain` reads a form-2 +// body as it reads a file's, the resolving walk replacing every reference with +// the id it names against the CONNECTION'S VOCABULARY instead of a trailer, +// and `SaveRetain` writing form 2 refuses by name. So the round trip a caller +// has is form 2 in and form 1 out: the file carries its own table and takes +// §6.6 unchanged. +// +// The batch below is RT2's, over the same values the file rows read, and it +// carries every class this form can put on the unknown arm: the fields at +// three depths that are retained, the whole `parcel` table the resolving walk +// reads, a field of kind 17, an array whose element kind is 17, a table whose +// payload meets a 17 three bodies down, an unknown enum variant reference, an +// unknown union arm id and an unknown keyed-array slot. + +// fill_rt2_message fills one RT2 root for the batch. `full` is the body that +// carries every class; the other is the batch's second body, which carries one +// unknown field and nothing else, so that a record of the first body can never +// be placed in the second. +static void fill_rt2_message( tblrt2::NodeBuilder & builder, bool full ) +{ + tblrt2::Node * root = builder.GetRoot(); + memcpy( root->name, full ? "world" : "again", 6 ); + root->name_length = 5; + root->extra = full ? 11 : 12; + root->inner.hits = 3; + root->inner.future = 21; + memcpy( root->inner.tag, "in", 3 ); + root->inner.tag_length = 2; + if ( !full ) { return; } + + root->tier = tblrt2::Slot::Extra; // an unknown enum VARIANT reference + + root->items_count = 2; + root->items[0].hits = 1; root->items[0].future = 31; + root->items[1].hits = 2; root->items[1].future = 32; + + root->banks.slots[0].hits = 4; root->banks.slots[0].future = 41; + root->banks.slots[2].hits = 6; root->banks.slots[2].future = 43; // an unknown keyed SLOT + + root->pick.type = tblrt2::PickType::Gamma; // an unknown union ARM id + root->pick.gamma = 55; + + tblrt2::TableSlot leaf = builder.Alloc(); + leaf->value = 77; + root->head = leaf; + + // THE NODE-INDEX CLASSES, each on a field RT1 cannot name: kind 17 itself, + // an array whose element kind is 17, and a table whose payload meets a 17 + // three bodies down + tblrt2::TableSlot ghost = builder.Alloc(); + ghost->value = 78; + root->ghost = ghost; + root->ghosts_count = 1; + root->ghosts[0] = ghost; + root->outer.plain = 79; + root->outer.mid.deeper.link = ghost; + + tblrt2::Inner * one = tblrt2::NodeEntriesInsert( builder.main, root->entries, "k1" ); + if ( one != NULL ) { one->hits = 7; one->future = 61; } + + tblrt2::Inner * item = tblrt2::NodeListAdd( builder.main, root->list ); + if ( item != NULL ) { item->hits = 8; item->future = 71; } + + root->parcel.grade = tblrt2::Grade::Silver; // kind 30, a variant reference + root->parcel.fit.type = tblrt2::FittingType::Bolt; // kind 15, a table arm + tblrt2::BoltReset( root->parcel.fit.bolt ); + root->parcel.fit.bolt.weight = 101; + root->parcel.bins.slots[0].weight = 102; // kind 16, keyed by Grade + root->parcel.bins.slots[1].weight = 103; + root->parcel.core.weight = 104; // kind 13, a nested body + root->parcel.stack_count = 2; // kind 14, table elements + root->parcel.stack[0].weight = 105; + root->parcel.stack[1].weight = 106; +} + +static void message_form() +{ + tblrt2::NodeBuilder first; + tblrt2::NodeBuilder second; + fill_rt2_message( first, true ); + fill_rt2_message( second, false ); + CHECK( first.Lock() ); + CHECK( second.Lock() ); + const tblrt2::Node * roots[2] = { first.AsConst(), second.AsConst() }; + + tblrt2::TableReport wrote; + uint8_t batch[ 8192 ]; + const int64_t n = tblrt2::NodeSaveMessages( roots, 2, batch, sizeof( batch ), &wrote ); + CHECK( n > 0 ); + // THE INPUT IS A PINNED VECTOR, so the oracle reads the same bytes this row + // reads (docs/SPEC-TABLES.md §4.2). It is a MESSAGE and not a file: its + // references resolve against RT2's announced vocabulary. + pin_golden( "retain_message", batch, n ); + + // THE CONNECTION'S VOCABULARY, which is what the resolving walk resolves + // against here where a file has a trailer (§3.3). RT1 declares room for + // RT2's entries, because a receiver meeting a LARGER unit declares more + // than its own count. + uint8_t announcement[ 8192 ]; + const int64_t a = tblrt2::Announce( announcement, sizeof( announcement ) ); + CHECK( a > 0 ); + static tblrt1::TableMessageEntry entries[ 128 ]; + tblrt1::TableVocabulary vocabulary( entries, 128 ); + tblrt1::TableReport announced; + CHECK( tblrt1::AnnounceRead( vocabulary, announcement, a, &announced ) ); + + // A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): + // each body carries its OWN node directory inside that one region, so a + // record's first step is an index into the directory of the body it came + // from, and the buffer that holds it is that body's own. + Region region; + region.size( tblrt1::NodeLoadMeasure( vocabulary, batch, n ) ); + uint8_t storage[ 2 ][ 8192 ]; + tblrt1::TableRetain::Id ids[ 2 ][ 1024 ]; + tblrt1::TableRetain retains[ 2 ]; + for ( int i = 0; i < 2; i++ ) + { + retains[i].bytes = storage[i]; + retains[i].capacity = (int64_t) sizeof( storage[i] ); + retains[i].ids = ids[i]; + retains[i].id_capacity = 1024; + } + + const tblrt1::Node * read[ 2 ] = { NULL, NULL }; + int64_t count = 2; + tblrt1::TableReport report; + const long long before = allocations; + CHECK( tblrt1::NodeLoadRetainMessages( read, &count, region.base, region.bytes, + vocabulary, batch, n, retains, &report ) ); + CHECK( count == 2 ); + CHECK( read[0] != NULL && read[1] != NULL ); + CHECK( !report.malformed ); + CHECK( allocations == before ); // RETENTION ALLOCATES NOTHING (§6.6) + + // THE FIRST BODY carries eight retained fields — `extra`, `future` at four + // more depths, the map entry's, the list element's, and `parcel`, the whole + // table the resolving walk reads — and six unknowns of the excluded + // classes: the enum variant `tier` names, the union arm `pick` names, the + // keyed slot RT2's third variant writes, a field of kind 17, an array whose + // element kind is 17, and a table whose payload meets a 17 three bodies + // down. THE SECOND BODY carries two retained fields and nothing excluded. + CHECK( report.retained == 10 ); + CHECK( report.retain_lost == 6 ); + CHECK( report.unknown == 16 ); + // and the READ'S OWN COUNTERS ARE UNMOVED: retention can lose a field and + // can never turn a good read into a bad one (§6.6) + CHECK( report.kind_mismatch == 0 && report.clamped == 0 && report.widened == 0 ); + + // AND THE SAVE IS THE FILE FORM'S, because form 2 refuses to write a + // retained record by name (§3.3): the file carries its own table and takes + // §6.6 unchanged. + for ( int i = 0; i < 2; i++ ) + { + tblrt1::TableReport save_report; + const int64_t m = tblrt1::NodeMeasureRetain( read[i], &retains[i] ); + CHECK( m > 0 ); + uint8_t out[ 8192 ]; + const int64_t w = tblrt1::NodeSaveRetain( read[i], &retains[i], out, m, &save_report ); + CHECK( w == m ); // MEASURE AND SAVE DROP THE SAME RECORDS UNDER THE SAME WALK + CHECK( save_report.retain_lost == 0 ); + pin_golden( i == 0 ? "retain_message_save_0" : "retain_message_save_1", out, w ); + + // AND RT2 READS ITS OWN FIELDS BACK out of the file RT1 wrote, which is + // the resolution half read back: every reference the walk resolved is + // re-interned into a trailer whose order is this file's own. + Region back; + back.size( tblrt2::NodeLoadMeasure( out, w ) ); + tblrt2::TableReport read_report; + const tblrt2::Node * again = tblrt2::NodeLoad( back.base, back.bytes, out, w, &read_report ); + CHECK( again != NULL && !read_report.malformed ); + CHECK( again->extra == ( i == 0 ? 11 : 12 ) ); + CHECK( again->inner.future == 21 ); + if ( i == 0 ) + { + CHECK( again->parcel.core.weight == 104 ); + CHECK( again->parcel.grade == tblrt2::Grade::Silver ); + CHECK( again->parcel.fit.type == tblrt2::FittingType::Bolt ); + CHECK( again->parcel.fit.bolt.weight == 101 ); + CHECK( again->parcel.bins.slots[1].weight == 103 ); + CHECK( again->parcel.stack_count == 2 && again->parcel.stack[1].weight == 106 ); + CHECK( again->items[1].future == 32 ); + CHECK( again->banks.slots[0].future == 41 ); + // AND THE EXCLUDED CLASSES ARE GONE, each having counted one + // retain_lost above: nothing put a node index back + CHECK( again->ghost.null() ); + CHECK( again->ghosts_count == 0 ); + CHECK( again->outer.plain == 0 ); + } + } +} + // ---- THE TRAILER IS PERMUTED, AND EVERY REFERENCE MOVES WITH IT ---- // // Moving a field changes the order ids are first used in, and the id table is @@ -936,6 +1129,7 @@ int main( int argc, char ** argv ) disjoint_occurrences(); walk_is_linear(); trailer_is_permuted(); + message_form(); if ( failures != 0 ) { printf( "retain: %d failure(s)\n", failures ); diff --git a/testdata/wire/tables/retain_message.bin b/testdata/wire/tables/retain_message.bin new file mode 100644 index 0000000000000000000000000000000000000000..993c1753c0d69b6310b87f806bd19a376f34651c GIT binary patch literal 139 zcmZQ#T*bh^(6GjY@kE!fLoh>meo;;e-%lB)%)Ao{D;XMESSIl^xJ+nZaOvVu^kh^J zbl$|Iu+$u=XL1OTa8SrLWGeEgVrb9;@)#Ud+!?MhU5`jVD$M50!_cs;HO6uZV@Xr9 kq=UsA#tLSs1J5V08LVJr0NRw8o|u_;UJ+u?1_=fR0GoLz5&!@I literal 0 HcmV?d00001 From 58422268885aa8a3c2b291e81e30f0e714706b28 Mon Sep 17 00:00:00 2001 From: Rowan Date: Mon, 7 Sep 2026 06:24:02 -0400 Subject: [PATCH 2/9] tables: the message form's LoadRetain, in both engines (#525) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `LoadRetain` reads a form-2 body as it reads a file's, the resolving walk replacing every reference with the id it names AGAINST THE CONNECTION'S VOCABULARY instead of a trailer (§3.3). `SaveRetain` writing form 2 still refuses by name, so the round trip a caller has is form 2 in and form 1 out, and the file carries its own table and takes §6.6 unchanged. THE RECORD IS THE FILE FORM'S OWN, to the byte, so the capture is a TRANSCODE as well as a resolve: a bitpacked value is read at the width its announced shape states and written at the width the file form spells, and from there it is the same record, laid down in the same slots and read back by the same emit walk. Neither engine carries a second copy of the emit side. THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain read's verdict on an unknown entry is the SKIP's, whether or not this build retains, and a capture that lands anywhere but the skip's own end drops the record. It is two flat passes over one record's bits and never a walk that doubles at every level. A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY: each body carries its own node directory inside that one region (§3.3), so a record's first step stays an index into that body's own directory and SaveRetain's accounting is the file form's unchanged. The reference and the oracle read the same pinned batch and write the same two files, 442 and 93 bytes, byte for byte: retained=10 retain_lost=6 unknown=17 `LoadRetainMessages` is claimed in tableGeneratedVerbs and §11 on that list's own rule, because it is emitted: 52 suffixes become 53 and 68 become 69. Goldens: every C++ table header of a unit with a variable-length table gained the retaining message family. Six under testdata/golden/tables/maps were already stale on main — their committed text predates #658's retain runtime and #620's message text rule — and this repin brings them level; the other eighteen moved on this change alone. No WIRE golden moved: retention is additive and the plain codec is untouched to the byte. Co-Authored-By: Claude Opus 5 --- docs/SPEC-TABLES.md | 22 +- internal/check/check.go | 6 +- internal/codegen/cpptable/cpptable.go | 6 + internal/codegen/cpptable/messagecodec.go | 36 +- internal/codegen/cpptable/messageload.go | 143 +- internal/codegen/cpptable/messagevariable.go | 140 +- internal/codegen/cpptable/retain.go | 445 +++ internal/tablewire/messagedecode.go | 112 +- internal/tablewire/retain.go | 30 +- internal/tablewire/retain_test.go | 24 +- internal/tablewire/retainmessage.go | 496 +++ test/tables/retain_main.cpp | 2 +- testdata/golden/tables/arms/CarryTable.h | 2304 ++++++++++++-- testdata/golden/tables/arms/GateTable.h | 914 +++++- testdata/golden/tables/arms/NestTable.h | 1553 ++++++++-- testdata/golden/tables/arms/RingTable.h | 2095 +++++++++++-- testdata/golden/tables/blobs/AssetsTable.h | 1186 ++++++- testdata/golden/tables/lists/HoldersTable.h | 2689 ++++++++++++++-- testdata/golden/tables/lists/MigrateTable.h | 960 +++++- testdata/golden/tables/lists/ReportTable.h | 2009 ++++++++++-- testdata/golden/tables/lists/SaveTable.h | 1900 +++++++++++- testdata/golden/tables/lists/SharedTable.h | 821 +++++ testdata/golden/tables/maps/CellsTable.h | 1050 ++++++- testdata/golden/tables/maps/ChunksTable.h | 1052 ++++++- testdata/golden/tables/maps/DepthTable.h | 1571 +++++++++- testdata/golden/tables/maps/DocsTable.h | 901 +++++- testdata/golden/tables/maps/FleetTable.h | 1967 +++++++++++- testdata/golden/tables/maps/RowsTable.h | 2370 ++++++++++++-- testdata/golden/tables/maps/RunsTable.h | 1058 ++++++- testdata/golden/tables/maps/SlotsTable.h | 1082 ++++++- testdata/golden/tables/maps/SpansTable.h | 880 ++++++ testdata/golden/tables/maps/TextTable.h | 1296 +++++++- testdata/golden/tables/pointers/GraphTable.h | 2725 ++++++++++++++++- testdata/golden/tables/pointers/MarksTable.h | 767 +++++ testdata/golden/tables/pointers/PartsTable.h | 662 ++++ testdata/golden/tables/stream/StreamTable.h | 1482 ++++++++- .../wire/tables/retain_message_save_0.bin | Bin 0 -> 442 bytes .../wire/tables/retain_message_save_1.bin | Bin 0 -> 93 bytes 38 files changed, 34087 insertions(+), 2669 deletions(-) create mode 100644 internal/tablewire/retainmessage.go create mode 100644 testdata/wire/tables/retain_message_save_0.bin create mode 100644 testdata/wire/tables/retain_message_save_1.bin diff --git a/docs/SPEC-TABLES.md b/docs/SPEC-TABLES.md index cb45b97c4..c575fcf4a 100644 --- a/docs/SPEC-TABLES.md +++ b/docs/SPEC-TABLES.md @@ -10093,9 +10093,9 @@ in build version (§20.5). types share one symbol table (§13.1), which is what makes the generated surface unprefixed and collision-free — so every name a closure member claims is refused to everything else. A member `X` claims `X` followed by - each of these **52 suffixes**, and a declaration spelling one of them is + each of these **53 suffixes**, and a declaration spelling one of them is refused naming the collision — the block form's nine and the C backend's - seven follow below, for **68 in all**: + seven follow below, for **69 in all**: ``` Measure MeasureBody Save SaveBody SaveBodyFields Load LoadBody @@ -10107,7 +10107,7 @@ in build version (§20.5). Open TableFields TableInfo FromJson ToJson ToJsonMeasure Table MeasureMessages SaveMessages LoadMessages - LoadRetain MeasureRetain SaveRetain SaveRetainMessages + LoadRetain MeasureRetain SaveRetain LoadRetainMessages SaveRetainMessages LoadBodyRetain MeasureBodyRetain SaveBodyRetain SaveBodyFieldsRetain MeasureWireRetain SaveWireRetain NodeBodyRetain ``` @@ -10115,19 +10115,21 @@ in build version (§20.5). The set is claimed for EVERY closure member, not only pointer-bearing ones: a table gains or loses pointers as an edit, and a name that was free yesterday must not become a collision tomorrow. That list is the - checker's own, and this section is held to it: the three lists here, 52, then + checker's own, and this section is held to it: the three lists here, 53, then the block form's nine, then the C backend's seven, are `tableGeneratedVerbs` - entire, spelling for spelling and 68 in all, because a claim the page states + entire, spelling for spelling and 69 in all, because a claim the page states and the checker does not make is a name a user may take. - **RETAIN-UNKNOWN'S ELEVEN ARE THREE AND EIGHT** (§6.6). `LoadRetain`, + **RETAIN-UNKNOWN'S TWELVE ARE THREE AND NINE** (§6.6). `LoadRetain`, `MeasureRetain` and `SaveRetain` are the SURFACE the feature owes this - section. The other eight are what carries them, and they are claimed on + section. The other nine are what carries them, and they are claimed on this list's own rule because they are EMITTED: the second family of body functions, the wire pair a pointered root takes, the node dispatch that - reaches each record's own body, and `SaveRetainMessages`, which is REFUSED - BY NAME on a form 2 write (§3.3) and is a definition rather than only a - claim for exactly that reason. + reaches each record's own body, and the MESSAGE form's two. + `LoadRetainMessages` is the form 2 READ, which resolves against the + connection's vocabulary where the file form resolves against a trailer, and + `SaveRetainMessages` is the form 2 WRITE, REFUSED BY NAME (§3.3) and a + definition rather than only a claim for exactly that reason. **`Open` AND `Cook` ARE BOTH EMITTED NOW — in different languages, and that is what the C# rule below is for. `OpenWalk` was RETIRED.** The C++ table backend diff --git a/internal/check/check.go b/internal/check/check.go index 6c92f567a..2b94b1af9 100644 --- a/internal/check/check.go +++ b/internal/check/check.go @@ -3641,9 +3641,11 @@ var tableGeneratedVerbs = []string{ // SaveRetain, and the rest are what carries them: the second family of // body functions, // the wire pair over a pointered root, the node dispatch that reaches each - // record's body, and the form 2 write, which is refused by name (§3.3). + // record's body, and the MESSAGE form's two: the form 2 READ, which + // retains against the connection's vocabulary, and the form 2 WRITE, which + // is refused by name (§3.3). // Every one is emitted, so every one is claimed on this list's own rule. - "LoadRetain", "MeasureRetain", "SaveRetain", "SaveRetainMessages", + "LoadRetain", "MeasureRetain", "SaveRetain", "LoadRetainMessages", "SaveRetainMessages", "LoadBodyRetain", "MeasureBodyRetain", "SaveBodyRetain", "SaveBodyFieldsRetain", "MeasureWireRetain", "SaveWireRetain", "NodeBodyRetain", "FromJson", "ToJson", "ToJsonMeasure", diff --git a/internal/codegen/cpptable/cpptable.go b/internal/codegen/cpptable/cpptable.go index 4899905a7..5d7253647 100644 --- a/internal/codegen/cpptable/cpptable.go +++ b/internal/codegen/cpptable/cpptable.go @@ -146,6 +146,12 @@ type tableGen struct { // unionField is the union FIELD whose arms are being emitted, which is // what an arm's own descent takes its ordinal from. unionField *ir.Field + // retainGate is the condition under which a nested MESSAGE read captures + // into the caller's store at all, and empty where it always does. A bit + // stream has to be walked past, so an element this build is dropping is + // decoded into a scratch where a file's reader steps over it by its + // length, and nothing in that body is a field of this region (§6.6, §3.3). + retainGate string } // step renders one path step at a child-body descent: the field's ordinal in diff --git a/internal/codegen/cpptable/messagecodec.go b/internal/codegen/cpptable/messagecodec.go index be7d5c32d..b591f319a 100644 --- a/internal/codegen/cpptable/messagecodec.go +++ b/internal/codegen/cpptable/messagecodec.go @@ -53,13 +53,47 @@ func (g *tableGen) msgSaveCall(name, expr string) string { return fmt.Sprintf("%sSaveMessageBody( w, %s )", name, expr) } -func (g *tableGen) msgLoadCall(name, reader, expr string) string { +func (g *tableGen) msgLoadCall(f *ir.Field, name, reader, expr string) string { + if g.retain { + // THE PATH IS THREADED exactly as the file form threads it + // (docs/SPEC-TABLES.md §6.6): the step is computed LOCALLY, at the + // moment the walk descends, and the store is NULL where the element is + // one the reader is dropping. + if g.isVar(name) { + return fmt.Sprintf("%sLoadMessageBodyRetain( %s, vocabulary, report, nodes, index_bits, %s, %s, %s )", + name, reader, expr, g.retainStore(), g.step(f)) + } + return fmt.Sprintf("%sLoadMessageBodyRetain( %s, vocabulary, report, index_bits, %s, %s, %s )", + name, reader, expr, g.retainStore(), g.step(f)) + } if g.isVar(name) { return fmt.Sprintf("%sLoadMessageBody( %s, vocabulary, report, nodes, index_bits, %s )", name, reader, expr) } return fmt.Sprintf("%sLoadMessageBody( %s, vocabulary, report, index_bits, %s )", name, reader, expr) } +// retainStore is the caller's buffer as a NESTED READ takes it. A bit stream +// has to be walked past, so an element this build is DROPPING — one past its +// own array bound, one under a keyed key it cannot name — is decoded into a +// scratch where a file's reader steps over it by its length. Nothing in that +// body is a field of this region, so the store it captures into is none +// (docs/SPEC-TABLES.md §6.6). +func (g *tableGen) retainStore() string { + if g.retainGate == "" { + return "retain" + } + return fmt.Sprintf("( %s ? retain : NULL )", g.retainGate) +} + +// inDrop runs `emit` with the store gated on the element being this build's, +// and puts back what was there. +func (g *tableGen) inDrop(gate string, emit func()) { + was := g.retainGate + g.retainGate = gate + emit() + g.retainGate = was +} + // msgEnter opens one nesting level of the message codec's emission and answers // the suffix its locals carry; msgLeave closes it. The outermost payload's // names are bare, and every level under it is numbered, so a decode inside a diff --git a/internal/codegen/cpptable/messageload.go b/internal/codegen/cpptable/messageload.go index 29b612c11..35b58f080 100644 --- a/internal/codegen/cpptable/messageload.go +++ b/internal/codegen/cpptable/messageload.go @@ -20,6 +20,7 @@ package cpptable import ( "fmt" + "strconv" "github.com/mas-bandwidth/schema/v2/ir" ) @@ -29,13 +30,28 @@ func (g *tableGen) emitMessageLoadBody(st *ir.Struct) { g.pf("// defaults first, then whatever the wire says, field by field. An entry this\n") g.pf("// build cannot name is skipped by its SHAPE and counted; one whose kind is\n") g.pf("// not this field's is a kind mismatch and skipped the same way.\n") + if g.retain { + g.pf("// UNDER RETENTION the same body keeps the fields this build cannot name,\n") + g.pf("// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the\n") + g.pf("// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6).\n") + g.pf("// The reader's own data is exactly what it would have been with retention off.\n") + } if g.isVar(st.Name) { - g.pf("inline bool %sLoadMessageBody( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, %s & value )\n{\n", st.Name, st.Name) + g.pf("inline bool %s( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, %s & value%s )\n{\n", + g.verb(st.Name, "LoadMessageBody"), st.Name, g.retainParams()) g.pf(" (void) nodes; (void) index_bits;\n") } else { - g.pf("inline bool %sLoadMessageBody( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, %s & value )\n{\n", st.Name, st.Name) + g.pf("inline bool %s( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, %s & value%s )\n{\n", + g.verb(st.Name, "LoadMessageBody"), st.Name, g.retainParams()) } g.pf(" %sReset( value );\n", st.Name) + if g.retain { + g.pf(" // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT\n") + g.pf(" // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever\n") + g.pf(" // an earlier occurrence of it left is discarded before the winning one is\n") + g.pf(" // read. The discard moves neither counter.\n") + g.pf(" TableRetainDiscardBody( retain, path );\n") + } g.pf(" for ( ;; )\n {\n") g.pf(" uint64_t ref = 0;\n") g.pf(" if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; }\n") @@ -64,6 +80,22 @@ func (g *tableGen) emitMessageLoadBody(st *ir.Struct) { } g.pf(" default:\n") g.pf(" report->unknown++;\n") + if g.retain { + // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits + // (§3.3): the plain read's verdict on this entry is the SKIP's, + // whether or not this build retains, and the capture re-reads the bits + // the skip delimited. It drops the record instead where an excluded + // class, a full buffer or a shape the walk cannot frame says it cannot + // be kept, and the read continues either way (§6.6). + g.pf(" {\n") + g.pf(" const int64_t unknown_at = r.offset;\n") + g.pf(" if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; }\n") + g.pf(" TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at );\n") + g.pf(" }\n") + g.pf(" break;\n") + g.pf(" }\n }\n}\n\n") + return + } g.pf(" if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; }\n") g.pf(" break;\n") g.pf(" }\n }\n}\n\n") @@ -102,6 +134,15 @@ func (g *tableGen) emitMessageWidenBranch(f *ir.Field, mine ir.TableVocabularyEn func (g *tableGen) emitMessageReadField(f *ir.Field) { ind := " " name := f.Name + if g.retain && fieldDiscardsWhole(f) { + // THE FIELD IS BEING READ AGAIN (docs/SPEC-TABLES.md §6.6): a repeated + // table field and a union whose arm is written again both replace + // everything the earlier occurrence held, so every record under this + // field goes before the winning one is read. A map, a list and a + // bounded array take this at the point their own read commits to + // replace instead, and an enum-keyed array never takes it at all. + g.pf("%sTableRetainDiscardField( retain, path, %d );\n", ind, g.ordinal[f]) + } switch { case f.IsMap(): g.emitMessageReadMap(f, ind) @@ -121,7 +162,7 @@ func (g *tableGen) emitMessageReadField(f *ir.Field) { case tableScalarKind(f) == tkUnion: g.emitMessageReadUnion(f, "value."+name, ind) case tableScalarKind(f) == tkTable: - g.pf("%sif ( !%s ) { return false; }\n", ind, g.msgLoadCall(f.Type.Name, "r", "value."+name)) + g.pf("%sif ( !%s ) { return false; }\n", ind, g.msgLoadCall(f, f.Type.Name, "r", "value."+name)) case tableScalarKind(f) == tkEnum: g.emitMessageReadEnum(f, "value."+name, ind) default: @@ -134,7 +175,7 @@ func (g *tableGen) emitMessageReadPayload(f *ir.Field, expr, ind string) { case f.Array != ir.ArrayNone: g.emitMessageReadArrayFrom(f, expr, fmt.Sprintf("value.%s_count", f.Name), ind, "entry", false) case tableScalarKind(f) == tkTable: - g.pf("%sif ( !%s ) { return false; }\n", ind, g.msgLoadCall(f.Type.Name, "r", expr)) + g.pf("%sif ( !%s ) { return false; }\n", ind, g.msgLoadCall(f, f.Type.Name, "r", expr)) case tableScalarKind(f) == tkEnum: g.emitMessageReadEnum(f, expr, ind) default: @@ -210,6 +251,7 @@ func (g *tableGen) emitMessageReadTextFrom(f *ir.Field, value, count, ind, from // discipline over a count rather than a value: a length at or above 2^31 // narrowed FIRST is negative, passes a signed test against the bound // untouched, and lands a negative length in the caller's storage + g.emitRetainReplaced(f, ind+" ") g.pf("%s int32_t kept%s = 0;\n", ind, sfx) g.pf("%s if ( n%s > (uint64_t) %d ) { kept%s = %d; report->clamped++; } else { kept%s = (int32_t) n%s; }\n", ind, sfx, f.Type.Size, sfx, f.Type.Size, sfx, sfx) if f.Type.Kind == ir.TWString { @@ -294,14 +336,26 @@ func (g *tableGen) emitMessageReadArrayFrom(f *ir.Field, base, count, ind, from case tableScalarKind(f) == tkTable: g.pf("%s%s scratch%s;\n", inner, f.Type.Name, sfx) g.pf("%s%sReset( scratch%s );\n", inner, f.Type.Name, sfx) - g.pf("%sif ( !%s ) { return false; }\n", inner, g.msgLoadCall(f.Type.Name, "r", elem)) + g.inStep(idx, func() { + g.inDrop("in_bounds"+sfx, func() { + g.pf("%sif ( !%s ) { return false; }\n", inner, g.msgLoadCall(f, f.Type.Name, "r", elem)) + }) + }) case tableScalarKind(f) == tkEnum: g.pf("%s%s slot_value%s = %s::None;\n", inner, f.Type.Name, sfx, f.Type.Name) g.emitMessageReadEnum(f, "slot_value"+sfx, inner) g.pf("%sif ( in_bounds%s ) { %s[%s] = slot_value%s; }\n", inner, sfx, base, idx, sfx) case tableScalarKind(f) == tkUnion: g.pf("%s%s scratch%s;\n", inner, f.Type.Name, sfx) - g.emitMessageReadUnion(f, elem, inner) + // AN ARRAY OF UNIONS TAKES TWO STEPS AND NOT ONE (docs/SPEC-TABLES.md + // §6.6): the array field's step names the element by its index, and the + // element's own step names the arm by its ordinal. + g.inStep(idx, func() { + wasPath, wasIndex := g.pathExpr, g.elemIndex + g.pathExpr, g.elemIndex = g.step(f), "0" + g.inDrop("in_bounds"+sfx, func() { g.emitMessageReadUnion(f, elem, inner) }) + g.pathExpr, g.elemIndex = wasPath, wasIndex + }) default: // A DISCARDED SURPLUS ELEMENT NEVER ACQUIRES A LIVE DESTINATION. A // fixed-width surplus is stepped over by the arithmetic below and @@ -339,7 +393,11 @@ func (g *tableGen) emitMessageReadEnum(f *ir.Field, dst, ind string) { g.pf("%s TableMessageEntry variant_entry%s;\n", ind, sfx) g.pf("%s if ( variant_ref%s == 0 ) { %s = %s::None; } // the zero reference is the enum's None\n", ind, sfx, dst, e) g.pf("%s else if ( !TableMessageNameEntry( vocabulary, variant_ref%s, variant_entry%s ) ) { report->malformed = true; return false; }\n", ind, sfx, sfx) - g.pf("%s else if ( !TableEnumValue( variant_entry%s.id, %s ) ) { %s = %s::None; report->unknown++; }\n", ind, sfx, dst, dst, e) + // AN UNKNOWN ENUM VARIANT REFERENCE IS AN EXCLUDED CLASS + // (docs/SPEC-TABLES.md §6.6): the FIELD is the reader's, and the reader + // writes its own value under that id, so a retained copy would be a second + // occurrence of an id the reader already wrote. + g.pf("%s else if ( !TableEnumValue( variant_entry%s.id, %s ) ) { %s = %s::None; report->unknown++;%s }\n", ind, sfx, dst, dst, e, g.retainLostMessageInline()) g.pf("%s}\n", ind) } @@ -360,7 +418,14 @@ func (g *tableGen) emitMessageReadUnion(f *ir.Field, dst, ind string) { g.pf("%s else if ( !TableMessageArmEntry( vocabulary, arm_ref%s, %s ) ) { report->malformed = true; return false; }\n", ind, sfx, arm) g.pf("%s else\n%s {\n", ind, ind) g.pf("%s switch ( %s.id )\n%s {\n", ind, arm, ind) - for _, v := range un.Variants { + // THE ARM'S OWN ORDINAL is the element index of a union's step, and not + // "whichever arm is set" (docs/SPEC-TABLES.md §6.6): a caller that switches + // the arm between load and save leaves a step no child body answers, so the + // record is dropped rather than placed in the other arm's body. + wasField := g.unionField + g.unionField = f + defer func() { g.unionField = wasField }() + for ai, v := range un.Variants { mine := ir.TableArmEntry(v) g.noteRef(v.Type) // the arm's id is `mine.Id`, the announcement's own entry, which reads @@ -384,21 +449,35 @@ func (g *tableGen) emitMessageReadUnion(f *ir.Field, dst, ind string) { g.pf("%s if ( !TableMessageSkip( r, vocabulary, index_bits, %s ) ) { report->malformed = true; return false; }\n", ind, arm) g.pf("%s break;\n%s }\n", ind, ind) g.pf("%s %s.type = %sType::%s;\n", ind, dst, un.Name, ir.GoExportName(v.Name)) - switch { - case v.Void(): - case v.Body(): - g.pf("%s if ( !%s ) { return false; }\n", ind, g.msgLoadCall(v.Type, "r", armValue(dst, v))) - default: - g.emitMessageReadArm(v, dst, ind+" ", arm, false) - } + g.inStep(strconv.Itoa(ai), func() { + switch { + case v.Void(): + case v.Body(): + g.pf("%s if ( !%s ) { return false; }\n", ind, g.msgLoadCall(g.unionField, v.Type, "r", armValue(dst, v))) + default: + g.emitMessageReadArm(v, dst, ind+" ", arm, false) + } + }) g.pf("%s break;\n%s }\n", ind, ind) } g.pf("%s default:\n", ind) - g.pf("%s %s.type = %sType::None; report->unknown++;\n", ind, dst, un.Name) + g.pf("%s %s.type = %sType::None; report->unknown++;%s\n", ind, dst, un.Name, g.retainLostMessageInline()) g.pf("%s if ( !TableMessageSkip( r, vocabulary, index_bits, %s ) ) { report->malformed = true; return false; }\n", ind, arm) g.pf("%s break;\n%s }\n%s }\n%s}\n", ind, ind, ind, ind) } +// retainLostMessageInline is one EXCLUDED CLASS counted on a MESSAGE body +// (docs/SPEC-TABLES.md §6.6), emitted into the retain family only and beside +// the unknown the plain read already counts. It is the file form's own +// retainLostInline with this form's report handle: a message body carries the +// report as a parameter where a file's rides on the reader. +func (g *tableGen) retainLostMessageInline() string { + if !g.retain { + return "" + } + return " report->retain_lost++;" +} + func (g *tableGen) emitMessageReadArm(v ir.UnionVariant, base, ind, arm string, widened bool) { af := v.F value, count := armValue(base, v), armCount(base, v) @@ -415,7 +494,9 @@ func (g *tableGen) emitMessageReadArm(v ir.UnionVariant, base, ind, arm string, case tableScalarKind(af) == tkEnum: g.emitMessageReadEnum(af, value, ind) case tableScalarKind(af) == tkTable: - g.pf("%sif ( !%s ) { return false; }\n", ind, g.msgLoadCall(af.Type.Name, "r", value)) + // the step is the UNION FIELD's ordinal and the arm's own, which the + // caller has already put in scope (docs/SPEC-TABLES.md §6.6) + g.pf("%sif ( !%s ) { return false; }\n", ind, g.msgLoadCall(g.unionField, af.Type.Name, "r", value)) default: g.emitMessageReadScalarFromEntry(af, value, ind, arm, false, widened) } @@ -442,7 +523,10 @@ func (g *tableGen) emitMessageReadKeyed(f *ir.Field, ind string) { g.pf("%sif ( !TableMessageNameEntry( vocabulary, key_ref%s, key_entry%s ) ) { report->malformed = true; return false; }\n", inner, sfx, sfx) g.pf("%s%s key%s = %s::None;\n", inner, f.KeyEnum, sfx, f.KeyEnum) g.pf("%sconst bool named%s = TableEnumValue( key_entry%s.id, key%s );\n", inner, sfx, sfx, sfx) - g.pf("%sif ( !named%s ) { report->unknown++; }\n", inner, sfx) + // AN UNKNOWN KEYED-ARRAY SLOT IS AN EXCLUDED CLASS (docs/SPEC-TABLES.md + // §6.6): a slot is not a field, the reader rewrites the array body whole, + // and a slot has nowhere to append to. + g.pf("%sif ( !named%s ) { report->unknown++;%s }\n", inner, sfx, g.retainLostMessageInline()) g.pf("%sconst int32_t slot%s = named%s ? (int32_t) key%s - 1 : -1;\n", inner, sfx, sfx, sfx) g.pf("%sconst bool in_bounds%s = slot%s >= 0 && slot%s < %d;\n", inner, sfx, sfx, sfx, f.ArrayBound) elem := fmt.Sprintf("( in_bounds%s ? %s[slot%s] : scratch%s )", sfx, slots, sfx, sfx) @@ -453,7 +537,14 @@ func (g *tableGen) emitMessageReadKeyed(f *ir.Field, ind string) { case kind == tkTable: g.pf("%s%s scratch%s;\n", inner, f.Type.Name, sfx) g.pf("%s%sReset( scratch%s );\n", inner, f.Type.Name, sfx) - g.pf("%sif ( !%s ) { return false; }\n", inner, g.msgLoadCall(f.Type.Name, "r", elem)) + // THE KEY'S SLOT is the element index of a keyed array's step (§6.6), + // and a slot this build cannot name captures nothing: it was excluded + // whole, and everything under it went with that one retain_lost. + g.inStep("slot"+sfx, func() { + g.inDrop("in_bounds"+sfx, func() { + g.pf("%sif ( !%s ) { return false; }\n", inner, g.msgLoadCall(f, f.Type.Name, "r", elem)) + }) + }) case kind == tkEnum: g.pf("%s%s slot_value%s = %s::None;\n", inner, f.Type.Name, sfx, f.Type.Name) g.emitMessageReadEnum(f, "slot_value"+sfx, inner) @@ -486,6 +577,7 @@ func (g *tableGen) emitMessageReadMap(f *ir.Field, ind string) { g.pf("%s uint64_t count%s = 0;\n", ind, sfx) g.pf("%s if ( !r.get( count%s, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; }\n", ind, sfx) g.pf("%s count%s += (uint64_t) entry.min;\n", ind, sfx) + g.emitRetainReplaced(f, ind+" ") g.pf("%s TableMapFill<%s> fill%s = TableMapFillBegin( nodes, value.%s, (uint32_t) count%s );\n", ind, n, sfx, f.Name, sfx) g.pf("%s if ( !fill%s.ok ) { report->malformed = true; return false; } // the measure and the load disagree\n", ind, sfx) if stringKey { @@ -529,7 +621,11 @@ func (g *tableGen) emitMessageReadMap(f *ir.Field, ind string) { g.pf("%s slot%s = TableMapFillNext( fill%s ); // ASCENDING: the next slot\n", ind, sfx, sfx) g.pf("%s }\n", ind) g.pf("%s if ( slot%s == NULL ) { report->malformed = true; return false; }\n", ind, sfx) - g.pf("%s if ( !%s ) { return false; }\n", ind, g.msgLoadCall(n, "r", "*slot"+sfx)) + // THE KEY'S SLOT is the element index of a map's step, which is the + // entry's index in ascending key order (docs/SPEC-TABLES.md §6.6, §2.8). + g.inStep(fmt.Sprintf("fill%s.map->count - 1", sfx), func() { + g.pf("%s if ( !%s ) { return false; }\n", ind, g.msgLoadCall(f, n, "r", "*slot"+sfx)) + }) g.pf("%s if ( r.offset != read%s.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends\n", ind, sfx) if stringKey { g.pf("%s last_key%s = read%s.key; last_length%s = read%s.length; // the WIRE keys of the entries that LAND\n", ind, sfx, sfx, sfx, sfx) @@ -829,6 +925,7 @@ func (g *tableGen) emitMessageReadList(f *ir.Field, ind string) { if listElementWireKind(f) == tkU8 { g.pf("%s if ( !r.align() ) { report->malformed = true; return false; } // an array of kind 6 aligns before its elements\n", ind) } + g.emitRetainReplaced(f, ind+" ") g.pf("%s TableListFill<%s> fill%s = TableListFillBegin( nodes, value.%s, n%s );\n", ind, g.listTypeArg(f), sfx, f.Name, sfx) g.pf("%s if ( fill%s.refused ) { nodes.refused = true; return false; }\n", ind, sfx) g.pf("%s if ( !fill%s.ok ) { report->malformed = true; return false; } // the measure and the load disagree\n", ind, sfx) @@ -841,7 +938,11 @@ func (g *tableGen) emitMessageReadList(f *ir.Field, ind string) { case f.Type.Pointer: g.emitMessageReadIndex(f, elem, inner) case tableScalarKind(f) == tkTable: - g.pf("%sif ( !%s ) { return false; }\n", inner, g.msgLoadCall(f.Type.Name, "r", elem)) + // THE ELEMENT'S INDEX is the second half of an unbounded array's step + // (docs/SPEC-TABLES.md §6.6, §2.9) + g.inStep(idx, func() { + g.pf("%sif ( !%s ) { return false; }\n", inner, g.msgLoadCall(f, f.Type.Name, "r", elem)) + }) case tableScalarKind(f) == tkEnum: g.emitMessageReadEnum(f, elem, inner) case tableScalarKind(f) == tkUnion: diff --git a/internal/codegen/cpptable/messagevariable.go b/internal/codegen/cpptable/messagevariable.go index 17f1c08ff..8971ebb53 100644 --- a/internal/codegen/cpptable/messagevariable.go +++ b/internal/codegen/cpptable/messagevariable.go @@ -166,15 +166,32 @@ func (g *tableGen) emitVariableMessageSurface(st *ir.Struct) { g.pf(" if ( attribution_bytes != NULL ) { *attribution_bytes = attribution; }\n") g.pf(" return data + attribution;\n}\n\n") + g.emitVariableMessageLoadSurface(st) +} + +// emitVariableMessageLoadSurface emits the batch's READ half over a pointered +// root: one body into the region, and the batch's own verb over it. It is +// emitted TWICE, once plain and once under RETENTION (docs/SPEC-TABLES.md §3.3, +// §6.6), and the retaining half is the same walk with the caller's stores +// threaded and the unknown arm capturing. +func (g *tableGen) emitVariableMessageLoadSurface(st *ir.Struct) { + n := st.Name // ONE BODY into the region: the directory, the records, the root - g.pf("// %sLoadMessageBodyInto: one body of a batch into the region at `used`. Its\n", n) + g.pf("// %s%s: one body of a batch into the region at `used`. Its\n", n, g.verb("", "LoadMessageBodyInto")) g.pf("// chunk is the node DIRECTORY, then the records in wire order, then the root\n") g.pf("// and the extent its maps take, so every offset a pass needs is known when\n") g.pf("// the pass reaches it. PASS ONE fills the numbering from the framing and\n") g.pf("// places every node; PASS TWO decodes each record's body into the storage it\n") g.pf("// owns; the ROOT's own body decodes last, so every index it carries resolves\n") g.pf("// against a numbering already known whole.\n") - g.pf("inline bool %sLoadMessageBodyInto( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const %s * & root_out )\n{\n", n, n) + if g.retain { + g.pf("// UNDER RETENTION the body's own retention buffer is reset here and belongs\n") + g.pf("// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because\n") + g.pf("// each body carries its own node directory inside that one region and a\n") + g.pf("// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6).\n") + } + g.pf("inline bool %s( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const %s * & root_out%s )\n{\n", + g.verb(n, "LoadMessageBodyInto"), n, g.retainIntoParam()) g.pf(" // the node table opens the body, or the body has none\n") g.pf(" int64_t count = 0;\n") g.pf(" if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; }\n") @@ -232,7 +249,19 @@ func (g *tableGen) emitVariableMessageSurface(st *ir.Struct) { } g.pf(" used += root_bytes;\n") g.pf(" nodes.good = true;\n") - g.pf(" out->unknown += unknown_records;\n\n") + if g.retain { + g.pf(" // A NODE RECORD whose type id this reader cannot name is one of the SIX\n") + g.pf(" // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means\n") + g.pf(" // renumbering a graph the writer numbers from its own edges.\n") + g.pf(" out->unknown += unknown_records;\n") + g.pf(" out->retain_lost += unknown_records;\n") + g.pf(" // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and\n") + g.pf(" // writes into neither id list, because a retained record carries its\n") + g.pf(" // field's identity in the record itself (§6.6).\n") + g.pf(" TableRetainReset( retain, nodes, region );\n\n") + } else { + g.pf(" out->unknown += unknown_records;\n\n") + } g.pf(" // PASS TWO: each record's body into its own storage, in wire order\n") g.pf(" r.offset = records_start;\n") g.pf(" for ( int64_t k = 0; k < count; k++ )\n {\n") @@ -248,23 +277,40 @@ func (g *tableGen) emitVariableMessageSurface(st *ir.Struct) { g.pf(" if ( directory[k + 1].offset == kTableNodeAbsent )\n {\n") g.pf(" if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; }\n") g.pf(" continue;\n }\n") - g.pf(" if ( !%sNodeMessageBody( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset ) ) { return false; }\n", n) + if g.retain { + g.pf(" if ( !%sNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; }\n", n) + } else { + g.pf(" if ( !%sNodeMessageBody( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset ) ) { return false; }\n", n) + } g.pf(" }\n") g.pf(" if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent\n\n") g.pf(" // and the ROOT's own body last\n") if g.anyExtent { g.pf(" nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's\n") } - g.pf(" return %sLoadMessageBody( r, vocabulary, out, nodes, index_bits, *root );\n}\n\n", n) + if g.retain { + g.pf(" return %sLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) );\n}\n\n", n) + } else { + g.pf(" return %sLoadMessageBody( r, vocabulary, out, nodes, index_bits, *root );\n}\n\n", n) + } // LoadMessages: the batch into ONE region - g.pf("// %sLoadMessages: decode a BATCH into the caller's exact-sized region and\n", n) + g.pf("// %s%s: decode a BATCH into the caller's exact-sized region and\n", n, g.messageBatchVerb()) g.pf("// write each body's root into `roots`. `count` is IN and OUT: the storage the\n") g.pf("// caller has room for, then what it got. M above the capacity is a refusal\n") g.pf("// by name with count holding the wire's M; damage inside body k delivers\n") g.pf("// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows\n") g.pf("// no reference, so there is no depth cap and no visited set. NULL roots\n") g.pf("// beyond count are not bodies.\n") - g.pf("inline bool %sLoadMessages( const %s ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableReport * report )\n{\n", n, n) + if g.retain { + g.pf("// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6):\n") + g.pf("// `retains` is an array parallel to `roots`, each entry reset by this call\n") + g.pf("// and each holding the records of the body it belongs to, which is what keeps\n") + g.pf("// a record's first step an index into that body's own node directory. A\n") + g.pf("// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own\n") + g.pf("// pair unchanged: retention writing FORM 2 refuses by name (§3.3).\n") + } + g.pf("inline bool %s( const %s ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes,%s TableReport * report )\n{\n", + g.messageBatchVerbOf(n), n, g.retainBatchParam()) g.pf(" TableReport ignored;\n") g.pf(" TableReport * out = report != NULL ? report : &ignored;\n") g.pf(" if ( roots == NULL || count == NULL ) { out->malformed = true; return false; }\n") @@ -279,13 +325,52 @@ func (g *tableGen) emitVariableMessageSurface(st *ir.Struct) { g.pf(" int64_t used = 0;\n") g.pf(" for ( int64_t b = 0; b < bodies; b++ )\n {\n") g.pf(" roots[b] = NULL;\n") - g.pf(" if ( !%sLoadMessageBodyInto( br.r, vocabulary, out, region, region_bytes, used, roots[b] ) ) { *count = b; return false; }\n", n) + if g.retain { + g.pf(" if ( !%s( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; }\n", + g.verb(n, "LoadMessageBodyInto")) + } else { + g.pf(" if ( !%sLoadMessageBodyInto( br.r, vocabulary, out, region, region_bytes, used, roots[b] ) ) { *count = b; return false; }\n", n) + } g.pf(" br.remaining--;\n }\n") g.pf(" *count = bodies;\n") g.pf(" return TableMessageBatchClose( br );\n}\n\n") } +// messageBatchVerb is the batch's own READ verb under the family being +// emitted. The page spells no name for the form-2 retaining read: §6.6 and §3.3 +// name it "the message form's LoadRetain" and §11's claimed set carries +// `SaveRetainMessages`, the write refusal, and no read spelling beside it. The +// reduce-cases name is the one this claims, `LoadRetainMessages` beside +// `LoadMessages`, and it is claimed in `tableGeneratedVerbs` and §11 on that +// list's own rule, because it is EMITTED. +func (g *tableGen) messageBatchVerb() string { + if g.retain { + return "LoadRetainMessages" + } + return "LoadMessages" +} + +func (g *tableGen) messageBatchVerbOf(name string) string { return name + g.messageBatchVerb() } + +// retainIntoParam is the one argument a retaining body-into takes: THIS BODY's +// own retention buffer (docs/SPEC-TABLES.md §3.3, §6.6). +func (g *tableGen) retainIntoParam() string { + if g.retain { + return ", TableRetain * retain" + } + return "" +} + +// retainBatchParam is the array of them the batch takes, parallel to the +// caller's array of roots. +func (g *tableGen) retainBatchParam() string { + if g.retain { + return " TableRetain * retains," + } + return "" +} + // emitRootNodeMessageDispatch emits the three answers a MESSAGE load needs // about a wire type id, over the members this root's numbering can name // (docs/SPEC-TABLES.md §3.1, §3.3): the storage a record commands, the extent @@ -295,6 +380,13 @@ func (g *tableGen) emitRootNodeMessageDispatch(st *ir.Struct) { reachable := ir.PointerReachable(st) blobs := reachableBlobs(st) + if g.retain { + // THE STORAGE AND THE EXTENT ARE THE PLAIN FAMILY'S, unchanged: they + // read the framing and no body, so retention has nothing to say about + // either and the retain pass emits the BODY dispatch alone. + g.emitRootNodeMessageBodyDispatch(st, reachable) + return + } g.pf("// %sNodeMessageStorage: the region bytes one record commands on the message\n", n) g.pf("// wire, or -1 for a type id this build cannot name. A table's is its own\n") g.pf("// storage plus the extent its maps take; a byte buffer's is its header and\n") @@ -340,9 +432,23 @@ func (g *tableGen) emitRootNodeMessageDispatch(st *ir.Struct) { } g.pf(" return TableMessageSkipBody( r, vocabulary, index_bits );\n}\n\n") - g.pf("// %sNodeMessageBody: PASS TWO's half, which decodes one record's body into\n", n) + g.emitRootNodeMessageBodyDispatch(st, reachable) +} + +// emitRootNodeMessageBodyDispatch is PASS TWO's half of the dispatch, emitted +// once per family: the plain one and, under retention, the same switch with the +// caller's store and this node's own path root threaded through it. +func (g *tableGen) emitRootNodeMessageBodyDispatch(st *ir.Struct, reachable []*ir.Struct) { + n := st.Name + g.pf("// %s%s: PASS TWO's half, which decodes one record's body into\n", n, g.verb("", "NodeMessageBody")) g.pf("// storage it already owns, its map entries carved from its own extent.\n") - g.pf("inline bool %sNodeMessageBody( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at )\n{\n", n) + if g.retain { + g.pf("// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the\n") + g.pf("// index is this body's own directory position, which the batch's load fills\n") + g.pf("// from the framing and nothing afterwards renumbers.\n") + } + g.pf("inline bool %s( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at%s )\n{\n", + g.verb(n, "NodeMessageBody"), g.retainNodeBodyParams()) // A LIST CARVES FROM THE NODE'S EXTENT EXACTLY AS A MAP DOES // (docs/SPEC-TABLES.md §2.8, §2.9), so the cursor rides wherever the unit // has an extent at all and not only where it has a map. @@ -372,10 +478,22 @@ func (g *tableGen) emitRootNodeMessageDispatch(st *ir.Struct) { if !anyVar { g.pf(" (void) nodes; (void) index_bits; // every node this root can name is a FIXED table\n") } + if g.retain && len(reachable) == 0 { + // a root whose numbering can name no TABLE record: a blob's bytes carry + // no body, so there is nothing under this node for a path to reach + g.pf(" (void) retain; (void) node;\n") + } g.pf(" bool ok = false;\n") g.pf(" switch ( type_id )\n {\n") for _, t := range reachable { - g.pf(" case 0x%016xull: ok = %s; break; // %s\n", ir.TableWireId(t.Name), g.msgLoadCall(t.Name, "r", fmt.Sprintf("*(%s *) at", t.Name)), t.Name) + call := g.msgLoadCall(nil, t.Name, "r", fmt.Sprintf("*(%s *) at", t.Name)) + if g.retain { + call = fmt.Sprintf("%sLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(%s *) at, retain, TableRetainPathRoot( (const void *) at, node ) )", t.Name, t.Name) + if !g.isVar(t.Name) { + call = fmt.Sprintf("%sLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(%s *) at, retain, TableRetainPathRoot( (const void *) at, node ) )", t.Name, t.Name) + } + } + g.pf(" case 0x%016xull: ok = %s; break; // %s\n", ir.TableWireId(t.Name), call, t.Name) } g.pf(" // a record this dispatch cannot name never reaches here: pass one left it absent\n") g.pf(" default: report->malformed = true; break;\n }\n") diff --git a/internal/codegen/cpptable/retain.go b/internal/codegen/cpptable/retain.go index 583f79c73..2ea1e3570 100644 --- a/internal/codegen/cpptable/retain.go +++ b/internal/codegen/cpptable/retain.go @@ -1258,6 +1258,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} ` // ---- the emitted surface (docs/SPEC-TABLES.md §6.6) ---- @@ -1292,11 +1724,13 @@ func (g *tableGen) emitRetainDeclarations(members []*ir.Struct) { g.pf("template inline bool %sSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const %s & value, TableRetain * retain, const TableRetainPath & path );\n", st.Name, st.Name) g.pf("template inline bool %sSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const %s & value, TableRetain * retain, const TableRetainPath & path );\n", st.Name, st.Name) g.pf("inline bool %sLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, %s & value, TableRetain * retain, const TableRetainPath & path );\n", st.Name, st.Name) + g.pf("inline bool %sLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, %s & value, TableRetain * retain, const TableRetainPath & path );\n", st.Name, st.Name) continue } g.pf("inline int64_t %sMeasureBodyRetain( TableRetainIds & ids, const %s & value, TableRetain * retain, const TableRetainPath & path );\n", st.Name, st.Name) g.pf("%s bool %sSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const %s & value, TableRetain * retain, const TableRetainPath & path );\n", tableInlineMacro(g.unit.Package), st.Name, st.Name) g.pf("%s bool %sLoadBodyRetain( TableReader & r, %s & value, TableRetain * retain, const TableRetainPath & path );\n", tableInlineMacro(g.unit.Package), st.Name, st.Name) + g.pf("inline bool %sLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, %s & value, TableRetain * retain, const TableRetainPath & path );\n", st.Name, st.Name) } g.pf("\n") } @@ -1310,6 +1744,11 @@ func (g *tableGen) emitRetainBodies(members []*ir.Struct) { g.emitTableMeasure(st) g.emitTableWrite(st) g.emitTableRead(st) + // AND THE MESSAGE FORM'S OWN BODY beside it (docs/SPEC-TABLES.md §3.3): + // a form-2 read retains where a form-2 write refuses by name, so the + // LOAD half of that family is emitted here and the measure and the save + // are not. + g.emitMessageLoadBody(st) } g.retain = false g.setOwner(nil) @@ -1365,6 +1804,12 @@ func (g *tableGen) emitRetainRoot(st *ir.Struct) { g.retain = true g.emitRootNodeBody(st, reachable, blobs) g.emitVariableLoad(st) + // THE MESSAGE FORM'S LoadRetain (docs/SPEC-TABLES.md §3.3): the batch's + // read half over this root, with the caller's stores threaded. There is no + // measure and no save beside it, because retention writing form 2 refuses + // by name and the file form's own pair is what a caller saves through. + g.emitRootNodeMessageDispatch(st) + g.emitVariableMessageLoadSurface(st) g.retain = false g.pf("// %sMeasureRetain and %sSaveRetain: the pair, with the retained tail in\n", n, n) diff --git a/internal/tablewire/messagedecode.go b/internal/tablewire/messagedecode.go index cfb6a162f..2ab4c274c 100644 --- a/internal/tablewire/messagedecode.go +++ b/internal/tablewire/messagedecode.go @@ -65,6 +65,14 @@ func MessageCount(data []byte, v *Vocabulary) (int, error) { // is read. The storage for body `k` holds whatever the decode had put in // it, and the COUNT is what says it is not a body. func DecodeMessages(m *tabletext.Model, insts []*tabletext.Instance, data []byte, v *Vocabulary, report *tabletext.Report) (int, bool, error) { + return decodeMessagesWith(m, insts, data, v, report, nil) +} + +// decodeMessagesWith is the batch read under an optional RETENTION STATE A +// BODY (docs/SPEC-TABLES.md §6.6, retainmessage.go). `states` is nil for the +// plain read and holds one entry per body for the retaining one, so the plain +// path is the path it always was and retains nothing. +func decodeMessagesWith(m *tabletext.Model, insts []*tabletext.Instance, data []byte, v *Vocabulary, report *tabletext.Report, states []*retainState) (int, bool, error) { // THE FORM BYTE IS READ FIRST, before the count and before any body, so a // wire that is both a form this reader does not carry and damaged is a // refusal and never damage (§3). @@ -95,6 +103,9 @@ func DecodeMessages(m *tabletext.Model, insts []*tabletext.Instance, data []byte } for i := range count { d := &bitDecoder{m: m, v: v, report: report, r: r, refBits: v.RefBits(), indexBits: ir.TableMessageBitsRequired(0, 1)} + if i < len(states) { + d.rt = states[i] + } if !d.root(insts[i]) { return i, false, nil } @@ -136,6 +147,26 @@ type bitDecoder struct { // many entries carry it (§2.8, §4). It is consumed by the entry body it // was set for, so a nested body never sees it. mapKey *bool + // rt, when set, is THIS BODY's retention state (§6.6): the caller's two + // stores and the ids this build can spell. A batch holds one a body, + // because a body carries its own node directory inside the batch's one + // region and a record's first step is an index into it (§3.3). + rt *retainState +} + +// dropped runs one element's read with RETENTION OFF (docs/SPEC-TABLES.md +// §6.6). A bit stream has to be walked past, so an element the reader is +// dropping — an unknown keyed slot's, a keyed key past this build's slots, an +// array element past this build's bound — is DECODED into a sink where a file's +// reader steps over it by its length. Nothing in that body is a field of this +// region: the slot or the element is what was excluded, and everything under it +// went with it under that one `retain_lost`. +func (d *bitDecoder) dropped(read func() bool) bool { + was := d.rt + d.rt = nil + ok := read() + d.rt = was + return ok } // BitSpot is one number's place in a batch's bit stream: a reference at @@ -440,10 +471,17 @@ func (d *bitDecoder) body(inst *tabletext.Instance) bool { i, known := index[entry.Id] if !known { d.report.Unknown++ + // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits + // (retainmessage.go): the plain read's verdict on this entry is the + // skip's, whether or not this build retains. + at := d.r.off if !d.skip(entry) { d.report.Malformed = true return false } + if d.rt != nil { + d.rt.captureMessage(d, inst, entry, at, d.r.off) + } continue } fv := &inst.Fields[i] @@ -479,6 +517,11 @@ func (d *bitDecoder) body(inst *tabletext.Instance) bool { } continue } + if discardsWhole(fv.Def) { + // THE FIELD IS BEING READ AGAIN (docs/SPEC-TABLES.md §6.6): every + // record under it goes before the winning occurrence is read. + d.rt.forgetField(fv) + } if !d.field(fv, entry) { return false } @@ -692,6 +735,13 @@ func (d *bitDecoder) array(fv *tabletext.Field, entry ir.TableVocabularyEntry) b // exists to find the bit the array ENDS at, and where the element's width // is announced that bit is a multiplication rather than a loop, which is // also what keeps a zero-width element under a wide count bounded. + // A SECOND OCCURRENCE OF A COLLECTION REPLACES IT WHOLE, and it takes its + // discard HERE rather than at the field: the commitment is past the count + // and the align, and a header that turned the occurrence inert would have + // left the field standing with its records (docs/SPEC-TABLES.md §6.6). + for i := range fv.Elems { + d.rt.forgetCellRecords(&fv.Elems[i]) + } walk := n if run >= 0 && walk > kept { walk = kept @@ -699,13 +749,20 @@ func (d *bitDecoder) array(fv *tabletext.Field, entry ir.TableVocabularyEntry) b for i := uint64(0); i < walk; i++ { var sink tabletext.Cell cell := &sink + mine := true if f.Array == ir.ArrayList { fv.Elems = append(fv.Elems, d.m.ElementZero(f)) cell = &fv.Elems[i] } else if i < kept { cell = &fv.Elems[i] + } else { + mine = false // an element past this build's bound: read into a sink and dropped + } + element := func() bool { return d.element(cell, f, shape) } + if !mine { + element = func() bool { return d.dropped(func() bool { return d.element(cell, f, shape) }) } } - if !d.element(cell, f, shape) { + if !element() { return false } } @@ -730,6 +787,7 @@ func (d *bitDecoder) element(cell *tabletext.Cell, f *ir.Field, shape ir.TableMe } switch int(shape.Elem) { case ir.TableKindTable: + d.rt.forgetCellRecords(cell) // the element's earlier body goes with it (§6.6) cell.Tab = d.m.New(tabletext.StructOf(f)) return d.body(cell.Tab) case ir.TableKindPointer: @@ -775,15 +833,33 @@ func (d *bitDecoder) keyed(fv *tabletext.Field, entry ir.TableVocabularyEntry) b value := enumValueForId(f.KeyEnumRef, key.Id) var sink tabletext.Cell cell := &sink + kept := true switch { case value < 0: d.report.Unknown++ + if d.rt != nil { + // AN UNKNOWN KEYED-ARRAY SLOT IS AN EXCLUDED CLASS + // (docs/SPEC-TABLES.md §6.6): a slot is not a field, the reader + // rewrites the array body whole, and a slot has nowhere to + // append to. + d.rt.lost(d.report) + } + kept = false case value > int64(tabletext.KeyedSlotCount(f)): d.report.Clamped++ + kept = false default: + // A KEYED-ARRAY SLOT WRITTEN AGAIN is one of §6.6's four + // occurrences, and only the slots this occurrence carries are + // replaced: the rest stand, and so do their records. The discard + // is the element's own, below. cell = &fv.Elems[value-1] } - if !d.element(cell, f, shape) { + element := func() bool { return d.element(cell, f, shape) } + if !kept { + element = func() bool { return d.dropped(func() bool { return d.element(cell, f, shape) }) } + } + if !element() { return false } } @@ -809,6 +885,12 @@ func (d *bitDecoder) mapField(fv *tabletext.Field, entry ir.TableVocabularyEntry d.report.Malformed = true return false } + // A SECOND OCCURRENCE OF A MAP REPLACES IT WHOLE (docs/SPEC-TABLES.md + // §6.6): every record under an entry the earlier occurrence held goes with + // the entry, and the discard moves neither counter. + for i := range fv.Entries { + d.rt.forgetCellRecords(&fv.Entries[i]) + } fv.Entries = nil var last *tabletext.Instance // A KEY KIND THIS DECLARATION WIDENS IS NOT A DISAGREEMENT (§2.8, §4): @@ -825,7 +907,10 @@ func (d *bitDecoder) mapField(fv *tabletext.Field, entry ir.TableVocabularyEntry } key := tabletext.MapKeyOf(f, decoded) if !tabletext.MapKeyFits(f, key) { - // KEYS NEVER CLAMP: the entry is dropped whole, one count per entry + // KEYS NEVER CLAMP: the entry is dropped whole, one count per entry. + // A record the decode captured under it is one the save's walk will + // not reach, and it counts its `retain_lost` THERE, exactly as the + // file form's own dropped entry does (§6.6). d.report.Clamped++ continue } @@ -839,6 +924,9 @@ func (d *bitDecoder) mapField(fv *tabletext.Field, entry ir.TableVocabularyEntry } if order == 0 { // EQUAL: a DUPLICATE. Last wins WHOLE, and the count excludes it. + // A MAP'S DUPLICATE KEY is one of §6.6's four occurrences: the + // records the slot's earlier entry held go with it. + d.rt.forgetCellRecords(&fv.Entries[len(fv.Entries)-1]) fv.Entries[len(fv.Entries)-1] = tabletext.Cell{Tab: decoded} d.report.Duplicate++ last = decoded @@ -860,6 +948,10 @@ func (d *bitDecoder) mapField(fv *tabletext.Field, entry ir.TableVocabularyEntry // arm's payload is skipped by the ARM's own announced entry. func (d *bitDecoder) unionCell(cell *tabletext.Cell, f *ir.Field) bool { un := tabletext.UnionOf(f) + // A UNION WHOSE ARM IS WRITTEN AGAIN, THE SAME ARM OR ANOTHER, is one of + // §6.6's four occurrences: the earlier arm body's records go with it, and + // the discard moves neither counter. + d.rt.forgetArm(cell) ref, ok := d.reference() if !ok { d.report.Malformed = true @@ -886,6 +978,12 @@ func (d *bitDecoder) unionCell(cell *tabletext.Cell, f *ir.Field) bool { if tag == 0 { cell.U = 0 d.report.Unknown++ + if d.rt != nil { + // AN UNKNOWN UNION ARM ID IS AN EXCLUDED CLASS + // (docs/SPEC-TABLES.md §6.6): the same as an unknown enum variant, + // one level in, because the union FIELD is the reader's. + d.rt.lost(d.report) + } return d.skip(entry) } arm := un.Variants[tag-1] @@ -906,6 +1004,7 @@ func (d *bitDecoder) unionCell(cell *tabletext.Cell, f *ir.Field) bool { return true case arm.Body(): cell.Tab = d.m.New(arm.Ref) + d.rt.builtArm(cell, cell.Tab) return d.body(cell.Tab) } fv := d.m.NewArm(arm) @@ -958,6 +1057,13 @@ func (d *bitDecoder) enumCell(cell *tabletext.Cell, f *ir.Field) bool { if v < 0 { cell.U = 0 d.report.Unknown++ + if d.rt != nil { + // AN UNKNOWN ENUM VARIANT REFERENCE IS AN EXCLUDED CLASS + // (docs/SPEC-TABLES.md §6.6): the FIELD is the reader's, and the + // reader writes its own value under that id, so a retained copy + // would be a second occurrence of an id the reader already wrote. + d.rt.lost(d.report) + } return true } cell.U = uint64(v) diff --git a/internal/tablewire/retain.go b/internal/tablewire/retain.go index fd5d54c16..abbfc0d93 100644 --- a/internal/tablewire/retain.go +++ b/internal/tablewire/retain.go @@ -160,6 +160,15 @@ func (rt *retainState) forget(inst *tabletext.Instance) { } } +// forgetCellRecords is forgetCell with the nil-state check the exported +// entry points carry, for a caller that discards one cell rather than a body. +func (rt *retainState) forgetCellRecords(cell *tabletext.Cell) { + if rt == nil { + return + } + rt.forgetCell(cell) +} + func (rt *retainState) forgetCell(cell *tabletext.Cell) { if cell.Tab != nil { rt.forget(cell.Tab) @@ -561,11 +570,20 @@ func (rt *retainState) capture(inst *tabletext.Instance, id uint64, kind uint8, rt.lost(report) return } - // THE EXPANSION IS BOUNDED, AND THIS ENGINE STATES THE CONSTANT: a record - // costs the id it rides under, its kind byte and the resolved payload, - // which is the wire's bytes plus seven for each reference widened to eight - // and this engine's own fixed-width inner lengths (§6.6). - cost := 9 + len(rs.out) + rt.keep(inst, id, kind, rs.out, report) +} + +// keep is the CAPACITY and the counter, which every capture answers the same +// way whatever form it read from: the file's resolving walk above and the +// message form's transcoding one (retainmessage.go) both land here, so the +// accounting is stated once. +// +// THE EXPANSION IS BOUNDED, AND THIS ENGINE STATES THE CONSTANT: a record costs +// the id it rides under, its kind byte and the resolved payload, which is the +// wire's bytes plus seven for each reference widened to eight and this engine's +// own fixed-width inner lengths (§6.6). +func (rt *retainState) keep(inst *tabletext.Instance, id uint64, kind uint8, payload []byte, report *tabletext.Report) { + cost := 9 + len(payload) if !rt.store.fits(cost) { // REFUSAL IS PER RECORD AND NEVER PARTIAL: the record is not written // at all, the read continues, and the buffer never holds a truncated @@ -574,7 +592,7 @@ func (rt *retainState) capture(inst *tabletext.Instance, id uint64, kind uint8, rt.lost(report) return } - rt.store.records[inst] = append(rt.store.records[inst], retainedField{id: id, kind: kind, payload: rs.out, cost: cost}) + rt.store.records[inst] = append(rt.store.records[inst], retainedField{id: id, kind: kind, payload: payload, cost: cost}) report.Retained++ } diff --git a/internal/tablewire/retain_test.go b/internal/tablewire/retain_test.go index f08f276f8..003db64af 100644 --- a/internal/tablewire/retain_test.go +++ b/internal/tablewire/retain_test.go @@ -729,13 +729,33 @@ func TestRetainMessageForm(t *testing.T) { // array whose element kind is 17, and a table whose payload meets a 17 // three bodies down. THE SECOND carries two retained fields and nothing // excluded. - if report.Retained != 10 || report.RetainLost != 6 || report.Unknown != 16 { - t.Fatalf("retained=%d retain_lost=%d unknown=%d, want 10 / 6 / 16", + // + // `unknown` IS SEVENTEEN AND NOT SIXTEEN, and the seventeenth is the plain + // read's own: a bit stream has to be walked past, so the DISCARDED SLOT's + // element body is decoded into a sink where a file's reader steps over it + // by its length, and the field inside it that this build cannot name counts + // there. Retention keeps nothing under it — the slot is what was excluded + // and everything below it went with that one `retain_lost` — so the two + // retention counters are the numbers the file form gives. + if report.Retained != 10 || report.RetainLost != 6 || report.Unknown != 17 { + t.Fatalf("retained=%d retain_lost=%d unknown=%d, want 10 / 6 / 17", report.Retained, report.RetainLost, report.Unknown) } if report.KindMismatch != 0 || report.Clamped != 0 || report.Widened != 0 { t.Fatalf("retention moved a read counter: %+v", report) } + // AND THE PLAIN READ OF THE SAME BATCH SAYS THE SAME SEVENTEEN, which is + // what makes that line the READ's and not retention's: the three names are + // ADDITIVE and retention moves no existing counter (§6.6). + var plain tabletext.Report + if _, _, err := tablewire.DecodeMessages(m, []*tabletext.Instance{ + m.New(m.Lookup("Node")), m.New(m.Lookup("Node")), + }, batch, v, &plain); err != nil { + t.Fatal(err) + } + if plain.Unknown != report.Unknown || plain.Retained != 0 || plain.RetainLost != 0 { + t.Fatalf("the plain read says %+v beside the retaining read's %+v", plain, report) + } // AND THE SAVE IS THE FILE FORM'S, byte for byte the reference's own pin for i, inst := range insts { diff --git a/internal/tablewire/retainmessage.go b/internal/tablewire/retainmessage.go new file mode 100644 index 000000000..3cdfa033d --- /dev/null +++ b/internal/tablewire/retainmessage.go @@ -0,0 +1,496 @@ +// RETAIN-UNKNOWN ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3, §6.6). +// +// `LoadRetain` reads a form-`2` body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and `SaveRetain` writing form `2` refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the round trip a +// caller has is form 2 in and form 1 out: the file carries its own table and +// takes §6.6 unchanged. +// +// THE RECORD IS THE FILE FORM'S OWN, to the byte. A retained record must carry +// the field's identity and bytes WITH EVERY REFERENCE RESOLVED, so that +// re-emitting it into any id table is correct, and the table it is re-emitted +// into is a FILE's. So the capture here is a TRANSCODE as well as a resolve: a +// bitpacked payload is read at the width its announced shape states and written +// at the width the file form spells, and from there it is the same record the +// file's own capture makes and the same emitter writes back. Nothing below +// copies the emit side, and nothing below is a second record layout. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's own verdict on an unknown entry is the skip's — a variant reference +// that names an entry carrying a payload is damage whether or not this build +// retains — and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture then re-reads the bits the skip +// delimited, and a capture that lands anywhere but the skip's own end drops the +// record: two engines that disagree about a payload's width would otherwise +// disagree in silence. It is two flat passes over one record's bits and never a +// walk that doubles at every level, which is what the cost rule forbids (§6.6). +package tablewire + +import ( + "encoding/binary" + "math" + "math/big" + + "github.com/mas-bandwidth/schema/v2/internal/tabletext" + "github.com/mas-bandwidth/schema/v2/ir" +) + +// DecodeRetainMessages is [DecodeMessages] with retention on +// (docs/SPEC-TABLES.md §3.3, §6.6). It reads exactly what [DecodeMessages] +// reads and reports exactly what it reports, and beside that it keeps the +// fields this build cannot name, in the caller's own buffers. +// +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY. The batch is one +// region and each body carries its OWN node directory inside it (§3.3), so a +// record's first step is an index into the directory of the body it came from, +// and the buffer that holds it is that body's own: `retains[k]` belongs to +// `insts[k]`, is reset by this call, and is what `EncodeRetain` from that +// instance reads. A caller with fewer buffers than the batch has bodies is +// refused before a body is read, on the batch bound's own terms. +func DecodeRetainMessages(m *tabletext.Model, insts []*tabletext.Instance, data []byte, v *Vocabulary, retains []*Retain, report *tabletext.Report) (int, bool, error) { + if retains == nil { + return DecodeMessages(m, insts, data, v, report) + } + if len(retains) < len(insts) { + insts = insts[:len(retains)] + } + states := make([]*retainState, len(insts)) + for i := range states { + if retains[i] != nil { + states[i] = newRetainState(m, retains[i]) + } + } + return decodeMessagesWith(m, insts, data, v, report, states) +} + +// captureMessage is the whole of the load side for one unknown entry: the +// outer-kind exclusion, the transcoding walk, the capacity, and the counter +// each answers. `at` is where the payload began and `end` where the skip left +// the reader, and the walk must land on `end` exactly. +func (rt *retainState) captureMessage(d *bitDecoder, inst *tabletext.Instance, entry ir.TableVocabularyEntry, at, end int) { + if entry.Kind == ir.TableKindPointer { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + rt.lost(d.report) + return + } + rs := &resolver{} + was := d.r.off + d.r.off = at + rs.msgPayload(d, entry, 0) + landed := d.r.off + d.r.off = was + if rs.bad || landed != end { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // `malformed` DOES NOT MOVE (§6.6). + rt.lost(d.report) + return + } + rt.keep(inst, entry.Id, entry.Kind, rs.out, d.report) +} + +// msgRef resolves one reference against the CONNECTION'S VOCABULARY and answers +// the sixty-four-bit id it names. It is the file walk's own verdict read +// against an announcement instead of a trailer (§6.6): a reference of zero, one +// above the entry count, and one naming a RESERVED id, which would be +// re-emitted into a nested body where it is malformed, all drop the record. +func (rs *resolver) msgRef(d *bitDecoder) uint64 { + ref, ok := d.reference() + if !ok { + rs.bad = true + return 0 + } + return rs.msgId(d, ref) +} + +func (rs *resolver) msgId(d *bitDecoder, ref uint64) uint64 { + entry, named := d.entry(ref) + if !named || reserved(entry.Id) || entry.Id == 0 { + rs.bad = true + return 0 + } + return entry.Id +} + +// msgPayload is the resolving walk over ONE announced payload — a field's, an +// array element's, a union arm's — written out in the FILE form's own spelling. +// +// WHICH KINDS THE WALK TOUCHES is §6.6's list unchanged: kind 13, a body's +// fields; kind 15, an arm id and then the arm's payload under this same rule; +// kind 30, a variant id; kind 14 at its element kind; and kind 16 at EVERY +// element kind, because a keyed body carries a KEY REFERENCE per slot whatever +// the elements are. What the file form COPIES VERBATIM is transcoded here +// instead, because a bitpacked value is not the file's bytes. +// +// KIND 17 IS WHAT THE WALK IS LOOKING FOR AS MUCH AS A REFERENCE IS: meeting +// one anywhere in the payload drops the whole record, which is what keeps a +// retained record from ever carrying a node index. +func (rs *resolver) msgPayload(d *bitDecoder, entry ir.TableVocabularyEntry, depth int) { + if rs.bad { + return + } + switch int(entry.Kind) { + case ir.TableKindPointer: + // THE NODE-INDEX CLASS, met inside a payload rather than at the outer + // kind: the record is dropped whole (§6.6) + rs.bad = true + case 0: + // A KIND-0 ENTRY IS A NAME (§3.3) and names no payload the file form + // has a kind for, so a body that used one as a field is a shape this + // walk cannot frame: the plain read skips it and this drops it. + rs.bad = true + case ir.TableKindNoPayload: + // kind 32 rides no bits here and an empty framed payload on the file + rs.out = appendLeb(rs.out, 0) + case ir.TableKindEnum: + ref, ok := d.reference() + if !ok { + rs.bad = true + return + } + if ref == 0 { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, not + // a reference, and it rides back as one + rs.u64(0) + return + } + rs.u64(rs.msgId(d, ref)) + case ir.TableKindUnion: + ref, ok := d.reference() + if !ok { + rs.bad = true + return + } + if ref == 0 { + rs.u64(0) + return + } + arm, named := d.entry(ref) + if !named || reserved(arm.Id) || arm.Kind == 0 { + rs.bad = true + return + } + rs.u64(arm.Id) + rs.u8(arm.Kind) + rs.msgFramed(d, arm, depth) + case ir.TableKindTable, ir.TableKindArray, ir.TableKindKeyed: + rs.msgFramed(d, entry, depth) + case ir.TableKindString, ir.TableKindWstring, ir.TableKindEscape: + // an opaque payload rides behind a CANONICAL LEB128 LENGTH on the file + b := rs.msgOpaque(d, entry) + if rs.bad { + return + } + rs.out = appendLeb(rs.out, uint64(len(b))) + rs.out = append(rs.out, b...) + default: + rs.msgScalar(d, entry) + } +} + +// msgOpaque reads one text or blob payload and answers its FILE bytes. Each of +// the three has its own framing here and none of them on the file, where the +// payload's own length frames it: a `string(N)` or a `bytes(N)` is a length at +// its own width, the ALIGN that buys a memcpy, then the bytes; a wide string is +// a length and then SIXTEEN bits a code unit, which is two file bytes each; and +// the ESCAPE aligns, reads a thirty-two bit L and takes L bytes opaque (§3.3). +func (rs *resolver) msgOpaque(d *bitDecoder, entry ir.TableVocabularyEntry) []byte { + n := 0 + switch int(entry.Kind) { + case ir.TableKindString, ir.TableKindWstring: + raw, ok := d.r.get(ir.TableMessageBitsRequired(0, entry.Shape.Max)) + if !ok { + rs.bad = true + return nil + } + n = int(raw) + if entry.Kind == ir.TableKindWstring { + n *= 2 + } else if !d.r.align() { + rs.bad = true + return nil + } + default: + if !d.r.align() { + rs.bad = true + return nil + } + raw, ok := d.r.get(32) + if !ok { + rs.bad = true + return nil + } + n = int(raw) + } + b, ok := d.r.bytes(n) + if !ok { + rs.bad = true + return nil + } + return b +} + +// msgFramed writes one CONTENT behind a length. The lengths inside a record are +// this engine's own spelling, so each is written after the content it frames +// and the capture costs one pass (§6.6). +func (rs *resolver) msgFramed(d *bitDecoder, entry ir.TableVocabularyEntry, depth int) { + at := rs.mark() + rs.msgContent(d, entry, depth+1) + rs.patch(at) +} + +// msgContent resolves a payload the file form frames by a length: a kind 13, +// 14 or 16 field's own body, a union arm's payload, and an enum-keyed slot's +// element. +func (rs *resolver) msgContent(d *bitDecoder, entry ir.TableVocabularyEntry, depth int) { + if rs.bad { + return + } + if depth > retainDepthCap { + // THE WALK'S NESTING CAP: a record past it is dropped on the same rule + // as any other shape the walk cannot take (§6.6) + rs.bad = true + return + } + switch int(entry.Kind) { + case ir.TableKindPointer: + rs.bad = true + case ir.TableKindTable: + rs.msgBody(d, depth) + case ir.TableKindArray, ir.TableKindKeyed: + rs.msgElements(d, entry, depth) + case ir.TableKindUnion, ir.TableKindEnum: + rs.msgPayload(d, entry, depth) + case ir.TableKindNoPayload: + // nothing rides, and the outer length is what says so + case ir.TableKindString, ir.TableKindEscape, ir.TableKindWstring: + // a content copied whole carries no inner length: the outer one frames + // it, which is what a keyed slot's element takes + rs.msgText(d, entry) + default: + rs.msgScalar(d, entry) + } +} + +// msgText is a text or blob content under an outer length: the same bytes +// msgPayload writes, without the inner length the outer one replaces. +func (rs *resolver) msgText(d *bitDecoder, entry ir.TableVocabularyEntry) { + b := rs.msgOpaque(d, entry) + if rs.bad { + return + } + rs.out = append(rs.out, b...) +} + +// msgElements is one array's or one keyed body's content: the element kind, the +// count, and the elements. A KEYED SLOT IS A TRIPLE — the key reference, the +// element's own length, and the element — and its keys resolve at every element +// kind (§3.2, §6.6). +func (rs *resolver) msgElements(d *bitDecoder, entry ir.TableVocabularyEntry, depth int) { + shape := entry.Shape + if shape.Elem == ir.TableKindPointer { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + rs.bad = true + return + } + n := uint64(shape.Min) + width := ir.TableMessageCountBits(shape) + if entry.Kind == ir.TableKindKeyed { + width, n = ir.TableMessageBitsRequired(0, shape.Max), 0 + } + if width > 0 { + raw, ok := d.r.get(width) + if !ok { + rs.bad = true + return + } + n = raw + if entry.Kind == ir.TableKindArray { + n += uint64(shape.Min) + } + } + if ir.TableMessageAligns(entry.Kind, shape) && !d.r.align() { + rs.bad = true + return + } + inner := ir.TableMessageShape{} + if shape.Inner != nil { + inner = *shape.Inner + } + element := ir.TableVocabularyEntry{Kind: shape.Elem, Shape: inner} + rs.u8(shape.Elem) + rs.u64(n) + for range n { + if rs.bad { + return + } + if entry.Kind == ir.TableKindKeyed { + rs.u64(rs.msgRef(d)) + rs.msgFramed(d, element, depth) + continue + } + rs.msgPayload(d, element, depth) + } +} + +// msgBody resolves one nested body: its fields, each an entry REFERENCE and the +// payload that entry's shape frames, ending at the body's own ZERO REFERENCE. +func (rs *resolver) msgBody(d *bitDecoder, depth int) { + for { + if rs.bad { + return + } + ref, ok := d.reference() + if !ok { + rs.bad = true + return + } + if ref == 0 { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + rs.u64(0) + return + } + entry, named := d.entry(ref) + if !named || reserved(entry.Id) || entry.Id == 0 { + rs.bad = true + return + } + rs.u64(entry.Id) + rs.u8(entry.Kind) + rs.msgPayload(d, entry, depth) + } +} + +// msgScalar transcodes ONE announced value: read at the width the shape states, +// written at the width the file form spells. It is the third of the three ways +// the form changes a value (§3.3) taken in the one direction retention has: a +// mask rides at its declared W bits and a compressed float as its QUANTIZED +// INDEX here, and the file carries the mask's own storage width and the float +// the index names. +// +// NO CLAMP FIRES AND NO RANGE IS APPLIED. The value is the SENDER's, under an +// id this reader cannot name, so there is no declaration to bound it by: the +// walk reads kind bytes, lengths and references and takes no branch on a +// payload byte (§6.6, THE SECURITY BOUND). +func (rs *resolver) msgScalar(d *bitDecoder, entry ir.TableVocabularyEntry) { + kind := int(entry.Kind) + shape := entry.Shape + switch kind { + case ir.TableKindBool: + v, ok := d.r.get(1) + if !ok { + rs.bad = true + return + } + rs.u8(uint8(v)) + return + case ir.TableKindF64: + raw, ok := d.r.get(64) + if !ok { + rs.bad = true + return + } + rs.out = binary.LittleEndian.AppendUint64(rs.out, raw) + return + case ir.TableKindF32: + rs.msgFloat32(d, shape) + return + } + width := int(ir.TableMessageValueBits(entry.Kind, shape)) + if width < 0 { + rs.bad = true + return + } + base := shape.Base + if base == nil { + base = big.NewInt(0) + } + if ir.TableKindWide(kind) { + var value *big.Int + if shape.Packing == ir.TableMessageRanged { + offset, ok := d.r.getBig(width) + if !ok { + rs.bad = true + return + } + value = new(big.Int).Add(offset, base) + } else { + raw, ok := d.r.bytes(16) + if !ok { + rs.bad = true + return + } + value = tabletext.WideFromBytes(raw, kind) + } + rs.out = append(rs.out, tabletext.WideBytes(value, kind)...) + return + } + raw, ok := d.r.get(width) + if !ok { + rs.bad = true + return + } + signed := ir.TableKindSigned(kind) + var value uint64 + switch { + case shape.Packing == ir.TableMessageRanged && signed: + value = uint64(int64(raw) + base.Int64()) + case shape.Packing == ir.TableMessageRanged: + value = raw + base.Uint64() // the unsigned domain, whole: the sum wraps into the bits below + case signed && width < 64 && width > 0: + shift := uint(64 - width) + value = uint64(int64(raw<> shift) + default: + value = raw + } + rs.msgWord(value, kind) +} + +// msgWord writes one integer at the FILE's own width for its kind, little +// endian, which is two's complement where the kind is signed. +func (rs *resolver) msgWord(value uint64, kind int) { + switch ir.TableKindWidth(kind) { + case 1: + rs.u8(uint8(value)) + case 2: + rs.out = binary.LittleEndian.AppendUint16(rs.out, uint16(value)) + case 4: + rs.out = binary.LittleEndian.AppendUint32(rs.out, uint32(value)) + case 8: + rs.u64(value) + default: + rs.bad = true + } +} + +// msgFloat32 reads an f32 at the sender's packing: the IEEE bit pattern where +// it rides raw, and the float its INDEX names where the sender quantized it +// (SPEC.md §4.3). An index above `count` is rejected, as the packet wire +// rejects it, and drops the record. +func (rs *resolver) msgFloat32(d *bitDecoder, shape ir.TableMessageShape) { + if shape.Packing == ir.TableMessageQuantized { + index, ok := d.r.get(int(shape.Bits)) + if !ok { + rs.bad = true + return + } + count, _, derived := ir.TableMessageQuantization(shape) + if !derived || index > uint64(count) { + rs.bad = true + return + } + v := ir.TableMessageDequantize(shape, uint32(index)) + rs.out = binary.LittleEndian.AppendUint32(rs.out, math.Float32bits(v)) + return + } + raw, ok := d.r.get(32) + if !ok { + rs.bad = true + return + } + rs.out = binary.LittleEndian.AppendUint32(rs.out, uint32(raw)) +} diff --git a/test/tables/retain_main.cpp b/test/tables/retain_main.cpp index 5252e786c..9fc545338 100644 --- a/test/tables/retain_main.cpp +++ b/test/tables/retain_main.cpp @@ -1036,7 +1036,7 @@ static void message_form() // down. THE SECOND BODY carries two retained fields and nothing excluded. CHECK( report.retained == 10 ); CHECK( report.retain_lost == 6 ); - CHECK( report.unknown == 16 ); + CHECK( report.unknown == 17 ); // and the READ'S OWN COUNTERS ARE UNMOVED: retention can lose a field and // can never turn a good read into a bad one (§6.6) CHECK( report.kind_mismatch == 0 && report.clamped == 0 && report.widened == 0 ); diff --git a/testdata/golden/tables/arms/CarryTable.h b/testdata/golden/tables/arms/CarryTable.h index 57dcdce4f..1d4eacd66 100644 --- a/testdata/golden/tables/arms/CarryTable.h +++ b/testdata/golden/tables/arms/CarryTable.h @@ -4241,6 +4241,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace armdemo #endif // ARMDEMO_SCHEMA_TABLE_RETAIN @@ -5367,18 +5799,22 @@ template inline int64_t LeafMeasureBodyRetain( const Ctx & ctx, c template inline bool LeafSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Leaf & value, TableRetain * retain, const TableRetainPath & path ); template inline bool LeafSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Leaf & value, TableRetain * retain, const TableRetainPath & path ); inline bool LeafLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Leaf & value, TableRetain * retain, const TableRetainPath & path ); +inline bool LeafLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Leaf & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t HolderMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Holder & value, TableRetain * retain, const TableRetainPath & path ); template inline bool HolderSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Holder & value, TableRetain * retain, const TableRetainPath & path ); template inline bool HolderSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Holder & value, TableRetain * retain, const TableRetainPath & path ); inline bool HolderLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Holder & value, TableRetain * retain, const TableRetainPath & path ); +inline bool HolderLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Holder & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t HandMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Hand & value, TableRetain * retain, const TableRetainPath & path ); template inline bool HandSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Hand & value, TableRetain * retain, const TableRetainPath & path ); template inline bool HandSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Hand & value, TableRetain * retain, const TableRetainPath & path ); inline bool HandLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Hand & value, TableRetain * retain, const TableRetainPath & path ); +inline bool HandLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Hand & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t ChainMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Chain & value, TableRetain * retain, const TableRetainPath & path ); template inline bool ChainSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Chain & value, TableRetain * retain, const TableRetainPath & path ); template inline bool ChainSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Chain & value, TableRetain * retain, const TableRetainPath & path ); inline bool ChainLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Chain & value, TableRetain * retain, const TableRetainPath & path ); +inline bool ChainLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Chain & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t LeafMeasureBody( const Ctx & ctx, const TableNumbering & numbering, TableIds & ids, const Leaf & value ) @@ -12203,6 +12639,92 @@ inline bool LeafLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Lea } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool LeafLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Leaf & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + LeafReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3e7884bf4f412c6full: // items + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 4 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + TableListFill fill = TableListFillBegin( nodes, value.items, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + int32_t * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + const int64_t width_2 = entry.elem_value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( entry.elem_packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) entry.elem_base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + ( *slot ) = decoded_v_2; + } + } + TableListFillEnd( fill ); + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t HolderMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Holder & value, TableRetain * retain, const TableRetainPath & path ) { @@ -12530,13 +13052,192 @@ inline bool HolderLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, H } } -template -inline int64_t HandMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Hand & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool HolderLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Holder & value, TableRetain * retain, const TableRetainPath & path ) { - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.entries_count < 0 || value.entries_count > 2 ) { return -1; } // storage invariant - if ( value.entries_count > 0 ) - { + (void) nodes; (void) index_bits; + HolderReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xafcd9a3b099f8ef0ull: // carry + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 15 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 0 ); + { + uint64_t arm_ref = 0; + if ( !r.get( arm_ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry arm; + if ( arm_ref == 0 ) { value.carry.type = CarryType::None; } + else if ( !TableMessageArmEntry( vocabulary, arm_ref, arm ) ) { report->malformed = true; return false; } + else + { + switch ( arm.id ) + { + case 0x24ad84ada20208d5ull: // leaf + { + if ( arm.kind != 13 || arm.elem_kind != 0 ) + { + value.carry.type = CarryType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.carry.type = CarryType::Leaf; + if ( !LeafLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, value.carry.leaf, retain, TableRetainStepInto( path, 0, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + case 0xfd4d194e1652b207ull: // plain + { + if ( arm.kind != 4 || arm.elem_kind != 0 ) + { + if ( TableKindWidens( arm.kind, 4 ) ) + { + value.carry.type = CarryType::Plain; + memset( (void *) &value.carry.plain, 0, sizeof( value.carry.plain ) ); // selection establishes the arm (§2.6) + { + const int64_t width_2 = arm.value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( arm.packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) arm.base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + value.carry.plain = decoded_v_2; + } + report->widened++; + break; + } + value.carry.type = CarryType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.carry.type = CarryType::Plain; + { + const int64_t width_2 = arm.value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( arm.packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) arm.base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + value.carry.plain = decoded_v_2; + } + break; + } + default: + value.carry.type = CarryType::None; report->unknown++; report->retain_lost++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + } + } + break; + } + case 0xd94c56ef0798d723ull: // tail + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 4 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + TableListFill fill = TableListFillBegin( nodes, value.tail, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + int32_t * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + const int64_t width_2 = entry.elem_value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( entry.elem_packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) entry.elem_base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + ( *slot ) = decoded_v_2; + } + } + TableListFillEnd( fill ); + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t HandMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Hand & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.entries_count < 0 || value.entries_count > 2 ) { return -1; } // storage invariant + if ( value.entries_count > 0 ) + { const uint64_t ref_entries = ids.ref( 0xc5b2a72c0845a253ull ); int64_t body_entries = 0; body_entries += 1 + TableLebBytes( (uint64_t) ( value.entries_count ) ); // the element kind byte and the count @@ -12851,50 +13552,255 @@ inline bool HandLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Han } } -template -inline int64_t ChainMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Chain & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool HandLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Hand & value, TableRetain * retain, const TableRetainPath & path ) { - int64_t bytes = 1; // the ZERO REFERENCE that ends the body + (void) nodes; (void) index_bits; + HandReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - // links: a kind 14 array of kind 15 elements, INDEX order (§2.9) - TableListCursor cursor_links = TableListElements( ctx, value.links ); - if ( !cursor_links.ok ) { return -1; } // the slot and the head disagree - if ( cursor_links.count > 0 ) // an EMPTY list elides, the by-value rule (§3) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - const uint64_t ref_links = ids.ref( 0x5cc201a9f1b8274eull ); - int64_t body_links = 0; - body_links += 1 + TableLebBytes( (uint64_t) ( cursor_links.count ) ); // the element kind byte and the count - for ( int32_t elem_i_links = 0; elem_i_links < cursor_links.count; elem_i_links++ ) + case 0xc5b2a72c0845a253ull: // entries { - if ( cursor_links[elem_i_links].type == CarryType::None ) { body_links += 1; } // a None element is the zero reference in its place - else + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 15 ) { - switch ( cursor_links[elem_i_links].type ) + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) { - case CarryType::None: break; - case CarryType::Leaf: + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 2 ) { kept = 2; report->clamped++; } else { kept = (int32_t) n; } + const uint64_t walk = n; + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + Carry scratch; { - int64_t arm_payload_linksu = 0; - const uint64_t arm_ref_linksu = ids.ref( 0x24ad84ada20208d5ull ); + uint64_t arm_ref_2 = 0; + if ( !r.get( arm_ref_2, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry arm_2; + if ( arm_ref_2 == 0 ) { ( in_bounds ? value.entries[i] : scratch ).type = CarryType::None; } + else if ( !TableMessageArmEntry( vocabulary, arm_ref_2, arm_2 ) ) { report->malformed = true; return false; } + else { - const int64_t arm_body_linksu = LeafMeasureBodyRetain( ctx, numbering, ids, cursor_links[elem_i_links].leaf, retain, TableRetainStepInto( TableRetainStepInto( path, 0, (uint32_t) ( elem_i_links ) ), 0, (uint32_t) ( 0 ) ) ); - if ( arm_body_linksu < 0 ) { return -1; } - arm_payload_linksu += arm_body_linksu; // the arm's own table body (§3) - } - body_links += TableLebBytes( arm_ref_linksu ) + 1 + TableLebBytes( (uint64_t) ( arm_payload_linksu ) ) + ( arm_payload_linksu ); - break; - } - case CarryType::Plain: - { - int64_t arm_payload_linksu = 0; - const uint64_t arm_ref_linksu = ids.ref( 0xfd4d194e1652b207ull ); - arm_payload_linksu += 4; // int32 - body_links += TableLebBytes( arm_ref_linksu ) + 1 + TableLebBytes( (uint64_t) ( arm_payload_linksu ) ) + ( arm_payload_linksu ); - break; - } - default: return -1; // invalid tag — the write side refuses it too - } - } + switch ( arm_2.id ) + { + case 0x24ad84ada20208d5ull: // leaf + { + if ( arm_2.kind != 13 || arm_2.elem_kind != 0 ) + { + ( in_bounds ? value.entries[i] : scratch ).type = CarryType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + ( in_bounds ? value.entries[i] : scratch ).type = CarryType::Leaf; + if ( !LeafLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, ( in_bounds ? value.entries[i] : scratch ).leaf, ( in_bounds ? retain : NULL ), TableRetainStepInto( TableRetainStepInto( path, 0, (uint32_t) ( i ) ), 0, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + case 0xfd4d194e1652b207ull: // plain + { + if ( arm_2.kind != 4 || arm_2.elem_kind != 0 ) + { + if ( TableKindWidens( arm_2.kind, 4 ) ) + { + ( in_bounds ? value.entries[i] : scratch ).type = CarryType::Plain; + memset( (void *) &( in_bounds ? value.entries[i] : scratch ).plain, 0, sizeof( ( in_bounds ? value.entries[i] : scratch ).plain ) ); // selection establishes the arm (§2.6) + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + ( in_bounds ? value.entries[i] : scratch ).plain = decoded_v_3; + } + report->widened++; + break; + } + ( in_bounds ? value.entries[i] : scratch ).type = CarryType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + ( in_bounds ? value.entries[i] : scratch ).type = CarryType::Plain; + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + ( in_bounds ? value.entries[i] : scratch ).plain = decoded_v_3; + } + break; + } + default: + ( in_bounds ? value.entries[i] : scratch ).type = CarryType::None; report->unknown++; report->retain_lost++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + } + } + } + value.entries_count = kept; + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t ChainMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Chain & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { + // links: a kind 14 array of kind 15 elements, INDEX order (§2.9) + TableListCursor cursor_links = TableListElements( ctx, value.links ); + if ( !cursor_links.ok ) { return -1; } // the slot and the head disagree + if ( cursor_links.count > 0 ) // an EMPTY list elides, the by-value rule (§3) + { + const uint64_t ref_links = ids.ref( 0x5cc201a9f1b8274eull ); + int64_t body_links = 0; + body_links += 1 + TableLebBytes( (uint64_t) ( cursor_links.count ) ); // the element kind byte and the count + for ( int32_t elem_i_links = 0; elem_i_links < cursor_links.count; elem_i_links++ ) + { + if ( cursor_links[elem_i_links].type == CarryType::None ) { body_links += 1; } // a None element is the zero reference in its place + else + { + switch ( cursor_links[elem_i_links].type ) + { + case CarryType::None: break; + case CarryType::Leaf: + { + int64_t arm_payload_linksu = 0; + const uint64_t arm_ref_linksu = ids.ref( 0x24ad84ada20208d5ull ); + { + const int64_t arm_body_linksu = LeafMeasureBodyRetain( ctx, numbering, ids, cursor_links[elem_i_links].leaf, retain, TableRetainStepInto( TableRetainStepInto( path, 0, (uint32_t) ( elem_i_links ) ), 0, (uint32_t) ( 0 ) ) ); + if ( arm_body_linksu < 0 ) { return -1; } + arm_payload_linksu += arm_body_linksu; // the arm's own table body (§3) + } + body_links += TableLebBytes( arm_ref_linksu ) + 1 + TableLebBytes( (uint64_t) ( arm_payload_linksu ) ) + ( arm_payload_linksu ); + break; + } + case CarryType::Plain: + { + int64_t arm_payload_linksu = 0; + const uint64_t arm_ref_linksu = ids.ref( 0xfd4d194e1652b207ull ); + arm_payload_linksu += 4; // int32 + body_links += TableLebBytes( arm_ref_linksu ) + 1 + TableLebBytes( (uint64_t) ( arm_payload_linksu ) ) + ( arm_payload_linksu ); + break; + } + default: return -1; // invalid tag — the write side refuses it too + } + } } bytes += TableLebBytes( ref_links ) + 1 + TableLebBytes( (uint64_t) ( body_links ) ) + ( body_links ); } @@ -13186,77 +14092,279 @@ inline bool ChainLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Ch } } -// LeafNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it -// already owns. -// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the -// index is the region directory's, which Load fills from the wire's framing -// and nothing afterwards renumbers. -inline void LeafNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) -{ - // the node's own EXTENT, where its lists' and maps' arrays are carved - // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). - // The tool's path carries a worker instead: there the arrays are the - // arena's. - TableExtentCarve carve; - carve.worker = nodes.worker; - if ( carve.worker == NULL ) - { - TableRefuseReason reason = count_over_length; // pass one already refused what this could refuse - const int64_t storage = LeafNodeStorage( type_id, r.size, reason ); - const int64_t record = storage > 0 ? LeafNodeRecordBytes( type_id ) : 0; - carve.at = at + record; - carve.left = storage > record ? storage - record : 0; - } - nodes.carve = &carve; - (void) nodes; // every node this root can name is a FIXED table - (void) retain; (void) node; - switch ( type_id ) - { - default: break; - } - nodes.carve = NULL; // the cursor is ONE node's, and this node's body is done -} - -// LeafLoadRetain: decode the tolerant wire into the caller's exact-sized region and -// return the root. LOAD IS A SCAN, and that is the whole of its bound: it -// follows no reference, so there is no depth cap, no visited set and no -// ordering rule on the indices. Partial results are kept, as everywhere on -// this wire — the report says what happened. NULL means the CALLER's buffer -// was wrong. -// UNDER RETENTION it also fills the caller's two stores with the fields -// this build cannot name, and the report carries what it could not keep -// (docs/SPEC-TABLES.md §6.6). It is Load's own path and nothing else: the -// reader's data is exactly what it would have been with retention off. -inline const Leaf * LeafLoadRetain( uint8_t * region, int64_t region_bytes, const uint8_t * wire_file, int64_t wire_file_bytes, TableRetain * retain, TableReport * report ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool ChainLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Chain & value, TableRetain * retain, const TableRetainPath & path ) { - TableReport ignored; - TableReport * out = report != NULL ? report : &ignored; - // THE FORM BYTE IS READ FIRST, then the trailer, and only then a body: - // a file that is both a newer form and damaged is a REFUSAL and never - // damage (docs/SPEC-TABLES.md §3). - TableIdTable ids_table; - int64_t body_bytes = 0; - const TableOpenVerdict verdict = TableOpen( wire_file, wire_file_bytes, ids_table, body_bytes ); - if ( verdict != TableOpenOk ) - { - if ( verdict == TableOpenDamaged ) { out->malformed = true; } else { out->refused = true; if ( wire_file_bytes > 0 && wire_file[0] == kTableWireMessageForm ) { out->reason = message_form_as_file; } else { out->reason = newer_form; } } - return NULL; - } - if ( TableBodyEndsEarly( wire_file + 1, body_bytes, ids_table ) ) + (void) nodes; (void) index_bits; + ChainReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - out->malformed = true; // a byte no field claims, before the table (§3) - return NULL; - } - const uint8_t * const wire = wire_file + 1; - const int64_t wire_bytes = body_bytes; - if ( region == NULL || region_bytes < (int64_t) sizeof( Leaf ) ) { out->malformed = true; return NULL; } - if ( ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return NULL; } - memset( region, 0, (size_t) region_bytes ); - uint64_t type_id = 0; - const uint8_t * body = NULL; - int64_t length = 0; - - // the record count and the data bytes, from the FRAMING alone + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x5cc201a9f1b8274eull: // links + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 15 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableListFill fill = TableListFillBegin( nodes, value.links, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + Carry * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + uint64_t arm_ref_2 = 0; + if ( !r.get( arm_ref_2, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry arm_2; + if ( arm_ref_2 == 0 ) { ( *slot ).type = CarryType::None; } + else if ( !TableMessageArmEntry( vocabulary, arm_ref_2, arm_2 ) ) { report->malformed = true; return false; } + else + { + switch ( arm_2.id ) + { + case 0x24ad84ada20208d5ull: // leaf + { + if ( arm_2.kind != 13 || arm_2.elem_kind != 0 ) + { + ( *slot ).type = CarryType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + ( *slot ).type = CarryType::Leaf; + if ( !LeafLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, ( *slot ).leaf, retain, TableRetainStepInto( path, 0, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + case 0xfd4d194e1652b207ull: // plain + { + if ( arm_2.kind != 4 || arm_2.elem_kind != 0 ) + { + if ( TableKindWidens( arm_2.kind, 4 ) ) + { + ( *slot ).type = CarryType::Plain; + memset( (void *) &( *slot ).plain, 0, sizeof( ( *slot ).plain ) ); // selection establishes the arm (§2.6) + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + ( *slot ).plain = decoded_v_3; + } + report->widened++; + break; + } + ( *slot ).type = CarryType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + ( *slot ).type = CarryType::Plain; + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + ( *slot ).plain = decoded_v_3; + } + break; + } + default: + ( *slot ).type = CarryType::None; report->unknown++; report->retain_lost++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + } + } + } + TableListFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +// LeafNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it +// already owns. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is the region directory's, which Load fills from the wire's framing +// and nothing afterwards renumbers. +inline void LeafNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + // the node's own EXTENT, where its lists' and maps' arrays are carved + // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). + // The tool's path carries a worker instead: there the arrays are the + // arena's. + TableExtentCarve carve; + carve.worker = nodes.worker; + if ( carve.worker == NULL ) + { + TableRefuseReason reason = count_over_length; // pass one already refused what this could refuse + const int64_t storage = LeafNodeStorage( type_id, r.size, reason ); + const int64_t record = storage > 0 ? LeafNodeRecordBytes( type_id ) : 0; + carve.at = at + record; + carve.left = storage > record ? storage - record : 0; + } + nodes.carve = &carve; + (void) nodes; // every node this root can name is a FIXED table + (void) retain; (void) node; + switch ( type_id ) + { + default: break; + } + nodes.carve = NULL; // the cursor is ONE node's, and this node's body is done +} + +// LeafLoadRetain: decode the tolerant wire into the caller's exact-sized region and +// return the root. LOAD IS A SCAN, and that is the whole of its bound: it +// follows no reference, so there is no depth cap, no visited set and no +// ordering rule on the indices. Partial results are kept, as everywhere on +// this wire — the report says what happened. NULL means the CALLER's buffer +// was wrong. +// UNDER RETENTION it also fills the caller's two stores with the fields +// this build cannot name, and the report carries what it could not keep +// (docs/SPEC-TABLES.md §6.6). It is Load's own path and nothing else: the +// reader's data is exactly what it would have been with retention off. +inline const Leaf * LeafLoadRetain( uint8_t * region, int64_t region_bytes, const uint8_t * wire_file, int64_t wire_file_bytes, TableRetain * retain, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + // THE FORM BYTE IS READ FIRST, then the trailer, and only then a body: + // a file that is both a newer form and damaged is a REFUSAL and never + // damage (docs/SPEC-TABLES.md §3). + TableIdTable ids_table; + int64_t body_bytes = 0; + const TableOpenVerdict verdict = TableOpen( wire_file, wire_file_bytes, ids_table, body_bytes ); + if ( verdict != TableOpenOk ) + { + if ( verdict == TableOpenDamaged ) { out->malformed = true; } else { out->refused = true; if ( wire_file_bytes > 0 && wire_file[0] == kTableWireMessageForm ) { out->reason = message_form_as_file; } else { out->reason = newer_form; } } + return NULL; + } + if ( TableBodyEndsEarly( wire_file + 1, body_bytes, ids_table ) ) + { + out->malformed = true; // a byte no field claims, before the table (§3) + return NULL; + } + const uint8_t * const wire = wire_file + 1; + const int64_t wire_bytes = body_bytes; + if ( region == NULL || region_bytes < (int64_t) sizeof( Leaf ) ) { out->malformed = true; return NULL; } + if ( ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return NULL; } + memset( region, 0, (size_t) region_bytes ); + uint64_t type_id = 0; + const uint8_t * body = NULL; + int64_t length = 0; + + // the record count and the data bytes, from the FRAMING alone TableRefuseReason reason = count_over_length; // LoadMeasure is where a caller reads it; a Load past a refusal is malformed int64_t root_extent = 0; if ( !LeafWireExtent( wire, wire_bytes, root_extent, &ids_table, reason ) ) { out->malformed = true; return NULL; } @@ -13330,33 +14438,209 @@ inline const Leaf * LeafLoadRetain( uint8_t * region, int64_t region_bytes, cons if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } } - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + LeafNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Leaf ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + LeafLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// LeafNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool LeafNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + LeafNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !LeafNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// LeafLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool LeafLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Leaf * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !LeafMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = LeafNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + LeafNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !LeafMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Leaf ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xa5c085b4bb73d1b5ull; + Leaf * root = new ( region + used ) Leaf; // lifetime only: LoadMessageBody's first act is LeafReset + LeafReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Leaf ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - LeafNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; } + if ( !LeafNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Leaf ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - LeafLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return LeafLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// LeafLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool LeafLoadRetainMessages( const Leaf ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !LeafLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // LeafMeasureRetain and LeafSaveRetain: the pair, with the retained tail in @@ -13580,71 +14864,247 @@ inline const Holder * HolderLoadRetain( uint8_t * region, int64_t region_bytes, // belongs to this region from here on. TableRetainReset( retain, nodes, region ); - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Holder ) ) + root_extent ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = HolderNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + directory[k + 1].type_id = type_id; + } + else + { + directory[k + 1].offset = (uint64_t) used; + directory[k + 1].type_id = type_id; + HolderNodePlace( type_id, region + used, length ); + used += storage; + } + k++; + } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + HolderNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Holder ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + HolderLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// HolderNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool HolderNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + HolderNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !HolderNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// HolderLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool HolderLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Holder * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !HolderMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = HolderNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + HolderNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !HolderMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Holder ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xa1f526c44ead452full; + Holder * root = new ( region + used ) Holder; // lifetime only: LoadMessageBody's first act is HolderReset + HolderReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Holder ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Holder ) ) + root_extent ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - int64_t storage = HolderNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) - { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; - directory[k + 1].type_id = type_id; - } - else - { - directory[k + 1].offset = (uint64_t) used; - directory[k + 1].type_id = type_id; - HolderNodePlace( type_id, region + used, length ); - used += storage; - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } - } - - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) - { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + if ( directory[k + 1].offset == kTableNodeAbsent ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - HolderNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; } + if ( !HolderNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Holder ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - HolderLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return HolderLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// HolderLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool HolderLoadRetainMessages( const Holder ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !HolderLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // HolderMeasureRetain and HolderSaveRetain: the pair, with the retained tail in @@ -13868,71 +15328,247 @@ inline const Hand * HandLoadRetain( uint8_t * region, int64_t region_bytes, cons // belongs to this region from here on. TableRetainReset( retain, nodes, region ); - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Hand ) ) + root_extent ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = HandNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + directory[k + 1].type_id = type_id; + } + else + { + directory[k + 1].offset = (uint64_t) used; + directory[k + 1].type_id = type_id; + HandNodePlace( type_id, region + used, length ); + used += storage; + } + k++; + } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + HandNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Hand ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + HandLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// HandNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool HandNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + HandNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !HandNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// HandLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool HandLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Hand * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !HandMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = HandNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + HandNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !HandMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Hand ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x58ba95d8757c67c0ull; + Hand * root = new ( region + used ) Hand; // lifetime only: LoadMessageBody's first act is HandReset + HandReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Hand ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Hand ) ) + root_extent ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - int64_t storage = HandNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) - { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; - directory[k + 1].type_id = type_id; - } - else - { - directory[k + 1].offset = (uint64_t) used; - directory[k + 1].type_id = type_id; - HandNodePlace( type_id, region + used, length ); - used += storage; - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } - } - - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) - { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + if ( directory[k + 1].offset == kTableNodeAbsent ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - HandNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; } + if ( !HandNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Hand ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - HandLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return HandLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// HandLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool HandLoadRetainMessages( const Hand ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !HandLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // HandMeasureRetain and HandSaveRetain: the pair, with the retained tail in @@ -14223,6 +15859,182 @@ inline const Chain * ChainLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// ChainNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool ChainNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + ChainNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !ChainNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// ChainLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool ChainLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Chain * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !ChainMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = ChainNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + ChainNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !ChainMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Chain ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x670377dcbe2f82b6ull; + Chain * root = new ( region + used ) Chain; // lifetime only: LoadMessageBody's first act is ChainReset + ChainReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Chain ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !ChainNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return ChainLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// ChainLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool ChainLoadRetainMessages( const Chain ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !ChainLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // ChainMeasureRetain and ChainSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/arms/GateTable.h b/testdata/golden/tables/arms/GateTable.h index 4913868fb..fb451508e 100644 --- a/testdata/golden/tables/arms/GateTable.h +++ b/testdata/golden/tables/arms/GateTable.h @@ -4241,6 +4241,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace armdemo #endif // ARMDEMO_SCHEMA_TABLE_RETAIN @@ -5328,10 +5760,12 @@ template inline bool TableNodeMessageSave( const Ctx & ctx, const inline int64_t OnlyMeasureBodyRetain( TableRetainIds & ids, const Only & value, TableRetain * retain, const TableRetainPath & path ); ARMDEMO_TABLE_INLINE bool OnlySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Only & value, TableRetain * retain, const TableRetainPath & path ); ARMDEMO_TABLE_INLINE bool OnlyLoadBodyRetain( TableReader & r, Only & value, TableRetain * retain, const TableRetainPath & path ); +inline bool OnlyLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Only & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t GateMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Gate & value, TableRetain * retain, const TableRetainPath & path ); template inline bool GateSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Gate & value, TableRetain * retain, const TableRetainPath & path ); template inline bool GateSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Gate & value, TableRetain * retain, const TableRetainPath & path ); inline bool GateLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Gate & value, TableRetain * retain, const TableRetainPath & path ); +inline bool GateLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Gate & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t OnlyMeasureBody( TableIds & ids, const Only & value ) { @@ -7608,6 +8042,98 @@ ARMDEMO_TABLE_INLINE bool OnlyLoadBodyRetain( TableReader & r, Only & value, Tab } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool OnlyLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Only & value, TableRetain * retain, const TableRetainPath & path ) +{ + OnlyReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xaf63ea4c86020456ull: // w + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.w = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.w = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t GateMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Gate & value, TableRetain * retain, const TableRetainPath & path ) { @@ -7913,11 +8439,217 @@ inline bool GateLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Gat } } -// GateNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it -// already owns. -// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the -// index is the region directory's, which Load fills from the wire's framing -// and nothing afterwards renumbers. +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool GateLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Gate & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + GateReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x891da1f305deb858ull: // reach + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 15 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 0 ); + { + uint64_t arm_ref = 0; + if ( !r.get( arm_ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry arm; + if ( arm_ref == 0 ) { value.reach.type = ReachType::None; } + else if ( !TableMessageArmEntry( vocabulary, arm_ref, arm ) ) { report->malformed = true; return false; } + else + { + switch ( arm.id ) + { + case 0x072ddab46af04ab7ull: // only + { + if ( arm.kind != 17 || arm.elem_kind != 0 ) + { + value.reach.type = ReachType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.reach.type = ReachType::Only; + { + uint64_t node_index_2 = 0; + if ( !r.get( node_index_2, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.reach.only, node_index_2, 0x31badbc06c5f0b97ull, report ); // *Only + } + break; + } + case 0xfa04f4ef1995407eull: // text + { + if ( arm.kind != 17 || arm.elem_kind != 0 ) + { + value.reach.type = ReachType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.reach.type = ReachType::Text; + { + uint64_t node_index_2 = 0; + if ( !r.get( node_index_2, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.reach.text, node_index_2, kTableStringTypeId, report ); // *string + } + break; + } + case 0xfd4d194e1652b207ull: // plain + { + if ( arm.kind != 4 || arm.elem_kind != 0 ) + { + if ( TableKindWidens( arm.kind, 4 ) ) + { + value.reach.type = ReachType::Plain; + memset( (void *) &value.reach.plain, 0, sizeof( value.reach.plain ) ); // selection establishes the arm (§2.6) + { + const int64_t width_2 = arm.value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( arm.packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) arm.base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + value.reach.plain = decoded_v_2; + } + report->widened++; + break; + } + value.reach.type = ReachType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.reach.type = ReachType::Plain; + { + const int64_t width_2 = arm.value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( arm.packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) arm.base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + value.reach.plain = decoded_v_2; + } + break; + } + default: + value.reach.type = ReachType::None; report->unknown++; report->retain_lost++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + } + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +// GateNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it +// already owns. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is the region directory's, which Load fills from the wire's framing +// and nothing afterwards renumbers. inline void GateNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) { // the node's own EXTENT, where its lists' and maps' arrays are carved @@ -8095,6 +8827,178 @@ inline const Gate * GateLoadRetain( uint8_t * region, int64_t region_bytes, cons return root; } +// GateNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool GateNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + GateNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !GateNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + bool ok = false; + switch ( type_id ) + { + case 0x31badbc06c5f0b97ull: ok = OnlyLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(Only *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Only + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// GateLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool GateLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Gate * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !GateMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = GateNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + GateNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Gate ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xb5877a7e05bbfed2ull; + Gate * root = new ( region + used ) Gate; // lifetime only: LoadMessageBody's first act is GateReset + GateReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Gate ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !GateNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return GateLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// GateLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool GateLoadRetainMessages( const Gate ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !GateLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // GateMeasureRetain and GateSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/arms/NestTable.h b/testdata/golden/tables/arms/NestTable.h index c65182742..6cd57f00f 100644 --- a/testdata/golden/tables/arms/NestTable.h +++ b/testdata/golden/tables/arms/NestTable.h @@ -4242,6 +4242,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace armdemo #endif // ARMDEMO_SCHEMA_TABLE_RETAIN @@ -5344,10 +5776,12 @@ template inline int64_t TwigMeasureBodyRetain( const Ctx & ctx, c template inline bool TwigSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Twig & value, TableRetain * retain, const TableRetainPath & path ); template inline bool TwigSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Twig & value, TableRetain * retain, const TableRetainPath & path ); inline bool TwigLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Twig & value, TableRetain * retain, const TableRetainPath & path ); +inline bool TwigLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Twig & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t NestMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Nest & value, TableRetain * retain, const TableRetainPath & path ); template inline bool NestSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Nest & value, TableRetain * retain, const TableRetainPath & path ); template inline bool NestSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Nest & value, TableRetain * retain, const TableRetainPath & path ); inline bool NestLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Nest & value, TableRetain * retain, const TableRetainPath & path ); +inline bool NestLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Nest & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t TwigMeasureBody( const Ctx & ctx, const TableNumbering & numbering, TableIds & ids, const Twig & value ) @@ -9124,54 +9558,190 @@ inline bool TwigLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Twi } } -template -inline int64_t NestMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Nest & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool TwigLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Twig & value, TableRetain * retain, const TableRetainPath & path ) { - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.outer.type != OuterType::None ) // None elides — the absence of the field is the None + (void) nodes; (void) index_bits; + TwigReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - bytes += TableLebBytes( ids.ref( 0x30e6ed678f5e1bd4ull ) ) + 1; - switch ( value.outer.type ) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - case OuterType::None: break; - case OuterType::Inner: + case 0x2d4c068f5f889287ull: // inner { - int64_t arm_payload = 0; - const uint64_t arm_ref = ids.ref( 0x2d4c068f5f889287ull ); - if ( value.outer.inner.type == InnerType::None ) { arm_payload += 1; } // the inner union's None: L = 1 and that one zero byte (§3) - else + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 15 || entry.elem_kind != 0 ) { - switch ( value.outer.inner.type ) + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 0 ); + { + uint64_t arm_ref = 0; + if ( !r.get( arm_ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry arm; + if ( arm_ref == 0 ) { value.inner.type = InnerType::None; } + else if ( !TableMessageArmEntry( vocabulary, arm_ref, arm ) ) { report->malformed = true; return false; } + else { - case InnerType::None: break; - case InnerType::Leaf: + switch ( arm.id ) { - int64_t arm_payloada = 0; - const uint64_t arm_refa = ids.ref( 0x24ad84ada20208d5ull ); + case 0x24ad84ada20208d5ull: // leaf { - const int64_t arm_bodya = LeafMeasureBodyRetain( ctx, numbering, ids, value.outer.inner.leaf, retain, TableRetainStepInto( path, 0, (uint32_t) ( 0 ) ) ); - if ( arm_bodya < 0 ) { return -1; } - arm_payloada += arm_bodya; // the arm's own table body (§3) + if ( arm.kind != 13 || arm.elem_kind != 0 ) + { + value.inner.type = InnerType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.inner.type = InnerType::Leaf; + if ( !LeafLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, value.inner.leaf, retain, TableRetainStepInto( path, 0, (uint32_t) ( 0 ) ) ) ) { return false; } + break; } - arm_payload += TableLebBytes( arm_refa ) + 1 + TableLebBytes( (uint64_t) ( arm_payloada ) ) + ( arm_payloada ); - break; - } - case InnerType::Plain: - { - int64_t arm_payloada = 0; - const uint64_t arm_refa = ids.ref( 0xfd4d194e1652b207ull ); - arm_payloada += 4; // int32 - arm_payload += TableLebBytes( arm_refa ) + 1 + TableLebBytes( (uint64_t) ( arm_payloada ) ) + ( arm_payloada ); - break; - } - default: return -1; // invalid tag — the write side refuses it too - } - } - bytes += TableLebBytes( arm_ref ) + 1 + TableLebBytes( (uint64_t) ( arm_payload ) ) + ( arm_payload ); - break; - } - case OuterType::Plain: - { + case 0xfd4d194e1652b207ull: // plain + { + if ( arm.kind != 4 || arm.elem_kind != 0 ) + { + if ( TableKindWidens( arm.kind, 4 ) ) + { + value.inner.type = InnerType::Plain; + memset( (void *) &value.inner.plain, 0, sizeof( value.inner.plain ) ); // selection establishes the arm (§2.6) + { + const int64_t width_2 = arm.value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( arm.packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) arm.base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + value.inner.plain = decoded_v_2; + } + report->widened++; + break; + } + value.inner.type = InnerType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.inner.type = InnerType::Plain; + { + const int64_t width_2 = arm.value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( arm.packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) arm.base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + value.inner.plain = decoded_v_2; + } + break; + } + default: + value.inner.type = InnerType::None; report->unknown++; report->retain_lost++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + } + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t NestMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Nest & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.outer.type != OuterType::None ) // None elides — the absence of the field is the None + { + bytes += TableLebBytes( ids.ref( 0x30e6ed678f5e1bd4ull ) ) + 1; + switch ( value.outer.type ) + { + case OuterType::None: break; + case OuterType::Inner: + { + int64_t arm_payload = 0; + const uint64_t arm_ref = ids.ref( 0x2d4c068f5f889287ull ); + if ( value.outer.inner.type == InnerType::None ) { arm_payload += 1; } // the inner union's None: L = 1 and that one zero byte (§3) + else + { + switch ( value.outer.inner.type ) + { + case InnerType::None: break; + case InnerType::Leaf: + { + int64_t arm_payloada = 0; + const uint64_t arm_refa = ids.ref( 0x24ad84ada20208d5ull ); + { + const int64_t arm_bodya = LeafMeasureBodyRetain( ctx, numbering, ids, value.outer.inner.leaf, retain, TableRetainStepInto( path, 0, (uint32_t) ( 0 ) ) ); + if ( arm_bodya < 0 ) { return -1; } + arm_payloada += arm_bodya; // the arm's own table body (§3) + } + arm_payload += TableLebBytes( arm_refa ) + 1 + TableLebBytes( (uint64_t) ( arm_payloada ) ) + ( arm_payloada ); + break; + } + case InnerType::Plain: + { + int64_t arm_payloada = 0; + const uint64_t arm_refa = ids.ref( 0xfd4d194e1652b207ull ); + arm_payloada += 4; // int32 + arm_payload += TableLebBytes( arm_refa ) + 1 + TableLebBytes( (uint64_t) ( arm_payloada ) ) + ( arm_payloada ); + break; + } + default: return -1; // invalid tag — the write side refuses it too + } + } + bytes += TableLebBytes( arm_ref ) + 1 + TableLebBytes( (uint64_t) ( arm_payload ) ) + ( arm_payload ); + break; + } + case OuterType::Plain: + { int64_t arm_payload = 0; const uint64_t arm_ref = ids.ref( 0xfd4d194e1652b207ull ); arm_payload += 4; // int32 @@ -9584,129 +10154,386 @@ inline bool NestLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Nes } } -// TwigNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it -// already owns. -// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the -// index is the region directory's, which Load fills from the wire's framing -// and nothing afterwards renumbers. -inline void TwigNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) -{ - // the node's own EXTENT, where its lists' and maps' arrays are carved - // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). - // The tool's path carries a worker instead: there the arrays are the - // arena's. - TableExtentCarve carve; - carve.worker = nodes.worker; - if ( carve.worker == NULL ) - { - TableRefuseReason reason = count_over_length; // pass one already refused what this could refuse - const int64_t storage = TwigNodeStorage( type_id, r.size, reason ); - const int64_t record = storage > 0 ? TwigNodeRecordBytes( type_id ) : 0; - carve.at = at + record; - carve.left = storage > record ? storage - record : 0; - } - nodes.carve = &carve; - (void) nodes; // every node this root can name is a FIXED table - (void) retain; (void) node; - switch ( type_id ) - { - default: break; - } - nodes.carve = NULL; // the cursor is ONE node's, and this node's body is done -} - -// TwigLoadRetain: decode the tolerant wire into the caller's exact-sized region and -// return the root. LOAD IS A SCAN, and that is the whole of its bound: it -// follows no reference, so there is no depth cap, no visited set and no -// ordering rule on the indices. Partial results are kept, as everywhere on -// this wire — the report says what happened. NULL means the CALLER's buffer -// was wrong. -// UNDER RETENTION it also fills the caller's two stores with the fields -// this build cannot name, and the report carries what it could not keep -// (docs/SPEC-TABLES.md §6.6). It is Load's own path and nothing else: the -// reader's data is exactly what it would have been with retention off. -inline const Twig * TwigLoadRetain( uint8_t * region, int64_t region_bytes, const uint8_t * wire_file, int64_t wire_file_bytes, TableRetain * retain, TableReport * report ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool NestLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Nest & value, TableRetain * retain, const TableRetainPath & path ) { - TableReport ignored; - TableReport * out = report != NULL ? report : &ignored; - // THE FORM BYTE IS READ FIRST, then the trailer, and only then a body: - // a file that is both a newer form and damaged is a REFUSAL and never - // damage (docs/SPEC-TABLES.md §3). - TableIdTable ids_table; - int64_t body_bytes = 0; - const TableOpenVerdict verdict = TableOpen( wire_file, wire_file_bytes, ids_table, body_bytes ); - if ( verdict != TableOpenOk ) - { - if ( verdict == TableOpenDamaged ) { out->malformed = true; } else { out->refused = true; if ( wire_file_bytes > 0 && wire_file[0] == kTableWireMessageForm ) { out->reason = message_form_as_file; } else { out->reason = newer_form; } } - return NULL; - } - if ( TableBodyEndsEarly( wire_file + 1, body_bytes, ids_table ) ) - { - out->malformed = true; // a byte no field claims, before the table (§3) - return NULL; - } - const uint8_t * const wire = wire_file + 1; - const int64_t wire_bytes = body_bytes; - if ( region == NULL || region_bytes < (int64_t) sizeof( Twig ) ) { out->malformed = true; return NULL; } - if ( ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return NULL; } - memset( region, 0, (size_t) region_bytes ); - uint64_t type_id = 0; - const uint8_t * body = NULL; - int64_t length = 0; - - // the record count and the data bytes, from the FRAMING alone - TableRefuseReason reason = count_over_length; // LoadMeasure is where a caller reads it; a Load past a refusal is malformed - int64_t root_extent = 0; - if ( !TwigWireExtent( wire, wire_bytes, root_extent, &ids_table, reason ) ) { out->malformed = true; return NULL; } - int64_t data = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Twig ) ) + root_extent ); - int64_t records = 0; - { - TableReport counting; - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, &counting, &ids_table ); - while ( TableNodeScanNext( scan, type_id, body, length ) ) - { - records++; - int64_t storage = TwigNodeStorage( type_id, length, reason ); - if ( storage == kTableNodeRefused ) { out->malformed = true; return NULL; } - if ( storage > 0 ) { data += storage; } - } - } - int64_t attribution = ( records + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); - if ( data + attribution > region_bytes ) { out->malformed = true; return NULL; } - - TableNodeMap nodes; - nodes.base = region; - nodes.entries = (const TableNodeDirEntry *) ( region + data ); - nodes.count = records + 1; - TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + data ); - directory[0].offset = 0; // position 0 is the ROOT, at offset 0 (§6.3) - directory[0].type_id = 0x9f8e22fb612a2f78ull; - Twig * root = new ( region ) Twig; // lifetime only: LoadBody's first act is TwigReset - TwigReset( *root ); - - // LoadRetain RESETS BOTH STORES and writes into neither id list: a - // retained record carries its field's identity in the record itself, - // with every reference resolved (docs/SPEC-TABLES.md §6.6). The buffer - // belongs to this region from here on. - TableRetainReset( retain, nodes, region ); - - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. + (void) nodes; (void) index_bits; + NestReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Twig ) ) + root_extent ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - int64_t storage = TwigNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) + case 0x30e6ed678f5e1bd4ull: // outer { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 15 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 0 ); + { + uint64_t arm_ref = 0; + if ( !r.get( arm_ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry arm; + if ( arm_ref == 0 ) { value.outer.type = OuterType::None; } + else if ( !TableMessageArmEntry( vocabulary, arm_ref, arm ) ) { report->malformed = true; return false; } + else + { + switch ( arm.id ) + { + case 0x2d4c068f5f889287ull: // inner + { + if ( arm.kind != 15 || arm.elem_kind != 0 ) + { + value.outer.type = OuterType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.outer.type = OuterType::Inner; + { + uint64_t arm_ref_2 = 0; + if ( !r.get( arm_ref_2, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry arm_2; + if ( arm_ref_2 == 0 ) { value.outer.inner.type = InnerType::None; } + else if ( !TableMessageArmEntry( vocabulary, arm_ref_2, arm_2 ) ) { report->malformed = true; return false; } + else + { + switch ( arm_2.id ) + { + case 0x24ad84ada20208d5ull: // leaf + { + if ( arm_2.kind != 13 || arm_2.elem_kind != 0 ) + { + value.outer.inner.type = InnerType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + value.outer.inner.type = InnerType::Leaf; + if ( !LeafLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, value.outer.inner.leaf, retain, TableRetainStepInto( path, 0, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + case 0xfd4d194e1652b207ull: // plain + { + if ( arm_2.kind != 4 || arm_2.elem_kind != 0 ) + { + if ( TableKindWidens( arm_2.kind, 4 ) ) + { + value.outer.inner.type = InnerType::Plain; + memset( (void *) &value.outer.inner.plain, 0, sizeof( value.outer.inner.plain ) ); // selection establishes the arm (§2.6) + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + value.outer.inner.plain = decoded_v_3; + } + report->widened++; + break; + } + value.outer.inner.type = InnerType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + value.outer.inner.type = InnerType::Plain; + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + value.outer.inner.plain = decoded_v_3; + } + break; + } + default: + value.outer.inner.type = InnerType::None; report->unknown++; report->retain_lost++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + } + } + break; + } + case 0xfd4d194e1652b207ull: // plain + { + if ( arm.kind != 4 || arm.elem_kind != 0 ) + { + if ( TableKindWidens( arm.kind, 4 ) ) + { + value.outer.type = OuterType::Plain; + memset( (void *) &value.outer.plain, 0, sizeof( value.outer.plain ) ); // selection establishes the arm (§2.6) + { + const int64_t width_2 = arm.value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( arm.packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) arm.base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + value.outer.plain = decoded_v_2; + } + report->widened++; + break; + } + value.outer.type = OuterType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.outer.type = OuterType::Plain; + { + const int64_t width_2 = arm.value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( arm.packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) arm.base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + value.outer.plain = decoded_v_2; + } + break; + } + default: + value.outer.type = OuterType::None; report->unknown++; report->retain_lost++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + } + } + break; + } + case 0xd94c56ef0798d723ull: // tail + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 4 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + TableListFill fill = TableListFillBegin( nodes, value.tail, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + int32_t * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + const int64_t width_2 = entry.elem_value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( entry.elem_packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) entry.elem_base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + ( *slot ) = decoded_v_2; + } + } + TableListFillEnd( fill ); + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +// TwigNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it +// already owns. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is the region directory's, which Load fills from the wire's framing +// and nothing afterwards renumbers. +inline void TwigNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + // the node's own EXTENT, where its lists' and maps' arrays are carved + // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). + // The tool's path carries a worker instead: there the arrays are the + // arena's. + TableExtentCarve carve; + carve.worker = nodes.worker; + if ( carve.worker == NULL ) + { + TableRefuseReason reason = count_over_length; // pass one already refused what this could refuse + const int64_t storage = TwigNodeStorage( type_id, r.size, reason ); + const int64_t record = storage > 0 ? TwigNodeRecordBytes( type_id ) : 0; + carve.at = at + record; + carve.left = storage > record ? storage - record : 0; + } + nodes.carve = &carve; + (void) nodes; // every node this root can name is a FIXED table + (void) retain; (void) node; + switch ( type_id ) + { + default: break; + } + nodes.carve = NULL; // the cursor is ONE node's, and this node's body is done +} + +// TwigLoadRetain: decode the tolerant wire into the caller's exact-sized region and +// return the root. LOAD IS A SCAN, and that is the whole of its bound: it +// follows no reference, so there is no depth cap, no visited set and no +// ordering rule on the indices. Partial results are kept, as everywhere on +// this wire — the report says what happened. NULL means the CALLER's buffer +// was wrong. +// UNDER RETENTION it also fills the caller's two stores with the fields +// this build cannot name, and the report carries what it could not keep +// (docs/SPEC-TABLES.md §6.6). It is Load's own path and nothing else: the +// reader's data is exactly what it would have been with retention off. +inline const Twig * TwigLoadRetain( uint8_t * region, int64_t region_bytes, const uint8_t * wire_file, int64_t wire_file_bytes, TableRetain * retain, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + // THE FORM BYTE IS READ FIRST, then the trailer, and only then a body: + // a file that is both a newer form and damaged is a REFUSAL and never + // damage (docs/SPEC-TABLES.md §3). + TableIdTable ids_table; + int64_t body_bytes = 0; + const TableOpenVerdict verdict = TableOpen( wire_file, wire_file_bytes, ids_table, body_bytes ); + if ( verdict != TableOpenOk ) + { + if ( verdict == TableOpenDamaged ) { out->malformed = true; } else { out->refused = true; if ( wire_file_bytes > 0 && wire_file[0] == kTableWireMessageForm ) { out->reason = message_form_as_file; } else { out->reason = newer_form; } } + return NULL; + } + if ( TableBodyEndsEarly( wire_file + 1, body_bytes, ids_table ) ) + { + out->malformed = true; // a byte no field claims, before the table (§3) + return NULL; + } + const uint8_t * const wire = wire_file + 1; + const int64_t wire_bytes = body_bytes; + if ( region == NULL || region_bytes < (int64_t) sizeof( Twig ) ) { out->malformed = true; return NULL; } + if ( ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return NULL; } + memset( region, 0, (size_t) region_bytes ); + uint64_t type_id = 0; + const uint8_t * body = NULL; + int64_t length = 0; + + // the record count and the data bytes, from the FRAMING alone + TableRefuseReason reason = count_over_length; // LoadMeasure is where a caller reads it; a Load past a refusal is malformed + int64_t root_extent = 0; + if ( !TwigWireExtent( wire, wire_bytes, root_extent, &ids_table, reason ) ) { out->malformed = true; return NULL; } + int64_t data = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Twig ) ) + root_extent ); + int64_t records = 0; + { + TableReport counting; + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, &counting, &ids_table ); + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + records++; + int64_t storage = TwigNodeStorage( type_id, length, reason ); + if ( storage == kTableNodeRefused ) { out->malformed = true; return NULL; } + if ( storage > 0 ) { data += storage; } + } + } + int64_t attribution = ( records + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( data + attribution > region_bytes ) { out->malformed = true; return NULL; } + + TableNodeMap nodes; + nodes.base = region; + nodes.entries = (const TableNodeDirEntry *) ( region + data ); + nodes.count = records + 1; + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + data ); + directory[0].offset = 0; // position 0 is the ROOT, at offset 0 (§6.3) + directory[0].type_id = 0x9f8e22fb612a2f78ull; + Twig * root = new ( region ) Twig; // lifetime only: LoadBody's first act is TwigReset + TwigReset( *root ); + + // LoadRetain RESETS BOTH STORES and writes into neither id list: a + // retained record carries its field's identity in the record itself, + // with every reference resolved (docs/SPEC-TABLES.md §6.6). The buffer + // belongs to this region from here on. + TableRetainReset( retain, nodes, region ); + + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Twig ) ) + root_extent ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = TwigNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; directory[k + 1].type_id = type_id; } else @@ -9718,43 +10545,219 @@ inline const Twig * TwigLoadRetain( uint8_t * region, int64_t region_bytes, cons } k++; } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + TwigNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Twig ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + TwigLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// TwigNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool TwigNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + TwigNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !TwigNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// TwigLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool TwigLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Twig * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !TwigMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = TwigNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + TwigNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !TwigMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Twig ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x9f8e22fb612a2f78ull; + Twig * root = new ( region + used ) Twig; // lifetime only: LoadMessageBody's first act is TwigReset + TwigReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Twig ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - TwigNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !TwigNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Twig ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - TwigLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return TwigLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// TwigLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool TwigLoadRetainMessages( const Twig ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !TwigLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // TwigMeasureRetain and TwigSaveRetain: the pair, with the retained tail in @@ -10045,6 +11048,182 @@ inline const Nest * NestLoadRetain( uint8_t * region, int64_t region_bytes, cons return root; } +// NestNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool NestNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + NestNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !NestNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// NestLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool NestLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Nest * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !NestMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = NestNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + NestNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !NestMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Nest ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x0fe46fc6a1b583abull; + Nest * root = new ( region + used ) Nest; // lifetime only: LoadMessageBody's first act is NestReset + NestReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Nest ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !NestNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return NestLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// NestLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool NestLoadRetainMessages( const Nest ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !NestLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // NestMeasureRetain and NestSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/arms/RingTable.h b/testdata/golden/tables/arms/RingTable.h index 9c838cc50..784cc9eb2 100644 --- a/testdata/golden/tables/arms/RingTable.h +++ b/testdata/golden/tables/arms/RingTable.h @@ -4241,6 +4241,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace armdemo #endif // ARMDEMO_SCHEMA_TABLE_RETAIN @@ -5435,18 +5867,22 @@ template inline bool TableNodeMessageSave( const Ctx & ctx, const inline int64_t NodeMeasureBodyRetain( TableRetainIds & ids, const Node & value, TableRetain * retain, const TableRetainPath & path ); ARMDEMO_TABLE_INLINE bool NodeSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Node & value, TableRetain * retain, const TableRetainPath & path ); ARMDEMO_TABLE_INLINE bool NodeLoadBodyRetain( TableReader & r, Node & value, TableRetain * retain, const TableRetainPath & path ); +inline bool NodeLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Node & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t RingMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Ring & value, TableRetain * retain, const TableRetainPath & path ); template inline bool RingSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Ring & value, TableRetain * retain, const TableRetainPath & path ); template inline bool RingSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Ring & value, TableRetain * retain, const TableRetainPath & path ); inline bool RingLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Ring & value, TableRetain * retain, const TableRetainPath & path ); +inline bool RingLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Ring & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t RackMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Rack & value, TableRetain * retain, const TableRetainPath & path ); template inline bool RackSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Rack & value, TableRetain * retain, const TableRetainPath & path ); template inline bool RackSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Rack & value, TableRetain * retain, const TableRetainPath & path ); inline bool RackLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Rack & value, TableRetain * retain, const TableRetainPath & path ); +inline bool RackLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Rack & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t TrayMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Tray & value, TableRetain * retain, const TableRetainPath & path ); template inline bool TraySaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Tray & value, TableRetain * retain, const TableRetainPath & path ); template inline bool TraySaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Tray & value, TableRetain * retain, const TableRetainPath & path ); inline bool TrayLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Tray & value, TableRetain * retain, const TableRetainPath & path ); +inline bool TrayLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Tray & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t NodeMeasureBody( TableIds & ids, const Node & value ) { @@ -11506,6 +11942,98 @@ ARMDEMO_TABLE_INLINE bool NodeLoadBodyRetain( TableReader & r, Node & value, Tab } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool NodeLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Node & value, TableRetain * retain, const TableRetainPath & path ) +{ + NodeReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xaf63eb4c86020609ull: // v + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.v = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.v = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t RingMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Ring & value, TableRetain * retain, const TableRetainPath & path ) { @@ -11853,11 +12381,217 @@ inline bool RingLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Rin } } -template -inline int64_t RackMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Rack & value, TableRetain * retain, const TableRetainPath & path ) -{ - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - { +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool RingLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Ring & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + RingReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3e7884bf4f412c6full: // items + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 15 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableListFill fill = TableListFillBegin( nodes, value.items, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + Slot * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + uint64_t arm_ref_2 = 0; + if ( !r.get( arm_ref_2, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry arm_2; + if ( arm_ref_2 == 0 ) { ( *slot ).type = SlotType::None; } + else if ( !TableMessageArmEntry( vocabulary, arm_ref_2, arm_2 ) ) { report->malformed = true; return false; } + else + { + switch ( arm_2.id ) + { + case 0x3c2f1bbad18642adull: // node + { + if ( arm_2.kind != 17 || arm_2.elem_kind != 0 ) + { + ( *slot ).type = SlotType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + ( *slot ).type = SlotType::Node; + { + uint64_t node_index_3 = 0; + if ( !r.get( node_index_3, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, ( *slot ).node, node_index_3, 0x66bd1cc6d2f6b68dull, report ); // *Node + } + break; + } + case 0xfd4d194e1652b207ull: // plain + { + if ( arm_2.kind != 4 || arm_2.elem_kind != 0 ) + { + if ( TableKindWidens( arm_2.kind, 4 ) ) + { + ( *slot ).type = SlotType::Plain; + memset( (void *) &( *slot ).plain, 0, sizeof( ( *slot ).plain ) ); // selection establishes the arm (§2.6) + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + ( *slot ).plain = decoded_v_3; + } + report->widened++; + break; + } + ( *slot ).type = SlotType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + ( *slot ).type = SlotType::Plain; + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + ( *slot ).plain = decoded_v_3; + } + break; + } + default: + ( *slot ).type = SlotType::None; report->unknown++; report->retain_lost++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + } + } + } + TableListFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t RackMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Rack & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { // items: a kind 14 array of kind 15 elements, INDEX order (§2.9) TableListCursor cursor_items = TableListElements( ctx, value.items ); if ( !cursor_items.ok ) { return -1; } // the slot and the head disagree @@ -12238,28 +12972,254 @@ inline bool RackLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Rac } } -template -inline int64_t TrayMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Tray & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool RackLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Rack & value, TableRetain * retain, const TableRetainPath & path ) { - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.entries_count < 0 || value.entries_count > 2 ) { return -1; } // storage invariant - if ( value.entries_count > 0 ) + (void) nodes; (void) index_bits; + RackReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - const uint64_t ref_entries = ids.ref( 0xc5b2a72c0845a253ull ); - int64_t body_entries = 0; - body_entries += 1 + TableLebBytes( (uint64_t) ( value.entries_count ) ); // the element kind byte and the count - for ( int32_t elem_i = 0; elem_i < value.entries_count; elem_i++ ) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - if ( value.entries[elem_i].type == SlotsType::None ) { body_entries += 1; } // a None element is the zero reference in its place - else + case 0x3e7884bf4f412c6full: // items { - switch ( value.entries[elem_i].type ) + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 15 ) { - case SlotsType::None: break; - case SlotsType::Many: + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableListFill fill = TableListFillBegin( nodes, value.items, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) { - int64_t arm_payloadu = 0; - const uint64_t arm_refu = ids.ref( 0x1f6459a2cea1fc02ull ); + Slots * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + uint64_t arm_ref_2 = 0; + if ( !r.get( arm_ref_2, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry arm_2; + if ( arm_ref_2 == 0 ) { ( *slot ).type = SlotsType::None; } + else if ( !TableMessageArmEntry( vocabulary, arm_ref_2, arm_2 ) ) { report->malformed = true; return false; } + else + { + switch ( arm_2.id ) + { + case 0x1f6459a2cea1fc02ull: // many + { + if ( arm_2.kind != 14 || arm_2.elem_kind != 17 ) + { + ( *slot ).type = SlotsType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + ( *slot ).type = SlotsType::Many; + { + uint64_t n_3 = (uint64_t) arm_2.min; + const int64_t count_bits_3 = TableBitsRequired( arm_2.min, arm_2.max ); + if ( count_bits_3 > 0 ) + { + uint64_t raw_3 = 0; + if ( !r.get( raw_3, count_bits_3 ) ) { report->malformed = true; return false; } + n_3 = raw_3 + (uint64_t) arm_2.min; + } + if ( arm_2.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept_3 = 0; + if ( n_3 > (uint64_t) 2 ) { kept_3 = 2; report->clamped++; } else { kept_3 = (int32_t) n_3; } + const uint64_t walk_3 = n_3; + for ( uint64_t i_3 = 0; i_3 < walk_3; i_3++ ) + { + const bool in_bounds_3 = (int32_t) i_3 < kept_3; + TableRef scratch_3; + { + uint64_t node_index_4 = 0; + if ( !r.get( node_index_4, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, ( in_bounds_3 ? ( *slot ).many.value[i_3] : scratch_3 ), node_index_4, 0x66bd1cc6d2f6b68dull, report ); // *Node + } + } + ( *slot ).many.value_count = kept_3; + } + break; + } + case 0xfd4d194e1652b207ull: // plain + { + if ( arm_2.kind != 4 || arm_2.elem_kind != 0 ) + { + if ( TableKindWidens( arm_2.kind, 4 ) ) + { + ( *slot ).type = SlotsType::Plain; + memset( (void *) &( *slot ).plain, 0, sizeof( ( *slot ).plain ) ); // selection establishes the arm (§2.6) + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + ( *slot ).plain = decoded_v_3; + } + report->widened++; + break; + } + ( *slot ).type = SlotsType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + ( *slot ).type = SlotsType::Plain; + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + ( *slot ).plain = decoded_v_3; + } + break; + } + default: + ( *slot ).type = SlotsType::None; report->unknown++; report->retain_lost++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + } + } + } + TableListFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t TrayMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Tray & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.entries_count < 0 || value.entries_count > 2 ) { return -1; } // storage invariant + if ( value.entries_count > 0 ) + { + const uint64_t ref_entries = ids.ref( 0xc5b2a72c0845a253ull ); + int64_t body_entries = 0; + body_entries += 1 + TableLebBytes( (uint64_t) ( value.entries_count ) ); // the element kind byte and the count + for ( int32_t elem_i = 0; elem_i < value.entries_count; elem_i++ ) + { + if ( value.entries[elem_i].type == SlotsType::None ) { body_entries += 1; } // a None element is the zero reference in its place + else + { + switch ( value.entries[elem_i].type ) + { + case SlotsType::None: break; + case SlotsType::Many: + { + int64_t arm_payloadu = 0; + const uint64_t arm_refu = ids.ref( 0x1f6459a2cea1fc02ull ); if ( value.entries[elem_i].many.value_count < 0 || value.entries[elem_i].many.value_count > 2 ) { return -1; } // storage invariant arm_payloadu += 1 + TableLebBytes( (uint64_t) ( value.entries[elem_i].many.value_count ) ); // the element kind byte and the count for ( int32_t elem_iue = 0; elem_iue < value.entries[elem_i].many.value_count; elem_iue++ ) @@ -12609,63 +13569,292 @@ inline bool TrayLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Tra } } -// RingNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it -// already owns. -// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the -// index is the region directory's, which Load fills from the wire's framing -// and nothing afterwards renumbers. -inline void RingNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) -{ - // the node's own EXTENT, where its lists' and maps' arrays are carved - // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). - // The tool's path carries a worker instead: there the arrays are the - // arena's. - TableExtentCarve carve; - carve.worker = nodes.worker; - if ( carve.worker == NULL ) - { - TableRefuseReason reason = count_over_length; // pass one already refused what this could refuse - const int64_t storage = RingNodeStorage( type_id, r.size, reason ); - const int64_t record = storage > 0 ? RingNodeRecordBytes( type_id ) : 0; - carve.at = at + record; - carve.left = storage > record ? storage - record : 0; - } - nodes.carve = &carve; - (void) nodes; // every node this root can name is a FIXED table - switch ( type_id ) - { - case 0x66bd1cc6d2f6b68dull: NodeLoadBodyRetain( r, *(Node *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Node - default: break; - } - nodes.carve = NULL; // the cursor is ONE node's, and this node's body is done -} - -// RingLoadRetain: decode the tolerant wire into the caller's exact-sized region and -// return the root. LOAD IS A SCAN, and that is the whole of its bound: it -// follows no reference, so there is no depth cap, no visited set and no -// ordering rule on the indices. Partial results are kept, as everywhere on -// this wire — the report says what happened. NULL means the CALLER's buffer -// was wrong. -// UNDER RETENTION it also fills the caller's two stores with the fields -// this build cannot name, and the report carries what it could not keep -// (docs/SPEC-TABLES.md §6.6). It is Load's own path and nothing else: the -// reader's data is exactly what it would have been with retention off. -inline const Ring * RingLoadRetain( uint8_t * region, int64_t region_bytes, const uint8_t * wire_file, int64_t wire_file_bytes, TableRetain * retain, TableReport * report ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool TrayLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Tray & value, TableRetain * retain, const TableRetainPath & path ) { - TableReport ignored; - TableReport * out = report != NULL ? report : &ignored; - // THE FORM BYTE IS READ FIRST, then the trailer, and only then a body: - // a file that is both a newer form and damaged is a REFUSAL and never - // damage (docs/SPEC-TABLES.md §3). - TableIdTable ids_table; - int64_t body_bytes = 0; - const TableOpenVerdict verdict = TableOpen( wire_file, wire_file_bytes, ids_table, body_bytes ); - if ( verdict != TableOpenOk ) - { - if ( verdict == TableOpenDamaged ) { out->malformed = true; } else { out->refused = true; if ( wire_file_bytes > 0 && wire_file[0] == kTableWireMessageForm ) { out->reason = message_form_as_file; } else { out->reason = newer_form; } } - return NULL; - } - if ( TableBodyEndsEarly( wire_file + 1, body_bytes, ids_table ) ) + (void) nodes; (void) index_bits; + TrayReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xc5b2a72c0845a253ull: // entries + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 15 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) + { + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 2 ) { kept = 2; report->clamped++; } else { kept = (int32_t) n; } + const uint64_t walk = n; + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + Slots scratch; + { + uint64_t arm_ref_2 = 0; + if ( !r.get( arm_ref_2, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry arm_2; + if ( arm_ref_2 == 0 ) { ( in_bounds ? value.entries[i] : scratch ).type = SlotsType::None; } + else if ( !TableMessageArmEntry( vocabulary, arm_ref_2, arm_2 ) ) { report->malformed = true; return false; } + else + { + switch ( arm_2.id ) + { + case 0x1f6459a2cea1fc02ull: // many + { + if ( arm_2.kind != 14 || arm_2.elem_kind != 17 ) + { + ( in_bounds ? value.entries[i] : scratch ).type = SlotsType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + ( in_bounds ? value.entries[i] : scratch ).type = SlotsType::Many; + { + uint64_t n_3 = (uint64_t) arm_2.min; + const int64_t count_bits_3 = TableBitsRequired( arm_2.min, arm_2.max ); + if ( count_bits_3 > 0 ) + { + uint64_t raw_3 = 0; + if ( !r.get( raw_3, count_bits_3 ) ) { report->malformed = true; return false; } + n_3 = raw_3 + (uint64_t) arm_2.min; + } + if ( arm_2.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept_3 = 0; + if ( n_3 > (uint64_t) 2 ) { kept_3 = 2; report->clamped++; } else { kept_3 = (int32_t) n_3; } + const uint64_t walk_3 = n_3; + for ( uint64_t i_3 = 0; i_3 < walk_3; i_3++ ) + { + const bool in_bounds_3 = (int32_t) i_3 < kept_3; + TableRef scratch_3; + { + uint64_t node_index_4 = 0; + if ( !r.get( node_index_4, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, ( in_bounds_3 ? ( in_bounds ? value.entries[i] : scratch ).many.value[i_3] : scratch_3 ), node_index_4, 0x66bd1cc6d2f6b68dull, report ); // *Node + } + } + ( in_bounds ? value.entries[i] : scratch ).many.value_count = kept_3; + } + break; + } + case 0xfd4d194e1652b207ull: // plain + { + if ( arm_2.kind != 4 || arm_2.elem_kind != 0 ) + { + if ( TableKindWidens( arm_2.kind, 4 ) ) + { + ( in_bounds ? value.entries[i] : scratch ).type = SlotsType::Plain; + memset( (void *) &( in_bounds ? value.entries[i] : scratch ).plain, 0, sizeof( ( in_bounds ? value.entries[i] : scratch ).plain ) ); // selection establishes the arm (§2.6) + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + ( in_bounds ? value.entries[i] : scratch ).plain = decoded_v_3; + } + report->widened++; + break; + } + ( in_bounds ? value.entries[i] : scratch ).type = SlotsType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + ( in_bounds ? value.entries[i] : scratch ).type = SlotsType::Plain; + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + ( in_bounds ? value.entries[i] : scratch ).plain = decoded_v_3; + } + break; + } + default: + ( in_bounds ? value.entries[i] : scratch ).type = SlotsType::None; report->unknown++; report->retain_lost++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + } + } + } + value.entries_count = kept; + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +// RingNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it +// already owns. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is the region directory's, which Load fills from the wire's framing +// and nothing afterwards renumbers. +inline void RingNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + // the node's own EXTENT, where its lists' and maps' arrays are carved + // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). + // The tool's path carries a worker instead: there the arrays are the + // arena's. + TableExtentCarve carve; + carve.worker = nodes.worker; + if ( carve.worker == NULL ) + { + TableRefuseReason reason = count_over_length; // pass one already refused what this could refuse + const int64_t storage = RingNodeStorage( type_id, r.size, reason ); + const int64_t record = storage > 0 ? RingNodeRecordBytes( type_id ) : 0; + carve.at = at + record; + carve.left = storage > record ? storage - record : 0; + } + nodes.carve = &carve; + (void) nodes; // every node this root can name is a FIXED table + switch ( type_id ) + { + case 0x66bd1cc6d2f6b68dull: NodeLoadBodyRetain( r, *(Node *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Node + default: break; + } + nodes.carve = NULL; // the cursor is ONE node's, and this node's body is done +} + +// RingLoadRetain: decode the tolerant wire into the caller's exact-sized region and +// return the root. LOAD IS A SCAN, and that is the whole of its bound: it +// follows no reference, so there is no depth cap, no visited set and no +// ordering rule on the indices. Partial results are kept, as everywhere on +// this wire — the report says what happened. NULL means the CALLER's buffer +// was wrong. +// UNDER RETENTION it also fills the caller's two stores with the fields +// this build cannot name, and the report carries what it could not keep +// (docs/SPEC-TABLES.md §6.6). It is Load's own path and nothing else: the +// reader's data is exactly what it would have been with retention off. +inline const Ring * RingLoadRetain( uint8_t * region, int64_t region_bytes, const uint8_t * wire_file, int64_t wire_file_bytes, TableRetain * retain, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + // THE FORM BYTE IS READ FIRST, then the trailer, and only then a body: + // a file that is both a newer form and damaged is a REFUSAL and never + // damage (docs/SPEC-TABLES.md §3). + TableIdTable ids_table; + int64_t body_bytes = 0; + const TableOpenVerdict verdict = TableOpen( wire_file, wire_file_bytes, ids_table, body_bytes ); + if ( verdict != TableOpenOk ) + { + if ( verdict == TableOpenDamaged ) { out->malformed = true; } else { out->refused = true; if ( wire_file_bytes > 0 && wire_file[0] == kTableWireMessageForm ) { out->reason = message_form_as_file; } else { out->reason = newer_form; } } + return NULL; + } + if ( TableBodyEndsEarly( wire_file + 1, body_bytes, ids_table ) ) { out->malformed = true; // a byte no field claims, before the table (§3) return NULL; @@ -12715,71 +13904,247 @@ inline const Ring * RingLoadRetain( uint8_t * region, int64_t region_bytes, cons // belongs to this region from here on. TableRetainReset( retain, nodes, region ); - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Ring ) ) + root_extent ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = RingNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + directory[k + 1].type_id = type_id; + } + else + { + directory[k + 1].offset = (uint64_t) used; + directory[k + 1].type_id = type_id; + RingNodePlace( type_id, region + used, length ); + used += storage; + } + k++; + } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + RingNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Ring ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + RingLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// RingNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool RingNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + RingNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !RingNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + bool ok = false; + switch ( type_id ) + { + case 0x66bd1cc6d2f6b68dull: ok = NodeLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(Node *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Node + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// RingLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool RingLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Ring * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !RingMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = RingNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + RingNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !RingMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Ring ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xdcea4d2bfa11ceebull; + Ring * root = new ( region + used ) Ring; // lifetime only: LoadMessageBody's first act is RingReset + RingReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Ring ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Ring ) ) + root_extent ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - int64_t storage = RingNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) - { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; - directory[k + 1].type_id = type_id; - } - else - { - directory[k + 1].offset = (uint64_t) used; - directory[k + 1].type_id = type_id; - RingNodePlace( type_id, region + used, length ); - used += storage; - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } - } - - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) - { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + if ( directory[k + 1].offset == kTableNodeAbsent ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - RingNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; } + if ( !RingNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Ring ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - RingLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return RingLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// RingLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool RingLoadRetainMessages( const Ring ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !RingLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // RingMeasureRetain and RingSaveRetain: the pair, with the retained tail in @@ -13006,71 +14371,247 @@ inline const Rack * RackLoadRetain( uint8_t * region, int64_t region_bytes, cons // belongs to this region from here on. TableRetainReset( retain, nodes, region ); - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Rack ) ) + root_extent ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = RackNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + directory[k + 1].type_id = type_id; + } + else + { + directory[k + 1].offset = (uint64_t) used; + directory[k + 1].type_id = type_id; + RackNodePlace( type_id, region + used, length ); + used += storage; + } + k++; + } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + RackNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Rack ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + RackLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// RackNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool RackNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + RackNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !RackNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + bool ok = false; + switch ( type_id ) + { + case 0x66bd1cc6d2f6b68dull: ok = NodeLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(Node *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Node + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// RackLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool RackLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Rack * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !RackMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = RackNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + RackNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !RackMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Rack ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x986d012bd380b0b2ull; + Rack * root = new ( region + used ) Rack; // lifetime only: LoadMessageBody's first act is RackReset + RackReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Rack ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Rack ) ) + root_extent ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - int64_t storage = RackNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) - { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; - directory[k + 1].type_id = type_id; - } - else - { - directory[k + 1].offset = (uint64_t) used; - directory[k + 1].type_id = type_id; - RackNodePlace( type_id, region + used, length ); - used += storage; - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } - } - - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) - { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + if ( directory[k + 1].offset == kTableNodeAbsent ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - RackNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; } + if ( !RackNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Rack ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - RackLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return RackLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// RackLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool RackLoadRetainMessages( const Rack ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !RackLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // RackMeasureRetain and RackSaveRetain: the pair, with the retained tail in @@ -13364,6 +14905,178 @@ inline const Tray * TrayLoadRetain( uint8_t * region, int64_t region_bytes, cons return root; } +// TrayNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool TrayNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + TrayNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !TrayNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + bool ok = false; + switch ( type_id ) + { + case 0x66bd1cc6d2f6b68dull: ok = NodeLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(Node *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Node + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// TrayLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool TrayLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Tray * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !TrayMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = TrayNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + TrayNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Tray ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x85a6b5fb5284964dull; + Tray * root = new ( region + used ) Tray; // lifetime only: LoadMessageBody's first act is TrayReset + TrayReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Tray ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !TrayNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return TrayLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// TrayLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool TrayLoadRetainMessages( const Tray ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !TrayLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // TrayMeasureRetain and TraySaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/blobs/AssetsTable.h b/testdata/golden/tables/blobs/AssetsTable.h index 7b728be6b..bc5201390 100644 --- a/testdata/golden/tables/blobs/AssetsTable.h +++ b/testdata/golden/tables/blobs/AssetsTable.h @@ -4147,6 +4147,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace blobdemo #endif // BLOBDEMO_SCHEMA_TABLE_RETAIN @@ -4614,10 +5046,12 @@ template inline int64_t AssetMeasureBodyRetain( const Ctx & ctx, template inline bool AssetSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Asset & value, TableRetain * retain, const TableRetainPath & path ); template inline bool AssetSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Asset & value, TableRetain * retain, const TableRetainPath & path ); inline bool AssetLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Asset & value, TableRetain * retain, const TableRetainPath & path ); +inline bool AssetLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Asset & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t CatalogMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Catalog & value, TableRetain * retain, const TableRetainPath & path ); template inline bool CatalogSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Catalog & value, TableRetain * retain, const TableRetainPath & path ); template inline bool CatalogSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Catalog & value, TableRetain * retain, const TableRetainPath & path ); inline bool CatalogLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Catalog & value, TableRetain * retain, const TableRetainPath & path ); +inline bool CatalogLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Catalog & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t AssetMeasureBody( const Ctx & ctx, const TableNumbering & numbering, TableIds & ids, const Asset & value ) @@ -8152,78 +8586,238 @@ inline bool AssetLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, As } } -template -inline int64_t CatalogMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Catalog & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool AssetLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Asset & value, TableRetain * retain, const TableRetainPath & path ) { - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.name_length < 0 || value.name_length > 32 ) { return -1; } // storage invariant - if ( value.name_length > 0 ) { bytes += TableLebBytes( ids.ref( 0xc4bcadba8e631b86ull ) ) + 1 + TableLebBytes( (uint64_t) ( value.name_length ) ) + ( value.name_length ); } // name - { - const Asset * pointee_head = AssetAt( ctx, value.head ); // *Asset - // A POINTER RIDES AS A NODE INDEX (docs/SPEC-TABLES.md §3.1): the - // header and the index and nothing below it, because the pointee's - // body is in the node table and not here. NULL IS ELIDED — absence - // and null are one value — and a non-null pointer ALWAYS rides, even - // when its node's body is entirely default. - if ( pointee_head != NULL ) - { - uint64_t index_head = 0; - if ( !TableNumberingIndex( numbering, (const void *) pointee_head, index_head ) ) { return -1; } - bytes += TableLebBytes( ids.ref( 0x0a8f12cc5f9a0c03ull ) ) + 1 + TableLebBytes( index_head ); - } - } - { - const TableBlob * blob_thumb = TableBlobAt( ctx, value.thumb ); // *bytes - // A BYTE BUFFER RIDES AS A NODE INDEX too (docs/SPEC-TABLES.md §2.5, - // §3.1): the header and the index here, the bytes themselves as a - // record in the node table. Null is elided and a non-null blob always - // rides, even at length zero — null and empty are two values. - if ( blob_thumb != NULL ) - { - uint64_t index_thumb = 0; - if ( !TableNumberingIndex( numbering, (const void *) blob_thumb, index_thumb ) ) { return -1; } - bytes += TableLebBytes( ids.ref( 0x613b19720ff4b203ull ) ) + 1 + TableLebBytes( index_thumb ); - } - } - { - const TableBlob * blob_note = TableBlobAt( ctx, value.note ); // *string - // A BYTE BUFFER RIDES AS A NODE INDEX too (docs/SPEC-TABLES.md §2.5, - // §3.1): the header and the index here, the bytes themselves as a - // record in the node table. Null is elided and a non-null blob always - // rides, even at length zero — null and empty are two values. - if ( blob_note != NULL ) - { - uint64_t index_note = 0; - if ( !TableNumberingIndex( numbering, (const void *) blob_note, index_note ) ) { return -1; } - bytes += TableLebBytes( ids.ref( 0x3bf8fbbad1587cddull ) ) + 1 + TableLebBytes( index_note ); - } - } + (void) nodes; (void) index_bits; + AssetReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - const TableBlob * blob_alias = TableBlobAt( ctx, value.alias ); // *bytes - // A BYTE BUFFER RIDES AS A NODE INDEX too (docs/SPEC-TABLES.md §2.5, - // §3.1): the header and the index here, the bytes themselves as a - // record in the node table. Null is elided and a non-null blob always - // rides, even at length zero — null and empty are two values. - if ( blob_alias != NULL ) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - uint64_t index_alias = 0; - if ( !TableNumberingIndex( numbering, (const void *) blob_alias, index_alias ) ) { return -1; } - bytes += TableLebBytes( ids.ref( 0x509220bb65a646b7ull ) ) + 1 + TableLebBytes( index_alias ); - } - } - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -template -inline bool CatalogSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Catalog & value, TableRetain * retain, const TableRetainPath & path ) -{ - if ( value.name_length < 0 || value.name_length > 32 ) { return false; } // storage invariant - if ( value.name_length > 0 ) - { - w.putleb( ids.ref( 0xc4bcadba8e631b86ull ) ); w.put8( 12 ); // name - w.putleb( (uint64_t) value.name_length ); - w.raw( value.name, value.name_length ); + case 0xc4bcadba8e631b86ull: // name + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 32 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.name, text, (size_t) kept ); + value.name[kept] = 0; + r.offset += (int64_t) n * 8; + value.name_length = kept; + } + break; + } + case 0xef9c96d721673243ull: // kind + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 8 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 8 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.kind = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.kind = decoded_v; + } + break; + } + case 0x855b556730a34a05ull: // data + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.data, node_index, kTableBytesTypeId, report ); // *bytes + } + break; + } + case 0x5daa28eb864c02a5ull: // caption + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.caption, node_index, kTableStringTypeId, report ); // *string + } + break; + } + case 0xe5316cbaa025f028ull: // next + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.next, node_index, 0x8e4e6dccfe5f64fbull, report ); // *Asset + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t CatalogMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Catalog & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.name_length < 0 || value.name_length > 32 ) { return -1; } // storage invariant + if ( value.name_length > 0 ) { bytes += TableLebBytes( ids.ref( 0xc4bcadba8e631b86ull ) ) + 1 + TableLebBytes( (uint64_t) ( value.name_length ) ) + ( value.name_length ); } // name + { + const Asset * pointee_head = AssetAt( ctx, value.head ); // *Asset + // A POINTER RIDES AS A NODE INDEX (docs/SPEC-TABLES.md §3.1): the + // header and the index and nothing below it, because the pointee's + // body is in the node table and not here. NULL IS ELIDED — absence + // and null are one value — and a non-null pointer ALWAYS rides, even + // when its node's body is entirely default. + if ( pointee_head != NULL ) + { + uint64_t index_head = 0; + if ( !TableNumberingIndex( numbering, (const void *) pointee_head, index_head ) ) { return -1; } + bytes += TableLebBytes( ids.ref( 0x0a8f12cc5f9a0c03ull ) ) + 1 + TableLebBytes( index_head ); + } + } + { + const TableBlob * blob_thumb = TableBlobAt( ctx, value.thumb ); // *bytes + // A BYTE BUFFER RIDES AS A NODE INDEX too (docs/SPEC-TABLES.md §2.5, + // §3.1): the header and the index here, the bytes themselves as a + // record in the node table. Null is elided and a non-null blob always + // rides, even at length zero — null and empty are two values. + if ( blob_thumb != NULL ) + { + uint64_t index_thumb = 0; + if ( !TableNumberingIndex( numbering, (const void *) blob_thumb, index_thumb ) ) { return -1; } + bytes += TableLebBytes( ids.ref( 0x613b19720ff4b203ull ) ) + 1 + TableLebBytes( index_thumb ); + } + } + { + const TableBlob * blob_note = TableBlobAt( ctx, value.note ); // *string + // A BYTE BUFFER RIDES AS A NODE INDEX too (docs/SPEC-TABLES.md §2.5, + // §3.1): the header and the index here, the bytes themselves as a + // record in the node table. Null is elided and a non-null blob always + // rides, even at length zero — null and empty are two values. + if ( blob_note != NULL ) + { + uint64_t index_note = 0; + if ( !TableNumberingIndex( numbering, (const void *) blob_note, index_note ) ) { return -1; } + bytes += TableLebBytes( ids.ref( 0x3bf8fbbad1587cddull ) ) + 1 + TableLebBytes( index_note ); + } + } + { + const TableBlob * blob_alias = TableBlobAt( ctx, value.alias ); // *bytes + // A BYTE BUFFER RIDES AS A NODE INDEX too (docs/SPEC-TABLES.md §2.5, + // §3.1): the header and the index here, the bytes themselves as a + // record in the node table. Null is elided and a non-null blob always + // rides, even at length zero — null and empty are two values. + if ( blob_alias != NULL ) + { + uint64_t index_alias = 0; + if ( !TableNumberingIndex( numbering, (const void *) blob_alias, index_alias ) ) { return -1; } + bytes += TableLebBytes( ids.ref( 0x509220bb65a646b7ull ) ) + 1 + TableLebBytes( index_alias ); + } + } + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +template +inline bool CatalogSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Catalog & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( value.name_length < 0 || value.name_length > 32 ) { return false; } // storage invariant + if ( value.name_length > 0 ) + { + w.putleb( ids.ref( 0xc4bcadba8e631b86ull ) ); w.put8( 12 ); // name + w.putleb( (uint64_t) value.name_length ); + w.raw( value.name, value.name_length ); } { const Asset * pointee_head = AssetAt( ctx, value.head ); // *Asset @@ -8417,10 +9011,150 @@ inline bool CatalogLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, } default: { - r.report->unknown++; - if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } - break; + r.report->unknown++; + if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } + break; + } + } + } +} + +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool CatalogLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Catalog & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + CatalogReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xc4bcadba8e631b86ull: // name + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 32 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.name, text, (size_t) kept ); + value.name[kept] = 0; + r.offset += (int64_t) n * 8; + value.name_length = kept; + } + break; + } + case 0x0a8f12cc5f9a0c03ull: // head + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.head, node_index, 0x8e4e6dccfe5f64fbull, report ); // *Asset + } + break; + } + case 0x613b19720ff4b203ull: // thumb + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.thumb, node_index, kTableBytesTypeId, report ); // *bytes + } + break; + } + case 0x3bf8fbbad1587cddull: // note + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.note, node_index, kTableStringTypeId, report ); // *string + } + break; + } + case 0x509220bb65a646b7ull: // alias + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.alias, node_index, kTableBytesTypeId, report ); // *bytes + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); } + break; } } } @@ -8585,6 +9319,160 @@ inline const Asset * AssetLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// AssetNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool AssetNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + bool ok = false; + switch ( type_id ) + { + case 0x8e4e6dccfe5f64fbull: ok = AssetLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(Asset *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Asset + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + return ok; +} + +// AssetLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool AssetLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Asset * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !AssetMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = AssetNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + AssetNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Asset ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x8e4e6dccfe5f64fbull; + Asset * root = new ( region + used ) Asset; // lifetime only: LoadMessageBody's first act is AssetReset + AssetReset( *root ); + root_out = root; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !AssetNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + return AssetLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// AssetLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool AssetLoadRetainMessages( const Asset ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !AssetLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // AssetMeasureRetain and AssetSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save @@ -8879,6 +9767,160 @@ inline const Catalog * CatalogLoadRetain( uint8_t * region, int64_t region_bytes return root; } +// CatalogNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool CatalogNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + bool ok = false; + switch ( type_id ) + { + case 0x8e4e6dccfe5f64fbull: ok = AssetLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(Asset *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Asset + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + return ok; +} + +// CatalogLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool CatalogLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Catalog * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !CatalogMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = CatalogNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + CatalogNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Catalog ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x1f1750c1bc916638ull; + Catalog * root = new ( region + used ) Catalog; // lifetime only: LoadMessageBody's first act is CatalogReset + CatalogReset( *root ); + root_out = root; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !CatalogNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + return CatalogLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// CatalogLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool CatalogLoadRetainMessages( const Catalog ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !CatalogLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // CatalogMeasureRetain and CatalogSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/lists/HoldersTable.h b/testdata/golden/tables/lists/HoldersTable.h index b15dcaff2..3e97ef490 100644 --- a/testdata/golden/tables/lists/HoldersTable.h +++ b/testdata/golden/tables/lists/HoldersTable.h @@ -4278,6 +4278,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace listdemo #endif // LISTDEMO_SCHEMA_TABLE_RETAIN @@ -6291,32 +6723,40 @@ inline SquadRosterEntryKeyRead SquadRosterEntryReadKey( const uint8_t * body, in inline int64_t SampleMeasureBodyRetain( TableRetainIds & ids, const Sample & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool SampleSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Sample & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool SampleLoadBodyRetain( TableReader & r, Sample & value, TableRetain * retain, const TableRetainPath & path ); +inline bool SampleLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Sample & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t RowMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Row & value, TableRetain * retain, const TableRetainPath & path ); template inline bool RowSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Row & value, TableRetain * retain, const TableRetainPath & path ); template inline bool RowSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Row & value, TableRetain * retain, const TableRetainPath & path ); inline bool RowLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Row & value, TableRetain * retain, const TableRetainPath & path ); +inline bool RowLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Row & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t SheetMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Sheet & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SheetSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Sheet & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SheetSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Sheet & value, TableRetain * retain, const TableRetainPath & path ); inline bool SheetLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Sheet & value, TableRetain * retain, const TableRetainPath & path ); +inline bool SheetLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Sheet & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t ItemMeasureBodyRetain( TableRetainIds & ids, const Item & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool ItemSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Item & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool ItemLoadBodyRetain( TableReader & r, Item & value, TableRetain * retain, const TableRetainPath & path ); +inline bool ItemLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Item & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t SquadRosterEntryMeasureBodyRetain( TableRetainIds & ids, const SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool SquadRosterEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool SquadRosterEntryLoadBodyRetain( TableReader & r, SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool SquadRosterEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t SquadMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Squad & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SquadSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Squad & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SquadSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Squad & value, TableRetain * retain, const TableRetainPath & path ); inline bool SquadLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Squad & value, TableRetain * retain, const TableRetainPath & path ); +inline bool SquadLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Squad & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t ArmyMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Army & value, TableRetain * retain, const TableRetainPath & path ); template inline bool ArmySaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Army & value, TableRetain * retain, const TableRetainPath & path ); template inline bool ArmySaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Army & value, TableRetain * retain, const TableRetainPath & path ); inline bool ArmyLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Army & value, TableRetain * retain, const TableRetainPath & path ); +inline bool ArmyLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Army & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t DeckMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Deck & value, TableRetain * retain, const TableRetainPath & path ); template inline bool DeckSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Deck & value, TableRetain * retain, const TableRetainPath & path ); template inline bool DeckSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Deck & value, TableRetain * retain, const TableRetainPath & path ); inline bool DeckLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Deck & value, TableRetain * retain, const TableRetainPath & path ); +inline bool DeckLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Deck & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t SampleMeasureBody( TableIds & ids, const Sample & value ) { @@ -14803,6 +15243,98 @@ LISTDEMO_TABLE_INLINE bool SampleLoadBodyRetain( TableReader & r, Sample & value } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool SampleLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Sample & value, TableRetain * retain, const TableRetainPath & path ) +{ + SampleReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xaf63eb4c86020609ull: // v + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.v = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.v = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t RowMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Row & value, TableRetain * retain, const TableRetainPath & path ) { @@ -15014,11 +15546,135 @@ inline bool RowLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Row } } -template -inline int64_t SheetMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Sheet & value, TableRetain * retain, const TableRetainPath & path ) -{ - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - { +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool RowLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Row & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + RowReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3e7884bf4f412c6full: // items + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableListFill fill = TableListFillBegin( nodes, value.items, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + Sample * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + if ( !SampleLoadMessageBodyRetain( r, vocabulary, report, index_bits, ( *slot ), retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { return false; } + } + TableListFillEnd( fill ); + } + break; + } + case 0x39f7fcec8fcb623dull: // label + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.label = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.label = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t SheetMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Sheet & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { // rows: a kind 14 array of kind 13 elements, INDEX order (§2.9) TableListCursor cursor_rows = TableListElements( ctx, value.rows ); if ( !cursor_rows.ok ) { return -1; } // the slot and the head disagree @@ -15234,6 +15890,98 @@ inline bool SheetLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Sh } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool SheetLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Sheet & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + SheetReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xa3a7061ff10a8138ull: // rows + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableListFill fill = TableListFillBegin( nodes, value.rows, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + Row * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + if ( !RowLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, ( *slot ), retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { return false; } + } + TableListFillEnd( fill ); + } + break; + } + case 0x5f82477707ad620full: // pinned + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.pinned, node_index, 0xa013e119fec906fbull, report ); // *Row + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + inline int64_t ItemMeasureBodyRetain( TableRetainIds & ids, const Item & value, TableRetain * retain, const TableRetainPath & path ) { int64_t bytes = 1; // the ZERO REFERENCE that ends the body @@ -15320,63 +16068,155 @@ LISTDEMO_TABLE_INLINE bool ItemLoadBodyRetain( TableReader & r, Item & value, Ta } } -inline int64_t SquadRosterEntryMeasureBodyRetain( TableRetainIds & ids, const SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ) -{ - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.key != 0 ) { bytes += TableLebBytes( ids.ref( 0x3dc94a19365b10ecull ) ) + 1 + 1; } // key - { - const int32_t mark_value = ids.count; - const uint64_t ref_value = ids.ref( 0x7ce4fd9430e80ceaull ); - const int64_t body_value = ItemMeasureBodyRetain( ids, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ); - if ( body_value < 0 ) { return -1; } - if ( body_value > 1 ) { bytes += TableLebBytes( ref_value ) + 1 + TableLebBytes( (uint64_t) ( body_value ) ) + ( body_value ); } // value - else { ids.truncate( mark_value ); } // an all-default nested table elides, and costs no entry - } - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -LISTDEMO_TABLE_INLINE bool SquadRosterEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ) -{ - if ( value.key != 0 ) - { - w.putleb( ids.ref( 0x3dc94a19365b10ecull ) ); w.put8( 6 ); // key - w.put8( uint8_t( value.key ) ); - } - { - const int32_t mark_value = ids.count; - const uint64_t ref_value = ids.ref( 0x7ce4fd9430e80ceaull ); - const int64_t body_value = ItemMeasureBodyRetain( ids, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ); - if ( body_value < 0 ) return false; // storage invariant, refused as measure refuses it - if ( body_value > 1 ) // all-default nested elides - { - w.putleb( ref_value ); w.put8( 13 ); w.putleb( (uint64_t) body_value ); // value - if ( !ItemSaveBodyRetain( w, ids, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ) ) return false; - } - else { ids.truncate( mark_value ); } - } - if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } - w.put8( 0 ); // the ZERO REFERENCE that ends the body - return !w.overflow; -} - -LISTDEMO_TABLE_INLINE bool SquadRosterEntryLoadBodyRetain( TableReader & r, SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool ItemLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Item & value, TableRetain * retain, const TableRetainPath & path ) { - SquadRosterEntryReset( value ); // prefill declared defaults in place, then overlay + ItemReset( value ); // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT - // (docs/SPEC-TABLES.md §6.6): this body is being established, so - // whatever an earlier occurrence of it left is discarded before the - // winning one is read. The discard moves neither counter. + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. TableRetainDiscardBody( retain, path ); for ( ;; ) { - uint64_t field_ref = 0; - if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } - if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE - if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count - const uint64_t field_id = r.ids->at( field_ref ); - if ( !r.has( 1 ) ) { r.report->malformed = true; return false; } - uint8_t kind = r.get8(); + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xb1e5e28e4479a274ull: // count + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.count = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.count = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +inline int64_t SquadRosterEntryMeasureBodyRetain( TableRetainIds & ids, const SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.key != 0 ) { bytes += TableLebBytes( ids.ref( 0x3dc94a19365b10ecull ) ) + 1 + 1; } // key + { + const int32_t mark_value = ids.count; + const uint64_t ref_value = ids.ref( 0x7ce4fd9430e80ceaull ); + const int64_t body_value = ItemMeasureBodyRetain( ids, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ); + if ( body_value < 0 ) { return -1; } + if ( body_value > 1 ) { bytes += TableLebBytes( ref_value ) + 1 + TableLebBytes( (uint64_t) ( body_value ) ) + ( body_value ); } // value + else { ids.truncate( mark_value ); } // an all-default nested table elides, and costs no entry + } + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +LISTDEMO_TABLE_INLINE bool SquadRosterEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( value.key != 0 ) + { + w.putleb( ids.ref( 0x3dc94a19365b10ecull ) ); w.put8( 6 ); // key + w.put8( uint8_t( value.key ) ); + } + { + const int32_t mark_value = ids.count; + const uint64_t ref_value = ids.ref( 0x7ce4fd9430e80ceaull ); + const int64_t body_value = ItemMeasureBodyRetain( ids, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ); + if ( body_value < 0 ) return false; // storage invariant, refused as measure refuses it + if ( body_value > 1 ) // all-default nested elides + { + w.putleb( ref_value ); w.put8( 13 ); w.putleb( (uint64_t) body_value ); // value + if ( !ItemSaveBodyRetain( w, ids, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ) ) return false; + } + else { ids.truncate( mark_value ); } + } + if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } + w.put8( 0 ); // the ZERO REFERENCE that ends the body + return !w.overflow; +} + +LISTDEMO_TABLE_INLINE bool SquadRosterEntryLoadBodyRetain( TableReader & r, SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + SquadRosterEntryReset( value ); // prefill declared defaults in place, then overlay + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so + // whatever an earlier occurrence of it left is discarded before the + // winning one is read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t field_ref = 0; + if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } + if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE + if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count + const uint64_t field_id = r.ids->at( field_ref ); + if ( !r.has( 1 ) ) { r.report->malformed = true; return false; } + uint8_t kind = r.get8(); if ( ( field_id == kTableNodeTableFieldId && r.nested ) || field_id == kTableBuildVersionFieldId || field_id == kTableMessageVocabularyFieldId ) { // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, @@ -15440,6 +16280,86 @@ LISTDEMO_TABLE_INLINE bool SquadRosterEntryLoadBodyRetain( TableReader & r, Squa } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool SquadRosterEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + SquadRosterEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 6 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 255ull ) { decoded_wide = (int64_t) 255ull; report->clamped++; } + uint8_t decoded_v = (uint8_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 1 ); + if ( !ItemLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t SquadMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Squad & value, TableRetain * retain, const TableRetainPath & path ) { @@ -15676,47 +16596,205 @@ inline bool SquadLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Sq } } -template -inline int64_t ArmyMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Army & value, TableRetain * retain, const TableRetainPath & path ) -{ - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - { - // squads: a kind 14 array of kind 13 elements, INDEX order (§2.9) - TableListCursor cursor_squads = TableListElements( ctx, value.squads ); - if ( !cursor_squads.ok ) { return -1; } // the slot and the head disagree - if ( cursor_squads.count > 0 ) // an EMPTY list elides, the by-value rule (§3) - { - const uint64_t ref_squads = ids.ref( 0x7848019b0c02a926ull ); - int64_t body_squads = 0; - body_squads += 1 + TableLebBytes( (uint64_t) ( cursor_squads.count ) ); // the element kind byte and the count - for ( int32_t elem_i_squads = 0; elem_i_squads < cursor_squads.count; elem_i_squads++ ) - { - const int64_t elem_bytes_squads = SquadMeasureBodyRetain( ctx, numbering, ids, cursor_squads[elem_i_squads], retain, TableRetainStepInto( path, 0, (uint32_t) ( elem_i_squads ) ) ); - if ( elem_bytes_squads < 0 ) { return -1; } - body_squads += TableLebBytes( (uint64_t) ( elem_bytes_squads ) ) + ( elem_bytes_squads ); - } - bytes += TableLebBytes( ref_squads ) + 1 + TableLebBytes( (uint64_t) ( body_squads ) ) + ( body_squads ); - } - } - if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -template -inline bool ArmySaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Army & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool SquadLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Squad & value, TableRetain * retain, const TableRetainPath & path ) { + (void) nodes; (void) index_bits; + SquadReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - TableListCursor cursor_squads = TableListElements( ctx, value.squads ); // squads - if ( !cursor_squads.ok ) { return false; } - if ( cursor_squads.count > 0 ) // an EMPTY list elides, the by-value rule (§3) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - const uint64_t ref_squads = ids.ref( 0x7848019b0c02a926ull ); - int64_t body_squads = 0; - body_squads += 1 + TableLebBytes( (uint64_t) ( cursor_squads.count ) ); // the element kind byte and the count - for ( int32_t elem_i_squads = 0; elem_i_squads < cursor_squads.count; elem_i_squads++ ) + case 0x1c84390d304f4f42ull: // roster { - const int64_t elem_bytes_squads = SquadMeasureBodyRetain( ctx, numbering, ids, cursor_squads[elem_i_squads], retain, TableRetainStepInto( path, 0, (uint32_t) ( elem_i_squads ) ) ); + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.roster, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + uint8_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const SquadRosterEntryMessageKeyRead read = SquadRosterEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (uint64_t) last_key, (uint64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + SquadRosterEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !SquadRosterEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xc4bcadba8e631b86ull: // name + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.name = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.name = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t ArmyMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Army & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { + // squads: a kind 14 array of kind 13 elements, INDEX order (§2.9) + TableListCursor cursor_squads = TableListElements( ctx, value.squads ); + if ( !cursor_squads.ok ) { return -1; } // the slot and the head disagree + if ( cursor_squads.count > 0 ) // an EMPTY list elides, the by-value rule (§3) + { + const uint64_t ref_squads = ids.ref( 0x7848019b0c02a926ull ); + int64_t body_squads = 0; + body_squads += 1 + TableLebBytes( (uint64_t) ( cursor_squads.count ) ); // the element kind byte and the count + for ( int32_t elem_i_squads = 0; elem_i_squads < cursor_squads.count; elem_i_squads++ ) + { + const int64_t elem_bytes_squads = SquadMeasureBodyRetain( ctx, numbering, ids, cursor_squads[elem_i_squads], retain, TableRetainStepInto( path, 0, (uint32_t) ( elem_i_squads ) ) ); + if ( elem_bytes_squads < 0 ) { return -1; } + body_squads += TableLebBytes( (uint64_t) ( elem_bytes_squads ) ) + ( elem_bytes_squads ); + } + bytes += TableLebBytes( ref_squads ) + 1 + TableLebBytes( (uint64_t) ( body_squads ) ) + ( body_squads ); + } + } + if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +template +inline bool ArmySaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Army & value, TableRetain * retain, const TableRetainPath & path ) +{ + { + TableListCursor cursor_squads = TableListElements( ctx, value.squads ); // squads + if ( !cursor_squads.ok ) { return false; } + if ( cursor_squads.count > 0 ) // an EMPTY list elides, the by-value rule (§3) + { + const uint64_t ref_squads = ids.ref( 0x7848019b0c02a926ull ); + int64_t body_squads = 0; + body_squads += 1 + TableLebBytes( (uint64_t) ( cursor_squads.count ) ); // the element kind byte and the count + for ( int32_t elem_i_squads = 0; elem_i_squads < cursor_squads.count; elem_i_squads++ ) + { + const int64_t elem_bytes_squads = SquadMeasureBodyRetain( ctx, numbering, ids, cursor_squads[elem_i_squads], retain, TableRetainStepInto( path, 0, (uint32_t) ( elem_i_squads ) ) ); if ( elem_bytes_squads < 0 ) { return false; } body_squads += TableLebBytes( (uint64_t) ( elem_bytes_squads ) ) + ( elem_bytes_squads ); } @@ -15884,6 +16962,130 @@ inline bool ArmyLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Arm } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool ArmyLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Army & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + ArmyReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x7848019b0c02a926ull: // squads + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableListFill fill = TableListFillBegin( nodes, value.squads, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + Squad * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + if ( !SquadLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, ( *slot ), retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { return false; } + } + TableListFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t DeckMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Deck & value, TableRetain * retain, const TableRetainPath & path ) { @@ -16058,22 +17260,150 @@ inline bool DeckLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Dec if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } break; } - if ( !r.has( 4 ) ) { r.report->malformed = true; return false; } - int32_t decoded_v = int32_t( r.get32( ) ); - value.after = decoded_v; - break; - } - case 0xffffffffffffffffull: - { - if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + if ( !r.has( 4 ) ) { r.report->malformed = true; return false; } + int32_t decoded_v = int32_t( r.get32( ) ); + value.after = decoded_v; + break; + } + case 0xffffffffffffffffull: + { + if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + break; + } + default: + { + r.report->unknown++; + if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } + break; + } + } + } +} + +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool DeckLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Deck & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + DeckReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x81b46a69304ee2c9ull: // hands + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) + { + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 3 ) { kept = 3; report->clamped++; } else { kept = (int32_t) n; } + const uint64_t walk = n; + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + Row scratch; + RowReset( scratch ); + if ( !RowLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, ( in_bounds ? value.hands[i] : scratch ), ( in_bounds ? retain : NULL ), TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { return false; } + } + value.hands_count = kept; + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } break; } default: + report->unknown++; { - r.report->unknown++; - if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } - break; + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); } + break; } } } @@ -16251,6 +17581,182 @@ inline const Row * RowLoadRetain( uint8_t * region, int64_t region_bytes, const return root; } +// RowNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool RowNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + RowNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !RowNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// RowLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool RowLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Row * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !RowMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = RowNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + RowNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !RowMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Row ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xa013e119fec906fbull; + Row * root = new ( region + used ) Row; // lifetime only: LoadMessageBody's first act is RowReset + RowReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Row ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !RowNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return RowLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// RowLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool RowLoadRetainMessages( const Row ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !RowLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // RowMeasureRetain and RowSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save @@ -16509,33 +18015,208 @@ inline const Sheet * SheetLoadRetain( uint8_t * region, int64_t region_bytes, co if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } } - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + SheetNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Sheet ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + SheetLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// SheetNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool SheetNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + SheetNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !SheetNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + bool ok = false; + switch ( type_id ) + { + case 0xa013e119fec906fbull: ok = RowLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(Row *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Row + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// SheetLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool SheetLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Sheet * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !SheetMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = SheetNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + SheetNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !SheetMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Sheet ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x0cc9e0af9a85fbc8ull; + Sheet * root = new ( region + used ) Sheet; // lifetime only: LoadMessageBody's first act is SheetReset + SheetReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Sheet ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - SheetNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; } + if ( !SheetNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Sheet ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - SheetLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return SheetLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// SheetLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool SheetLoadRetainMessages( const Sheet ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !SheetLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // SheetMeasureRetain and SheetSaveRetain: the pair, with the retained tail in @@ -16762,71 +18443,247 @@ inline const Squad * SquadLoadRetain( uint8_t * region, int64_t region_bytes, co // belongs to this region from here on. TableRetainReset( retain, nodes, region ); - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Squad ) ) + root_extent ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = SquadNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + directory[k + 1].type_id = type_id; + } + else + { + directory[k + 1].offset = (uint64_t) used; + directory[k + 1].type_id = type_id; + SquadNodePlace( type_id, region + used, length ); + used += storage; + } + k++; + } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + SquadNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Squad ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + SquadLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// SquadNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool SquadNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + SquadNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !SquadNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// SquadLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool SquadLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Squad * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !SquadMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = SquadNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + SquadNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !SquadMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Squad ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xec07a2f760550a91ull; + Squad * root = new ( region + used ) Squad; // lifetime only: LoadMessageBody's first act is SquadReset + SquadReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Squad ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Squad ) ) + root_extent ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - int64_t storage = SquadNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) - { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; - directory[k + 1].type_id = type_id; - } - else - { - directory[k + 1].offset = (uint64_t) used; - directory[k + 1].type_id = type_id; - SquadNodePlace( type_id, region + used, length ); - used += storage; - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } - } - - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) - { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + if ( directory[k + 1].offset == kTableNodeAbsent ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - SquadNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; } + if ( !SquadNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Squad ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - SquadLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return SquadLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// SquadLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool SquadLoadRetainMessages( const Squad ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !SquadLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // SquadMeasureRetain and SquadSaveRetain: the pair, with the retained tail in @@ -17050,71 +18907,247 @@ inline const Army * ArmyLoadRetain( uint8_t * region, int64_t region_bytes, cons // belongs to this region from here on. TableRetainReset( retain, nodes, region ); - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Army ) ) + root_extent ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = ArmyNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + directory[k + 1].type_id = type_id; + } + else + { + directory[k + 1].offset = (uint64_t) used; + directory[k + 1].type_id = type_id; + ArmyNodePlace( type_id, region + used, length ); + used += storage; + } + k++; + } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + ArmyNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Army ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + ArmyLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// ArmyNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool ArmyNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + ArmyNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !ArmyNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// ArmyLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool ArmyLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Army * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !ArmyMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = ArmyNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + ArmyNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !ArmyMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Army ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x06e2378b553a9e84ull; + Army * root = new ( region + used ) Army; // lifetime only: LoadMessageBody's first act is ArmyReset + ArmyReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Army ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Army ) ) + root_extent ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - int64_t storage = ArmyNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) - { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; - directory[k + 1].type_id = type_id; - } - else - { - directory[k + 1].offset = (uint64_t) used; - directory[k + 1].type_id = type_id; - ArmyNodePlace( type_id, region + used, length ); - used += storage; - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } - } - - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) - { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + if ( directory[k + 1].offset == kTableNodeAbsent ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - ArmyNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; } + if ( !ArmyNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Army ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - ArmyLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return ArmyLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// ArmyLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool ArmyLoadRetainMessages( const Army ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !ArmyLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // ArmyMeasureRetain and ArmySaveRetain: the pair, with the retained tail in @@ -17405,6 +19438,182 @@ inline const Deck * DeckLoadRetain( uint8_t * region, int64_t region_bytes, cons return root; } +// DeckNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool DeckNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + DeckNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !DeckNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// DeckLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool DeckLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Deck * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !DeckMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = DeckNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + DeckNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !DeckMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Deck ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xd043187343bfcfe8ull; + Deck * root = new ( region + used ) Deck; // lifetime only: LoadMessageBody's first act is DeckReset + DeckReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Deck ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !DeckNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return DeckLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// DeckLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool DeckLoadRetainMessages( const Deck ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !DeckLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // DeckMeasureRetain and DeckSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/lists/MigrateTable.h b/testdata/golden/tables/lists/MigrateTable.h index b2e69494f..ed606e479 100644 --- a/testdata/golden/tables/lists/MigrateTable.h +++ b/testdata/golden/tables/lists/MigrateTable.h @@ -4278,6 +4278,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace listdemo #endif // LISTDEMO_SCHEMA_TABLE_RETAIN @@ -5997,13 +6429,16 @@ template inline bool TableNodeMessageSave( const Ctx & ctx, const inline int64_t UnitMeasureBodyRetain( TableRetainIds & ids, const Unit & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool UnitSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Unit & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool UnitLoadBodyRetain( TableReader & r, Unit & value, TableRetain * retain, const TableRetainPath & path ); +inline bool UnitLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Unit & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t BoundedMeasureBodyRetain( TableRetainIds & ids, const Bounded & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool BoundedSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Bounded & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool BoundedLoadBodyRetain( TableReader & r, Bounded & value, TableRetain * retain, const TableRetainPath & path ); +inline bool BoundedLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Bounded & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t UnboundedMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Unbounded & value, TableRetain * retain, const TableRetainPath & path ); template inline bool UnboundedSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Unbounded & value, TableRetain * retain, const TableRetainPath & path ); template inline bool UnboundedSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Unbounded & value, TableRetain * retain, const TableRetainPath & path ); inline bool UnboundedLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Unbounded & value, TableRetain * retain, const TableRetainPath & path ); +inline bool UnboundedLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Unbounded & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t UnitMeasureBody( TableIds & ids, const Unit & value ) { @@ -8358,6 +8793,98 @@ LISTDEMO_TABLE_INLINE bool UnitLoadBodyRetain( TableReader & r, Unit & value, Ta } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool UnitLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Unit & value, TableRetain * retain, const TableRetainPath & path ) +{ + UnitReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xaf63eb4c86020609ull: // v + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.v = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.v = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + inline int64_t BoundedMeasureBodyRetain( TableRetainIds & ids, const Bounded & value, TableRetain * retain, const TableRetainPath & path ) { int64_t bytes = 1; // the ZERO REFERENCE that ends the body @@ -8538,10 +9065,137 @@ LISTDEMO_TABLE_INLINE bool BoundedLoadBodyRetain( TableReader & r, Bounded & val } } -template -inline int64_t UnboundedMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Unbounded & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool BoundedLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Bounded & value, TableRetain * retain, const TableRetainPath & path ) { - (void) ctx; (void) numbering; + BoundedReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3e7884bf4f412c6full: // items + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) + { + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 8 ) { kept = 8; report->clamped++; } else { kept = (int32_t) n; } + const uint64_t walk = n; + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + Unit scratch; + UnitReset( scratch ); + if ( !UnitLoadMessageBodyRetain( r, vocabulary, report, index_bits, ( in_bounds ? value.items[i] : scratch ), ( in_bounds ? retain : NULL ), TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { return false; } + } + value.items_count = kept; + } + break; + } + case 0x56d7ab194448a4f3ull: // tag + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.tag = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.tag = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t UnboundedMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Unbounded & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) ctx; (void) numbering; int64_t bytes = 1; // the ZERO REFERENCE that ends the body { // items: a kind 14 array of kind 13 elements, INDEX order (§2.9) @@ -8749,6 +9403,130 @@ inline bool UnboundedLoadBodyRetain( TableReader & r, const TableNodeMap & nodes } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool UnboundedLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Unbounded & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + UnboundedReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3e7884bf4f412c6full: // items + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableListFill fill = TableListFillBegin( nodes, value.items, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + Unit * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + if ( !UnitLoadMessageBodyRetain( r, vocabulary, report, index_bits, ( *slot ), retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { return false; } + } + TableListFillEnd( fill ); + } + break; + } + case 0x56d7ab194448a4f3ull: // tag + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.tag = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.tag = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + // UnboundedNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it // already owns. // EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the @@ -8922,6 +9700,182 @@ inline const Unbounded * UnboundedLoadRetain( uint8_t * region, int64_t region_b return root; } +// UnboundedNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool UnboundedNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + UnboundedNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !UnboundedNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// UnboundedLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool UnboundedLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Unbounded * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !UnboundedMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = UnboundedNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + UnboundedNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !UnboundedMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Unbounded ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x2ec2f34386026d8bull; + Unbounded * root = new ( region + used ) Unbounded; // lifetime only: LoadMessageBody's first act is UnboundedReset + UnboundedReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Unbounded ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !UnboundedNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return UnboundedLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// UnboundedLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool UnboundedLoadRetainMessages( const Unbounded ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !UnboundedLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // UnboundedMeasureRetain and UnboundedSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/lists/ReportTable.h b/testdata/golden/tables/lists/ReportTable.h index 04421138a..79327f572 100644 --- a/testdata/golden/tables/lists/ReportTable.h +++ b/testdata/golden/tables/lists/ReportTable.h @@ -4278,6 +4278,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace listdemo #endif // LISTDEMO_SCHEMA_TABLE_RETAIN @@ -6019,14 +6451,17 @@ template inline int64_t BytesMeasureBodyRetain( const Ctx & ctx, template inline bool BytesSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Bytes & value, TableRetain * retain, const TableRetainPath & path ); template inline bool BytesSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Bytes & value, TableRetain * retain, const TableRetainPath & path ); inline bool BytesLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Bytes & value, TableRetain * retain, const TableRetainPath & path ); +inline bool BytesLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Bytes & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t IntsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Ints & value, TableRetain * retain, const TableRetainPath & path ); template inline bool IntsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Ints & value, TableRetain * retain, const TableRetainPath & path ); template inline bool IntsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Ints & value, TableRetain * retain, const TableRetainPath & path ); inline bool IntsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Ints & value, TableRetain * retain, const TableRetainPath & path ); +inline bool IntsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Ints & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t FloatsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Floats & value, TableRetain * retain, const TableRetainPath & path ); template inline bool FloatsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Floats & value, TableRetain * retain, const TableRetainPath & path ); template inline bool FloatsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Floats & value, TableRetain * retain, const TableRetainPath & path ); inline bool FloatsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Floats & value, TableRetain * retain, const TableRetainPath & path ); +inline bool FloatsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Floats & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t BytesMeasureBody( const Ctx & ctx, const TableNumbering & numbering, TableIds & ids, const Bytes & value ) @@ -10589,233 +11024,145 @@ inline bool BytesLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, By } } -template -inline int64_t IntsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Ints & value, TableRetain * retain, const TableRetainPath & path ) -{ - (void) ctx; (void) numbering; - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - { - // values: a kind 14 array of kind 4 elements, INDEX order (§2.9) - TableListCursor cursor_values = TableListElements( ctx, value.values ); - if ( !cursor_values.ok ) { return -1; } // the slot and the head disagree - if ( cursor_values.count > 0 ) // an EMPTY list elides, the by-value rule (§3) - { - const uint64_t ref_values = ids.ref( 0x21277bcf1a4d67fbull ); - int64_t body_values = 0; - body_values += 1 + TableLebBytes( (uint64_t) ( cursor_values.count ) ); // the element kind byte and the count - body_values += (int64_t) ( cursor_values.count ) * 4; - bytes += TableLebBytes( ref_values ) + 1 + TableLebBytes( (uint64_t) ( body_values ) ) + ( body_values ); - } - } - if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -template -inline bool IntsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Ints & value, TableRetain * retain, const TableRetainPath & path ) -{ - (void) ctx; (void) numbering; - { - TableListCursor cursor_values = TableListElements( ctx, value.values ); // values - if ( !cursor_values.ok ) { return false; } - if ( cursor_values.count > 0 ) // an EMPTY list elides, the by-value rule (§3) - { - const uint64_t ref_values = ids.ref( 0x21277bcf1a4d67fbull ); - int64_t body_values = 0; - body_values += 1 + TableLebBytes( (uint64_t) ( cursor_values.count ) ); // the element kind byte and the count - body_values += (int64_t) ( cursor_values.count ) * 4; - w.putleb( ref_values ); w.put8( 14 ); w.putleb( (uint64_t) body_values ); // values - w.put8( 4 ); w.putleb( (uint64_t) ( cursor_values.count ) ); - for ( int32_t elem_i_values = 0; elem_i_values < cursor_values.count; elem_i_values++ ) - { - w.put32( uint32_t( cursor_values[elem_i_values] ) ); - } - } - } - if ( value.after != 0 ) - { - w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after - w.put32( uint32_t( value.after ) ); - } - if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } - return !w.overflow; -} - -template -inline bool IntsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Ints & value, TableRetain * retain, const TableRetainPath & path ) -{ - if ( !IntsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } - w.put8( 0 ); // the ZERO REFERENCE that ends the body - return !w.overflow; -} - -inline bool IntsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Ints & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool BytesLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Bytes & value, TableRetain * retain, const TableRetainPath & path ) { - (void) nodes; - IntsReset( value ); // prefill declared defaults in place, then overlay + (void) nodes; (void) index_bits; + BytesReset( value ); // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT - // (docs/SPEC-TABLES.md §6.6): this body is being established, so - // whatever an earlier occurrence of it left is discarded before the - // winning one is read. The discard moves neither counter. + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. TableRetainDiscardBody( retain, path ); for ( ;; ) { - uint64_t field_ref = 0; - if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } - if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE - if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count - const uint64_t field_id = r.ids->at( field_ref ); - if ( !r.has( 1 ) ) { r.report->malformed = true; return false; } - uint8_t kind = r.get8(); - if ( ( field_id == kTableNodeTableFieldId && r.nested ) || field_id == kTableBuildVersionFieldId || field_id == kTableMessageVocabularyFieldId ) - { - // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, - // IS MALFORMED (docs/SPEC-TABLES.md §3.1, §3.3). The node - // table's is the ROOT body's alone, on the numbering's own - // rule — a second numbering cannot exist — and the BUILD - // VERSION's rides in the announcement and nowhere else. That - // body stops and the parent reads on past its L. - r.report->malformed = true; - return false; - } - switch ( field_id ) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - case 0x21277bcf1a4d67fbull: // values + case 0x855b556730a34a05ull: // data { - if ( kind != 14 ) + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 6 ) { - // AT A POSITION THE READER DOES NAME, a field under - // kind 31 or kind 32 takes this same rule and no other (§3) - r.report->kind_mismatch++; - if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } break; } - uint64_t body_len = 0; - if ( !r.getleb( body_len ) || !r.room( body_len ) ) { r.report->malformed = true; return false; } - int64_t body_end = r.offset + (int64_t) body_len; - // A BODY TOO SHORT FOR ITS OWN HEADER is INERT (§4): the field keeps - // the value it has, no counter is raised, and the walk continues past L. - if ( body_len >= 2 ) { - uint8_t elem_kind = r.get8(); - uint64_t count = 0; - const bool counted_ok = r.getleb( count ); - if ( !counted_ok ) { r.report->malformed = true; } - // AN ELEMENT KIND THAT DISAGREES with the reader's declaration is §3's - // element-kind rule: the field reads EMPTY and one kind_mismatch counts - else if ( elem_kind != 4 ) - { - if ( !TableKindWidens( elem_kind, 4 ) ) { r.report->kind_mismatch++; r.offset = body_end; break; } - r.report->widened++; - // THE COUNT IS THE DATA'S (§2.9): there is no bound, so clamped - // cannot fire on it. A count above the int32 storage cap is the - // fill's refusal, and it moves no counter. - TableListFill fill = TableListFillBegin( nodes, value.values, count ); - if ( fill.refused ) { nodes.refused = true; return false; } - if ( !fill.ok ) { r.report->malformed = true; r.offset = body_end; break; } - // elements are BOUNDED by the field body: a count the length cannot - // cover keeps the decoded prefix, flags malformed, and the parent - // continues at the next field - TableReader sub( r.buffer + r.offset, body_end - r.offset, r.report, r.ids ); - for ( uint64_t i = 0; i < count; i++ ) - { - int32_t * slot = TableListFillNext( fill ); - if ( slot == NULL ) { r.report->malformed = true; break; } // the arena could not carve - bool landed = false; - do - { - int64_t widened_v = 0; - if ( !TableReadSignedAt( sub, elem_kind, widened_v ) ) { r.report->malformed = true; break; } - int32_t decoded_v = (int32_t) widened_v; - ( *slot ) = decoded_v; - landed = true; - } while ( 0 ); - if ( !landed ) { TableListFillDrop( fill ); break; } // the element's own framing gave out before it decoded - } - TableListFillEnd( fill ); - } - else + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + if ( !r.align() ) { report->malformed = true; return false; } // an array of kind 6 aligns before its elements + TableListFill fill = TableListFillBegin( nodes, value.data, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) { - // THE COUNT IS THE DATA'S (§2.9): there is no bound, so clamped - // cannot fire on it. A count above the int32 storage cap is the - // fill's refusal, and it moves no counter. - TableListFill fill = TableListFillBegin( nodes, value.values, count ); - if ( fill.refused ) { nodes.refused = true; return false; } - if ( !fill.ok ) { r.report->malformed = true; r.offset = body_end; break; } - // elements are BOUNDED by the field body: a count the length cannot - // cover keeps the decoded prefix, flags malformed, and the parent - // continues at the next field - TableReader sub( r.buffer + r.offset, body_end - r.offset, r.report, r.ids ); - for ( uint64_t i = 0; i < count; i++ ) + uint8_t * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve { - int32_t * slot = TableListFillNext( fill ); - if ( slot == NULL ) { r.report->malformed = true; break; } // the arena could not carve - bool landed = false; - do - { - if ( !sub.has( 4 ) ) { r.report->malformed = true; break; } - int32_t decoded_v = int32_t( sub.get32( ) ); - ( *slot ) = decoded_v; - landed = true; - } while ( 0 ); - if ( !landed ) { TableListFillDrop( fill ); break; } // the element's own framing gave out before it decoded + const int64_t width_2 = entry.elem_value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( entry.elem_packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) entry.elem_base_lo ); } + if ( (uint64_t) decoded_wide_2 > 255ull ) { decoded_wide_2 = (int64_t) 255ull; report->clamped++; } + uint8_t decoded_v_2 = (uint8_t) decoded_wide_2; + ( *slot ) = decoded_v_2; } - TableListFillEnd( fill ); } + TableListFillEnd( fill ); } - r.offset = body_end; // excess bytes and slack skip via the length break; } case 0xbf82010f6f71eae9ull: // after { - if ( kind != 4 ) + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) { - if ( TableKindWidens( kind, 4 ) ) + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) { - // WIDENED (§4): a kind that grew since the writer decodes - // exactly at its own width, the value lands, one widened counts - int64_t widened_v = 0; - if ( !TableReadSignedAt( r, kind, widened_v ) ) { r.report->malformed = true; return false; } - int32_t decoded_v = (int32_t) widened_v; - value.after = decoded_v; - r.report->widened++; + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; break; } - // AT A POSITION THE READER DOES NAME, a field under - // kind 31 or kind 32 takes this same rule and no other (§3) - r.report->kind_mismatch++; - if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } break; } - if ( !r.has( 4 ) ) { r.report->malformed = true; return false; } - int32_t decoded_v = int32_t( r.get32( ) ); - value.after = decoded_v; - break; - } - case 0xffffffffffffffffull: - { - if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } break; } default: + report->unknown++; { - r.report->unknown++; - if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } - break; + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); } + break; } } } template -inline int64_t FloatsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Floats & value, TableRetain * retain, const TableRetainPath & path ) +inline int64_t IntsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Ints & value, TableRetain * retain, const TableRetainPath & path ) { (void) ctx; (void) numbering; int64_t bytes = 1; // the ZERO REFERENCE that ends the body { - // values: a kind 14 array of kind 10 elements, INDEX order (§2.9) - TableListCursor cursor_values = TableListElements( ctx, value.values ); + // values: a kind 14 array of kind 4 elements, INDEX order (§2.9) + TableListCursor cursor_values = TableListElements( ctx, value.values ); if ( !cursor_values.ok ) { return -1; } // the slot and the head disagree if ( cursor_values.count > 0 ) // an EMPTY list elides, the by-value rule (§3) { @@ -10832,11 +11179,11 @@ inline int64_t FloatsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & } template -inline bool FloatsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Floats & value, TableRetain * retain, const TableRetainPath & path ) +inline bool IntsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Ints & value, TableRetain * retain, const TableRetainPath & path ) { (void) ctx; (void) numbering; { - TableListCursor cursor_values = TableListElements( ctx, value.values ); // values + TableListCursor cursor_values = TableListElements( ctx, value.values ); // values if ( !cursor_values.ok ) { return false; } if ( cursor_values.count > 0 ) // an EMPTY list elides, the by-value rule (§3) { @@ -10845,10 +11192,10 @@ inline bool FloatsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & body_values += 1 + TableLebBytes( (uint64_t) ( cursor_values.count ) ); // the element kind byte and the count body_values += (int64_t) ( cursor_values.count ) * 4; w.putleb( ref_values ); w.put8( 14 ); w.putleb( (uint64_t) body_values ); // values - w.put8( 10 ); w.putleb( (uint64_t) ( cursor_values.count ) ); + w.put8( 4 ); w.putleb( (uint64_t) ( cursor_values.count ) ); for ( int32_t elem_i_values = 0; elem_i_values < cursor_values.count; elem_i_values++ ) { - w.put32( table_float_to_bits( cursor_values[elem_i_values] ) ); + w.put32( uint32_t( cursor_values[elem_i_values] ) ); } } } @@ -10862,17 +11209,17 @@ inline bool FloatsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & } template -inline bool FloatsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Floats & value, TableRetain * retain, const TableRetainPath & path ) +inline bool IntsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Ints & value, TableRetain * retain, const TableRetainPath & path ) { - if ( !FloatsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } + if ( !IntsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } w.put8( 0 ); // the ZERO REFERENCE that ends the body return !w.overflow; } -inline bool FloatsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Floats & value, TableRetain * retain, const TableRetainPath & path ) +inline bool IntsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Ints & value, TableRetain * retain, const TableRetainPath & path ) { (void) nodes; - FloatsReset( value ); // prefill declared defaults in place, then overlay + IntsReset( value ); // prefill declared defaults in place, then overlay // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT // (docs/SPEC-TABLES.md §6.6): this body is being established, so // whatever an earlier occurrence of it left is discarded before the @@ -10923,13 +11270,43 @@ inline bool FloatsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, F if ( !counted_ok ) { r.report->malformed = true; } // AN ELEMENT KIND THAT DISAGREES with the reader's declaration is §3's // element-kind rule: the field reads EMPTY and one kind_mismatch counts - else if ( elem_kind != 10 ) { r.report->kind_mismatch++; r.offset = body_end; break; } + else if ( elem_kind != 4 ) + { + if ( !TableKindWidens( elem_kind, 4 ) ) { r.report->kind_mismatch++; r.offset = body_end; break; } + r.report->widened++; + // THE COUNT IS THE DATA'S (§2.9): there is no bound, so clamped + // cannot fire on it. A count above the int32 storage cap is the + // fill's refusal, and it moves no counter. + TableListFill fill = TableListFillBegin( nodes, value.values, count ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { r.report->malformed = true; r.offset = body_end; break; } + // elements are BOUNDED by the field body: a count the length cannot + // cover keeps the decoded prefix, flags malformed, and the parent + // continues at the next field + TableReader sub( r.buffer + r.offset, body_end - r.offset, r.report, r.ids ); + for ( uint64_t i = 0; i < count; i++ ) + { + int32_t * slot = TableListFillNext( fill ); + if ( slot == NULL ) { r.report->malformed = true; break; } // the arena could not carve + bool landed = false; + do + { + int64_t widened_v = 0; + if ( !TableReadSignedAt( sub, elem_kind, widened_v ) ) { r.report->malformed = true; break; } + int32_t decoded_v = (int32_t) widened_v; + ( *slot ) = decoded_v; + landed = true; + } while ( 0 ); + if ( !landed ) { TableListFillDrop( fill ); break; } // the element's own framing gave out before it decoded + } + TableListFillEnd( fill ); + } else { // THE COUNT IS THE DATA'S (§2.9): there is no bound, so clamped // cannot fire on it. A count above the int32 storage cap is the // fill's refusal, and it moves no counter. - TableListFill fill = TableListFillBegin( nodes, value.values, count ); + TableListFill fill = TableListFillBegin( nodes, value.values, count ); if ( fill.refused ) { nodes.refused = true; return false; } if ( !fill.ok ) { r.report->malformed = true; r.offset = body_end; break; } // elements are BOUNDED by the field body: a count the length cannot @@ -10938,13 +11315,14 @@ inline bool FloatsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, F TableReader sub( r.buffer + r.offset, body_end - r.offset, r.report, r.ids ); for ( uint64_t i = 0; i < count; i++ ) { - float * slot = TableListFillNext( fill ); + int32_t * slot = TableListFillNext( fill ); if ( slot == NULL ) { r.report->malformed = true; break; } // the arena could not carve bool landed = false; do { if ( !sub.has( 4 ) ) { r.report->malformed = true; break; } - ( *slot ) = table_bits_to_float( sub.get32() ); + int32_t decoded_v = int32_t( sub.get32( ) ); + ( *slot ) = decoded_v; landed = true; } while ( 0 ); if ( !landed ) { TableListFillDrop( fill ); break; } // the element's own framing gave out before it decoded @@ -10996,15 +11374,476 @@ inline bool FloatsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, F } } -// BytesNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it -// already owns. -// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the -// index is the region directory's, which Load fills from the wire's framing -// and nothing afterwards renumbers. -inline void BytesNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool IntsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Ints & value, TableRetain * retain, const TableRetainPath & path ) { - // the node's own EXTENT, where its lists' and maps' arrays are carved - // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). + (void) nodes; (void) index_bits; + IntsReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x21277bcf1a4d67fbull: // values + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 4 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + TableListFill fill = TableListFillBegin( nodes, value.values, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + int32_t * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + const int64_t width_2 = entry.elem_value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( entry.elem_packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) entry.elem_base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + ( *slot ) = decoded_v_2; + } + } + TableListFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t FloatsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Floats & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) ctx; (void) numbering; + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { + // values: a kind 14 array of kind 10 elements, INDEX order (§2.9) + TableListCursor cursor_values = TableListElements( ctx, value.values ); + if ( !cursor_values.ok ) { return -1; } // the slot and the head disagree + if ( cursor_values.count > 0 ) // an EMPTY list elides, the by-value rule (§3) + { + const uint64_t ref_values = ids.ref( 0x21277bcf1a4d67fbull ); + int64_t body_values = 0; + body_values += 1 + TableLebBytes( (uint64_t) ( cursor_values.count ) ); // the element kind byte and the count + body_values += (int64_t) ( cursor_values.count ) * 4; + bytes += TableLebBytes( ref_values ) + 1 + TableLebBytes( (uint64_t) ( body_values ) ) + ( body_values ); + } + } + if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +template +inline bool FloatsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Floats & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) ctx; (void) numbering; + { + TableListCursor cursor_values = TableListElements( ctx, value.values ); // values + if ( !cursor_values.ok ) { return false; } + if ( cursor_values.count > 0 ) // an EMPTY list elides, the by-value rule (§3) + { + const uint64_t ref_values = ids.ref( 0x21277bcf1a4d67fbull ); + int64_t body_values = 0; + body_values += 1 + TableLebBytes( (uint64_t) ( cursor_values.count ) ); // the element kind byte and the count + body_values += (int64_t) ( cursor_values.count ) * 4; + w.putleb( ref_values ); w.put8( 14 ); w.putleb( (uint64_t) body_values ); // values + w.put8( 10 ); w.putleb( (uint64_t) ( cursor_values.count ) ); + for ( int32_t elem_i_values = 0; elem_i_values < cursor_values.count; elem_i_values++ ) + { + w.put32( table_float_to_bits( cursor_values[elem_i_values] ) ); + } + } + } + if ( value.after != 0 ) + { + w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after + w.put32( uint32_t( value.after ) ); + } + if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } + return !w.overflow; +} + +template +inline bool FloatsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Floats & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( !FloatsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } + w.put8( 0 ); // the ZERO REFERENCE that ends the body + return !w.overflow; +} + +inline bool FloatsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Floats & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; + FloatsReset( value ); // prefill declared defaults in place, then overlay + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so + // whatever an earlier occurrence of it left is discarded before the + // winning one is read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t field_ref = 0; + if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } + if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE + if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count + const uint64_t field_id = r.ids->at( field_ref ); + if ( !r.has( 1 ) ) { r.report->malformed = true; return false; } + uint8_t kind = r.get8(); + if ( ( field_id == kTableNodeTableFieldId && r.nested ) || field_id == kTableBuildVersionFieldId || field_id == kTableMessageVocabularyFieldId ) + { + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, + // IS MALFORMED (docs/SPEC-TABLES.md §3.1, §3.3). The node + // table's is the ROOT body's alone, on the numbering's own + // rule — a second numbering cannot exist — and the BUILD + // VERSION's rides in the announcement and nowhere else. That + // body stops and the parent reads on past its L. + r.report->malformed = true; + return false; + } + switch ( field_id ) + { + case 0x21277bcf1a4d67fbull: // values + { + if ( kind != 14 ) + { + // AT A POSITION THE READER DOES NAME, a field under + // kind 31 or kind 32 takes this same rule and no other (§3) + r.report->kind_mismatch++; + if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + break; + } + uint64_t body_len = 0; + if ( !r.getleb( body_len ) || !r.room( body_len ) ) { r.report->malformed = true; return false; } + int64_t body_end = r.offset + (int64_t) body_len; + // A BODY TOO SHORT FOR ITS OWN HEADER is INERT (§4): the field keeps + // the value it has, no counter is raised, and the walk continues past L. + if ( body_len >= 2 ) + { + uint8_t elem_kind = r.get8(); + uint64_t count = 0; + const bool counted_ok = r.getleb( count ); + if ( !counted_ok ) { r.report->malformed = true; } + // AN ELEMENT KIND THAT DISAGREES with the reader's declaration is §3's + // element-kind rule: the field reads EMPTY and one kind_mismatch counts + else if ( elem_kind != 10 ) { r.report->kind_mismatch++; r.offset = body_end; break; } + else + { + // THE COUNT IS THE DATA'S (§2.9): there is no bound, so clamped + // cannot fire on it. A count above the int32 storage cap is the + // fill's refusal, and it moves no counter. + TableListFill fill = TableListFillBegin( nodes, value.values, count ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { r.report->malformed = true; r.offset = body_end; break; } + // elements are BOUNDED by the field body: a count the length cannot + // cover keeps the decoded prefix, flags malformed, and the parent + // continues at the next field + TableReader sub( r.buffer + r.offset, body_end - r.offset, r.report, r.ids ); + for ( uint64_t i = 0; i < count; i++ ) + { + float * slot = TableListFillNext( fill ); + if ( slot == NULL ) { r.report->malformed = true; break; } // the arena could not carve + bool landed = false; + do + { + if ( !sub.has( 4 ) ) { r.report->malformed = true; break; } + ( *slot ) = table_bits_to_float( sub.get32() ); + landed = true; + } while ( 0 ); + if ( !landed ) { TableListFillDrop( fill ); break; } // the element's own framing gave out before it decoded + } + TableListFillEnd( fill ); + } + } + r.offset = body_end; // excess bytes and slack skip via the length + break; + } + case 0xbf82010f6f71eae9ull: // after + { + if ( kind != 4 ) + { + if ( TableKindWidens( kind, 4 ) ) + { + // WIDENED (§4): a kind that grew since the writer decodes + // exactly at its own width, the value lands, one widened counts + int64_t widened_v = 0; + if ( !TableReadSignedAt( r, kind, widened_v ) ) { r.report->malformed = true; return false; } + int32_t decoded_v = (int32_t) widened_v; + value.after = decoded_v; + r.report->widened++; + break; + } + // AT A POSITION THE READER DOES NAME, a field under + // kind 31 or kind 32 takes this same rule and no other (§3) + r.report->kind_mismatch++; + if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + break; + } + if ( !r.has( 4 ) ) { r.report->malformed = true; return false; } + int32_t decoded_v = int32_t( r.get32( ) ); + value.after = decoded_v; + break; + } + case 0xffffffffffffffffull: + { + if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + break; + } + default: + { + r.report->unknown++; + if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } + break; + } + } + } +} + +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool FloatsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Floats & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + FloatsReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x21277bcf1a4d67fbull: // values + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 10 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + TableListFill fill = TableListFillBegin( nodes, value.values, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + float * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + float decoded_f_2 = 0.0f; + if ( entry.elem_packing == 2 ) + { + uint64_t index_2 = 0; + if ( !r.get( index_2, entry.elem_value_bits ) ) { report->malformed = true; return false; } + if ( index_2 > (uint64_t) entry.elem_qcount ) { report->malformed = true; return false; } // above the step count: the packet wire's own refusal + decoded_f_2 = TableMessageDequantize( (uint32_t) index_2, entry.elem_qmin, entry.elem_qdelta, entry.elem_qcount ); // SPEC.md §4.3's rule, in float32 + } + else + { + uint64_t raw_2 = 0; + if ( !r.get( raw_2, 32 ) ) { report->malformed = true; return false; } + decoded_f_2 = table_bits_to_float( (uint32_t) raw_2 ); + } + ( *slot ) = decoded_f_2; + } + } + TableListFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +// BytesNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it +// already owns. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is the region directory's, which Load fills from the wire's framing +// and nothing afterwards renumbers. +inline void BytesNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + // the node's own EXTENT, where its lists' and maps' arrays are carved + // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). // The tool's path carries a worker instead: there the arrays are the // arena's. TableExtentCarve carve; @@ -11102,71 +11941,247 @@ inline const Bytes * BytesLoadRetain( uint8_t * region, int64_t region_bytes, co // belongs to this region from here on. TableRetainReset( retain, nodes, region ); - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Bytes ) ) + root_extent ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = BytesNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + directory[k + 1].type_id = type_id; + } + else + { + directory[k + 1].offset = (uint64_t) used; + directory[k + 1].type_id = type_id; + BytesNodePlace( type_id, region + used, length ); + used += storage; + } + k++; + } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + BytesNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Bytes ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + BytesLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// BytesNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool BytesNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + BytesNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !BytesNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// BytesLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool BytesLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Bytes * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !BytesMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = BytesNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + BytesNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !BytesMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Bytes ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xeeeea7adc131a244ull; + Bytes * root = new ( region + used ) Bytes; // lifetime only: LoadMessageBody's first act is BytesReset + BytesReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Bytes ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Bytes ) ) + root_extent ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - int64_t storage = BytesNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) - { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; - directory[k + 1].type_id = type_id; - } - else - { - directory[k + 1].offset = (uint64_t) used; - directory[k + 1].type_id = type_id; - BytesNodePlace( type_id, region + used, length ); - used += storage; - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } - } - - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) - { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + if ( directory[k + 1].offset == kTableNodeAbsent ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - BytesNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; } + if ( !BytesNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Bytes ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - BytesLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return BytesLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// BytesLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool BytesLoadRetainMessages( const Bytes ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !BytesLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // BytesMeasureRetain and BytesSaveRetain: the pair, with the retained tail in @@ -11390,71 +12405,247 @@ inline const Ints * IntsLoadRetain( uint8_t * region, int64_t region_bytes, cons // belongs to this region from here on. TableRetainReset( retain, nodes, region ); - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Ints ) ) + root_extent ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = IntsNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + directory[k + 1].type_id = type_id; + } + else + { + directory[k + 1].offset = (uint64_t) used; + directory[k + 1].type_id = type_id; + IntsNodePlace( type_id, region + used, length ); + used += storage; + } + k++; + } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + IntsNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Ints ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + IntsLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// IntsNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool IntsNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + IntsNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !IntsNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// IntsLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool IntsLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Ints * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !IntsMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = IntsNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + IntsNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !IntsMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Ints ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x2034c5d17c00ceb7ull; + Ints * root = new ( region + used ) Ints; // lifetime only: LoadMessageBody's first act is IntsReset + IntsReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Ints ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Ints ) ) + root_extent ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - int64_t storage = IntsNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) - { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; - directory[k + 1].type_id = type_id; - } - else - { - directory[k + 1].offset = (uint64_t) used; - directory[k + 1].type_id = type_id; - IntsNodePlace( type_id, region + used, length ); - used += storage; - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } - } - - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) - { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + if ( directory[k + 1].offset == kTableNodeAbsent ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - IntsNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; } + if ( !IntsNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Ints ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - IntsLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return IntsLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// IntsLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool IntsLoadRetainMessages( const Ints ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !IntsLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // IntsMeasureRetain and IntsSaveRetain: the pair, with the retained tail in @@ -11745,6 +12936,182 @@ inline const Floats * FloatsLoadRetain( uint8_t * region, int64_t region_bytes, return root; } +// FloatsNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool FloatsNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + FloatsNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !FloatsNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// FloatsLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool FloatsLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Floats * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !FloatsMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = FloatsNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + FloatsNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !FloatsMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Floats ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x91638659f8f6ad42ull; + Floats * root = new ( region + used ) Floats; // lifetime only: LoadMessageBody's first act is FloatsReset + FloatsReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Floats ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !FloatsNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return FloatsLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// FloatsLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool FloatsLoadRetainMessages( const Floats ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !FloatsLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // FloatsMeasureRetain and FloatsSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/lists/SaveTable.h b/testdata/golden/tables/lists/SaveTable.h index a3e1b541f..0e195bd24 100644 --- a/testdata/golden/tables/lists/SaveTable.h +++ b/testdata/golden/tables/lists/SaveTable.h @@ -4278,6 +4278,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace listdemo #endif // LISTDEMO_SCHEMA_TABLE_RETAIN @@ -6220,20 +6652,25 @@ template inline bool TableNodeMessageSave( const Ctx & ctx, const inline int64_t PlacementMeasureBodyRetain( TableRetainIds & ids, const Placement & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool PlacementSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Placement & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool PlacementLoadBodyRetain( TableReader & r, Placement & value, TableRetain * retain, const TableRetainPath & path ); +inline bool PlacementLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Placement & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t LogEntryMeasureBodyRetain( TableRetainIds & ids, const LogEntry & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool LogEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const LogEntry & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool LogEntryLoadBodyRetain( TableReader & r, LogEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool LogEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, LogEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t SaveMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Save & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SaveSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Save & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SaveSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Save & value, TableRetain * retain, const TableRetainPath & path ); inline bool SaveLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Save & value, TableRetain * retain, const TableRetainPath & path ); +inline bool SaveLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Save & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t PointMeasureBodyRetain( TableRetainIds & ids, const Point & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool PointSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Point & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool PointLoadBodyRetain( TableReader & r, Point & value, TableRetain * retain, const TableRetainPath & path ); +inline bool PointLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Point & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t MixedMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Mixed & value, TableRetain * retain, const TableRetainPath & path ); template inline bool MixedSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Mixed & value, TableRetain * retain, const TableRetainPath & path ); template inline bool MixedSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Mixed & value, TableRetain * retain, const TableRetainPath & path ); inline bool MixedLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Mixed & value, TableRetain * retain, const TableRetainPath & path ); +inline bool MixedLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Mixed & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t PlacementMeasureBody( TableIds & ids, const Placement & value ) { @@ -11922,80 +12359,220 @@ LISTDEMO_TABLE_INLINE bool PlacementLoadBodyRetain( TableReader & r, Placement & } } -inline int64_t LogEntryMeasureBodyRetain( TableRetainIds & ids, const LogEntry & value, TableRetain * retain, const TableRetainPath & path ) -{ - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.tick != 0 ) { bytes += TableLebBytes( ids.ref( 0x1e7683ef2ebc7684ull ) ) + 1 + 4; } // tick - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -LISTDEMO_TABLE_INLINE bool LogEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const LogEntry & value, TableRetain * retain, const TableRetainPath & path ) -{ - if ( value.tick != 0 ) - { - w.putleb( ids.ref( 0x1e7683ef2ebc7684ull ) ); w.put8( 8 ); // tick - w.put32( uint32_t( value.tick ) ); - } - if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } - w.put8( 0 ); // the ZERO REFERENCE that ends the body - return !w.overflow; -} - -LISTDEMO_TABLE_INLINE bool LogEntryLoadBodyRetain( TableReader & r, LogEntry & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool PlacementLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Placement & value, TableRetain * retain, const TableRetainPath & path ) { - LogEntryReset( value ); // prefill declared defaults in place, then overlay + PlacementReset( value ); // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT - // (docs/SPEC-TABLES.md §6.6): this body is being established, so - // whatever an earlier occurrence of it left is discarded before the - // winning one is read. The discard moves neither counter. + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. TableRetainDiscardBody( retain, path ); for ( ;; ) { - uint64_t field_ref = 0; - if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } - if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE - if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count - const uint64_t field_id = r.ids->at( field_ref ); - if ( !r.has( 1 ) ) { r.report->malformed = true; return false; } - uint8_t kind = r.get8(); - if ( ( field_id == kTableNodeTableFieldId && r.nested ) || field_id == kTableBuildVersionFieldId || field_id == kTableMessageVocabularyFieldId ) - { - // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, - // IS MALFORMED (docs/SPEC-TABLES.md §3.1, §3.3). The node - // table's is the ROOT body's alone, on the numbering's own - // rule — a second numbering cannot exist — and the BUILD - // VERSION's rides in the announcement and nowhere else. That - // body stops and the parent reads on past its L. - r.report->malformed = true; - return false; - } - switch ( field_id ) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - case 0x1e7683ef2ebc7684ull: // tick + case 0xaf63f54c86021707ull: // x { - if ( kind != 8 ) + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 10 || entry.elem_kind != 0 ) { - if ( TableKindWidens( kind, 8 ) ) - { - // WIDENED (§4): a kind that grew since the writer decodes - // exactly at its own width, the value lands, one widened counts - uint64_t widened_v = 0; - if ( !TableReadUnsignedAt( r, kind, widened_v ) ) { r.report->malformed = true; return false; } - uint32_t decoded_v = (uint32_t) widened_v; - value.tick = decoded_v; - r.report->widened++; - break; - } - // AT A POSITION THE READER DOES NAME, a field under - // kind 31 or kind 32 takes this same rule and no other (§3) - r.report->kind_mismatch++; - if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } break; } - if ( !r.has( 4 ) ) { r.report->malformed = true; return false; } - uint32_t decoded_v = uint32_t( r.get32( ) ); - value.tick = decoded_v; + { + float decoded_f = 0.0f; + if ( entry.packing == 2 ) + { + uint64_t index = 0; + if ( !r.get( index, entry.value_bits ) ) { report->malformed = true; return false; } + if ( index > (uint64_t) entry.qcount ) { report->malformed = true; return false; } // above the step count: the packet wire's own refusal + decoded_f = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); // SPEC.md §4.3's rule, in float32 + } + else + { + uint64_t raw = 0; + if ( !r.get( raw, 32 ) ) { report->malformed = true; return false; } + decoded_f = table_bits_to_float( (uint32_t) raw ); + } + value.x = decoded_f; + } + break; + } + case 0xaf63f44c86021554ull: // y + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 10 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + float decoded_f = 0.0f; + if ( entry.packing == 2 ) + { + uint64_t index = 0; + if ( !r.get( index, entry.value_bits ) ) { report->malformed = true; return false; } + if ( index > (uint64_t) entry.qcount ) { report->malformed = true; return false; } // above the step count: the packet wire's own refusal + decoded_f = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); // SPEC.md §4.3's rule, in float32 + } + else + { + uint64_t raw = 0; + if ( !r.get( raw, 32 ) ) { report->malformed = true; return false; } + decoded_f = table_bits_to_float( (uint32_t) raw ); + } + value.y = decoded_f; + } + break; + } + case 0x9de543933e6e703aull: // model + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 8 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 8 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.model = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.model = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +inline int64_t LogEntryMeasureBodyRetain( TableRetainIds & ids, const LogEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.tick != 0 ) { bytes += TableLebBytes( ids.ref( 0x1e7683ef2ebc7684ull ) ) + 1 + 4; } // tick + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +LISTDEMO_TABLE_INLINE bool LogEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const LogEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( value.tick != 0 ) + { + w.putleb( ids.ref( 0x1e7683ef2ebc7684ull ) ); w.put8( 8 ); // tick + w.put32( uint32_t( value.tick ) ); + } + if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } + w.put8( 0 ); // the ZERO REFERENCE that ends the body + return !w.overflow; +} + +LISTDEMO_TABLE_INLINE bool LogEntryLoadBodyRetain( TableReader & r, LogEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + LogEntryReset( value ); // prefill declared defaults in place, then overlay + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so + // whatever an earlier occurrence of it left is discarded before the + // winning one is read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t field_ref = 0; + if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } + if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE + if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count + const uint64_t field_id = r.ids->at( field_ref ); + if ( !r.has( 1 ) ) { r.report->malformed = true; return false; } + uint8_t kind = r.get8(); + if ( ( field_id == kTableNodeTableFieldId && r.nested ) || field_id == kTableBuildVersionFieldId || field_id == kTableMessageVocabularyFieldId ) + { + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, + // IS MALFORMED (docs/SPEC-TABLES.md §3.1, §3.3). The node + // table's is the ROOT body's alone, on the numbering's own + // rule — a second numbering cannot exist — and the BUILD + // VERSION's rides in the announcement and nowhere else. That + // body stops and the parent reads on past its L. + r.report->malformed = true; + return false; + } + switch ( field_id ) + { + case 0x1e7683ef2ebc7684ull: // tick + { + if ( kind != 8 ) + { + if ( TableKindWidens( kind, 8 ) ) + { + // WIDENED (§4): a kind that grew since the writer decodes + // exactly at its own width, the value lands, one widened counts + uint64_t widened_v = 0; + if ( !TableReadUnsignedAt( r, kind, widened_v ) ) { r.report->malformed = true; return false; } + uint32_t decoded_v = (uint32_t) widened_v; + value.tick = decoded_v; + r.report->widened++; + break; + } + // AT A POSITION THE READER DOES NAME, a field under + // kind 31 or kind 32 takes this same rule and no other (§3) + r.report->kind_mismatch++; + if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + break; + } + if ( !r.has( 4 ) ) { r.report->malformed = true; return false; } + uint32_t decoded_v = uint32_t( r.get32( ) ); + value.tick = decoded_v; break; } default: @@ -12008,6 +12585,86 @@ LISTDEMO_TABLE_INLINE bool LogEntryLoadBodyRetain( TableReader & r, LogEntry & v } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool LogEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, LogEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + LogEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x1e7683ef2ebc7684ull: // tick + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 8 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 8 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.tick = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.tick = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t SaveMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Save & value, TableRetain * retain, const TableRetainPath & path ) { @@ -12409,18 +13066,167 @@ inline bool SaveLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Sav } } -inline int64_t PointMeasureBodyRetain( TableRetainIds & ids, const Point & value, TableRetain * retain, const TableRetainPath & path ) -{ - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.x != 0 ) { bytes += TableLebBytes( ids.ref( 0xaf63f54c86021707ull ) ) + 1 + 4; } // x - if ( value.y != 0 ) { bytes += TableLebBytes( ids.ref( 0xaf63f44c86021554ull ) ) + 1 + 4; } // y - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -LISTDEMO_TABLE_INLINE bool PointSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Point & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool SaveLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Save & value, TableRetain * retain, const TableRetainPath & path ) { - if ( value.x != 0 ) + (void) nodes; (void) index_bits; + SaveReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xd24733aa574d4b09ull: // placements + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableListFill fill = TableListFillBegin( nodes, value.placements, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + Placement * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + if ( !PlacementLoadMessageBodyRetain( r, vocabulary, report, index_bits, ( *slot ), retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { return false; } + } + TableListFillEnd( fill ); + } + break; + } + case 0x125073191daf5431ull: // log + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 17 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + TableListFill fill = TableListFillBegin( nodes, value.log, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + TableRef * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + uint64_t node_index_2 = 0; + if ( !r.get( node_index_2, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, ( *slot ), node_index_2, 0x5e781536ac58825full, report ); // *LogEntry + } + } + TableListFillEnd( fill ); + } + break; + } + case 0x01986b0b27400fb2ull: // scores + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 4 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + TableListFill fill = TableListFillBegin( nodes, value.scores, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + int32_t * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + const int64_t width_2 = entry.elem_value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( entry.elem_packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) entry.elem_base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + ( *slot ) = decoded_v_2; + } + } + TableListFillEnd( fill ); + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +inline int64_t PointMeasureBodyRetain( TableRetainIds & ids, const Point & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.x != 0 ) { bytes += TableLebBytes( ids.ref( 0xaf63f54c86021707ull ) ) + 1 + 4; } // x + if ( value.y != 0 ) { bytes += TableLebBytes( ids.ref( 0xaf63f44c86021554ull ) ) + 1 + 4; } // y + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +LISTDEMO_TABLE_INLINE bool PointSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Point & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( value.x != 0 ) { w.putleb( ids.ref( 0xaf63f54c86021707ull ) ); w.put8( 4 ); // x w.put32( uint32_t( value.x ) ); @@ -12527,6 +13333,148 @@ LISTDEMO_TABLE_INLINE bool PointLoadBodyRetain( TableReader & r, Point & value, } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool PointLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Point & value, TableRetain * retain, const TableRetainPath & path ) +{ + PointReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xaf63f54c86021707ull: // x + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.x = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.x = decoded_v; + } + break; + } + case 0xaf63f44c86021554ull: // y + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.y = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.y = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t MixedMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Mixed & value, TableRetain * retain, const TableRetainPath & path ) { @@ -13096,53 +14044,319 @@ inline bool MixedLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Mi } while ( 0 ); if ( !landed ) { TableListFillDrop( fill ); break; } // the element's own framing gave out before it decoded } - TableListFillEnd( fill ); + TableListFillEnd( fill ); + } + else + { + // THE COUNT IS THE DATA'S (§2.9): there is no bound, so clamped + // cannot fire on it. A count above the int32 storage cap is the + // fill's refusal, and it moves no counter. + TableListFill fill = TableListFillBegin( nodes, value.bounds, count ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { r.report->malformed = true; r.offset = body_end; break; } + // elements are BOUNDED by the field body: a count the length cannot + // cover keeps the decoded prefix, flags malformed, and the parent + // continues at the next field + TableReader sub( r.buffer + r.offset, body_end - r.offset, r.report, r.ids ); + for ( uint64_t i = 0; i < count; i++ ) + { + int32_t * slot = TableListFillNext( fill ); + if ( slot == NULL ) { r.report->malformed = true; break; } // the arena could not carve + bool landed = false; + do + { + if ( !sub.has( 4 ) ) { r.report->malformed = true; break; } + int32_t decoded_v = int32_t( sub.get32( ) ); + if ( decoded_v < 0 ) { decoded_v = 0; r.report->clamped++; } + else if ( decoded_v > 100 ) { decoded_v = 100; r.report->clamped++; } + ( *slot ) = decoded_v; + landed = true; + } while ( 0 ); + if ( !landed ) { TableListFillDrop( fill ); break; } // the element's own framing gave out before it decoded + } + TableListFillEnd( fill ); + } + } + r.offset = body_end; // excess bytes and slack skip via the length + break; + } + case 0xffffffffffffffffull: + { + if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + break; + } + default: + { + r.report->unknown++; + if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } + break; + } + } + } +} + +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool MixedLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Mixed & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + MixedReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xd90a4e7682f799c5ull: // grades + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 30 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + TableListFill fill = TableListFillBegin( nodes, value.grades, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + Grade * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + uint64_t variant_ref_2 = 0; + if ( !r.get( variant_ref_2, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry variant_entry_2; + if ( variant_ref_2 == 0 ) { ( *slot ) = Grade::None; } // the zero reference is the enum's None + else if ( !TableMessageNameEntry( vocabulary, variant_ref_2, variant_entry_2 ) ) { report->malformed = true; return false; } + else if ( !TableEnumValue( variant_entry_2.id, ( *slot ) ) ) { ( *slot ) = Grade::None; report->unknown++; report->retain_lost++; } + } + } + TableListFillEnd( fill ); + } + break; + } + case 0x4af2ed8470862ea8ull: // perms + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 9 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + TableListFill fill = TableListFillBegin( nodes, value.perms, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + Perm * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + const int64_t width_2 = entry.elem_value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( entry.elem_packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) entry.elem_base_lo ); } + uint64_t decoded_v_2 = (uint64_t) decoded_wide_2; + ( *slot ) = decoded_v_2; + } + } + TableListFillEnd( fill ); + } + break; + } + case 0x732dfbcc9b0cf0bbull: // hits + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 15 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 2 ); + TableListFill fill = TableListFillBegin( nodes, value.hits, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + Hit * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + uint64_t arm_ref_2 = 0; + if ( !r.get( arm_ref_2, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry arm_2; + if ( arm_ref_2 == 0 ) { ( *slot ).type = HitType::None; } + else if ( !TableMessageArmEntry( vocabulary, arm_ref_2, arm_2 ) ) { report->malformed = true; return false; } + else + { + switch ( arm_2.id ) + { + case 0x73feab3544c345b1ull: // point + { + if ( arm_2.kind != 13 || arm_2.elem_kind != 0 ) + { + ( *slot ).type = HitType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + ( *slot ).type = HitType::Point; + if ( !PointLoadMessageBodyRetain( r, vocabulary, report, index_bits, ( *slot ).point, retain, TableRetainStepInto( path, 2, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + case 0x7f6308be8ab37fc0ull: // damage + { + if ( arm_2.kind != 4 || arm_2.elem_kind != 0 ) + { + if ( TableKindWidens( arm_2.kind, 4 ) ) + { + ( *slot ).type = HitType::Damage; + memset( (void *) &( *slot ).damage, 0, sizeof( ( *slot ).damage ) ); // selection establishes the arm (§2.6) + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + ( *slot ).damage = decoded_v_3; + } + report->widened++; + break; + } + ( *slot ).type = HitType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + ( *slot ).type = HitType::Damage; + { + const int64_t width_3 = arm_2.value_bits; + uint64_t raw_3 = 0; + if ( width_3 < 0 || !r.get( raw_3, width_3 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_3 = (int64_t) raw_3; + if ( arm_2.packing == 1 ) { decoded_wide_3 = (int64_t) ( raw_3 + (uint64_t) arm_2.base_lo ); } + else if ( width_3 > 0 && width_3 < 64 ) + { + const uint64_t sign_3 = uint64_t(1) << ( width_3 - 1 ); + if ( ( raw_3 & sign_3 ) != 0 ) { decoded_wide_3 = (int64_t) ( raw_3 | ~( ( uint64_t(1) << width_3 ) - 1 ) ); } + } + if ( decoded_wide_3 < -2147483648ll ) { decoded_wide_3 = -2147483648ll; report->clamped++; } + if ( decoded_wide_3 > 2147483647ll ) { decoded_wide_3 = 2147483647ll; report->clamped++; } + int32_t decoded_v_3 = (int32_t) decoded_wide_3; + ( *slot ).damage = decoded_v_3; + } + break; + } + default: + ( *slot ).type = HitType::None; report->unknown++; report->retain_lost++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm_2 ) ) { report->malformed = true; return false; } + break; + } + } + } } - else + TableListFillEnd( fill ); + } + break; + } + case 0x52f60c4caef0b768ull: // bounds + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 4 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + TableListFill fill = TableListFillBegin( nodes, value.bounds, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) { - // THE COUNT IS THE DATA'S (§2.9): there is no bound, so clamped - // cannot fire on it. A count above the int32 storage cap is the - // fill's refusal, and it moves no counter. - TableListFill fill = TableListFillBegin( nodes, value.bounds, count ); - if ( fill.refused ) { nodes.refused = true; return false; } - if ( !fill.ok ) { r.report->malformed = true; r.offset = body_end; break; } - // elements are BOUNDED by the field body: a count the length cannot - // cover keeps the decoded prefix, flags malformed, and the parent - // continues at the next field - TableReader sub( r.buffer + r.offset, body_end - r.offset, r.report, r.ids ); - for ( uint64_t i = 0; i < count; i++ ) + int32_t * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve { - int32_t * slot = TableListFillNext( fill ); - if ( slot == NULL ) { r.report->malformed = true; break; } // the arena could not carve - bool landed = false; - do + const int64_t width_2 = entry.elem_value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( entry.elem_packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) entry.elem_base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) { - if ( !sub.has( 4 ) ) { r.report->malformed = true; break; } - int32_t decoded_v = int32_t( sub.get32( ) ); - if ( decoded_v < 0 ) { decoded_v = 0; r.report->clamped++; } - else if ( decoded_v > 100 ) { decoded_v = 100; r.report->clamped++; } - ( *slot ) = decoded_v; - landed = true; - } while ( 0 ); - if ( !landed ) { TableListFillDrop( fill ); break; } // the element's own framing gave out before it decoded + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < 0ll ) { decoded_wide_2 = 0ll; report->clamped++; } + if ( decoded_wide_2 > 100ll ) { decoded_wide_2 = 100ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + ( *slot ) = decoded_v_2; } - TableListFillEnd( fill ); } + TableListFillEnd( fill ); } - r.offset = body_end; // excess bytes and slack skip via the length - break; - } - case 0xffffffffffffffffull: - { - if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } break; } default: + report->unknown++; { - r.report->unknown++; - if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } - break; + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); } + break; } } } @@ -13253,71 +14467,247 @@ inline const Save * SaveLoadRetain( uint8_t * region, int64_t region_bytes, cons // belongs to this region from here on. TableRetainReset( retain, nodes, region ); - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Save ) ) + root_extent ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = SaveNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + directory[k + 1].type_id = type_id; + } + else + { + directory[k + 1].offset = (uint64_t) used; + directory[k + 1].type_id = type_id; + SaveNodePlace( type_id, region + used, length ); + used += storage; + } + k++; + } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + SaveNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Save ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + SaveLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// SaveNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool SaveNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + SaveNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !SaveNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + bool ok = false; + switch ( type_id ) + { + case 0x5e781536ac58825full: ok = LogEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(LogEntry *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // LogEntry + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// SaveLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool SaveLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Save * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !SaveMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = SaveNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + SaveNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !SaveMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Save ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x33f85f24c0f5f008ull; + Save * root = new ( region + used ) Save; // lifetime only: LoadMessageBody's first act is SaveReset + SaveReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Save ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Save ) ) + root_extent ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - int64_t storage = SaveNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) - { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; - directory[k + 1].type_id = type_id; - } - else - { - directory[k + 1].offset = (uint64_t) used; - directory[k + 1].type_id = type_id; - SaveNodePlace( type_id, region + used, length ); - used += storage; - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } - } - - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) - { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + if ( directory[k + 1].offset == kTableNodeAbsent ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - SaveNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; } + if ( !SaveNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Save ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - SaveLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return SaveLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// SaveLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool SaveLoadRetainMessages( const Save ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !SaveLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // SaveMeasureRetain and SaveSaveRetain: the pair, with the retained tail in @@ -13611,6 +15001,182 @@ inline const Mixed * MixedLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// MixedNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool MixedNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + MixedNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !MixedNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// MixedLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool MixedLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Mixed * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !MixedMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = MixedNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + MixedNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !MixedMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Mixed ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xbb86c6c96f598bb8ull; + Mixed * root = new ( region + used ) Mixed; // lifetime only: LoadMessageBody's first act is MixedReset + MixedReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Mixed ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !MixedNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return MixedLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// MixedLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool MixedLoadRetainMessages( const Mixed ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !MixedLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // MixedMeasureRetain and MixedSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/lists/SharedTable.h b/testdata/golden/tables/lists/SharedTable.h index 460636d46..fce47b79c 100644 --- a/testdata/golden/tables/lists/SharedTable.h +++ b/testdata/golden/tables/lists/SharedTable.h @@ -4278,6 +4278,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace listdemo #endif // LISTDEMO_SCHEMA_TABLE_RETAIN @@ -6013,10 +6445,12 @@ template inline bool TableNodeMessageSave( const Ctx & ctx, const inline int64_t PhotoMeasureBodyRetain( TableRetainIds & ids, const Photo & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool PhotoSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Photo & value, TableRetain * retain, const TableRetainPath & path ); LISTDEMO_TABLE_INLINE bool PhotoLoadBodyRetain( TableReader & r, Photo & value, TableRetain * retain, const TableRetainPath & path ); +inline bool PhotoLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Photo & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t AlbumMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Album & value, TableRetain * retain, const TableRetainPath & path ); template inline bool AlbumSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Album & value, TableRetain * retain, const TableRetainPath & path ); template inline bool AlbumSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Album & value, TableRetain * retain, const TableRetainPath & path ); inline bool AlbumLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Album & value, TableRetain * retain, const TableRetainPath & path ); +inline bool AlbumLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Album & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t PhotoMeasureBody( TableIds & ids, const Photo & value ) { @@ -8248,6 +8682,124 @@ LISTDEMO_TABLE_INLINE bool PhotoLoadBodyRetain( TableReader & r, Photo & value, } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool PhotoLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Photo & value, TableRetain * retain, const TableRetainPath & path ) +{ + PhotoReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xdbdacd932fd1e9bfull: // width + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 8 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 8 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.width = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.width = decoded_v; + } + break; + } + case 0x17720bf67d347222ull: // height + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 8 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 8 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.height = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.height = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t AlbumMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Album & value, TableRetain * retain, const TableRetainPath & path ) { @@ -8469,6 +9021,99 @@ inline bool AlbumLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Al } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool AlbumLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Album & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + AlbumReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x40b1d94aff3ab130ull: // photos + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 17 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + TableListFill fill = TableListFillBegin( nodes, value.photos, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + TableRef * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + uint64_t node_index_2 = 0; + if ( !r.get( node_index_2, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, ( *slot ), node_index_2, 0xf1a78dd2508964c3ull, report ); // *Photo + } + } + TableListFillEnd( fill ); + } + break; + } + case 0xaa19a78e404dea20ull: // cover + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.cover, node_index, 0xf1a78dd2508964c3ull, report ); // *Photo + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + // AlbumNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it // already owns. // EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the @@ -8642,6 +9287,182 @@ inline const Album * AlbumLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// AlbumNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool AlbumNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + AlbumNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !AlbumNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + bool ok = false; + switch ( type_id ) + { + case 0xf1a78dd2508964c3ull: ok = PhotoLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(Photo *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Photo + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// AlbumLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool AlbumLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Album * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !AlbumMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = AlbumNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + AlbumNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !AlbumMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Album ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xd858c2cb7f1514ccull; + Album * root = new ( region + used ) Album; // lifetime only: LoadMessageBody's first act is AlbumReset + AlbumReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Album ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !AlbumNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return AlbumLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// AlbumLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool AlbumLoadRetainMessages( const Album ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !AlbumLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // AlbumMeasureRetain and AlbumSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/maps/CellsTable.h b/testdata/golden/tables/maps/CellsTable.h index 907c00422..81a7b1523 100644 --- a/testdata/golden/tables/maps/CellsTable.h +++ b/testdata/golden/tables/maps/CellsTable.h @@ -3752,6 +3752,16 @@ inline int64_t TableRetainInContent( TableRetainIn & s, uint8_t kind, int64_t le } break; } + case 15: case 30: + // A UNION ARM AND AN ENUM'S VARIANT REFERENCE RESOLVE AS A FRAMED + // CONTENT TOO (§6.6): a kind 15 arm whose own payload is a union, + // and a kind 16 slot whose element kind is 15 or 30, both arrive + // here, and both carry a reference. Copying them as bytes would + // re-emit a reference into a permuted trailer, where it names + // another id, and would let a kind 17 UNDER A KIND 15 ARM through + // a walk whose whole job is to catch it. + if ( TableRetainInPayload( s, kind, depth ) < 0 ) { return -1; } + break; case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) default: // every other content is bytes: a string, wide text, an escape, a @@ -4128,6 +4138,11 @@ inline bool TableRetainOutContent( TableRetainOut & s, uint8_t kind, int64_t len } break; } + case 15: case 30: + // the emit side of the capture's own rule (§6.6): an arm and a + // variant reference resolve as a framed content too + if ( !TableRetainOutPayload( s, kind, depth ) ) { return false; } + break; default: TableRetainOutRaw( s, s.in + s.at, length ); s.at += length; @@ -4372,6 +4387,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace mapdemo #endif // MAPDEMO_SCHEMA_TABLE_RETAIN @@ -6212,10 +6659,12 @@ inline CellsRowsEntryKeyRead CellsRowsEntryReadKey( const uint8_t * body, int64_ inline int64_t CellsRowsEntryMeasureBodyRetain( TableRetainIds & ids, const CellsRowsEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool CellsRowsEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const CellsRowsEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool CellsRowsEntryLoadBodyRetain( TableReader & r, CellsRowsEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool CellsRowsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, CellsRowsEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t CellsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Cells & value, TableRetain * retain, const TableRetainPath & path ); template inline bool CellsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Cells & value, TableRetain * retain, const TableRetainPath & path ); template inline bool CellsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Cells & value, TableRetain * retain, const TableRetainPath & path ); inline bool CellsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Cells & value, TableRetain * retain, const TableRetainPath & path ); +inline bool CellsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Cells & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t CellsRowsEntryMeasureBody( TableIds & ids, const CellsRowsEntry & value ) { @@ -6480,15 +6929,13 @@ inline bool CellsRowsEntryLoadMessageBody( TableBitReader & r, const TableVocabu { uint64_t n = 0; if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } - int32_t kept = 0; - if ( n > (uint64_t) 8 ) { kept = 8; report->clamped++; } else { kept = (int32_t) n; } - for ( uint64_t i = 0; i < n; i++ ) - { - uint64_t by = 0; - if ( !r.get( by, 8 ) ) { report->malformed = true; return false; } - if ( (int32_t) i < kept ) { value.key[i] = (char) by; } - } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 8 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.key, text, (size_t) kept ); value.key[kept] = 0; + r.offset += (int64_t) n * 8; value.key_length = kept; } break; @@ -8361,57 +8808,220 @@ MAPDEMO_TABLE_INLINE bool CellsRowsEntryLoadBodyRetain( TableReader & r, CellsRo } } -template -inline int64_t CellsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Cells & value, TableRetain * retain, const TableRetainPath & path ) -{ - (void) ctx; (void) numbering; - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - { - // rows: a kind 14 array of kind 13 elements, ASCENDING (§2.8) - TableMapCursor order_rows = TableMapOrder( ctx, value.rows ); - if ( !order_rows.ok ) { return -1; } // the sort could not run - if ( order_rows.count > 0 ) - { - const uint64_t ref_rows = ids.ref( 0xa3a7061ff10a8138ull ); - int64_t body_rows = 1 + TableLebBytes( (uint64_t) order_rows.count ); // the element kind byte and the count - for ( int32_t i = 0; i < order_rows.count; i++ ) - { - const int64_t elem_rows = CellsRowsEntryMeasureBodyRetain( ids, *order_rows[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_rows < 0 ) { TableMapRelease( order_rows ); return -1; } - body_rows += TableLebBytes( (uint64_t) ( elem_rows ) ) + ( elem_rows ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key - } - bytes += TableLebBytes( ref_rows ) + 1 + TableLebBytes( (uint64_t) ( body_rows ) ) + ( body_rows ); - } - TableMapRelease( order_rows ); - } - if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -template -inline bool CellsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Cells & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool CellsRowsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, CellsRowsEntry & value, TableRetain * retain, const TableRetainPath & path ) { - (void) ctx; (void) numbering; + CellsRowsEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - TableMapCursor order_rows = TableMapOrder( ctx, value.rows ); // rows - if ( !order_rows.ok ) { return false; } - if ( order_rows.count > 0 ) // an EMPTY map elides, the by-value rule (§3) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - const uint64_t ref_rows = ids.ref( 0xa3a7061ff10a8138ull ); - int64_t body_rows = 1 + TableLebBytes( (uint64_t) order_rows.count ); - for ( int32_t i = 0; i < order_rows.count; i++ ) + case 0x3dc94a19365b10ecull: // key { - const int64_t elem_rows = CellsRowsEntryMeasureBodyRetain( ids, *order_rows[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_rows < 0 ) { TableMapRelease( order_rows ); return false; } - body_rows += TableLebBytes( (uint64_t) ( elem_rows ) ) + ( elem_rows ); + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 8 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.key, text, (size_t) kept ); + value.key[kept] = 0; + r.offset += (int64_t) n * 8; + value.key_length = kept; + } + break; } - w.putleb( ref_rows ); w.put8( 14 ); w.putleb( (uint64_t) body_rows ); - w.put8( 13 ); w.putleb( (uint64_t) order_rows.count ); - for ( int32_t i = 0; i < order_rows.count; i++ ) + case 0x7ce4fd9430e80ceaull: // value { - const int64_t elem_len_rows = CellsRowsEntryMeasureBodyRetain( ids, *order_rows[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_len_rows < 0 ) { TableMapRelease( order_rows ); return false; } + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 4 ) + { + if ( entry.kind == 14 && TableKindWidens( entry.elem_kind, 4 ) ) + { + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) + { + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 3 ) { kept = 3; report->clamped++; } else { kept = (int32_t) n; } + const int64_t surplus_bits = entry.elem_value_bits; + uint64_t walk = n; + if ( surplus_bits >= 0 && walk > (uint64_t) 3 ) { walk = (uint64_t) 3; } // the surplus is arithmetic + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + int32_t scratch = 0; + { + const int64_t width_2 = entry.elem_value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( entry.elem_packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) entry.elem_base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + scratch = decoded_v_2; + } + if ( in_bounds ) { value.value[i] = scratch; } + } + if ( walk < n && !TableMessageSkipRun( r, n - walk, surplus_bits ) ) { report->malformed = true; return false; } + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) + { + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 3 ) { kept = 3; report->clamped++; } else { kept = (int32_t) n; } + const int64_t surplus_bits = entry.elem_value_bits; + uint64_t walk = n; + if ( surplus_bits >= 0 && walk > (uint64_t) 3 ) { walk = (uint64_t) 3; } // the surplus is arithmetic + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + int32_t scratch = 0; + { + const int64_t width_2 = entry.elem_value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( entry.elem_packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) entry.elem_base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + scratch = decoded_v_2; + } + if ( in_bounds ) { value.value[i] = scratch; } + } + if ( walk < n && !TableMessageSkipRun( r, n - walk, surplus_bits ) ) { report->malformed = true; return false; } + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t CellsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Cells & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) ctx; (void) numbering; + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { + // rows: a kind 14 array of kind 13 elements, ASCENDING (§2.8) + TableMapCursor order_rows = TableMapOrder( ctx, value.rows ); + if ( !order_rows.ok ) { return -1; } // the sort could not run + if ( order_rows.count > 0 ) + { + const uint64_t ref_rows = ids.ref( 0xa3a7061ff10a8138ull ); + int64_t body_rows = 1 + TableLebBytes( (uint64_t) order_rows.count ); // the element kind byte and the count + for ( int32_t i = 0; i < order_rows.count; i++ ) + { + const int64_t elem_rows = CellsRowsEntryMeasureBodyRetain( ids, *order_rows[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_rows < 0 ) { TableMapRelease( order_rows ); return -1; } + body_rows += TableLebBytes( (uint64_t) ( elem_rows ) ) + ( elem_rows ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key + } + bytes += TableLebBytes( ref_rows ) + 1 + TableLebBytes( (uint64_t) ( body_rows ) ) + ( body_rows ); + } + TableMapRelease( order_rows ); + } + if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +template +inline bool CellsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Cells & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) ctx; (void) numbering; + { + TableMapCursor order_rows = TableMapOrder( ctx, value.rows ); // rows + if ( !order_rows.ok ) { return false; } + if ( order_rows.count > 0 ) // an EMPTY map elides, the by-value rule (§3) + { + const uint64_t ref_rows = ids.ref( 0xa3a7061ff10a8138ull ); + int64_t body_rows = 1 + TableLebBytes( (uint64_t) order_rows.count ); + for ( int32_t i = 0; i < order_rows.count; i++ ) + { + const int64_t elem_rows = CellsRowsEntryMeasureBodyRetain( ids, *order_rows[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_rows < 0 ) { TableMapRelease( order_rows ); return false; } + body_rows += TableLebBytes( (uint64_t) ( elem_rows ) ) + ( elem_rows ); + } + w.putleb( ref_rows ); w.put8( 14 ); w.putleb( (uint64_t) body_rows ); + w.put8( 13 ); w.putleb( (uint64_t) order_rows.count ); + for ( int32_t i = 0; i < order_rows.count; i++ ) + { + const int64_t elem_len_rows = CellsRowsEntryMeasureBodyRetain( ids, *order_rows[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_len_rows < 0 ) { TableMapRelease( order_rows ); return false; } w.putleb( (uint64_t) elem_len_rows ); if ( !CellsRowsEntrySaveBodyRetain( w, ids, *order_rows[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { TableMapRelease( order_rows ); return false; } } @@ -8597,6 +9207,164 @@ inline bool CellsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Ce } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool CellsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Cells & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + CellsReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xa3a7061ff10a8138ull: // rows + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.rows, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + const char * last_key = NULL; int32_t last_length = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const CellsRowsEntryMessageKeyRead read = CellsRowsEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( last_key, last_length, read.key, read.length ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + CellsRowsEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !CellsRowsEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; last_length = read.length; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + // CellsNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it // already owns. // EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the @@ -8770,6 +9538,182 @@ inline const Cells * CellsLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// CellsNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool CellsNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + CellsNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !CellsNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// CellsLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool CellsLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Cells * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !CellsMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = CellsNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + CellsNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !CellsMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Cells ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x1f781dc01a2b5152ull; + Cells * root = new ( region + used ) Cells; // lifetime only: LoadMessageBody's first act is CellsReset + CellsReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Cells ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !CellsNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return CellsLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// CellsLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool CellsLoadRetainMessages( const Cells ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !CellsLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // CellsMeasureRetain and CellsSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/maps/ChunksTable.h b/testdata/golden/tables/maps/ChunksTable.h index 6a1d6b153..54599fa71 100644 --- a/testdata/golden/tables/maps/ChunksTable.h +++ b/testdata/golden/tables/maps/ChunksTable.h @@ -3752,6 +3752,16 @@ inline int64_t TableRetainInContent( TableRetainIn & s, uint8_t kind, int64_t le } break; } + case 15: case 30: + // A UNION ARM AND AN ENUM'S VARIANT REFERENCE RESOLVE AS A FRAMED + // CONTENT TOO (§6.6): a kind 15 arm whose own payload is a union, + // and a kind 16 slot whose element kind is 15 or 30, both arrive + // here, and both carry a reference. Copying them as bytes would + // re-emit a reference into a permuted trailer, where it names + // another id, and would let a kind 17 UNDER A KIND 15 ARM through + // a walk whose whole job is to catch it. + if ( TableRetainInPayload( s, kind, depth ) < 0 ) { return -1; } + break; case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) default: // every other content is bytes: a string, wide text, an escape, a @@ -4128,6 +4138,11 @@ inline bool TableRetainOutContent( TableRetainOut & s, uint8_t kind, int64_t len } break; } + case 15: case 30: + // the emit side of the capture's own rule (§6.6): an arm and a + // variant reference resolve as a framed content too + if ( !TableRetainOutPayload( s, kind, depth ) ) { return false; } + break; default: TableRetainOutRaw( s, s.in + s.at, length ); s.at += length; @@ -4372,6 +4387,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace mapdemo #endif // MAPDEMO_SCHEMA_TABLE_RETAIN @@ -6214,10 +6661,12 @@ template inline int64_t ChunksBlobsEntryMeasureBodyRetain( const template inline bool ChunksBlobsEntrySaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const ChunksBlobsEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline bool ChunksBlobsEntrySaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const ChunksBlobsEntry & value, TableRetain * retain, const TableRetainPath & path ); inline bool ChunksBlobsEntryLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, ChunksBlobsEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool ChunksBlobsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, ChunksBlobsEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t ChunksMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Chunks & value, TableRetain * retain, const TableRetainPath & path ); template inline bool ChunksSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Chunks & value, TableRetain * retain, const TableRetainPath & path ); template inline bool ChunksSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Chunks & value, TableRetain * retain, const TableRetainPath & path ); inline bool ChunksLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Chunks & value, TableRetain * retain, const TableRetainPath & path ); +inline bool ChunksLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Chunks & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t ChunksBlobsEntryMeasureBody( const Ctx & ctx, const TableNumbering & numbering, TableIds & ids, const ChunksBlobsEntry & value ) @@ -8412,90 +8861,201 @@ inline bool ChunksBlobsEntryLoadBodyRetain( TableReader & r, const TableNodeMap } } -template -inline int64_t ChunksMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Chunks & value, TableRetain * retain, const TableRetainPath & path ) -{ - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - { - // blobs: a kind 14 array of kind 13 elements, ASCENDING (§2.8) - TableMapCursor order_blobs = TableMapOrder( ctx, value.blobs ); - if ( !order_blobs.ok ) { return -1; } // the sort could not run - if ( order_blobs.count > 0 ) - { - const uint64_t ref_blobs = ids.ref( 0x14e2eaab9cde925bull ); - int64_t body_blobs = 1 + TableLebBytes( (uint64_t) order_blobs.count ); // the element kind byte and the count - for ( int32_t i = 0; i < order_blobs.count; i++ ) - { - const int64_t elem_blobs = ChunksBlobsEntryMeasureBodyRetain( ctx, numbering, ids, *order_blobs[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_blobs < 0 ) { TableMapRelease( order_blobs ); return -1; } - body_blobs += TableLebBytes( (uint64_t) ( elem_blobs ) ) + ( elem_blobs ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key - } - bytes += TableLebBytes( ref_blobs ) + 1 + TableLebBytes( (uint64_t) ( body_blobs ) ) + ( body_blobs ); - } - TableMapRelease( order_blobs ); - } - if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -template -inline bool ChunksSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Chunks & value, TableRetain * retain, const TableRetainPath & path ) -{ - { - TableMapCursor order_blobs = TableMapOrder( ctx, value.blobs ); // blobs - if ( !order_blobs.ok ) { return false; } - if ( order_blobs.count > 0 ) // an EMPTY map elides, the by-value rule (§3) - { - const uint64_t ref_blobs = ids.ref( 0x14e2eaab9cde925bull ); - int64_t body_blobs = 1 + TableLebBytes( (uint64_t) order_blobs.count ); - for ( int32_t i = 0; i < order_blobs.count; i++ ) - { - const int64_t elem_blobs = ChunksBlobsEntryMeasureBodyRetain( ctx, numbering, ids, *order_blobs[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_blobs < 0 ) { TableMapRelease( order_blobs ); return false; } - body_blobs += TableLebBytes( (uint64_t) ( elem_blobs ) ) + ( elem_blobs ); - } - w.putleb( ref_blobs ); w.put8( 14 ); w.putleb( (uint64_t) body_blobs ); - w.put8( 13 ); w.putleb( (uint64_t) order_blobs.count ); - for ( int32_t i = 0; i < order_blobs.count; i++ ) - { - const int64_t elem_len_blobs = ChunksBlobsEntryMeasureBodyRetain( ctx, numbering, ids, *order_blobs[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_len_blobs < 0 ) { TableMapRelease( order_blobs ); return false; } - w.putleb( (uint64_t) elem_len_blobs ); - if ( !ChunksBlobsEntrySaveBodyRetain( ctx, numbering, w, ids, *order_blobs[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { TableMapRelease( order_blobs ); return false; } - } - } - TableMapRelease( order_blobs ); - } - if ( value.after != 0 ) - { - w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after - w.put32( uint32_t( value.after ) ); - } - if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } - return !w.overflow; -} - -template -inline bool ChunksSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Chunks & value, TableRetain * retain, const TableRetainPath & path ) -{ - if ( !ChunksSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } - w.put8( 0 ); // the ZERO REFERENCE that ends the body - return !w.overflow; -} - -inline bool ChunksLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Chunks & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool ChunksBlobsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, ChunksBlobsEntry & value, TableRetain * retain, const TableRetainPath & path ) { - ChunksReset( value ); // prefill declared defaults in place, then overlay + (void) nodes; (void) index_bits; + ChunksBlobsEntryReset( value ); // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT - // (docs/SPEC-TABLES.md §6.6): this body is being established, so - // whatever an earlier occurrence of it left is discarded before the - // winning one is read. The discard moves neither counter. + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. TableRetainDiscardBody( retain, path ); for ( ;; ) { - uint64_t field_ref = 0; - if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.key = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.value, node_index, kTableBytesTypeId, report ); // *bytes + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t ChunksMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Chunks & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { + // blobs: a kind 14 array of kind 13 elements, ASCENDING (§2.8) + TableMapCursor order_blobs = TableMapOrder( ctx, value.blobs ); + if ( !order_blobs.ok ) { return -1; } // the sort could not run + if ( order_blobs.count > 0 ) + { + const uint64_t ref_blobs = ids.ref( 0x14e2eaab9cde925bull ); + int64_t body_blobs = 1 + TableLebBytes( (uint64_t) order_blobs.count ); // the element kind byte and the count + for ( int32_t i = 0; i < order_blobs.count; i++ ) + { + const int64_t elem_blobs = ChunksBlobsEntryMeasureBodyRetain( ctx, numbering, ids, *order_blobs[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_blobs < 0 ) { TableMapRelease( order_blobs ); return -1; } + body_blobs += TableLebBytes( (uint64_t) ( elem_blobs ) ) + ( elem_blobs ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key + } + bytes += TableLebBytes( ref_blobs ) + 1 + TableLebBytes( (uint64_t) ( body_blobs ) ) + ( body_blobs ); + } + TableMapRelease( order_blobs ); + } + if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +template +inline bool ChunksSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Chunks & value, TableRetain * retain, const TableRetainPath & path ) +{ + { + TableMapCursor order_blobs = TableMapOrder( ctx, value.blobs ); // blobs + if ( !order_blobs.ok ) { return false; } + if ( order_blobs.count > 0 ) // an EMPTY map elides, the by-value rule (§3) + { + const uint64_t ref_blobs = ids.ref( 0x14e2eaab9cde925bull ); + int64_t body_blobs = 1 + TableLebBytes( (uint64_t) order_blobs.count ); + for ( int32_t i = 0; i < order_blobs.count; i++ ) + { + const int64_t elem_blobs = ChunksBlobsEntryMeasureBodyRetain( ctx, numbering, ids, *order_blobs[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_blobs < 0 ) { TableMapRelease( order_blobs ); return false; } + body_blobs += TableLebBytes( (uint64_t) ( elem_blobs ) ) + ( elem_blobs ); + } + w.putleb( ref_blobs ); w.put8( 14 ); w.putleb( (uint64_t) body_blobs ); + w.put8( 13 ); w.putleb( (uint64_t) order_blobs.count ); + for ( int32_t i = 0; i < order_blobs.count; i++ ) + { + const int64_t elem_len_blobs = ChunksBlobsEntryMeasureBodyRetain( ctx, numbering, ids, *order_blobs[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_len_blobs < 0 ) { TableMapRelease( order_blobs ); return false; } + w.putleb( (uint64_t) elem_len_blobs ); + if ( !ChunksBlobsEntrySaveBodyRetain( ctx, numbering, w, ids, *order_blobs[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { TableMapRelease( order_blobs ); return false; } + } + } + TableMapRelease( order_blobs ); + } + if ( value.after != 0 ) + { + w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after + w.put32( uint32_t( value.after ) ); + } + if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } + return !w.overflow; +} + +template +inline bool ChunksSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Chunks & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( !ChunksSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } + w.put8( 0 ); // the ZERO REFERENCE that ends the body + return !w.overflow; +} + +inline bool ChunksLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Chunks & value, TableRetain * retain, const TableRetainPath & path ) +{ + ChunksReset( value ); // prefill declared defaults in place, then overlay + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so + // whatever an earlier occurrence of it left is discarded before the + // winning one is read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t field_ref = 0; + if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count const uint64_t field_id = r.ids->at( field_ref ); @@ -8645,6 +9205,164 @@ inline bool ChunksLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, C } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool ChunksLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Chunks & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + ChunksReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x14e2eaab9cde925bull: // blobs + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.blobs, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + int32_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const ChunksBlobsEntryMessageKeyRead read = ChunksBlobsEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (int64_t) last_key, (int64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + ChunksBlobsEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !ChunksBlobsEntryLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + // ChunksNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it // already owns. // EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the @@ -8819,6 +9537,182 @@ inline const Chunks * ChunksLoadRetain( uint8_t * region, int64_t region_bytes, return root; } +// ChunksNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool ChunksNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + ChunksNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !ChunksNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// ChunksLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool ChunksLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Chunks * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !ChunksMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = ChunksNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + ChunksNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !ChunksMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Chunks ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x816c207ba6213983ull; + Chunks * root = new ( region + used ) Chunks; // lifetime only: LoadMessageBody's first act is ChunksReset + ChunksReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Chunks ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !ChunksNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return ChunksLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// ChunksLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool ChunksLoadRetainMessages( const Chunks ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !ChunksLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // ChunksMeasureRetain and ChunksSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/maps/DepthTable.h b/testdata/golden/tables/maps/DepthTable.h index bc2fa8711..dff7a6462 100644 --- a/testdata/golden/tables/maps/DepthTable.h +++ b/testdata/golden/tables/maps/DepthTable.h @@ -4388,6 +4388,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace mapdemo #endif // MAPDEMO_SCHEMA_TABLE_RETAIN @@ -6352,14 +6784,17 @@ inline SquadRosterEntryKeyRead SquadRosterEntryReadKey( const uint8_t * body, in inline int64_t SquadRosterEntryMeasureBodyRetain( TableRetainIds & ids, const SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool SquadRosterEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool SquadRosterEntryLoadBodyRetain( TableReader & r, SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool SquadRosterEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t SquadMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Squad & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SquadSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Squad & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SquadSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Squad & value, TableRetain * retain, const TableRetainPath & path ); inline bool SquadLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Squad & value, TableRetain * retain, const TableRetainPath & path ); +inline bool SquadLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Squad & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t DepthMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Depth & value, TableRetain * retain, const TableRetainPath & path ); template inline bool DepthSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Depth & value, TableRetain * retain, const TableRetainPath & path ); template inline bool DepthSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Depth & value, TableRetain * retain, const TableRetainPath & path ); inline bool DepthLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Depth & value, TableRetain * retain, const TableRetainPath & path ); +inline bool DepthLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Depth & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t SquadRosterEntryMeasureBody( TableIds & ids, const SquadRosterEntry & value ) { @@ -10355,6 +10790,86 @@ MAPDEMO_TABLE_INLINE bool SquadRosterEntryLoadBodyRetain( TableReader & r, Squad } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool SquadRosterEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, SquadRosterEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + SquadRosterEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 6 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 255ull ) { decoded_wide = (int64_t) 255ull; report->clamped++; } + uint8_t decoded_v = (uint8_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 1 ); + if ( !ItemLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t SquadMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Squad & value, TableRetain * retain, const TableRetainPath & path ) { @@ -10559,16 +11074,124 @@ inline bool SquadLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Sq } } -template -inline int64_t DepthMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Depth & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool SquadLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Squad & value, TableRetain * retain, const TableRetainPath & path ) { - int64_t bytes = 1; // the ZERO REFERENCE that ends the body + (void) nodes; (void) index_bits; + SquadReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - const int32_t mark_one = ids.count; - const uint64_t ref_one = ids.ref( 0x1a08aa1921ca5cafull ); - const int64_t body_one = SquadMeasureBodyRetain( ctx, numbering, ids, value.one, retain, TableRetainStepInto( path, 0, (uint32_t) ( 0 ) ) ); - if ( body_one < 0 ) { return -1; } - if ( body_one > 1 ) { bytes += TableLebBytes( ref_one ) + 1 + TableLebBytes( (uint64_t) ( body_one ) ) + ( body_one ); } // one + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x1c84390d304f4f42ull: // roster + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.roster, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + uint8_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const SquadRosterEntryMessageKeyRead read = SquadRosterEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (uint64_t) last_key, (uint64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + SquadRosterEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !SquadRosterEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t DepthMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Depth & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { + const int32_t mark_one = ids.count; + const uint64_t ref_one = ids.ref( 0x1a08aa1921ca5cafull ); + const int64_t body_one = SquadMeasureBodyRetain( ctx, numbering, ids, value.one, retain, TableRetainStepInto( path, 0, (uint32_t) ( 0 ) ) ); + if ( body_one < 0 ) { return -1; } + if ( body_one > 1 ) { bytes += TableLebBytes( ref_one ) + 1 + TableLebBytes( (uint64_t) ( body_one ) ) + ( body_one ); } // one else { ids.truncate( mark_one ); } // an all-default nested table elides, and costs no entry } if ( value.many_count < 0 || value.many_count > 3 ) { return -1; } // storage invariant @@ -11055,177 +11678,621 @@ inline bool DepthLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, De } } -// SquadNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it -// already owns. -// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the -// index is the region directory's, which Load fills from the wire's framing -// and nothing afterwards renumbers. -inline void SquadNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) -{ - // the node's own EXTENT, where its lists' and maps' arrays are carved - // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). - // The tool's path carries a worker instead: there the arrays are the - // arena's. - TableExtentCarve carve; - carve.worker = nodes.worker; - if ( carve.worker == NULL ) - { - TableRefuseReason reason = count_over_length; // pass one already refused what this could refuse - const int64_t storage = SquadNodeStorage( type_id, r.size, reason ); - const int64_t record = storage > 0 ? SquadNodeRecordBytes( type_id ) : 0; - carve.at = at + record; - carve.left = storage > record ? storage - record : 0; - } - nodes.carve = &carve; - (void) nodes; // every node this root can name is a FIXED table - (void) retain; (void) node; - switch ( type_id ) - { - default: break; - } - nodes.carve = NULL; // the cursor is ONE node's, and this node's body is done -} - -// SquadLoadRetain: decode the tolerant wire into the caller's exact-sized region and -// return the root. LOAD IS A SCAN, and that is the whole of its bound: it -// follows no reference, so there is no depth cap, no visited set and no -// ordering rule on the indices. Partial results are kept, as everywhere on -// this wire — the report says what happened. NULL means the CALLER's buffer -// was wrong. -// UNDER RETENTION it also fills the caller's two stores with the fields -// this build cannot name, and the report carries what it could not keep -// (docs/SPEC-TABLES.md §6.6). It is Load's own path and nothing else: the -// reader's data is exactly what it would have been with retention off. -inline const Squad * SquadLoadRetain( uint8_t * region, int64_t region_bytes, const uint8_t * wire_file, int64_t wire_file_bytes, TableRetain * retain, TableReport * report ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool DepthLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Depth & value, TableRetain * retain, const TableRetainPath & path ) { - TableReport ignored; - TableReport * out = report != NULL ? report : &ignored; - // THE FORM BYTE IS READ FIRST, then the trailer, and only then a body: - // a file that is both a newer form and damaged is a REFUSAL and never - // damage (docs/SPEC-TABLES.md §3). - TableIdTable ids_table; - int64_t body_bytes = 0; - const TableOpenVerdict verdict = TableOpen( wire_file, wire_file_bytes, ids_table, body_bytes ); - if ( verdict != TableOpenOk ) - { - if ( verdict == TableOpenDamaged ) { out->malformed = true; } else { out->refused = true; if ( wire_file_bytes > 0 && wire_file[0] == kTableWireMessageForm ) { out->reason = message_form_as_file; } else { out->reason = newer_form; } } - return NULL; - } - if ( TableBodyEndsEarly( wire_file + 1, body_bytes, ids_table ) ) - { - out->malformed = true; // a byte no field claims, before the table (§3) - return NULL; - } - const uint8_t * const wire = wire_file + 1; - const int64_t wire_bytes = body_bytes; - if ( region == NULL || region_bytes < (int64_t) sizeof( Squad ) ) { out->malformed = true; return NULL; } - if ( ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return NULL; } - memset( region, 0, (size_t) region_bytes ); - uint64_t type_id = 0; - const uint8_t * body = NULL; - int64_t length = 0; - - // the record count and the data bytes, from the FRAMING alone - TableRefuseReason reason = count_over_length; // LoadMeasure is where a caller reads it; a Load past a refusal is malformed - int64_t root_extent = 0; - if ( !SquadWireExtent( wire, wire_bytes, root_extent, &ids_table, reason ) ) { out->malformed = true; return NULL; } - int64_t data = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Squad ) ) + root_extent ); - int64_t records = 0; - { - TableReport counting; - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, &counting, &ids_table ); - while ( TableNodeScanNext( scan, type_id, body, length ) ) - { - records++; - int64_t storage = SquadNodeStorage( type_id, length, reason ); - if ( storage == kTableNodeRefused ) { out->malformed = true; return NULL; } - if ( storage > 0 ) { data += storage; } - } - } - int64_t attribution = ( records + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); - if ( data + attribution > region_bytes ) { out->malformed = true; return NULL; } - - TableNodeMap nodes; - nodes.base = region; - nodes.entries = (const TableNodeDirEntry *) ( region + data ); - nodes.count = records + 1; - TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + data ); - directory[0].offset = 0; // position 0 is the ROOT, at offset 0 (§6.3) - directory[0].type_id = 0xec07a2f760550a91ull; - Squad * root = new ( region ) Squad; // lifetime only: LoadBody's first act is SquadReset - SquadReset( *root ); - - // LoadRetain RESETS BOTH STORES and writes into neither id list: a - // retained record carries its field's identity in the record itself, - // with every reference resolved (docs/SPEC-TABLES.md §6.6). The buffer - // belongs to this region from here on. - TableRetainReset( retain, nodes, region ); - - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. + (void) nodes; (void) index_bits; + DepthReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Squad ) ) + root_extent ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - int64_t storage = SquadNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) + case 0x1a08aa1921ca5cafull: // one { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; - directory[k + 1].type_id = type_id; + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 0 ); + if ( !SquadLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, value.one, retain, TableRetainStepInto( path, 0, (uint32_t) ( 0 ) ) ) ) { return false; } + break; } - else + case 0x1f6459a2cea1fc02ull: // many { - directory[k + 1].offset = (uint64_t) used; - directory[k + 1].type_id = type_id; - SquadNodePlace( type_id, region + used, length ); - used += storage; - } - k++; + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) + { + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 3 ) { kept = 3; report->clamped++; } else { kept = (int32_t) n; } + const uint64_t walk = n; + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + Squad scratch; + SquadReset( scratch ); + if ( !SquadLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, ( in_bounds ? value.many[i] : scratch ), ( in_bounds ? retain : NULL ), TableRetainStepInto( path, 1, (uint32_t) ( i ) ) ) ) { return false; } + } + value.many_count = kept; + } + break; + } + case 0x70551ff29550f15dull: // keyed + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 16 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) ) { report->malformed = true; return false; } + for ( uint64_t p = 0; p < n; p++ ) + { + uint64_t key_ref = 0; + if ( !r.get( key_ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry key_entry; + if ( !TableMessageNameEntry( vocabulary, key_ref, key_entry ) ) { report->malformed = true; return false; } + Slot key = Slot::None; + const bool named = TableEnumValue( key_entry.id, key ); + if ( !named ) { report->unknown++; report->retain_lost++; } + const int32_t slot = named ? (int32_t) key - 1 : -1; + const bool in_bounds = slot >= 0 && slot < 2; + Squad scratch; + SquadReset( scratch ); + if ( !SquadLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, ( in_bounds ? value.keyed.slots[slot] : scratch ), ( in_bounds ? retain : NULL ), TableRetainStepInto( path, 2, (uint32_t) ( slot ) ) ) ) { return false; } + } + } + break; + } + case 0xe756c0190570ccb5ull: // arm + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 15 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 3 ); + { + uint64_t arm_ref = 0; + if ( !r.get( arm_ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry arm; + if ( arm_ref == 0 ) { value.arm.type = ForceType::None; } + else if ( !TableMessageArmEntry( vocabulary, arm_ref, arm ) ) { report->malformed = true; return false; } + else + { + switch ( arm.id ) + { + case 0xd5c2bb95d63e6331ull: // squad + { + if ( arm.kind != 13 || arm.elem_kind != 0 ) + { + value.arm.type = ForceType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.arm.type = ForceType::Squad; + if ( !SquadLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, value.arm.squad, retain, TableRetainStepInto( path, 3, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + case 0xfd4d194e1652b207ull: // plain + { + if ( arm.kind != 4 || arm.elem_kind != 0 ) + { + if ( TableKindWidens( arm.kind, 4 ) ) + { + value.arm.type = ForceType::Plain; + memset( (void *) &value.arm.plain, 0, sizeof( value.arm.plain ) ); // selection establishes the arm (§2.6) + { + const int64_t width_2 = arm.value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( arm.packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) arm.base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + value.arm.plain = decoded_v_2; + } + report->widened++; + break; + } + value.arm.type = ForceType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.arm.type = ForceType::Plain; + { + const int64_t width_2 = arm.value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( arm.packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) arm.base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + value.arm.plain = decoded_v_2; + } + break; + } + default: + value.arm.type = ForceType::None; report->unknown++; report->retain_lost++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + } + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +// SquadNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it +// already owns. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is the region directory's, which Load fills from the wire's framing +// and nothing afterwards renumbers. +inline void SquadNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + // the node's own EXTENT, where its lists' and maps' arrays are carved + // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). + // The tool's path carries a worker instead: there the arrays are the + // arena's. + TableExtentCarve carve; + carve.worker = nodes.worker; + if ( carve.worker == NULL ) + { + TableRefuseReason reason = count_over_length; // pass one already refused what this could refuse + const int64_t storage = SquadNodeStorage( type_id, r.size, reason ); + const int64_t record = storage > 0 ? SquadNodeRecordBytes( type_id ) : 0; + carve.at = at + record; + carve.left = storage > record ? storage - record : 0; + } + nodes.carve = &carve; + (void) nodes; // every node this root can name is a FIXED table + (void) retain; (void) node; + switch ( type_id ) + { + default: break; + } + nodes.carve = NULL; // the cursor is ONE node's, and this node's body is done +} + +// SquadLoadRetain: decode the tolerant wire into the caller's exact-sized region and +// return the root. LOAD IS A SCAN, and that is the whole of its bound: it +// follows no reference, so there is no depth cap, no visited set and no +// ordering rule on the indices. Partial results are kept, as everywhere on +// this wire — the report says what happened. NULL means the CALLER's buffer +// was wrong. +// UNDER RETENTION it also fills the caller's two stores with the fields +// this build cannot name, and the report carries what it could not keep +// (docs/SPEC-TABLES.md §6.6). It is Load's own path and nothing else: the +// reader's data is exactly what it would have been with retention off. +inline const Squad * SquadLoadRetain( uint8_t * region, int64_t region_bytes, const uint8_t * wire_file, int64_t wire_file_bytes, TableRetain * retain, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + // THE FORM BYTE IS READ FIRST, then the trailer, and only then a body: + // a file that is both a newer form and damaged is a REFUSAL and never + // damage (docs/SPEC-TABLES.md §3). + TableIdTable ids_table; + int64_t body_bytes = 0; + const TableOpenVerdict verdict = TableOpen( wire_file, wire_file_bytes, ids_table, body_bytes ); + if ( verdict != TableOpenOk ) + { + if ( verdict == TableOpenDamaged ) { out->malformed = true; } else { out->refused = true; if ( wire_file_bytes > 0 && wire_file[0] == kTableWireMessageForm ) { out->reason = message_form_as_file; } else { out->reason = newer_form; } } + return NULL; + } + if ( TableBodyEndsEarly( wire_file + 1, body_bytes, ids_table ) ) + { + out->malformed = true; // a byte no field claims, before the table (§3) + return NULL; + } + const uint8_t * const wire = wire_file + 1; + const int64_t wire_bytes = body_bytes; + if ( region == NULL || region_bytes < (int64_t) sizeof( Squad ) ) { out->malformed = true; return NULL; } + if ( ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return NULL; } + memset( region, 0, (size_t) region_bytes ); + uint64_t type_id = 0; + const uint8_t * body = NULL; + int64_t length = 0; + + // the record count and the data bytes, from the FRAMING alone + TableRefuseReason reason = count_over_length; // LoadMeasure is where a caller reads it; a Load past a refusal is malformed + int64_t root_extent = 0; + if ( !SquadWireExtent( wire, wire_bytes, root_extent, &ids_table, reason ) ) { out->malformed = true; return NULL; } + int64_t data = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Squad ) ) + root_extent ); + int64_t records = 0; + { + TableReport counting; + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, &counting, &ids_table ); + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + records++; + int64_t storage = SquadNodeStorage( type_id, length, reason ); + if ( storage == kTableNodeRefused ) { out->malformed = true; return NULL; } + if ( storage > 0 ) { data += storage; } + } + } + int64_t attribution = ( records + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( data + attribution > region_bytes ) { out->malformed = true; return NULL; } + + TableNodeMap nodes; + nodes.base = region; + nodes.entries = (const TableNodeDirEntry *) ( region + data ); + nodes.count = records + 1; + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + data ); + directory[0].offset = 0; // position 0 is the ROOT, at offset 0 (§6.3) + directory[0].type_id = 0xec07a2f760550a91ull; + Squad * root = new ( region ) Squad; // lifetime only: LoadBody's first act is SquadReset + SquadReset( *root ); + + // LoadRetain RESETS BOTH STORES and writes into neither id list: a + // retained record carries its field's identity in the record itself, + // with every reference resolved (docs/SPEC-TABLES.md §6.6). The buffer + // belongs to this region from here on. + TableRetainReset( retain, nodes, region ); + + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Squad ) ) + root_extent ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = SquadNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + directory[k + 1].type_id = type_id; + } + else + { + directory[k + 1].offset = (uint64_t) used; + directory[k + 1].type_id = type_id; + SquadNodePlace( type_id, region + used, length ); + used += storage; + } + k++; + } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + SquadNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Squad ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + SquadLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// SquadNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool SquadNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + SquadNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !SquadNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// SquadLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool SquadLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Squad * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !SquadMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = SquadNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + SquadNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !SquadMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Squad ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xec07a2f760550a91ull; + Squad * root = new ( region + used ) Squad; // lifetime only: LoadMessageBody's first act is SquadReset + SquadReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Squad ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - SquadNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !SquadNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Squad ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - SquadLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return SquadLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// SquadLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool SquadLoadRetainMessages( const Squad ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !SquadLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // SquadMeasureRetain and SquadSaveRetain: the pair, with the retained tail in @@ -11516,6 +12583,182 @@ inline const Depth * DepthLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// DepthNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool DepthNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + DepthNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !DepthNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// DepthLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool DepthLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Depth * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !DepthMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = DepthNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + DepthNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !DepthMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Depth ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x3231d0dc6fe30d4aull; + Depth * root = new ( region + used ) Depth; // lifetime only: LoadMessageBody's first act is DepthReset + DepthReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Depth ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !DepthNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return DepthLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// DepthLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool DepthLoadRetainMessages( const Depth ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !DepthLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // DepthMeasureRetain and DepthSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/maps/DocsTable.h b/testdata/golden/tables/maps/DocsTable.h index acdfed2b6..4e771afb4 100644 --- a/testdata/golden/tables/maps/DocsTable.h +++ b/testdata/golden/tables/maps/DocsTable.h @@ -3752,6 +3752,16 @@ inline int64_t TableRetainInContent( TableRetainIn & s, uint8_t kind, int64_t le } break; } + case 15: case 30: + // A UNION ARM AND AN ENUM'S VARIANT REFERENCE RESOLVE AS A FRAMED + // CONTENT TOO (§6.6): a kind 15 arm whose own payload is a union, + // and a kind 16 slot whose element kind is 15 or 30, both arrive + // here, and both carry a reference. Copying them as bytes would + // re-emit a reference into a permuted trailer, where it names + // another id, and would let a kind 17 UNDER A KIND 15 ARM through + // a walk whose whole job is to catch it. + if ( TableRetainInPayload( s, kind, depth ) < 0 ) { return -1; } + break; case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) default: // every other content is bytes: a string, wide text, an escape, a @@ -4128,6 +4138,11 @@ inline bool TableRetainOutContent( TableRetainOut & s, uint8_t kind, int64_t len } break; } + case 15: case 30: + // the emit side of the capture's own rule (§6.6): an arm and a + // variant reference resolve as a framed content too + if ( !TableRetainOutPayload( s, kind, depth ) ) { return false; } + break; default: TableRetainOutRaw( s, s.in + s.at, length ); s.at += length; @@ -4372,6 +4387,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace mapdemo #endif // MAPDEMO_SCHEMA_TABLE_RETAIN @@ -6221,10 +6668,12 @@ template inline int64_t DocsPagesEntryMeasureBodyRetain( const Ct template inline bool DocsPagesEntrySaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const DocsPagesEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline bool DocsPagesEntrySaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const DocsPagesEntry & value, TableRetain * retain, const TableRetainPath & path ); inline bool DocsPagesEntryLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, DocsPagesEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool DocsPagesEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, DocsPagesEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t DocsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Docs & value, TableRetain * retain, const TableRetainPath & path ); template inline bool DocsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Docs & value, TableRetain * retain, const TableRetainPath & path ); template inline bool DocsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Docs & value, TableRetain * retain, const TableRetainPath & path ); inline bool DocsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Docs & value, TableRetain * retain, const TableRetainPath & path ); +inline bool DocsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Docs & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t DocsPagesEntryMeasureBody( const Ctx & ctx, const TableNumbering & numbering, TableIds & ids, const DocsPagesEntry & value ) @@ -6458,15 +6907,13 @@ inline bool DocsPagesEntryLoadMessageBody( TableBitReader & r, const TableVocabu { uint64_t n = 0; if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } - int32_t kept = 0; - if ( n > (uint64_t) 8 ) { kept = 8; report->clamped++; } else { kept = (int32_t) n; } - for ( uint64_t i = 0; i < n; i++ ) - { - uint64_t by = 0; - if ( !r.get( by, 8 ) ) { report->malformed = true; return false; } - if ( (int32_t) i < kept ) { value.key[i] = (char) by; } - } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 8 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.key, text, (size_t) kept ); value.key[kept] = 0; + r.offset += (int64_t) n * 8; value.key_length = kept; } break; @@ -8421,6 +8868,92 @@ inline bool DocsPagesEntryLoadBodyRetain( TableReader & r, const TableNodeMap & } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool DocsPagesEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, DocsPagesEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + DocsPagesEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 8 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.key, text, (size_t) kept ); + value.key[kept] = 0; + r.offset += (int64_t) n * 8; + value.key_length = kept; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.value, node_index, kTableStringTypeId, report ); // *string + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t DocsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Docs & value, TableRetain * retain, const TableRetainPath & path ) { @@ -8654,16 +9187,174 @@ inline bool DocsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Doc } } -// DocsNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it -// already owns. -// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the -// index is the region directory's, which Load fills from the wire's framing -// and nothing afterwards renumbers. -inline void DocsNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool DocsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Docs & value, TableRetain * retain, const TableRetainPath & path ) { - // the node's own EXTENT, where its lists' and maps' arrays are carved - // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). - // The tool's path carries a worker instead: there the arrays are the + (void) nodes; (void) index_bits; + DocsReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xab01daa76a48769full: // pages + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.pages, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + const char * last_key = NULL; int32_t last_length = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const DocsPagesEntryMessageKeyRead read = DocsPagesEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( last_key, last_length, read.key, read.length ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + DocsPagesEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !DocsPagesEntryLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; last_length = read.length; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +// DocsNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it +// already owns. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is the region directory's, which Load fills from the wire's framing +// and nothing afterwards renumbers. +inline void DocsNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + // the node's own EXTENT, where its lists' and maps' arrays are carved + // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). + // The tool's path carries a worker instead: there the arrays are the // arena's. TableExtentCarve carve; carve.worker = nodes.worker; @@ -8836,6 +9527,182 @@ inline const Docs * DocsLoadRetain( uint8_t * region, int64_t region_bytes, cons return root; } +// DocsNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool DocsNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + DocsNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !DocsNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// DocsLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool DocsLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Docs * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !DocsMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = DocsNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + DocsNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !DocsMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Docs ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x036ffe7360826852ull; + Docs * root = new ( region + used ) Docs; // lifetime only: LoadMessageBody's first act is DocsReset + DocsReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Docs ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !DocsNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return DocsLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// DocsLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool DocsLoadRetainMessages( const Docs ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !DocsLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // DocsMeasureRetain and DocsSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/maps/FleetTable.h b/testdata/golden/tables/maps/FleetTable.h index 96d00d68b..0ac00ec12 100644 --- a/testdata/golden/tables/maps/FleetTable.h +++ b/testdata/golden/tables/maps/FleetTable.h @@ -4387,6 +4387,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace mapdemo #endif // MAPDEMO_SCHEMA_TABLE_RETAIN @@ -6942,30 +7374,38 @@ inline FleetTiersEntryKeyRead FleetTiersEntryReadKey( const uint8_t * body, int6 inline int64_t ShipConfigMeasureBodyRetain( TableRetainIds & ids, const ShipConfig & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool ShipConfigSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const ShipConfig & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool ShipConfigLoadBodyRetain( TableReader & r, ShipConfig & value, TableRetain * retain, const TableRetainPath & path ); +inline bool ShipConfigLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, ShipConfig & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t ItemMeasureBodyRetain( TableRetainIds & ids, const Item & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool ItemSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Item & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool ItemLoadBodyRetain( TableReader & r, Item & value, TableRetain * retain, const TableRetainPath & path ); +inline bool ItemLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Item & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t FleetShipsEntryMeasureBodyRetain( TableRetainIds & ids, const FleetShipsEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool FleetShipsEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const FleetShipsEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool FleetShipsEntryLoadBodyRetain( TableReader & r, FleetShipsEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool FleetShipsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, FleetShipsEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t FleetByIdEntryMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const FleetByIdEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline bool FleetByIdEntrySaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const FleetByIdEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline bool FleetByIdEntrySaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const FleetByIdEntry & value, TableRetain * retain, const TableRetainPath & path ); inline bool FleetByIdEntryLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, FleetByIdEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool FleetByIdEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, FleetByIdEntry & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t FleetLoadoutsEntryValueEntryMeasureBodyRetain( TableRetainIds & ids, const FleetLoadoutsEntryValueEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool FleetLoadoutsEntryValueEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const FleetLoadoutsEntryValueEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool FleetLoadoutsEntryValueEntryLoadBodyRetain( TableReader & r, FleetLoadoutsEntryValueEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool FleetLoadoutsEntryValueEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, FleetLoadoutsEntryValueEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t FleetLoadoutsEntryMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const FleetLoadoutsEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline bool FleetLoadoutsEntrySaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const FleetLoadoutsEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline bool FleetLoadoutsEntrySaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const FleetLoadoutsEntry & value, TableRetain * retain, const TableRetainPath & path ); inline bool FleetLoadoutsEntryLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, FleetLoadoutsEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool FleetLoadoutsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, FleetLoadoutsEntry & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t FleetTiersEntryMeasureBodyRetain( TableRetainIds & ids, const FleetTiersEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool FleetTiersEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const FleetTiersEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool FleetTiersEntryLoadBodyRetain( TableReader & r, FleetTiersEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool FleetTiersEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, FleetTiersEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t FleetMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Fleet & value, TableRetain * retain, const TableRetainPath & path ); template inline bool FleetSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Fleet & value, TableRetain * retain, const TableRetainPath & path ); template inline bool FleetSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Fleet & value, TableRetain * retain, const TableRetainPath & path ); inline bool FleetLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Fleet & value, TableRetain * retain, const TableRetainPath & path ); +inline bool FleetLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Fleet & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t ShipConfigMeasureBody( TableIds & ids, const ShipConfig & value ) { @@ -12523,80 +12963,197 @@ MAPDEMO_TABLE_INLINE bool ShipConfigLoadBodyRetain( TableReader & r, ShipConfig } } -inline int64_t ItemMeasureBodyRetain( TableRetainIds & ids, const Item & value, TableRetain * retain, const TableRetainPath & path ) -{ - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.count != 0 ) { bytes += TableLebBytes( ids.ref( 0xb1e5e28e4479a274ull ) ) + 1 + 4; } // count - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -MAPDEMO_TABLE_INLINE bool ItemSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Item & value, TableRetain * retain, const TableRetainPath & path ) -{ - if ( value.count != 0 ) - { - w.putleb( ids.ref( 0xb1e5e28e4479a274ull ) ); w.put8( 4 ); // count - w.put32( uint32_t( value.count ) ); - } - if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } - w.put8( 0 ); // the ZERO REFERENCE that ends the body - return !w.overflow; -} - -MAPDEMO_TABLE_INLINE bool ItemLoadBodyRetain( TableReader & r, Item & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool ShipConfigLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, ShipConfig & value, TableRetain * retain, const TableRetainPath & path ) { - ItemReset( value ); // prefill declared defaults in place, then overlay + ShipConfigReset( value ); // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT - // (docs/SPEC-TABLES.md §6.6): this body is being established, so - // whatever an earlier occurrence of it left is discarded before the - // winning one is read. The discard moves neither counter. + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. TableRetainDiscardBody( retain, path ); for ( ;; ) { - uint64_t field_ref = 0; - if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } - if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE - if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count - const uint64_t field_id = r.ids->at( field_ref ); - if ( !r.has( 1 ) ) { r.report->malformed = true; return false; } - uint8_t kind = r.get8(); - if ( ( field_id == kTableNodeTableFieldId && r.nested ) || field_id == kTableBuildVersionFieldId || field_id == kTableMessageVocabularyFieldId ) - { - // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, - // IS MALFORMED (docs/SPEC-TABLES.md §3.1, §3.3). The node - // table's is the ROOT body's alone, on the numbering's own - // rule — a second numbering cannot exist — and the BUILD - // VERSION's rides in the announcement and nowhere else. That - // body stops and the parent reads on past its L. - r.report->malformed = true; - return false; - } - switch ( field_id ) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - case 0xb1e5e28e4479a274ull: // count + case 0xc4bcadba8e631b86ull: // name { - if ( kind != 4 ) + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) { - if ( TableKindWidens( kind, 4 ) ) - { - // WIDENED (§4): a kind that grew since the writer decodes - // exactly at its own width, the value lands, one widened counts - int64_t widened_v = 0; - if ( !TableReadSignedAt( r, kind, widened_v ) ) { r.report->malformed = true; return false; } - int32_t decoded_v = (int32_t) widened_v; - value.count = decoded_v; - r.report->widened++; - break; - } - // AT A POSITION THE READER DOES NAME, a field under - // kind 31 or kind 32 takes this same rule and no other (§3) - r.report->kind_mismatch++; - if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } break; } - if ( !r.has( 4 ) ) { r.report->malformed = true; return false; } - int32_t decoded_v = int32_t( r.get32( ) ); - value.count = decoded_v; + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 64 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.name, text, (size_t) kept ); + value.name[kept] = 0; + r.offset += (int64_t) n * 8; + value.name_length = kept; + } + break; + } + case 0x7f69d4b5288ba9cfull: // health + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.health = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.health = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +inline int64_t ItemMeasureBodyRetain( TableRetainIds & ids, const Item & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.count != 0 ) { bytes += TableLebBytes( ids.ref( 0xb1e5e28e4479a274ull ) ) + 1 + 4; } // count + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +MAPDEMO_TABLE_INLINE bool ItemSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Item & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( value.count != 0 ) + { + w.putleb( ids.ref( 0xb1e5e28e4479a274ull ) ); w.put8( 4 ); // count + w.put32( uint32_t( value.count ) ); + } + if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } + w.put8( 0 ); // the ZERO REFERENCE that ends the body + return !w.overflow; +} + +MAPDEMO_TABLE_INLINE bool ItemLoadBodyRetain( TableReader & r, Item & value, TableRetain * retain, const TableRetainPath & path ) +{ + ItemReset( value ); // prefill declared defaults in place, then overlay + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so + // whatever an earlier occurrence of it left is discarded before the + // winning one is read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t field_ref = 0; + if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } + if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE + if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count + const uint64_t field_id = r.ids->at( field_ref ); + if ( !r.has( 1 ) ) { r.report->malformed = true; return false; } + uint8_t kind = r.get8(); + if ( ( field_id == kTableNodeTableFieldId && r.nested ) || field_id == kTableBuildVersionFieldId || field_id == kTableMessageVocabularyFieldId ) + { + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, + // IS MALFORMED (docs/SPEC-TABLES.md §3.1, §3.3). The node + // table's is the ROOT body's alone, on the numbering's own + // rule — a second numbering cannot exist — and the BUILD + // VERSION's rides in the announcement and nowhere else. That + // body stops and the parent reads on past its L. + r.report->malformed = true; + return false; + } + switch ( field_id ) + { + case 0xb1e5e28e4479a274ull: // count + { + if ( kind != 4 ) + { + if ( TableKindWidens( kind, 4 ) ) + { + // WIDENED (§4): a kind that grew since the writer decodes + // exactly at its own width, the value lands, one widened counts + int64_t widened_v = 0; + if ( !TableReadSignedAt( r, kind, widened_v ) ) { r.report->malformed = true; return false; } + int32_t decoded_v = (int32_t) widened_v; + value.count = decoded_v; + r.report->widened++; + break; + } + // AT A POSITION THE READER DOES NAME, a field under + // kind 31 or kind 32 takes this same rule and no other (§3) + r.report->kind_mismatch++; + if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + break; + } + if ( !r.has( 4 ) ) { r.report->malformed = true; return false; } + int32_t decoded_v = int32_t( r.get32( ) ); + value.count = decoded_v; break; } default: @@ -12609,6 +13166,98 @@ MAPDEMO_TABLE_INLINE bool ItemLoadBodyRetain( TableReader & r, Item & value, Tab } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool ItemLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Item & value, TableRetain * retain, const TableRetainPath & path ) +{ + ItemReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xb1e5e28e4479a274ull: // count + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.count = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.count = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + inline int64_t FleetShipsEntryMeasureBodyRetain( TableRetainIds & ids, const FleetShipsEntry & value, TableRetain * retain, const TableRetainPath & path ) { int64_t bytes = 1; // the ZERO REFERENCE that ends the body @@ -12740,26 +13389,108 @@ MAPDEMO_TABLE_INLINE bool FleetShipsEntryLoadBodyRetain( TableReader & r, FleetS } } -template -inline int64_t FleetByIdEntryMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const FleetByIdEntry & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool FleetShipsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, FleetShipsEntry & value, TableRetain * retain, const TableRetainPath & path ) { - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.key != 0 ) { bytes += TableLebBytes( ids.ref( 0x3dc94a19365b10ecull ) ) + 1 + 4; } // key + FleetShipsEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - const ShipConfig * pointee_value = ShipConfigAt( ctx, value.value ); // *ShipConfig - // A POINTER RIDES AS A NODE INDEX (docs/SPEC-TABLES.md §3.1): the - // header and the index and nothing below it, because the pointee's - // body is in the node table and not here. NULL IS ELIDED — absence - // and null are one value — and a non-null pointer ALWAYS rides, even - // when its node's body is entirely default. - if ( pointee_value != NULL ) - { - uint64_t index_value = 0; - if ( !TableNumberingIndex( numbering, (const void *) pointee_value, index_value ) ) { return -1; } - bytes += TableLebBytes( ids.ref( 0x7ce4fd9430e80ceaull ) ) + 1 + TableLebBytes( index_value ); - } - } - bytes += TableRetainTailMeasure( retain, ids, path ); + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 32 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.key, text, (size_t) kept ); + value.key[kept] = 0; + r.offset += (int64_t) n * 8; + value.key_length = kept; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 1 ); + if ( !ShipConfigLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t FleetByIdEntryMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const FleetByIdEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.key != 0 ) { bytes += TableLebBytes( ids.ref( 0x3dc94a19365b10ecull ) ) + 1 + 4; } // key + { + const ShipConfig * pointee_value = ShipConfigAt( ctx, value.value ); // *ShipConfig + // A POINTER RIDES AS A NODE INDEX (docs/SPEC-TABLES.md §3.1): the + // header and the index and nothing below it, because the pointee's + // body is in the node table and not here. NULL IS ELIDED — absence + // and null are one value — and a non-null pointer ALWAYS rides, even + // when its node's body is entirely default. + if ( pointee_value != NULL ) + { + uint64_t index_value = 0; + if ( !TableNumberingIndex( numbering, (const void *) pointee_value, index_value ) ) { return -1; } + bytes += TableLebBytes( ids.ref( 0x7ce4fd9430e80ceaull ) ) + 1 + TableLebBytes( index_value ); + } + } + bytes += TableRetainTailMeasure( retain, ids, path ); return bytes; } @@ -12884,6 +13615,105 @@ inline bool FleetByIdEntryLoadBodyRetain( TableReader & r, const TableNodeMap & } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool FleetByIdEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, FleetByIdEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + FleetByIdEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 8 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 8 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.key = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.value, node_index, 0x758252d2d1b14f0dull, report ); // *ShipConfig + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + inline int64_t FleetLoadoutsEntryValueEntryMeasureBodyRetain( TableRetainIds & ids, const FleetLoadoutsEntryValueEntry & value, TableRetain * retain, const TableRetainPath & path ) { int64_t bytes = 1; // the ZERO REFERENCE that ends the body @@ -13004,6 +13834,86 @@ MAPDEMO_TABLE_INLINE bool FleetLoadoutsEntryValueEntryLoadBodyRetain( TableReade } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool FleetLoadoutsEntryValueEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, FleetLoadoutsEntryValueEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + FleetLoadoutsEntryValueEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 6 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 255ull ) { decoded_wide = (int64_t) 255ull; report->clamped++; } + uint8_t decoded_v = (uint8_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 1 ); + if ( !ItemLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t FleetLoadoutsEntryMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const FleetLoadoutsEntry & value, TableRetain * retain, const TableRetainPath & path ) { @@ -13240,16 +14150,149 @@ inline bool FleetLoadoutsEntryLoadBodyRetain( TableReader & r, const TableNodeMa } } -inline int64_t FleetTiersEntryMeasureBodyRetain( TableRetainIds & ids, const FleetTiersEntry & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool FleetLoadoutsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, FleetLoadoutsEntry & value, TableRetain * retain, const TableRetainPath & path ) { - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.key != 0 ) { bytes += TableLebBytes( ids.ref( 0x3dc94a19365b10ecull ) ) + 1 + 2; } // key + (void) nodes; (void) index_bits; + FleetLoadoutsEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - const int32_t mark_value = ids.count; - const uint64_t ref_value = ids.ref( 0x7ce4fd9430e80ceaull ); - const int64_t body_value = ItemMeasureBodyRetain( ids, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ); - if ( body_value < 0 ) { return -1; } - if ( body_value > 1 ) { bytes += TableLebBytes( ref_value ) + 1 + TableLebBytes( (uint64_t) ( body_value ) ) + ( body_value ); } // value + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 16 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.key, text, (size_t) kept ); + value.key[kept] = 0; + r.offset += (int64_t) n * 8; + value.key_length = kept; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 1 ); + TableMapFill fill = TableMapFillBegin( nodes, value.value, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + uint8_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const FleetLoadoutsEntryValueEntryMessageKeyRead read = FleetLoadoutsEntryValueEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (uint64_t) last_key, (uint64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + FleetLoadoutsEntryValueEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !FleetLoadoutsEntryValueEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 1, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +inline int64_t FleetTiersEntryMeasureBodyRetain( TableRetainIds & ids, const FleetTiersEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.key != 0 ) { bytes += TableLebBytes( ids.ref( 0x3dc94a19365b10ecull ) ) + 1 + 2; } // key + { + const int32_t mark_value = ids.count; + const uint64_t ref_value = ids.ref( 0x7ce4fd9430e80ceaull ); + const int64_t body_value = ItemMeasureBodyRetain( ids, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ); + if ( body_value < 0 ) { return -1; } + if ( body_value > 1 ) { bytes += TableLebBytes( ref_value ) + 1 + TableLebBytes( (uint64_t) ( body_value ) ) + ( body_value ); } // value else { ids.truncate( mark_value ); } // an all-default nested table elides, and costs no entry } bytes += TableRetainTailMeasure( retain, ids, path ); @@ -13371,6 +14414,113 @@ MAPDEMO_TABLE_INLINE bool FleetTiersEntryLoadBodyRetain( TableReader & r, FleetT } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool FleetTiersEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, FleetTiersEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + FleetTiersEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 3 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 3 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -32768ll ) { decoded_wide = -32768ll; report->clamped++; } + if ( decoded_wide > 32767ll ) { decoded_wide = 32767ll; report->clamped++; } + int16_t decoded_v = (int16_t) decoded_wide; + value.key = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -32768ll ) { decoded_wide = -32768ll; report->clamped++; } + if ( decoded_wide > 32767ll ) { decoded_wide = 32767ll; report->clamped++; } + int16_t decoded_v = (int16_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 1 ); + if ( !ItemLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t FleetMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Fleet & value, TableRetain * retain, const TableRetainPath & path ) { @@ -13886,131 +15036,452 @@ inline bool FleetLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Fl FleetLoadoutsEntry * slot = NULL; if ( order == 0 ) { - // EQUAL: a DUPLICATE. The slot that entry took is reset to the - // entry's defaults by the decode below, so LAST WINS WHOLE and an - // elided field of the repeat reads as its default. The map's - // count excludes it. + // EQUAL: a DUPLICATE. The slot that entry took is reset to the + // entry's defaults by the decode below, so LAST WINS WHOLE and an + // elided field of the repeat reads as its default. The map's + // count excludes it. + slot = TableMapFillLast( fill ); + r.report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { r.report->malformed = true; break; } + { + TableReader elem( elem_body, (int64_t) elem_len, r.report, r.ids ); + FleetLoadoutsEntryLoadBodyRetain( elem, nodes, *slot, retain, TableRetainStepInto( path, 3, (uint32_t) ( fill.map->count - 1 ) ) ); + } + last_key = read.key; last_length = read.length; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + r.offset = body_end; // the remaining entries skip by the map's L + break; + } + case 0x6dd8dc6c5fdae3ceull: // tiers + { + if ( kind != 14 ) + { + // AT A POSITION THE READER DOES NAME, a field under + // kind 31 or kind 32 takes this same rule and no other (§3) + r.report->kind_mismatch++; + if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + break; + } + uint64_t body_len = 0; + if ( !r.getleb( body_len ) || !r.room( body_len ) ) { r.report->malformed = true; return false; } + int64_t body_end = r.offset + (int64_t) body_len; + if ( body_len >= 2 ) + { + uint8_t elem_kind = r.get8(); + uint64_t count = 0; + if ( !r.getleb( count ) ) { r.report->malformed = true; r.offset = body_end; break; } + // A MAP HEADER WHOSE ELEMENT KIND IS NOT 13 is the ordinary array + // kind mismatch of §4, and nothing about a map is special-cased + if ( elem_kind != 13 ) { r.report->kind_mismatch++; r.offset = body_end; break; } + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 4 ); + TableMapFill fill = TableMapFillBegin( nodes, value.tiers, (uint32_t) count ); + if ( !fill.ok ) { r.report->malformed = true; r.offset = body_end; break; } + TableReader sub( r.buffer + r.offset, body_end - r.offset, r.report, r.ids ); + int16_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + uint64_t elem_len = 0; + if ( !sub.getleb( elem_len ) || !sub.room( elem_len ) ) { r.report->malformed = true; break; } + const uint8_t * elem_body = sub.buffer + sub.offset; + sub.offset += (int64_t) elem_len; + FleetTiersEntryKeyRead read = FleetTiersEntryReadKey( elem_body, (int64_t) elem_len, r.ids ); + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; r.report->widened++; } + // THE KEY KIND IS CHECKED FIRST: a key read under another kind + // desynchronizes the rest of the scan, and the honest answer to a + // body whose key is not this reader's kind is the KIND, not the + // framing damage that follows from it. + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets + // to EMPTY, ONE kind_mismatch is counted for it, and the rest + // is skipped. Events counted inside earlier entries stand. + r.report->kind_mismatch++; + TableMapFillReset( fill ); + break; + } + if ( read.malformed ) { r.report->malformed = true; break; } + if ( read.over ) { r.report->clamped++; continue; } // skipped by its L, one count per entry + const int order = landed ? TableKeyOrder( (int64_t) last_key, (int64_t) read.key ) : -1; + if ( order > 0 ) + { + // DESCENDING: not a body any conforming writer produced. The map + // keeps the ascending prefix it has, the rest skips by the map's + // L, and the PARENT reads on past the field's length (§4). + r.report->malformed = true; + break; + } + FleetTiersEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset to the + // entry's defaults by the decode below, so LAST WINS WHOLE and an + // elided field of the repeat reads as its default. The map's + // count excludes it. + slot = TableMapFillLast( fill ); + r.report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { r.report->malformed = true; break; } + { + TableReader elem( elem_body, (int64_t) elem_len, r.report, r.ids ); + FleetTiersEntryLoadBodyRetain( elem, *slot, retain, TableRetainStepInto( path, 4, (uint32_t) ( fill.map->count - 1 ) ) ); + } + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + r.offset = body_end; // the remaining entries skip by the map's L + break; + } + case 0xffffffffffffffffull: + { + if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + break; + } + default: + { + r.report->unknown++; + if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } + break; + } + } + } +} + +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool FleetLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Fleet & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + FleetReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x294a5c4913e1ad44ull: // ships + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.ships, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + const char * last_key = NULL; int32_t last_length = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const FleetShipsEntryMessageKeyRead read = FleetShipsEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( last_key, last_length, read.key, read.length ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + FleetShipsEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !FleetShipsEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; last_length = read.length; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0x7b024c46e98d3404ull: // by_id + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 1 ); + TableMapFill fill = TableMapFillBegin( nodes, value.by_id, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + uint32_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const FleetByIdEntryMessageKeyRead read = FleetByIdEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (uint64_t) last_key, (uint64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + FleetByIdEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !FleetByIdEntryLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *slot, retain, TableRetainStepInto( path, 1, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0x63dfa0c4a4b3815dull: // flagship + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.flagship, node_index, 0x758252d2d1b14f0dull, report ); // *ShipConfig + } + break; + } + case 0x294fa1b3f0f5f070ull: // loadouts + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 3 ); + TableMapFill fill = TableMapFillBegin( nodes, value.loadouts, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + const char * last_key = NULL; int32_t last_length = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const FleetLoadoutsEntryMessageKeyRead read = FleetLoadoutsEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( last_key, last_length, read.key, read.length ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + FleetLoadoutsEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. slot = TableMapFillLast( fill ); - r.report->duplicate++; + report->duplicate++; } else { slot = TableMapFillNext( fill ); // ASCENDING: the next slot } - if ( slot == NULL ) { r.report->malformed = true; break; } - { - TableReader elem( elem_body, (int64_t) elem_len, r.report, r.ids ); - FleetLoadoutsEntryLoadBodyRetain( elem, nodes, *slot, retain, TableRetainStepInto( path, 3, (uint32_t) ( fill.map->count - 1 ) ) ); - } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !FleetLoadoutsEntryLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *slot, retain, TableRetainStepInto( path, 3, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends last_key = read.key; last_length = read.length; // the WIRE keys of the entries that LAND landed = true; } TableMapFillEnd( fill ); } - r.offset = body_end; // the remaining entries skip by the map's L break; } case 0x6dd8dc6c5fdae3ceull: // tiers { - if ( kind != 14 ) + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) { - // AT A POSITION THE READER DOES NAME, a field under - // kind 31 or kind 32 takes this same rule and no other (§3) - r.report->kind_mismatch++; - if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } break; } - uint64_t body_len = 0; - if ( !r.getleb( body_len ) || !r.room( body_len ) ) { r.report->malformed = true; return false; } - int64_t body_end = r.offset + (int64_t) body_len; - if ( body_len >= 2 ) { - uint8_t elem_kind = r.get8(); uint64_t count = 0; - if ( !r.getleb( count ) ) { r.report->malformed = true; r.offset = body_end; break; } - // A MAP HEADER WHOSE ELEMENT KIND IS NOT 13 is the ordinary array - // kind mismatch of §4, and nothing about a map is special-cased - if ( elem_kind != 13 ) { r.report->kind_mismatch++; r.offset = body_end; break; } + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the // records under this field go with the value it is about to lose. TableRetainDiscardField( retain, path, 4 ); TableMapFill fill = TableMapFillBegin( nodes, value.tiers, (uint32_t) count ); - if ( !fill.ok ) { r.report->malformed = true; r.offset = body_end; break; } - TableReader sub( r.buffer + r.offset, body_end - r.offset, r.report, r.ids ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree int16_t last_key = 0; bool landed = false; bool map_widened = false; for ( uint64_t i = 0; i < count; i++ ) { - uint64_t elem_len = 0; - if ( !sub.getleb( elem_len ) || !sub.room( elem_len ) ) { r.report->malformed = true; break; } - const uint8_t * elem_body = sub.buffer + sub.offset; - sub.offset += (int64_t) elem_len; - FleetTiersEntryKeyRead read = FleetTiersEntryReadKey( elem_body, (int64_t) elem_len, r.ids ); + const FleetTiersEntryMessageKeyRead read = FleetTiersEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) - if ( read.widened && !map_widened ) { map_widened = true; r.report->widened++; } - // THE KEY KIND IS CHECKED FIRST: a key read under another kind - // desynchronizes the rest of the scan, and the honest answer to a - // body whose key is not this reader's kind is the KIND, not the - // framing damage that follows from it. + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } if ( read.kind_bad ) { - // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets - // to EMPTY, ONE kind_mismatch is counted for it, and the rest - // is skipped. Events counted inside earlier entries stand. - r.report->kind_mismatch++; + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } break; } - if ( read.malformed ) { r.report->malformed = true; break; } - if ( read.over ) { r.report->clamped++; continue; } // skipped by its L, one count per entry + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry const int order = landed ? TableKeyOrder( (int64_t) last_key, (int64_t) read.key ) : -1; - if ( order > 0 ) - { - // DESCENDING: not a body any conforming writer produced. The map - // keeps the ascending prefix it has, the rest skips by the map's - // L, and the PARENT reads on past the field's length (§4). - r.report->malformed = true; - break; - } + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced FleetTiersEntry * slot = NULL; if ( order == 0 ) { - // EQUAL: a DUPLICATE. The slot that entry took is reset to the - // entry's defaults by the decode below, so LAST WINS WHOLE and an - // elided field of the repeat reads as its default. The map's - // count excludes it. + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. slot = TableMapFillLast( fill ); - r.report->duplicate++; + report->duplicate++; } else { slot = TableMapFillNext( fill ); // ASCENDING: the next slot } - if ( slot == NULL ) { r.report->malformed = true; break; } - { - TableReader elem( elem_body, (int64_t) elem_len, r.report, r.ids ); - FleetTiersEntryLoadBodyRetain( elem, *slot, retain, TableRetainStepInto( path, 4, (uint32_t) ( fill.map->count - 1 ) ) ); - } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !FleetTiersEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 4, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends last_key = read.key; // the WIRE keys of the entries that LAND landed = true; } TableMapFillEnd( fill ); } - r.offset = body_end; // the remaining entries skip by the map's L - break; - } - case 0xffffffffffffffffull: - { - if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } break; } default: + report->unknown++; { - r.report->unknown++; - if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } - break; + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); } + break; } } } @@ -14188,6 +15659,182 @@ inline const Fleet * FleetLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// FleetNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool FleetNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + FleetNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !FleetNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + bool ok = false; + switch ( type_id ) + { + case 0x758252d2d1b14f0dull: ok = ShipConfigLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(ShipConfig *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // ShipConfig + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// FleetLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool FleetLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Fleet * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !FleetMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = FleetNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + FleetNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !FleetMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Fleet ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x0a53e00afba279afull; + Fleet * root = new ( region + used ) Fleet; // lifetime only: LoadMessageBody's first act is FleetReset + FleetReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Fleet ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !FleetNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return FleetLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// FleetLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool FleetLoadRetainMessages( const Fleet ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !FleetLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // FleetMeasureRetain and FleetSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/maps/RowsTable.h b/testdata/golden/tables/maps/RowsTable.h index e3c970741..b65043c58 100644 --- a/testdata/golden/tables/maps/RowsTable.h +++ b/testdata/golden/tables/maps/RowsTable.h @@ -4388,6 +4388,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace mapdemo #endif // MAPDEMO_SCHEMA_TABLE_RETAIN @@ -6752,27 +7184,34 @@ inline EdgeRowIdsEntryKeyRead EdgeRowIdsEntryReadKey( const uint8_t * body, int6 inline int64_t RowEntriesEntryMeasureBodyRetain( TableRetainIds & ids, const RowEntriesEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool RowEntriesEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const RowEntriesEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool RowEntriesEntryLoadBodyRetain( TableReader & r, RowEntriesEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool RowEntriesEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, RowEntriesEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t RowMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Row & value, TableRetain * retain, const TableRetainPath & path ); template inline bool RowSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Row & value, TableRetain * retain, const TableRetainPath & path ); template inline bool RowSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Row & value, TableRetain * retain, const TableRetainPath & path ); inline bool RowLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Row & value, TableRetain * retain, const TableRetainPath & path ); +inline bool RowLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Row & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t WideRowEntriesEntryMeasureBodyRetain( TableRetainIds & ids, const WideRowEntriesEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool WideRowEntriesEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const WideRowEntriesEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool WideRowEntriesEntryLoadBodyRetain( TableReader & r, WideRowEntriesEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool WideRowEntriesEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, WideRowEntriesEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t WideRowMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const WideRow & value, TableRetain * retain, const TableRetainPath & path ); template inline bool WideRowSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const WideRow & value, TableRetain * retain, const TableRetainPath & path ); template inline bool WideRowSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const WideRow & value, TableRetain * retain, const TableRetainPath & path ); inline bool WideRowLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, WideRow & value, TableRetain * retain, const TableRetainPath & path ); +inline bool WideRowLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, WideRow & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t EdgeRowNamesEntryMeasureBodyRetain( TableRetainIds & ids, const EdgeRowNamesEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool EdgeRowNamesEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const EdgeRowNamesEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool EdgeRowNamesEntryLoadBodyRetain( TableReader & r, EdgeRowNamesEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool EdgeRowNamesEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, EdgeRowNamesEntry & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t EdgeRowIdsEntryMeasureBodyRetain( TableRetainIds & ids, const EdgeRowIdsEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool EdgeRowIdsEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const EdgeRowIdsEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool EdgeRowIdsEntryLoadBodyRetain( TableReader & r, EdgeRowIdsEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool EdgeRowIdsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, EdgeRowIdsEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t EdgeRowMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const EdgeRow & value, TableRetain * retain, const TableRetainPath & path ); template inline bool EdgeRowSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const EdgeRow & value, TableRetain * retain, const TableRetainPath & path ); template inline bool EdgeRowSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const EdgeRow & value, TableRetain * retain, const TableRetainPath & path ); inline bool EdgeRowLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, EdgeRow & value, TableRetain * retain, const TableRetainPath & path ); +inline bool EdgeRowLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, EdgeRow & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t RowEntriesEntryMeasureBody( TableIds & ids, const RowEntriesEntry & value ) { @@ -13011,6 +13450,88 @@ MAPDEMO_TABLE_INLINE bool RowEntriesEntryLoadBodyRetain( TableReader & r, RowEnt } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool RowEntriesEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, RowEntriesEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + RowEntriesEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 8 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.key, text, (size_t) kept ); + value.key[kept] = 0; + r.offset += (int64_t) n * 8; + value.key_length = kept; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 1 ); + if ( !ItemLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t RowMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Row & value, TableRetain * retain, const TableRetainPath & path ) { @@ -13247,15 +13768,173 @@ inline bool RowLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Row } } -inline int64_t WideRowEntriesEntryMeasureBodyRetain( TableRetainIds & ids, const WideRowEntriesEntry & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool RowLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Row & value, TableRetain * retain, const TableRetainPath & path ) { - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.key != 0 ) { bytes += TableLebBytes( ids.ref( 0x3dc94a19365b10ecull ) ) + 1 + 4; } // key + (void) nodes; (void) index_bits; + RowReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - const int32_t mark_value = ids.count; - const uint64_t ref_value = ids.ref( 0x7ce4fd9430e80ceaull ); - const int64_t body_value = ItemMeasureBodyRetain( ids, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ); - if ( body_value < 0 ) { return -1; } + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xc5b2a72c0845a253ull: // entries + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.entries, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + const char * last_key = NULL; int32_t last_length = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const RowEntriesEntryMessageKeyRead read = RowEntriesEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( last_key, last_length, read.key, read.length ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + RowEntriesEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !RowEntriesEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; last_length = read.length; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +inline int64_t WideRowEntriesEntryMeasureBodyRetain( TableRetainIds & ids, const WideRowEntriesEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.key != 0 ) { bytes += TableLebBytes( ids.ref( 0x3dc94a19365b10ecull ) ) + 1 + 4; } // key + { + const int32_t mark_value = ids.count; + const uint64_t ref_value = ids.ref( 0x7ce4fd9430e80ceaull ); + const int64_t body_value = ItemMeasureBodyRetain( ids, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ); + if ( body_value < 0 ) { return -1; } if ( body_value > 1 ) { bytes += TableLebBytes( ref_value ) + 1 + TableLebBytes( (uint64_t) ( body_value ) ) + ( body_value ); } // value else { ids.truncate( mark_value ); } // an all-default nested table elides, and costs no entry } @@ -13378,6 +14057,101 @@ MAPDEMO_TABLE_INLINE bool WideRowEntriesEntryLoadBodyRetain( TableReader & r, Wi } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool WideRowEntriesEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, WideRowEntriesEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + WideRowEntriesEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 8 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 8 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.key = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 1 ); + if ( !ItemLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t WideRowMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const WideRow & value, TableRetain * retain, const TableRetainPath & path ) { @@ -13614,26 +14388,184 @@ inline bool WideRowLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, } } -inline int64_t EdgeRowNamesEntryMeasureBodyRetain( TableRetainIds & ids, const EdgeRowNamesEntry & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool WideRowLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, WideRow & value, TableRetain * retain, const TableRetainPath & path ) { - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.key_length < 0 || value.key_length > 300 ) { return -1; } // storage invariant - if ( value.key_length > 0 ) { bytes += TableLebBytes( ids.ref( 0x3dc94a19365b10ecull ) ) + 1 + TableLebBytes( (uint64_t) ( value.key_length ) ) + ( value.key_length ); } // key + (void) nodes; (void) index_bits; + WideRowReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - const int32_t mark_value = ids.count; - const uint64_t ref_value = ids.ref( 0x7ce4fd9430e80ceaull ); - const int64_t body_value = ItemMeasureBodyRetain( ids, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ); - if ( body_value < 0 ) { return -1; } - if ( body_value > 1 ) { bytes += TableLebBytes( ref_value ) + 1 + TableLebBytes( (uint64_t) ( body_value ) ) + ( body_value ); } // value - else { ids.truncate( mark_value ); } // an all-default nested table elides, and costs no entry - } - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -MAPDEMO_TABLE_INLINE bool EdgeRowNamesEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const EdgeRowNamesEntry & value, TableRetain * retain, const TableRetainPath & path ) -{ - if ( value.key_length < 0 || value.key_length > 300 ) { return false; } // storage invariant + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xc5b2a72c0845a253ull: // entries + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.entries, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + uint32_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const WideRowEntriesEntryMessageKeyRead read = WideRowEntriesEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (uint64_t) last_key, (uint64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + WideRowEntriesEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !WideRowEntriesEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +inline int64_t EdgeRowNamesEntryMeasureBodyRetain( TableRetainIds & ids, const EdgeRowNamesEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.key_length < 0 || value.key_length > 300 ) { return -1; } // storage invariant + if ( value.key_length > 0 ) { bytes += TableLebBytes( ids.ref( 0x3dc94a19365b10ecull ) ) + 1 + TableLebBytes( (uint64_t) ( value.key_length ) ) + ( value.key_length ); } // key + { + const int32_t mark_value = ids.count; + const uint64_t ref_value = ids.ref( 0x7ce4fd9430e80ceaull ); + const int64_t body_value = ItemMeasureBodyRetain( ids, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ); + if ( body_value < 0 ) { return -1; } + if ( body_value > 1 ) { bytes += TableLebBytes( ref_value ) + 1 + TableLebBytes( (uint64_t) ( body_value ) ) + ( body_value ); } // value + else { ids.truncate( mark_value ); } // an all-default nested table elides, and costs no entry + } + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +MAPDEMO_TABLE_INLINE bool EdgeRowNamesEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const EdgeRowNamesEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( value.key_length < 0 || value.key_length > 300 ) { return false; } // storage invariant if ( value.key_length > 0 ) { w.putleb( ids.ref( 0x3dc94a19365b10ecull ) ); w.put8( 12 ); // key @@ -13745,6 +14677,88 @@ MAPDEMO_TABLE_INLINE bool EdgeRowNamesEntryLoadBodyRetain( TableReader & r, Edge } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool EdgeRowNamesEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, EdgeRowNamesEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + EdgeRowNamesEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 300 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.key, text, (size_t) kept ); + value.key[kept] = 0; + r.offset += (int64_t) n * 8; + value.key_length = kept; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 1 ); + if ( !ItemLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + inline int64_t EdgeRowIdsEntryMeasureBodyRetain( TableRetainIds & ids, const EdgeRowIdsEntry & value, TableRetain * retain, const TableRetainPath & path ) { int64_t bytes = 1; // the ZERO REFERENCE that ends the body @@ -13876,19 +14890,112 @@ MAPDEMO_TABLE_INLINE bool EdgeRowIdsEntryLoadBodyRetain( TableReader & r, EdgeRo } } -template -inline int64_t EdgeRowMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const EdgeRow & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool EdgeRowIdsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, EdgeRowIdsEntry & value, TableRetain * retain, const TableRetainPath & path ) { - (void) ctx; (void) numbering; - int64_t bytes = 1; // the ZERO REFERENCE that ends the body + EdgeRowIdsEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - // names: a kind 14 array of kind 13 elements, ASCENDING (§2.8) - TableMapCursor order_names = TableMapOrder( ctx, value.names ); - if ( !order_names.ok ) { return -1; } // the sort could not run - if ( order_names.count > 0 ) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - const uint64_t ref_names = ids.ref( 0xafb728fff268814full ); - int64_t body_names = 1 + TableLebBytes( (uint64_t) order_names.count ); // the element kind byte and the count + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 9 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 9 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + uint64_t decoded_v = (uint64_t) decoded_wide; + value.key = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + uint64_t decoded_v = (uint64_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 1 ); + if ( !ItemLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.value, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t EdgeRowMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const EdgeRow & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) ctx; (void) numbering; + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { + // names: a kind 14 array of kind 13 elements, ASCENDING (§2.8) + TableMapCursor order_names = TableMapOrder( ctx, value.names ); + if ( !order_names.ok ) { return -1; } // the sort could not run + if ( order_names.count > 0 ) + { + const uint64_t ref_names = ids.ref( 0xafb728fff268814full ); + int64_t body_names = 1 + TableLebBytes( (uint64_t) order_names.count ); // the element kind byte and the count for ( int32_t i = 0; i < order_names.count; i++ ) { const int64_t elem_names = EdgeRowNamesEntryMeasureBodyRetain( ids, *order_names[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); @@ -14245,177 +15352,576 @@ inline bool EdgeRowLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, } } -// RowNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it -// already owns. -// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the -// index is the region directory's, which Load fills from the wire's framing -// and nothing afterwards renumbers. -inline void RowNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) -{ - // the node's own EXTENT, where its lists' and maps' arrays are carved - // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). - // The tool's path carries a worker instead: there the arrays are the - // arena's. - TableExtentCarve carve; - carve.worker = nodes.worker; - if ( carve.worker == NULL ) - { - TableRefuseReason reason = count_over_length; // pass one already refused what this could refuse - const int64_t storage = RowNodeStorage( type_id, r.size, reason ); - const int64_t record = storage > 0 ? RowNodeRecordBytes( type_id ) : 0; - carve.at = at + record; - carve.left = storage > record ? storage - record : 0; - } - nodes.carve = &carve; - (void) nodes; // every node this root can name is a FIXED table - (void) retain; (void) node; - switch ( type_id ) - { - default: break; - } - nodes.carve = NULL; // the cursor is ONE node's, and this node's body is done -} - -// RowLoadRetain: decode the tolerant wire into the caller's exact-sized region and -// return the root. LOAD IS A SCAN, and that is the whole of its bound: it -// follows no reference, so there is no depth cap, no visited set and no -// ordering rule on the indices. Partial results are kept, as everywhere on -// this wire — the report says what happened. NULL means the CALLER's buffer -// was wrong. -// UNDER RETENTION it also fills the caller's two stores with the fields -// this build cannot name, and the report carries what it could not keep -// (docs/SPEC-TABLES.md §6.6). It is Load's own path and nothing else: the -// reader's data is exactly what it would have been with retention off. -inline const Row * RowLoadRetain( uint8_t * region, int64_t region_bytes, const uint8_t * wire_file, int64_t wire_file_bytes, TableRetain * retain, TableReport * report ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool EdgeRowLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, EdgeRow & value, TableRetain * retain, const TableRetainPath & path ) { - TableReport ignored; - TableReport * out = report != NULL ? report : &ignored; - // THE FORM BYTE IS READ FIRST, then the trailer, and only then a body: - // a file that is both a newer form and damaged is a REFUSAL and never - // damage (docs/SPEC-TABLES.md §3). - TableIdTable ids_table; - int64_t body_bytes = 0; - const TableOpenVerdict verdict = TableOpen( wire_file, wire_file_bytes, ids_table, body_bytes ); - if ( verdict != TableOpenOk ) - { - if ( verdict == TableOpenDamaged ) { out->malformed = true; } else { out->refused = true; if ( wire_file_bytes > 0 && wire_file[0] == kTableWireMessageForm ) { out->reason = message_form_as_file; } else { out->reason = newer_form; } } - return NULL; - } - if ( TableBodyEndsEarly( wire_file + 1, body_bytes, ids_table ) ) - { - out->malformed = true; // a byte no field claims, before the table (§3) - return NULL; - } - const uint8_t * const wire = wire_file + 1; - const int64_t wire_bytes = body_bytes; - if ( region == NULL || region_bytes < (int64_t) sizeof( Row ) ) { out->malformed = true; return NULL; } - if ( ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return NULL; } - memset( region, 0, (size_t) region_bytes ); - uint64_t type_id = 0; - const uint8_t * body = NULL; - int64_t length = 0; - - // the record count and the data bytes, from the FRAMING alone - TableRefuseReason reason = count_over_length; // LoadMeasure is where a caller reads it; a Load past a refusal is malformed - int64_t root_extent = 0; - if ( !RowWireExtent( wire, wire_bytes, root_extent, &ids_table, reason ) ) { out->malformed = true; return NULL; } - int64_t data = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Row ) ) + root_extent ); - int64_t records = 0; - { - TableReport counting; - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, &counting, &ids_table ); - while ( TableNodeScanNext( scan, type_id, body, length ) ) - { - records++; - int64_t storage = RowNodeStorage( type_id, length, reason ); - if ( storage == kTableNodeRefused ) { out->malformed = true; return NULL; } - if ( storage > 0 ) { data += storage; } - } - } - int64_t attribution = ( records + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); - if ( data + attribution > region_bytes ) { out->malformed = true; return NULL; } - - TableNodeMap nodes; - nodes.base = region; - nodes.entries = (const TableNodeDirEntry *) ( region + data ); - nodes.count = records + 1; - TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + data ); - directory[0].offset = 0; // position 0 is the ROOT, at offset 0 (§6.3) - directory[0].type_id = 0xa013e119fec906fbull; - Row * root = new ( region ) Row; // lifetime only: LoadBody's first act is RowReset - RowReset( *root ); - - // LoadRetain RESETS BOTH STORES and writes into neither id list: a - // retained record carries its field's identity in the record itself, - // with every reference resolved (docs/SPEC-TABLES.md §6.6). The buffer - // belongs to this region from here on. - TableRetainReset( retain, nodes, region ); - - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. - { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Row ) ) + root_extent ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) - { - int64_t storage = RowNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) - { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; - directory[k + 1].type_id = type_id; - } - else - { - directory[k + 1].offset = (uint64_t) used; - directory[k + 1].type_id = type_id; - RowNodePlace( type_id, region + used, length ); - used += storage; - } - k++; - } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } - } - - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) + (void) nodes; (void) index_bits; + EdgeRowReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) + case 0xafb728fff268814full: // names { - TableReader sub( body, length, out, &ids_table ); - RowNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; - } - } - - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.names, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + const char * last_key = NULL; int32_t last_length = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const EdgeRowNamesEntryMessageKeyRead read = EdgeRowNamesEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( last_key, last_length, read.key, read.length ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + EdgeRowNamesEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !EdgeRowNamesEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; last_length = read.length; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0x2b7dea192bb7be29ull: // ids + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 1 ); + TableMapFill fill = TableMapFillBegin( nodes, value.ids, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + uint64_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const EdgeRowIdsEntryMessageKeyRead read = EdgeRowIdsEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (uint64_t) last_key, (uint64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + EdgeRowIdsEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !EdgeRowIdsEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 1, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +// RowNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it +// already owns. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is the region directory's, which Load fills from the wire's framing +// and nothing afterwards renumbers. +inline void RowNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + // the node's own EXTENT, where its lists' and maps' arrays are carved + // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). + // The tool's path carries a worker instead: there the arrays are the + // arena's. + TableExtentCarve carve; + carve.worker = nodes.worker; + if ( carve.worker == NULL ) + { + TableRefuseReason reason = count_over_length; // pass one already refused what this could refuse + const int64_t storage = RowNodeStorage( type_id, r.size, reason ); + const int64_t record = storage > 0 ? RowNodeRecordBytes( type_id ) : 0; + carve.at = at + record; + carve.left = storage > record ? storage - record : 0; + } + nodes.carve = &carve; + (void) nodes; // every node this root can name is a FIXED table + (void) retain; (void) node; + switch ( type_id ) + { + default: break; + } + nodes.carve = NULL; // the cursor is ONE node's, and this node's body is done +} + +// RowLoadRetain: decode the tolerant wire into the caller's exact-sized region and +// return the root. LOAD IS A SCAN, and that is the whole of its bound: it +// follows no reference, so there is no depth cap, no visited set and no +// ordering rule on the indices. Partial results are kept, as everywhere on +// this wire — the report says what happened. NULL means the CALLER's buffer +// was wrong. +// UNDER RETENTION it also fills the caller's two stores with the fields +// this build cannot name, and the report carries what it could not keep +// (docs/SPEC-TABLES.md §6.6). It is Load's own path and nothing else: the +// reader's data is exactly what it would have been with retention off. +inline const Row * RowLoadRetain( uint8_t * region, int64_t region_bytes, const uint8_t * wire_file, int64_t wire_file_bytes, TableRetain * retain, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + // THE FORM BYTE IS READ FIRST, then the trailer, and only then a body: + // a file that is both a newer form and damaged is a REFUSAL and never + // damage (docs/SPEC-TABLES.md §3). + TableIdTable ids_table; + int64_t body_bytes = 0; + const TableOpenVerdict verdict = TableOpen( wire_file, wire_file_bytes, ids_table, body_bytes ); + if ( verdict != TableOpenOk ) + { + if ( verdict == TableOpenDamaged ) { out->malformed = true; } else { out->refused = true; if ( wire_file_bytes > 0 && wire_file[0] == kTableWireMessageForm ) { out->reason = message_form_as_file; } else { out->reason = newer_form; } } + return NULL; + } + if ( TableBodyEndsEarly( wire_file + 1, body_bytes, ids_table ) ) + { + out->malformed = true; // a byte no field claims, before the table (§3) + return NULL; + } + const uint8_t * const wire = wire_file + 1; + const int64_t wire_bytes = body_bytes; + if ( region == NULL || region_bytes < (int64_t) sizeof( Row ) ) { out->malformed = true; return NULL; } + if ( ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return NULL; } + memset( region, 0, (size_t) region_bytes ); + uint64_t type_id = 0; + const uint8_t * body = NULL; + int64_t length = 0; + + // the record count and the data bytes, from the FRAMING alone + TableRefuseReason reason = count_over_length; // LoadMeasure is where a caller reads it; a Load past a refusal is malformed + int64_t root_extent = 0; + if ( !RowWireExtent( wire, wire_bytes, root_extent, &ids_table, reason ) ) { out->malformed = true; return NULL; } + int64_t data = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Row ) ) + root_extent ); + int64_t records = 0; + { + TableReport counting; + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, &counting, &ids_table ); + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + records++; + int64_t storage = RowNodeStorage( type_id, length, reason ); + if ( storage == kTableNodeRefused ) { out->malformed = true; return NULL; } + if ( storage > 0 ) { data += storage; } + } + } + int64_t attribution = ( records + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( data + attribution > region_bytes ) { out->malformed = true; return NULL; } + + TableNodeMap nodes; + nodes.base = region; + nodes.entries = (const TableNodeDirEntry *) ( region + data ); + nodes.count = records + 1; + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + data ); + directory[0].offset = 0; // position 0 is the ROOT, at offset 0 (§6.3) + directory[0].type_id = 0xa013e119fec906fbull; + Row * root = new ( region ) Row; // lifetime only: LoadBody's first act is RowReset + RowReset( *root ); + + // LoadRetain RESETS BOTH STORES and writes into neither id list: a + // retained record carries its field's identity in the record itself, + // with every reference resolved (docs/SPEC-TABLES.md §6.6). The buffer + // belongs to this region from here on. + TableRetainReset( retain, nodes, region ); + + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Row ) ) + root_extent ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = RowNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + directory[k + 1].type_id = type_id; + } + else + { + directory[k + 1].offset = (uint64_t) used; + directory[k + 1].type_id = type_id; + RowNodePlace( type_id, region + used, length ); + used += storage; + } + k++; + } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + RowNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; root_carve.at = region + TableAlignUp64( (int64_t) sizeof( Row ) ); root_carve.left = root_extent; nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - RowLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + RowLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// RowNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool RowNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + RowNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !RowNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// RowLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool RowLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Row * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !RowMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = RowNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + RowNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !RowMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Row ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xa013e119fec906fbull; + Row * root = new ( region + used ) Row; // lifetime only: LoadMessageBody's first act is RowReset + RowReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Row ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !RowNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return RowLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// RowLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool RowLoadRetainMessages( const Row ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !RowLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // RowMeasureRetain and RowSaveRetain: the pair, with the retained tail in @@ -14639,71 +16145,247 @@ inline const WideRow * WideRowLoadRetain( uint8_t * region, int64_t region_bytes // belongs to this region from here on. TableRetainReset( retain, nodes, region ); - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( WideRow ) ) + root_extent ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = WideRowNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + directory[k + 1].type_id = type_id; + } + else + { + directory[k + 1].offset = (uint64_t) used; + directory[k + 1].type_id = type_id; + WideRowNodePlace( type_id, region + used, length ); + used += storage; + } + k++; + } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) + { + TableReader sub( body, length, out, &ids_table ); + WideRowNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); + } + k++; + } + } + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TableExtentCarve root_carve; + root_carve.at = region + TableAlignUp64( (int64_t) sizeof( WideRow ) ); + root_carve.left = root_extent; + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + WideRowLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// WideRowNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool WideRowNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + WideRowNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !WideRowNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// WideRowLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool WideRowLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const WideRow * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !WideRowMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = WideRowNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + WideRowNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !WideRowMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( WideRow ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xb413964e3571a316ull; + WideRow * root = new ( region + used ) WideRow; // lifetime only: LoadMessageBody's first act is WideRowReset + WideRowReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( WideRow ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( WideRow ) ) + root_extent ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) { - int64_t storage = WideRowNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) - { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; - directory[k + 1].type_id = type_id; - } - else - { - directory[k + 1].offset = (uint64_t) used; - directory[k + 1].type_id = type_id; - WideRowNodePlace( type_id, region + used, length ); - used += storage; - } - k++; + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } - } - - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) - { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) + if ( directory[k + 1].offset == kTableNodeAbsent ) { - if ( directory[k + 1].offset != kTableNodeAbsent ) - { - TableReader sub( body, length, out, &ids_table ); - WideRowNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); - } - k++; + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; } + if ( !WideRowNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TableExtentCarve root_carve; - root_carve.at = region + TableAlignUp64( (int64_t) sizeof( WideRow ) ); - root_carve.left = root_extent; + // and the ROOT's own body last nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's - WideRowLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + return WideRowLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// WideRowLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool WideRowLoadRetainMessages( const WideRow ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !WideRowLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // WideRowMeasureRetain and WideRowSaveRetain: the pair, with the retained tail in @@ -14994,6 +16676,182 @@ inline const EdgeRow * EdgeRowLoadRetain( uint8_t * region, int64_t region_bytes return root; } +// EdgeRowNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool EdgeRowNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + EdgeRowNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !EdgeRowNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// EdgeRowLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool EdgeRowLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const EdgeRow * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !EdgeRowMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = EdgeRowNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + EdgeRowNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !EdgeRowMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( EdgeRow ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xe8130af045a036f8ull; + EdgeRow * root = new ( region + used ) EdgeRow; // lifetime only: LoadMessageBody's first act is EdgeRowReset + EdgeRowReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( EdgeRow ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !EdgeRowNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return EdgeRowLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// EdgeRowLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool EdgeRowLoadRetainMessages( const EdgeRow ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !EdgeRowLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // EdgeRowMeasureRetain and EdgeRowSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/maps/RunsTable.h b/testdata/golden/tables/maps/RunsTable.h index 2eb12b0c3..bc5d76e86 100644 --- a/testdata/golden/tables/maps/RunsTable.h +++ b/testdata/golden/tables/maps/RunsTable.h @@ -3753,6 +3753,16 @@ inline int64_t TableRetainInContent( TableRetainIn & s, uint8_t kind, int64_t le } break; } + case 15: case 30: + // A UNION ARM AND AN ENUM'S VARIANT REFERENCE RESOLVE AS A FRAMED + // CONTENT TOO (§6.6): a kind 15 arm whose own payload is a union, + // and a kind 16 slot whose element kind is 15 or 30, both arrive + // here, and both carry a reference. Copying them as bytes would + // re-emit a reference into a permuted trailer, where it names + // another id, and would let a kind 17 UNDER A KIND 15 ARM through + // a walk whose whole job is to catch it. + if ( TableRetainInPayload( s, kind, depth ) < 0 ) { return -1; } + break; case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) default: // every other content is bytes: a string, wide text, an escape, a @@ -4129,6 +4139,11 @@ inline bool TableRetainOutContent( TableRetainOut & s, uint8_t kind, int64_t len } break; } + case 15: case 30: + // the emit side of the capture's own rule (§6.6): an arm and a + // variant reference resolve as a framed content too + if ( !TableRetainOutPayload( s, kind, depth ) ) { return false; } + break; default: TableRetainOutRaw( s, s.in + s.at, length ); s.at += length; @@ -4373,6 +4388,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace mapdemo #endif // MAPDEMO_SCHEMA_TABLE_RETAIN @@ -6206,10 +6653,12 @@ inline RunsSpansEntryKeyRead RunsSpansEntryReadKey( const uint8_t * body, int64_ inline int64_t RunsSpansEntryMeasureBodyRetain( TableRetainIds & ids, const RunsSpansEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool RunsSpansEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const RunsSpansEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool RunsSpansEntryLoadBodyRetain( TableReader & r, RunsSpansEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool RunsSpansEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, RunsSpansEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t RunsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Runs & value, TableRetain * retain, const TableRetainPath & path ); template inline bool RunsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Runs & value, TableRetain * retain, const TableRetainPath & path ); template inline bool RunsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Runs & value, TableRetain * retain, const TableRetainPath & path ); inline bool RunsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Runs & value, TableRetain * retain, const TableRetainPath & path ); +inline bool RunsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Runs & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t RunsSpansEntryMeasureBody( TableIds & ids, const RunsSpansEntry & value ) { @@ -8298,88 +8747,203 @@ MAPDEMO_TABLE_INLINE bool RunsSpansEntryLoadBodyRetain( TableReader & r, RunsSpa } } -template -inline int64_t RunsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Runs & value, TableRetain * retain, const TableRetainPath & path ) -{ - (void) ctx; (void) numbering; - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - { - // spans: a kind 14 array of kind 13 elements, ASCENDING (§2.8) - TableMapCursor order_spans = TableMapOrder( ctx, value.spans ); - if ( !order_spans.ok ) { return -1; } // the sort could not run - if ( order_spans.count > 0 ) - { - const uint64_t ref_spans = ids.ref( 0x437dfc8ab2566816ull ); - int64_t body_spans = 1 + TableLebBytes( (uint64_t) order_spans.count ); // the element kind byte and the count - for ( int32_t i = 0; i < order_spans.count; i++ ) - { - const int64_t elem_spans = RunsSpansEntryMeasureBodyRetain( ids, *order_spans[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_spans < 0 ) { TableMapRelease( order_spans ); return -1; } - body_spans += TableLebBytes( (uint64_t) ( elem_spans ) ) + ( elem_spans ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key - } - bytes += TableLebBytes( ref_spans ) + 1 + TableLebBytes( (uint64_t) ( body_spans ) ) + ( body_spans ); - } - TableMapRelease( order_spans ); - } - if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -template -inline bool RunsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Runs & value, TableRetain * retain, const TableRetainPath & path ) -{ - (void) ctx; (void) numbering; - { - TableMapCursor order_spans = TableMapOrder( ctx, value.spans ); // spans - if ( !order_spans.ok ) { return false; } - if ( order_spans.count > 0 ) // an EMPTY map elides, the by-value rule (§3) - { - const uint64_t ref_spans = ids.ref( 0x437dfc8ab2566816ull ); - int64_t body_spans = 1 + TableLebBytes( (uint64_t) order_spans.count ); - for ( int32_t i = 0; i < order_spans.count; i++ ) - { - const int64_t elem_spans = RunsSpansEntryMeasureBodyRetain( ids, *order_spans[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_spans < 0 ) { TableMapRelease( order_spans ); return false; } - body_spans += TableLebBytes( (uint64_t) ( elem_spans ) ) + ( elem_spans ); - } - w.putleb( ref_spans ); w.put8( 14 ); w.putleb( (uint64_t) body_spans ); - w.put8( 13 ); w.putleb( (uint64_t) order_spans.count ); - for ( int32_t i = 0; i < order_spans.count; i++ ) - { - const int64_t elem_len_spans = RunsSpansEntryMeasureBodyRetain( ids, *order_spans[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_len_spans < 0 ) { TableMapRelease( order_spans ); return false; } - w.putleb( (uint64_t) elem_len_spans ); - if ( !RunsSpansEntrySaveBodyRetain( w, ids, *order_spans[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { TableMapRelease( order_spans ); return false; } - } - } - TableMapRelease( order_spans ); - } - if ( value.after != 0 ) - { - w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after - w.put32( uint32_t( value.after ) ); - } - if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } - return !w.overflow; -} - -template -inline bool RunsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Runs & value, TableRetain * retain, const TableRetainPath & path ) -{ - if ( !RunsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } - w.put8( 0 ); // the ZERO REFERENCE that ends the body - return !w.overflow; -} - -inline bool RunsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Runs & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool RunsSpansEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, RunsSpansEntry & value, TableRetain * retain, const TableRetainPath & path ) { - (void) nodes; - RunsReset( value ); // prefill declared defaults in place, then overlay + RunsSpansEntryReset( value ); // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT - // (docs/SPEC-TABLES.md §6.6): this body is being established, so - // whatever an earlier occurrence of it left is discarded before the - // winning one is read. The discard moves neither counter. + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 7 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 7 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 65535ull ) { decoded_wide = (int64_t) 65535ull; report->clamped++; } + uint16_t decoded_v = (uint16_t) decoded_wide; + value.key = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 65535ull ) { decoded_wide = (int64_t) 65535ull; report->clamped++; } + uint16_t decoded_v = (uint16_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) + { + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 4 ) { kept = 4; report->clamped++; } else { kept = (int32_t) n; } + const uint64_t walk = n; + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + Item scratch; + ItemReset( scratch ); + if ( !ItemLoadMessageBodyRetain( r, vocabulary, report, index_bits, ( in_bounds ? value.value[i] : scratch ), ( in_bounds ? retain : NULL ), TableRetainStepInto( path, 1, (uint32_t) ( i ) ) ) ) { return false; } + } + value.value_count = kept; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t RunsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Runs & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) ctx; (void) numbering; + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { + // spans: a kind 14 array of kind 13 elements, ASCENDING (§2.8) + TableMapCursor order_spans = TableMapOrder( ctx, value.spans ); + if ( !order_spans.ok ) { return -1; } // the sort could not run + if ( order_spans.count > 0 ) + { + const uint64_t ref_spans = ids.ref( 0x437dfc8ab2566816ull ); + int64_t body_spans = 1 + TableLebBytes( (uint64_t) order_spans.count ); // the element kind byte and the count + for ( int32_t i = 0; i < order_spans.count; i++ ) + { + const int64_t elem_spans = RunsSpansEntryMeasureBodyRetain( ids, *order_spans[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_spans < 0 ) { TableMapRelease( order_spans ); return -1; } + body_spans += TableLebBytes( (uint64_t) ( elem_spans ) ) + ( elem_spans ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key + } + bytes += TableLebBytes( ref_spans ) + 1 + TableLebBytes( (uint64_t) ( body_spans ) ) + ( body_spans ); + } + TableMapRelease( order_spans ); + } + if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +template +inline bool RunsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Runs & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) ctx; (void) numbering; + { + TableMapCursor order_spans = TableMapOrder( ctx, value.spans ); // spans + if ( !order_spans.ok ) { return false; } + if ( order_spans.count > 0 ) // an EMPTY map elides, the by-value rule (§3) + { + const uint64_t ref_spans = ids.ref( 0x437dfc8ab2566816ull ); + int64_t body_spans = 1 + TableLebBytes( (uint64_t) order_spans.count ); + for ( int32_t i = 0; i < order_spans.count; i++ ) + { + const int64_t elem_spans = RunsSpansEntryMeasureBodyRetain( ids, *order_spans[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_spans < 0 ) { TableMapRelease( order_spans ); return false; } + body_spans += TableLebBytes( (uint64_t) ( elem_spans ) ) + ( elem_spans ); + } + w.putleb( ref_spans ); w.put8( 14 ); w.putleb( (uint64_t) body_spans ); + w.put8( 13 ); w.putleb( (uint64_t) order_spans.count ); + for ( int32_t i = 0; i < order_spans.count; i++ ) + { + const int64_t elem_len_spans = RunsSpansEntryMeasureBodyRetain( ids, *order_spans[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_len_spans < 0 ) { TableMapRelease( order_spans ); return false; } + w.putleb( (uint64_t) elem_len_spans ); + if ( !RunsSpansEntrySaveBodyRetain( w, ids, *order_spans[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { TableMapRelease( order_spans ); return false; } + } + } + TableMapRelease( order_spans ); + } + if ( value.after != 0 ) + { + w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after + w.put32( uint32_t( value.after ) ); + } + if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } + return !w.overflow; +} + +template +inline bool RunsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Runs & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( !RunsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } + w.put8( 0 ); // the ZERO REFERENCE that ends the body + return !w.overflow; +} + +inline bool RunsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Runs & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; + RunsReset( value ); // prefill declared defaults in place, then overlay + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so + // whatever an earlier occurrence of it left is discarded before the + // winning one is read. The discard moves neither counter. TableRetainDiscardBody( retain, path ); for ( ;; ) { @@ -8534,6 +9098,164 @@ inline bool RunsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Run } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool RunsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Runs & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + RunsReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x437dfc8ab2566816ull: // spans + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.spans, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + uint16_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const RunsSpansEntryMessageKeyRead read = RunsSpansEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (uint64_t) last_key, (uint64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + RunsSpansEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !RunsSpansEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + // RunsNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it // already owns. // EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the @@ -8707,6 +9429,182 @@ inline const Runs * RunsLoadRetain( uint8_t * region, int64_t region_bytes, cons return root; } +// RunsNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool RunsNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + RunsNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !RunsNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// RunsLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool RunsLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Runs * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !RunsMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = RunsNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + RunsNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !RunsMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Runs ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xea7bdd2b70c8c2bbull; + Runs * root = new ( region + used ) Runs; // lifetime only: LoadMessageBody's first act is RunsReset + RunsReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Runs ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !RunsNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return RunsLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// RunsLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool RunsLoadRetainMessages( const Runs ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !RunsLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // RunsMeasureRetain and RunsSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/maps/SlotsTable.h b/testdata/golden/tables/maps/SlotsTable.h index c2c0bed59..92cb149c7 100644 --- a/testdata/golden/tables/maps/SlotsTable.h +++ b/testdata/golden/tables/maps/SlotsTable.h @@ -3753,6 +3753,16 @@ inline int64_t TableRetainInContent( TableRetainIn & s, uint8_t kind, int64_t le } break; } + case 15: case 30: + // A UNION ARM AND AN ENUM'S VARIANT REFERENCE RESOLVE AS A FRAMED + // CONTENT TOO (§6.6): a kind 15 arm whose own payload is a union, + // and a kind 16 slot whose element kind is 15 or 30, both arrive + // here, and both carry a reference. Copying them as bytes would + // re-emit a reference into a permuted trailer, where it names + // another id, and would let a kind 17 UNDER A KIND 15 ARM through + // a walk whose whole job is to catch it. + if ( TableRetainInPayload( s, kind, depth ) < 0 ) { return -1; } + break; case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) default: // every other content is bytes: a string, wide text, an escape, a @@ -4129,6 +4139,11 @@ inline bool TableRetainOutContent( TableRetainOut & s, uint8_t kind, int64_t len } break; } + case 15: case 30: + // the emit side of the capture's own rule (§6.6): an arm and a + // variant reference resolve as a framed content too + if ( !TableRetainOutPayload( s, kind, depth ) ) { return false; } + break; default: TableRetainOutRaw( s, s.in + s.at, length ); s.at += length; @@ -4373,6 +4388,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace mapdemo #endif // MAPDEMO_SCHEMA_TABLE_RETAIN @@ -6271,10 +6718,12 @@ inline SlotsSeatsEntryKeyRead SlotsSeatsEntryReadKey( const uint8_t * body, int6 inline int64_t SlotsSeatsEntryMeasureBodyRetain( TableRetainIds & ids, const SlotsSeatsEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool SlotsSeatsEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const SlotsSeatsEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool SlotsSeatsEntryLoadBodyRetain( TableReader & r, SlotsSeatsEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool SlotsSeatsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, SlotsSeatsEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t SlotsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Slots & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SlotsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Slots & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SlotsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Slots & value, TableRetain * retain, const TableRetainPath & path ); inline bool SlotsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Slots & value, TableRetain * retain, const TableRetainPath & path ); +inline bool SlotsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Slots & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t SlotsSeatsEntryMeasureBody( TableIds & ids, const SlotsSeatsEntry & value ) { @@ -8524,88 +8973,227 @@ MAPDEMO_TABLE_INLINE bool SlotsSeatsEntryLoadBodyRetain( TableReader & r, SlotsS } } -template -inline int64_t SlotsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Slots & value, TableRetain * retain, const TableRetainPath & path ) -{ - (void) ctx; (void) numbering; - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - { - // seats: a kind 14 array of kind 13 elements, ASCENDING (§2.8) - TableMapCursor order_seats = TableMapOrder( ctx, value.seats ); - if ( !order_seats.ok ) { return -1; } // the sort could not run - if ( order_seats.count > 0 ) - { - const uint64_t ref_seats = ids.ref( 0x7f6548303072b061ull ); - int64_t body_seats = 1 + TableLebBytes( (uint64_t) order_seats.count ); // the element kind byte and the count - for ( int32_t i = 0; i < order_seats.count; i++ ) - { - const int64_t elem_seats = SlotsSeatsEntryMeasureBodyRetain( ids, *order_seats[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_seats < 0 ) { TableMapRelease( order_seats ); return -1; } - body_seats += TableLebBytes( (uint64_t) ( elem_seats ) ) + ( elem_seats ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key - } - bytes += TableLebBytes( ref_seats ) + 1 + TableLebBytes( (uint64_t) ( body_seats ) ) + ( body_seats ); - } - TableMapRelease( order_seats ); - } - if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -template -inline bool SlotsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Slots & value, TableRetain * retain, const TableRetainPath & path ) -{ - (void) ctx; (void) numbering; - { - TableMapCursor order_seats = TableMapOrder( ctx, value.seats ); // seats - if ( !order_seats.ok ) { return false; } - if ( order_seats.count > 0 ) // an EMPTY map elides, the by-value rule (§3) - { - const uint64_t ref_seats = ids.ref( 0x7f6548303072b061ull ); - int64_t body_seats = 1 + TableLebBytes( (uint64_t) order_seats.count ); - for ( int32_t i = 0; i < order_seats.count; i++ ) - { - const int64_t elem_seats = SlotsSeatsEntryMeasureBodyRetain( ids, *order_seats[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_seats < 0 ) { TableMapRelease( order_seats ); return false; } - body_seats += TableLebBytes( (uint64_t) ( elem_seats ) ) + ( elem_seats ); - } - w.putleb( ref_seats ); w.put8( 14 ); w.putleb( (uint64_t) body_seats ); - w.put8( 13 ); w.putleb( (uint64_t) order_seats.count ); - for ( int32_t i = 0; i < order_seats.count; i++ ) - { - const int64_t elem_len_seats = SlotsSeatsEntryMeasureBodyRetain( ids, *order_seats[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_len_seats < 0 ) { TableMapRelease( order_seats ); return false; } - w.putleb( (uint64_t) elem_len_seats ); - if ( !SlotsSeatsEntrySaveBodyRetain( w, ids, *order_seats[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { TableMapRelease( order_seats ); return false; } - } - } - TableMapRelease( order_seats ); - } - if ( value.after != 0 ) - { - w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after - w.put32( uint32_t( value.after ) ); - } - if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } - return !w.overflow; -} - -template -inline bool SlotsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Slots & value, TableRetain * retain, const TableRetainPath & path ) -{ - if ( !SlotsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } - w.put8( 0 ); // the ZERO REFERENCE that ends the body - return !w.overflow; -} - -inline bool SlotsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Slots & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool SlotsSeatsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, SlotsSeatsEntry & value, TableRetain * retain, const TableRetainPath & path ) { - (void) nodes; - SlotsReset( value ); // prefill declared defaults in place, then overlay + SlotsSeatsEntryReset( value ); // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT - // (docs/SPEC-TABLES.md §6.6): this body is being established, so - // whatever an earlier occurrence of it left is discarded before the - // winning one is read. The discard moves neither counter. + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.key = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 16 || entry.elem_kind != 4 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) ) { report->malformed = true; return false; } + for ( uint64_t p = 0; p < n; p++ ) + { + uint64_t key_ref = 0; + if ( !r.get( key_ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry key_entry; + if ( !TableMessageNameEntry( vocabulary, key_ref, key_entry ) ) { report->malformed = true; return false; } + Slot key = Slot::None; + const bool named = TableEnumValue( key_entry.id, key ); + if ( !named ) { report->unknown++; report->retain_lost++; } + const int32_t slot = named ? (int32_t) key - 1 : -1; + const bool in_bounds = slot >= 0 && slot < 2; + int32_t scratch = 0; + { + const int64_t width_2 = entry.elem_value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( entry.elem_packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) entry.elem_base_lo ); } + else if ( width_2 > 0 && width_2 < 64 ) + { + const uint64_t sign_2 = uint64_t(1) << ( width_2 - 1 ); + if ( ( raw_2 & sign_2 ) != 0 ) { decoded_wide_2 = (int64_t) ( raw_2 | ~( ( uint64_t(1) << width_2 ) - 1 ) ); } + } + if ( decoded_wide_2 < -2147483648ll ) { decoded_wide_2 = -2147483648ll; report->clamped++; } + if ( decoded_wide_2 > 2147483647ll ) { decoded_wide_2 = 2147483647ll; report->clamped++; } + int32_t decoded_v_2 = (int32_t) decoded_wide_2; + scratch = decoded_v_2; + } + if ( in_bounds ) { value.value.slots[slot] = scratch; } + } + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t SlotsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Slots & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) ctx; (void) numbering; + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { + // seats: a kind 14 array of kind 13 elements, ASCENDING (§2.8) + TableMapCursor order_seats = TableMapOrder( ctx, value.seats ); + if ( !order_seats.ok ) { return -1; } // the sort could not run + if ( order_seats.count > 0 ) + { + const uint64_t ref_seats = ids.ref( 0x7f6548303072b061ull ); + int64_t body_seats = 1 + TableLebBytes( (uint64_t) order_seats.count ); // the element kind byte and the count + for ( int32_t i = 0; i < order_seats.count; i++ ) + { + const int64_t elem_seats = SlotsSeatsEntryMeasureBodyRetain( ids, *order_seats[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_seats < 0 ) { TableMapRelease( order_seats ); return -1; } + body_seats += TableLebBytes( (uint64_t) ( elem_seats ) ) + ( elem_seats ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key + } + bytes += TableLebBytes( ref_seats ) + 1 + TableLebBytes( (uint64_t) ( body_seats ) ) + ( body_seats ); + } + TableMapRelease( order_seats ); + } + if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +template +inline bool SlotsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Slots & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) ctx; (void) numbering; + { + TableMapCursor order_seats = TableMapOrder( ctx, value.seats ); // seats + if ( !order_seats.ok ) { return false; } + if ( order_seats.count > 0 ) // an EMPTY map elides, the by-value rule (§3) + { + const uint64_t ref_seats = ids.ref( 0x7f6548303072b061ull ); + int64_t body_seats = 1 + TableLebBytes( (uint64_t) order_seats.count ); + for ( int32_t i = 0; i < order_seats.count; i++ ) + { + const int64_t elem_seats = SlotsSeatsEntryMeasureBodyRetain( ids, *order_seats[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_seats < 0 ) { TableMapRelease( order_seats ); return false; } + body_seats += TableLebBytes( (uint64_t) ( elem_seats ) ) + ( elem_seats ); + } + w.putleb( ref_seats ); w.put8( 14 ); w.putleb( (uint64_t) body_seats ); + w.put8( 13 ); w.putleb( (uint64_t) order_seats.count ); + for ( int32_t i = 0; i < order_seats.count; i++ ) + { + const int64_t elem_len_seats = SlotsSeatsEntryMeasureBodyRetain( ids, *order_seats[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_len_seats < 0 ) { TableMapRelease( order_seats ); return false; } + w.putleb( (uint64_t) elem_len_seats ); + if ( !SlotsSeatsEntrySaveBodyRetain( w, ids, *order_seats[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { TableMapRelease( order_seats ); return false; } + } + } + TableMapRelease( order_seats ); + } + if ( value.after != 0 ) + { + w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after + w.put32( uint32_t( value.after ) ); + } + if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } + return !w.overflow; +} + +template +inline bool SlotsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Slots & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( !SlotsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } + w.put8( 0 ); // the ZERO REFERENCE that ends the body + return !w.overflow; +} + +inline bool SlotsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Slots & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; + SlotsReset( value ); // prefill declared defaults in place, then overlay + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so + // whatever an earlier occurrence of it left is discarded before the + // winning one is read. The discard moves neither counter. TableRetainDiscardBody( retain, path ); for ( ;; ) { @@ -8760,6 +9348,164 @@ inline bool SlotsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Sl } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool SlotsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Slots & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + SlotsReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x7f6548303072b061ull: // seats + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.seats, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + int32_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const SlotsSeatsEntryMessageKeyRead read = SlotsSeatsEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (int64_t) last_key, (int64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + SlotsSeatsEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !SlotsSeatsEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + // SlotsNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it // already owns. // EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the @@ -8933,6 +9679,182 @@ inline const Slots * SlotsLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// SlotsNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool SlotsNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + SlotsNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !SlotsNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// SlotsLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool SlotsLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Slots * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !SlotsMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = SlotsNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + SlotsNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !SlotsMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Slots ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xf96b15cd3921d4a6ull; + Slots * root = new ( region + used ) Slots; // lifetime only: LoadMessageBody's first act is SlotsReset + SlotsReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Slots ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !SlotsNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return SlotsLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// SlotsLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool SlotsLoadRetainMessages( const Slots ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !SlotsLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // SlotsMeasureRetain and SlotsSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/maps/SpansTable.h b/testdata/golden/tables/maps/SpansTable.h index 580da8759..db715d5bb 100644 --- a/testdata/golden/tables/maps/SpansTable.h +++ b/testdata/golden/tables/maps/SpansTable.h @@ -3753,6 +3753,16 @@ inline int64_t TableRetainInContent( TableRetainIn & s, uint8_t kind, int64_t le } break; } + case 15: case 30: + // A UNION ARM AND AN ENUM'S VARIANT REFERENCE RESOLVE AS A FRAMED + // CONTENT TOO (§6.6): a kind 15 arm whose own payload is a union, + // and a kind 16 slot whose element kind is 15 or 30, both arrive + // here, and both carry a reference. Copying them as bytes would + // re-emit a reference into a permuted trailer, where it names + // another id, and would let a kind 17 UNDER A KIND 15 ARM through + // a walk whose whole job is to catch it. + if ( TableRetainInPayload( s, kind, depth ) < 0 ) { return -1; } + break; case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) default: // every other content is bytes: a string, wide text, an escape, a @@ -4129,6 +4139,11 @@ inline bool TableRetainOutContent( TableRetainOut & s, uint8_t kind, int64_t len } break; } + case 15: case 30: + // the emit side of the capture's own rule (§6.6): an arm and a + // variant reference resolve as a framed content too + if ( !TableRetainOutPayload( s, kind, depth ) ) { return false; } + break; default: TableRetainOutRaw( s, s.in + s.at, length ); s.at += length; @@ -4373,6 +4388,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace mapdemo #endif // MAPDEMO_SCHEMA_TABLE_RETAIN @@ -6202,10 +6649,12 @@ template inline int64_t SpansTracksEntryMeasureBodyRetain( const template inline bool SpansTracksEntrySaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const SpansTracksEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SpansTracksEntrySaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const SpansTracksEntry & value, TableRetain * retain, const TableRetainPath & path ); inline bool SpansTracksEntryLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, SpansTracksEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool SpansTracksEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, SpansTracksEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t SpansMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Spans & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SpansSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Spans & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SpansSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Spans & value, TableRetain * retain, const TableRetainPath & path ); inline bool SpansLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Spans & value, TableRetain * retain, const TableRetainPath & path ); +inline bool SpansLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Spans & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t SpansTracksEntryMeasureBody( const Ctx & ctx, const TableNumbering & numbering, TableIds & ids, const SpansTracksEntry & value ) @@ -8519,6 +8968,103 @@ inline bool SpansTracksEntryLoadBodyRetain( TableReader & r, const TableNodeMap } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool SpansTracksEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, SpansTracksEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + SpansTracksEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 6 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 255ull ) { decoded_wide = (int64_t) 255ull; report->clamped++; } + uint8_t decoded_v = (uint8_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 1 ); + TableListFill fill = TableListFillBegin( nodes, value.value, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + Item * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + if ( !ItemLoadMessageBodyRetain( r, vocabulary, report, index_bits, ( *slot ), retain, TableRetainStepInto( path, 1, (uint32_t) ( i ) ) ) ) { return false; } + } + TableListFillEnd( fill ); + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t SpansMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Spans & value, TableRetain * retain, const TableRetainPath & path ) { @@ -8755,6 +9301,164 @@ inline bool SpansLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Sp } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool SpansLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Spans & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + SpansReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x755332609c470fbdull: // tracks + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.tracks, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + uint8_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const SpansTracksEntryMessageKeyRead read = SpansTracksEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (uint64_t) last_key, (uint64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + SpansTracksEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !SpansTracksEntryLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + // SpansNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it // already owns. // EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the @@ -8928,6 +9632,182 @@ inline const Spans * SpansLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// SpansNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool SpansNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + SpansNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !SpansNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// SpansLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool SpansLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Spans * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !SpansMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = SpansNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + SpansNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !SpansMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Spans ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x033de3f1246bba76ull; + Spans * root = new ( region + used ) Spans; // lifetime only: LoadMessageBody's first act is SpansReset + SpansReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Spans ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !SpansNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return SpansLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// SpansLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool SpansLoadRetainMessages( const Spans ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !SpansLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // SpansMeasureRetain and SpansSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/maps/TextTable.h b/testdata/golden/tables/maps/TextTable.h index e81498914..226a9affe 100644 --- a/testdata/golden/tables/maps/TextTable.h +++ b/testdata/golden/tables/maps/TextTable.h @@ -4387,6 +4387,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace mapdemo #endif // MAPDEMO_SCHEMA_TABLE_RETAIN @@ -6553,16 +6985,20 @@ inline TextBlobsEntryKeyRead TextBlobsEntryReadKey( const uint8_t * body, int64_ inline int64_t TextNamesEntryMeasureBodyRetain( TableRetainIds & ids, const TextNamesEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool TextNamesEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const TextNamesEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool TextNamesEntryLoadBodyRetain( TableReader & r, TextNamesEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool TextNamesEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, TextNamesEntry & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t TextWideEntryMeasureBodyRetain( TableRetainIds & ids, const TextWideEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool TextWideEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const TextWideEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool TextWideEntryLoadBodyRetain( TableReader & r, TextWideEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool TextWideEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, TextWideEntry & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t TextBlobsEntryMeasureBodyRetain( TableRetainIds & ids, const TextBlobsEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool TextBlobsEntrySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const TextBlobsEntry & value, TableRetain * retain, const TableRetainPath & path ); MAPDEMO_TABLE_INLINE bool TextBlobsEntryLoadBodyRetain( TableReader & r, TextBlobsEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool TextBlobsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, TextBlobsEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t TextMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Text & value, TableRetain * retain, const TableRetainPath & path ); template inline bool TextSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Text & value, TableRetain * retain, const TableRetainPath & path ); template inline bool TextSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Text & value, TableRetain * retain, const TableRetainPath & path ); inline bool TextLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Text & value, TableRetain * retain, const TableRetainPath & path ); +inline bool TextLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Text & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t TextNamesEntryMeasureBody( TableIds & ids, const TextNamesEntry & value ) { @@ -9788,6 +10224,98 @@ MAPDEMO_TABLE_INLINE bool TextNamesEntryLoadBodyRetain( TableReader & r, TextNam } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool TextNamesEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, TextNamesEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + TextNamesEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 8 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.key, text, (size_t) kept ); + value.key[kept] = 0; + r.offset += (int64_t) n * 8; + value.key_length = kept; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 16 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.value, text, (size_t) kept ); + value.value[kept] = 0; + r.offset += (int64_t) n * 8; + value.value_length = kept; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + inline int64_t TextWideEntryMeasureBodyRetain( TableRetainIds & ids, const TextWideEntry & value, TableRetain * retain, const TableRetainPath & path ) { int64_t bytes = 1; // the ZERO REFERENCE that ends the body @@ -9911,7 +10439,127 @@ MAPDEMO_TABLE_INLINE bool TextWideEntryLoadBodyRetain( TableReader & r, TextWide } } -inline int64_t TextBlobsEntryMeasureBodyRetain( TableRetainIds & ids, const TextBlobsEntry & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool TextWideEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, TextWideEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + TextWideEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 7 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 7 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 65535ull ) { decoded_wide = (int64_t) 65535ull; report->clamped++; } + uint16_t decoded_v = (uint16_t) decoded_wide; + value.key = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 65535ull ) { decoded_wide = (int64_t) 65535ull; report->clamped++; } + uint16_t decoded_v = (uint16_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 33 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.has( (int64_t) n * 16 ) ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 6 ) { kept = 6; report->clamped++; } else { kept = (int32_t) n; } + bool high = false; // a high surrogate awaiting its low half + bool ill = false; + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t unit = 0; + if ( !r.get( unit, 16 ) ) { report->malformed = true; return false; } + const uint16_t u = (uint16_t) unit; + if ( u == 0 ) { ill = true; } + if ( high ) { if ( u < 0xDC00 || u > 0xDFFF ) { ill = true; } high = false; } + else if ( u >= 0xD800 && u <= 0xDBFF ) { high = true; } + else if ( u >= 0xDC00 && u <= 0xDFFF ) { ill = true; } + if ( (int32_t) i < kept ) { value.value[i] = (char16_t) u; } + } + if ( high || ill ) { report->malformed = true; return false; } + if ( kept > 0 && (uint64_t) kept < n ) + { + const char16_t last = value.value[kept - 1]; + if ( last >= 0xD800 && last <= 0xDBFF ) { kept--; } + } + value.value[kept] = 0; + value.value_length = kept; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +inline int64_t TextBlobsEntryMeasureBodyRetain( TableRetainIds & ids, const TextBlobsEntry & value, TableRetain * retain, const TableRetainPath & path ) { int64_t bytes = 1; // the ZERO REFERENCE that ends the body if ( value.key != 0 ) { bytes += TableLebBytes( ids.ref( 0x3dc94a19365b10ecull ) ) + 1 + 4; } // key @@ -10061,6 +10709,124 @@ MAPDEMO_TABLE_INLINE bool TextBlobsEntryLoadBodyRetain( TableReader & r, TextBlo } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool TextBlobsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, TextBlobsEntry & value, TableRetain * retain, const TableRetainPath & path ) +{ + TextBlobsEntryReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.key = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 6 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 10 ) { kept = 10; report->clamped++; } else { kept = (int32_t) n; } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !r.get( by, 8 ) ) { report->malformed = true; return false; } + if ( (int32_t) i < kept ) { value.value[i] = (uint8_t) by; } + } + value.value_length = kept; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t TextMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Text & value, TableRetain * retain, const TableRetainPath & path ) { @@ -10563,40 +11329,328 @@ inline bool TextLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Tex } } -// TextNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it -// already owns. -// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the -// index is the region directory's, which Load fills from the wire's framing -// and nothing afterwards renumbers. -inline void TextNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool TextLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Text & value, TableRetain * retain, const TableRetainPath & path ) { - // the node's own EXTENT, where its lists' and maps' arrays are carved - // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). - // The tool's path carries a worker instead: there the arrays are the - // arena's. - TableExtentCarve carve; - carve.worker = nodes.worker; - if ( carve.worker == NULL ) - { - TableRefuseReason reason = count_over_length; // pass one already refused what this could refuse - const int64_t storage = TextNodeStorage( type_id, r.size, reason ); - const int64_t record = storage > 0 ? TextNodeRecordBytes( type_id ) : 0; - carve.at = at + record; - carve.left = storage > record ? storage - record : 0; - } - nodes.carve = &carve; - (void) nodes; // every node this root can name is a FIXED table - (void) retain; (void) node; - switch ( type_id ) + (void) nodes; (void) index_bits; + TextReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - default: break; - } - nodes.carve = NULL; // the cursor is ONE node's, and this node's body is done -} - -// TextLoadRetain: decode the tolerant wire into the caller's exact-sized region and -// return the root. LOAD IS A SCAN, and that is the whole of its bound: it -// follows no reference, so there is no depth cap, no visited set and no + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xafb728fff268814full: // names + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.names, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + const char * last_key = NULL; int32_t last_length = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const TextNamesEntryMessageKeyRead read = TextNamesEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( last_key, last_length, read.key, read.length ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + TextNamesEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !TextNamesEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; last_length = read.length; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xa633f1f655715ccaull: // wide + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 1 ); + TableMapFill fill = TableMapFillBegin( nodes, value.wide, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + uint16_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const TextWideEntryMessageKeyRead read = TextWideEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (uint64_t) last_key, (uint64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + TextWideEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !TextWideEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 1, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0x14e2eaab9cde925bull: // blobs + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 2 ); + TableMapFill fill = TableMapFillBegin( nodes, value.blobs, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + int32_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const TextBlobsEntryMessageKeyRead read = TextBlobsEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (int64_t) last_key, (int64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + TextBlobsEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !TextBlobsEntryLoadMessageBodyRetain( r, vocabulary, report, index_bits, *slot, retain, TableRetainStepInto( path, 2, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +// TextNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it +// already owns. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is the region directory's, which Load fills from the wire's framing +// and nothing afterwards renumbers. +inline void TextNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + // the node's own EXTENT, where its lists' and maps' arrays are carved + // from, PRE-ORDER as the bodies decode (docs/SPEC-TABLES.md §2.8, §2.9). + // The tool's path carries a worker instead: there the arrays are the + // arena's. + TableExtentCarve carve; + carve.worker = nodes.worker; + if ( carve.worker == NULL ) + { + TableRefuseReason reason = count_over_length; // pass one already refused what this could refuse + const int64_t storage = TextNodeStorage( type_id, r.size, reason ); + const int64_t record = storage > 0 ? TextNodeRecordBytes( type_id ) : 0; + carve.at = at + record; + carve.left = storage > record ? storage - record : 0; + } + nodes.carve = &carve; + (void) nodes; // every node this root can name is a FIXED table + (void) retain; (void) node; + switch ( type_id ) + { + default: break; + } + nodes.carve = NULL; // the cursor is ONE node's, and this node's body is done +} + +// TextLoadRetain: decode the tolerant wire into the caller's exact-sized region and +// return the root. LOAD IS A SCAN, and that is the whole of its bound: it +// follows no reference, so there is no depth cap, no visited set and no // ordering rule on the indices. Partial results are kept, as everywhere on // this wire — the report says what happened. NULL means the CALLER's buffer // was wrong. @@ -10736,6 +11790,182 @@ inline const Text * TextLoadRetain( uint8_t * region, int64_t region_bytes, cons return root; } +// TextNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool TextNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + TextNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !TextNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + (void) retain; (void) node; + bool ok = false; + switch ( type_id ) + { + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// TextLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool TextLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Text * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !TextMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = TextNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + TextNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !TextMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Text ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x2492f5fb1b05b45eull; + Text * root = new ( region + used ) Text; // lifetime only: LoadMessageBody's first act is TextReset + TextReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Text ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !TextNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return TextLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// TextLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool TextLoadRetainMessages( const Text ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !TextLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // TextMeasureRetain and TextSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/pointers/GraphTable.h b/testdata/golden/tables/pointers/GraphTable.h index 2dcb91aac..d727af246 100644 --- a/testdata/golden/tables/pointers/GraphTable.h +++ b/testdata/golden/tables/pointers/GraphTable.h @@ -4310,6 +4310,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace graphdemo #endif // GRAPHDEMO_SCHEMA_TABLE_RETAIN @@ -5105,33 +5537,41 @@ template inline bool TableNodeMessageSave( const Ctx & ctx, const inline int64_t MetaMeasureBodyRetain( TableRetainIds & ids, const Meta & value, TableRetain * retain, const TableRetainPath & path ); GRAPHDEMO_TABLE_INLINE bool MetaSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Meta & value, TableRetain * retain, const TableRetainPath & path ); GRAPHDEMO_TABLE_INLINE bool MetaLoadBodyRetain( TableReader & r, Meta & value, TableRetain * retain, const TableRetainPath & path ); +inline bool MetaLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Meta & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t SettingsMeasureBodyRetain( TableRetainIds & ids, const Settings & value, TableRetain * retain, const TableRetainPath & path ); GRAPHDEMO_TABLE_INLINE bool SettingsSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Settings & value, TableRetain * retain, const TableRetainPath & path ); GRAPHDEMO_TABLE_INLINE bool SettingsLoadBodyRetain( TableReader & r, Settings & value, TableRetain * retain, const TableRetainPath & path ); +inline bool SettingsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Settings & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t ListNodeMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const ListNode & value, TableRetain * retain, const TableRetainPath & path ); template inline bool ListNodeSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const ListNode & value, TableRetain * retain, const TableRetainPath & path ); template inline bool ListNodeSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const ListNode & value, TableRetain * retain, const TableRetainPath & path ); inline bool ListNodeLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, ListNode & value, TableRetain * retain, const TableRetainPath & path ); +inline bool ListNodeLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, ListNode & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t TreeNodeMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const TreeNode & value, TableRetain * retain, const TableRetainPath & path ); template inline bool TreeNodeSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const TreeNode & value, TableRetain * retain, const TableRetainPath & path ); template inline bool TreeNodeSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const TreeNode & value, TableRetain * retain, const TableRetainPath & path ); inline bool TreeNodeLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, TreeNode & value, TableRetain * retain, const TableRetainPath & path ); +inline bool TreeNodeLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, TreeNode & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t LayerMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Layer & value, TableRetain * retain, const TableRetainPath & path ); template inline bool LayerSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Layer & value, TableRetain * retain, const TableRetainPath & path ); template inline bool LayerSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Layer & value, TableRetain * retain, const TableRetainPath & path ); inline bool LayerLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Layer & value, TableRetain * retain, const TableRetainPath & path ); +inline bool LayerLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Layer & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t SceneMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Scene & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SceneSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Scene & value, TableRetain * retain, const TableRetainPath & path ); template inline bool SceneSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Scene & value, TableRetain * retain, const TableRetainPath & path ); inline bool SceneLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Scene & value, TableRetain * retain, const TableRetainPath & path ); +inline bool SceneLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Scene & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t DepotMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Depot & value, TableRetain * retain, const TableRetainPath & path ); template inline bool DepotSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Depot & value, TableRetain * retain, const TableRetainPath & path ); template inline bool DepotSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Depot & value, TableRetain * retain, const TableRetainPath & path ); inline bool DepotLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Depot & value, TableRetain * retain, const TableRetainPath & path ); +inline bool DepotLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Depot & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t AlbumMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Album & value, TableRetain * retain, const TableRetainPath & path ); template inline bool AlbumSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Album & value, TableRetain * retain, const TableRetainPath & path ); template inline bool AlbumSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Album & value, TableRetain * retain, const TableRetainPath & path ); inline bool AlbumLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Album & value, TableRetain * retain, const TableRetainPath & path ); +inline bool AlbumLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Album & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t MetaMeasureBody( TableIds & ids, const Meta & value ) { @@ -15259,82 +15699,199 @@ GRAPHDEMO_TABLE_INLINE bool MetaLoadBodyRetain( TableReader & r, Meta & value, T } } -inline int64_t SettingsMeasureBodyRetain( TableRetainIds & ids, const Settings & value, TableRetain * retain, const TableRetainPath & path ) -{ - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.quality != 2 ) { bytes += TableLebBytes( ids.ref( 0x7a8060916400fe66ull ) ) + 1 + 4; } // quality - if ( value.label_length < 0 || value.label_length > 16 ) { return -1; } // storage invariant - if ( value.label_length > 0 ) { bytes += TableLebBytes( ids.ref( 0x39f7fcec8fcb623dull ) ) + 1 + TableLebBytes( (uint64_t) ( value.label_length ) ) + ( value.label_length ); } // label - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -GRAPHDEMO_TABLE_INLINE bool SettingsSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Settings & value, TableRetain * retain, const TableRetainPath & path ) -{ - if ( value.quality != 2 ) - { - w.putleb( ids.ref( 0x7a8060916400fe66ull ) ); w.put8( 4 ); // quality - w.put32( uint32_t( value.quality ) ); - } - if ( value.label_length < 0 || value.label_length > 16 ) { return false; } // storage invariant - if ( value.label_length > 0 ) - { - w.putleb( ids.ref( 0x39f7fcec8fcb623dull ) ); w.put8( 12 ); // label - w.putleb( (uint64_t) value.label_length ); - w.raw( value.label, value.label_length ); - } - if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } - w.put8( 0 ); // the ZERO REFERENCE that ends the body - return !w.overflow; -} - -GRAPHDEMO_TABLE_INLINE bool SettingsLoadBodyRetain( TableReader & r, Settings & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool MetaLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Meta & value, TableRetain * retain, const TableRetainPath & path ) { - SettingsReset( value ); // prefill declared defaults in place, then overlay + MetaReset( value ); // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT - // (docs/SPEC-TABLES.md §6.6): this body is being established, so - // whatever an earlier occurrence of it left is discarded before the - // winning one is read. The discard moves neither counter. + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. TableRetainDiscardBody( retain, path ); for ( ;; ) { - uint64_t field_ref = 0; - if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } - if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE - if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count - const uint64_t field_id = r.ids->at( field_ref ); - if ( !r.has( 1 ) ) { r.report->malformed = true; return false; } - uint8_t kind = r.get8(); - if ( ( field_id == kTableNodeTableFieldId && r.nested ) || field_id == kTableBuildVersionFieldId || field_id == kTableMessageVocabularyFieldId ) - { - // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, - // IS MALFORMED (docs/SPEC-TABLES.md §3.1, §3.3). The node - // table's is the ROOT body's alone, on the numbering's own - // rule — a second numbering cannot exist — and the BUILD - // VERSION's rides in the announcement and nowhere else. That - // body stops and the parent reads on past its L. - r.report->malformed = true; - return false; - } - switch ( field_id ) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - case 0x7a8060916400fe66ull: // quality + case 0x802517e298c70b03ull: // build { - if ( kind != 4 ) + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) { - if ( TableKindWidens( kind, 4 ) ) + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) { - // WIDENED (§4): a kind that grew since the writer decodes - // exactly at its own width, the value lands, one widened counts - int64_t widened_v = 0; - if ( !TableReadSignedAt( r, kind, widened_v ) ) { r.report->malformed = true; return false; } - int32_t decoded_v = (int32_t) widened_v; - if ( decoded_v < 0 ) { decoded_v = 0; r.report->clamped++; } - else if ( decoded_v > 4 ) { decoded_v = 4; r.report->clamped++; } - value.quality = decoded_v; - r.report->widened++; - break; - } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < 0ll ) { decoded_wide = 0ll; report->clamped++; } + if ( decoded_wide > 1000ll ) { decoded_wide = 1000ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.build = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < 0ll ) { decoded_wide = 0ll; report->clamped++; } + if ( decoded_wide > 1000ll ) { decoded_wide = 1000ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.build = decoded_v; + } + break; + } + case 0x56d7ab194448a4f3ull: // tag + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 8 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.tag, text, (size_t) kept ); + value.tag[kept] = 0; + r.offset += (int64_t) n * 8; + value.tag_length = kept; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +inline int64_t SettingsMeasureBodyRetain( TableRetainIds & ids, const Settings & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.quality != 2 ) { bytes += TableLebBytes( ids.ref( 0x7a8060916400fe66ull ) ) + 1 + 4; } // quality + if ( value.label_length < 0 || value.label_length > 16 ) { return -1; } // storage invariant + if ( value.label_length > 0 ) { bytes += TableLebBytes( ids.ref( 0x39f7fcec8fcb623dull ) ) + 1 + TableLebBytes( (uint64_t) ( value.label_length ) ) + ( value.label_length ); } // label + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +GRAPHDEMO_TABLE_INLINE bool SettingsSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Settings & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( value.quality != 2 ) + { + w.putleb( ids.ref( 0x7a8060916400fe66ull ) ); w.put8( 4 ); // quality + w.put32( uint32_t( value.quality ) ); + } + if ( value.label_length < 0 || value.label_length > 16 ) { return false; } // storage invariant + if ( value.label_length > 0 ) + { + w.putleb( ids.ref( 0x39f7fcec8fcb623dull ) ); w.put8( 12 ); // label + w.putleb( (uint64_t) value.label_length ); + w.raw( value.label, value.label_length ); + } + if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } + w.put8( 0 ); // the ZERO REFERENCE that ends the body + return !w.overflow; +} + +GRAPHDEMO_TABLE_INLINE bool SettingsLoadBodyRetain( TableReader & r, Settings & value, TableRetain * retain, const TableRetainPath & path ) +{ + SettingsReset( value ); // prefill declared defaults in place, then overlay + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so + // whatever an earlier occurrence of it left is discarded before the + // winning one is read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t field_ref = 0; + if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } + if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE + if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count + const uint64_t field_id = r.ids->at( field_ref ); + if ( !r.has( 1 ) ) { r.report->malformed = true; return false; } + uint8_t kind = r.get8(); + if ( ( field_id == kTableNodeTableFieldId && r.nested ) || field_id == kTableBuildVersionFieldId || field_id == kTableMessageVocabularyFieldId ) + { + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, + // IS MALFORMED (docs/SPEC-TABLES.md §3.1, §3.3). The node + // table's is the ROOT body's alone, on the numbering's own + // rule — a second numbering cannot exist — and the BUILD + // VERSION's rides in the announcement and nowhere else. That + // body stops and the parent reads on past its L. + r.report->malformed = true; + return false; + } + switch ( field_id ) + { + case 0x7a8060916400fe66ull: // quality + { + if ( kind != 4 ) + { + if ( TableKindWidens( kind, 4 ) ) + { + // WIDENED (§4): a kind that grew since the writer decodes + // exactly at its own width, the value lands, one widened counts + int64_t widened_v = 0; + if ( !TableReadSignedAt( r, kind, widened_v ) ) { r.report->malformed = true; return false; } + int32_t decoded_v = (int32_t) widened_v; + if ( decoded_v < 0 ) { decoded_v = 0; r.report->clamped++; } + else if ( decoded_v > 4 ) { decoded_v = 4; r.report->clamped++; } + value.quality = decoded_v; + r.report->widened++; + break; + } // AT A POSITION THE READER DOES NAME, a field under // kind 31 or kind 32 takes this same rule and no other (§3) r.report->kind_mismatch++; @@ -15381,6 +15938,123 @@ GRAPHDEMO_TABLE_INLINE bool SettingsLoadBodyRetain( TableReader & r, Settings & } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool SettingsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Settings & value, TableRetain * retain, const TableRetainPath & path ) +{ + SettingsReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x7a8060916400fe66ull: // quality + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < 0ll ) { decoded_wide = 0ll; report->clamped++; } + if ( decoded_wide > 4ll ) { decoded_wide = 4ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.quality = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < 0ll ) { decoded_wide = 0ll; report->clamped++; } + if ( decoded_wide > 4ll ) { decoded_wide = 4ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.quality = decoded_v; + } + break; + } + case 0x39f7fcec8fcb623dull: // label + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 16 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.label, text, (size_t) kept ); + value.label[kept] = 0; + r.offset += (int64_t) n * 8; + value.label_length = kept; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t ListNodeMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const ListNode & value, TableRetain * retain, const TableRetainPath & path ) { @@ -15503,56 +16177,192 @@ inline bool ListNodeLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, { if ( kind != 12 ) { - // AT A POSITION THE READER DOES NAME, a field under - // kind 31 or kind 32 takes this same rule and no other (§3) - r.report->kind_mismatch++; - if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + // AT A POSITION THE READER DOES NAME, a field under + // kind 31 or kind 32 takes this same rule and no other (§3) + r.report->kind_mismatch++; + if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + break; + } + uint64_t len = 0; + if ( !r.getleb( len ) || !r.room( len ) ) { r.report->malformed = true; return false; } + // ILL-FORMED TEXT IS DAMAGE (§3, §4): the field reads its declared + // default, one malformed counts, and the parent reads on past L + if ( !TableUtf8Valid( r.buffer + r.offset, len ) ) { r.report->malformed = true; value.name[0] = 0; value.name_length = 0; r.offset += (int64_t) len; break; } + uint64_t keep = len; + if ( keep > 12 ) { keep = (uint64_t) TableUtf8Clamp( r.buffer + r.offset, len, 12 ); r.report->clamped++; } // at a code point boundary (§3) + memcpy( value.name, r.buffer + r.offset, (size_t) keep ); + value.name[keep] = 0; + value.name_length = (int32_t) keep; + r.offset += (int64_t) len; + break; + } + case 0xe5316cbaa025f028ull: // next + { + if ( kind != 17 ) + { + // AT A POSITION THE READER DOES NAME, a field under + // kind 31 or kind 32 takes this same rule and no other (§3) + r.report->kind_mismatch++; + if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + break; + } + // A POINTER FIELD'S PAYLOAD IS A NUMBER (docs/SPEC-TABLES.md §3.1): it is + // bounds-checked and resolved through the numbering, never FOLLOWED, so + // there is no traversal here and therefore no traversal bound. + { + uint64_t node_index = 0; + if ( !r.getleb( node_index ) ) { r.report->malformed = true; return false; } + TableNodeResolve( nodes, value.next, node_index, 0xf60ec899a5a69fa9ull, r.report ); // *ListNode + } + break; + } + case 0xffffffffffffffffull: + { + if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + break; + } + default: + { + r.report->unknown++; + if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } + break; + } + } + } +} + +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool ListNodeLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, ListNode & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + ListNodeReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.value = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.value = decoded_v; + } + break; + } + case 0xc4bcadba8e631b86ull: // name + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } break; } - uint64_t len = 0; - if ( !r.getleb( len ) || !r.room( len ) ) { r.report->malformed = true; return false; } - // ILL-FORMED TEXT IS DAMAGE (§3, §4): the field reads its declared - // default, one malformed counts, and the parent reads on past L - if ( !TableUtf8Valid( r.buffer + r.offset, len ) ) { r.report->malformed = true; value.name[0] = 0; value.name_length = 0; r.offset += (int64_t) len; break; } - uint64_t keep = len; - if ( keep > 12 ) { keep = (uint64_t) TableUtf8Clamp( r.buffer + r.offset, len, 12 ); r.report->clamped++; } // at a code point boundary (§3) - memcpy( value.name, r.buffer + r.offset, (size_t) keep ); - value.name[keep] = 0; - value.name_length = (int32_t) keep; - r.offset += (int64_t) len; + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 12 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.name, text, (size_t) kept ); + value.name[kept] = 0; + r.offset += (int64_t) n * 8; + value.name_length = kept; + } break; } case 0xe5316cbaa025f028ull: // next { - if ( kind != 17 ) + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) { - // AT A POSITION THE READER DOES NAME, a field under - // kind 31 or kind 32 takes this same rule and no other (§3) - r.report->kind_mismatch++; - if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } break; } - // A POINTER FIELD'S PAYLOAD IS A NUMBER (docs/SPEC-TABLES.md §3.1): it is - // bounds-checked and resolved through the numbering, never FOLLOWED, so - // there is no traversal here and therefore no traversal bound. { uint64_t node_index = 0; - if ( !r.getleb( node_index ) ) { r.report->malformed = true; return false; } - TableNodeResolve( nodes, value.next, node_index, 0xf60ec899a5a69fa9ull, r.report ); // *ListNode + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.next, node_index, 0xf60ec899a5a69fa9ull, report ); // *ListNode } break; } - case 0xffffffffffffffffull: - { - if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } - break; - } default: + report->unknown++; { - r.report->unknown++; - if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } - break; + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); } + break; } } } @@ -15745,6 +16555,110 @@ inline bool TreeNodeLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool TreeNodeLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, TreeNode & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + TreeNodeReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x39f7fcec8fcb623dull: // label + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 12 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.label, text, (size_t) kept ); + value.label[kept] = 0; + r.offset += (int64_t) n * 8; + value.label_length = kept; + } + break; + } + case 0x24b070ada2041cb0ull: // left + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.left, node_index, 0xb97e90a3784c431dull, report ); // *TreeNode + } + break; + } + case 0x76aaaa535714d805ull: // right + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.right, node_index, 0xb97e90a3784c431dull, report ); // *TreeNode + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t LayerMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Layer & value, TableRetain * retain, const TableRetainPath & path ) { @@ -15873,22 +16787,133 @@ inline bool LayerLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, La // there is no traversal here and therefore no traversal bound. { uint64_t node_index = 0; - if ( !r.getleb( node_index ) ) { r.report->malformed = true; return false; } - TableNodeResolve( nodes, value.head, node_index, 0xf60ec899a5a69fa9ull, r.report ); // *ListNode + if ( !r.getleb( node_index ) ) { r.report->malformed = true; return false; } + TableNodeResolve( nodes, value.head, node_index, 0xf60ec899a5a69fa9ull, r.report ); // *ListNode + } + break; + } + case 0xffffffffffffffffull: + { + if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } + break; + } + default: + { + r.report->unknown++; + if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } + break; + } + } + } +} + +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool LayerLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Layer & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + LayerReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x75d8e97600b296eaull: // depth + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < 0ll ) { decoded_wide = 0ll; report->clamped++; } + if ( decoded_wide > 64ll ) { decoded_wide = 64ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.depth = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < 0ll ) { decoded_wide = 0ll; report->clamped++; } + if ( decoded_wide > 64ll ) { decoded_wide = 64ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.depth = decoded_v; + } + break; + } + case 0x0a8f12cc5f9a0c03ull: // head + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.head, node_index, 0xf60ec899a5a69fa9ull, report ); // *ListNode } break; } - case 0xffffffffffffffffull: - { - if ( !r.skip( kind ) ) { r.report->malformed = true; return false; } - break; - } default: + report->unknown++; { - r.report->unknown++; - if ( !TableRetainCapture( retain, r, path, field_id, kind ) ) { r.report->malformed = true; return false; } - break; + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); } + break; } } } @@ -16389,6 +17414,261 @@ inline bool SceneLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Sc } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool SceneLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Scene & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + SceneReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xc4bcadba8e631b86ull: // name + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 24 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.name, text, (size_t) kept ); + value.name[kept] = 0; + r.offset += (int64_t) n * 8; + value.name_length = kept; + } + break; + } + case 0xbb62c62c9808ea37ull: // version + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < 0ll ) { decoded_wide = 0ll; report->clamped++; } + if ( decoded_wide > 99ll ) { decoded_wide = 99ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.version = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < 0ll ) { decoded_wide = 0ll; report->clamped++; } + if ( decoded_wide > 99ll ) { decoded_wide = 99ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.version = decoded_v; + } + break; + } + case 0x0a8f12cc5f9a0c03ull: // head + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.head, node_index, 0xf60ec899a5a69fa9ull, report ); // *ListNode + } + break; + } + case 0x5b25b8ef511eb395ull: // tree + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.tree, node_index, 0xb97e90a3784c431dull, report ); // *TreeNode + } + break; + } + case 0xee5f6d7b48b44de8ull: // settings + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.settings, node_index, 0x9d8b8aa2b404c2c8ull, report ); // *Settings + } + break; + } + case 0x509220bb65a646b7ull: // alias + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.alias, node_index, 0xf60ec899a5a69fa9ull, report ); // *ListNode + } + break; + } + case 0x60839e2395be697eull: // ground + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 6 ); + if ( !LayerLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, value.ground, retain, TableRetainStepInto( path, 6, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + case 0x4554e34a747022dfull: // layers + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) + { + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 4 ) { kept = 4; report->clamped++; } else { kept = (int32_t) n; } + const uint64_t walk = n; + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + Layer scratch; + LayerReset( scratch ); + if ( !LayerLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, ( in_bounds ? value.layers[i] : scratch ), ( in_bounds ? retain : NULL ), TableRetainStepInto( path, 7, (uint32_t) ( i ) ) ) ) { return false; } + } + value.layers_count = kept; + } + break; + } + case 0x4320e9a2e32eac38ull: // meta + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 8 ); + if ( !MetaLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.meta, retain, TableRetainStepInto( path, 8, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t DepotMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Depot & value, TableRetain * retain, const TableRetainPath & path ) { @@ -16688,6 +17968,140 @@ inline bool DepotLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, De } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool DepotLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Depot & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + DepotReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xc4bcadba8e631b86ull: // name + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 12 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.name, text, (size_t) kept ); + value.name[kept] = 0; + r.offset += (int64_t) n * 8; + value.name_length = kept; + } + break; + } + case 0xdd9eb981e152e90cull: // banks + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 16 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) ) { report->malformed = true; return false; } + for ( uint64_t p = 0; p < n; p++ ) + { + uint64_t key_ref = 0; + if ( !r.get( key_ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry key_entry; + if ( !TableMessageNameEntry( vocabulary, key_ref, key_entry ) ) { report->malformed = true; return false; } + Tier key = Tier::None; + const bool named = TableEnumValue( key_entry.id, key ); + if ( !named ) { report->unknown++; report->retain_lost++; } + const int32_t slot = named ? (int32_t) key - 1 : -1; + const bool in_bounds = slot >= 0 && slot < 2; + Layer scratch; + LayerReset( scratch ); + if ( !LayerLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, ( in_bounds ? value.banks.slots[slot] : scratch ), ( in_bounds ? retain : NULL ), TableRetainStepInto( path, 1, (uint32_t) ( slot ) ) ) ) { return false; } + } + } + break; + } + case 0x4339ee8ab21c8380ull: // spare + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 2 ); + if ( !MetaLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.spare, retain, TableRetainStepInto( path, 2, (uint32_t) ( 0 ) ) ) ) { return false; } + value.spare_present = true; // the field rode, so it is PRESENT (§2.3) + break; + } + case 0x0a8f12cc5f9a0c03ull: // head + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.head, node_index, 0xf60ec899a5a69fa9ull, report ); // *ListNode + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t AlbumMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Album & value, TableRetain * retain, const TableRetainPath & path ) { @@ -17011,6 +18425,155 @@ inline bool AlbumLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Al } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool AlbumLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Album & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + AlbumReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xc4bcadba8e631b86ull: // name + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 16 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.name, text, (size_t) kept ); + value.name[kept] = 0; + r.offset += (int64_t) n * 8; + value.name_length = kept; + } + break; + } + case 0x1e4984ef2e958a4cull: // tint + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 1 ); + if ( !ColourLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.tint, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + case 0xee7ba9ad45c64144ull: // stamp + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 2 ); + if ( !StampLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.stamp, retain, TableRetainStepInto( path, 2, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + case 0xeddcb72b15486e77ull: // marker + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 13 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 3 ); + if ( !MarkerLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, value.marker, retain, TableRetainStepInto( path, 3, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + case 0x77af761956600b54ull: // pin + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.pin, node_index, 0xd6458a3eef83d457ull, report ); // *Marker + } + break; + } + case 0x0a8f12cc5f9a0c03ull: // head + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.head, node_index, 0xf60ec899a5a69fa9ull, report ); // *ListNode + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + // ListNodeNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it // already owns. // EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the @@ -17161,6 +18724,160 @@ inline const ListNode * ListNodeLoadRetain( uint8_t * region, int64_t region_byt return root; } +// ListNodeNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool ListNodeNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + bool ok = false; + switch ( type_id ) + { + case 0xf60ec899a5a69fa9ull: ok = ListNodeLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(ListNode *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // ListNode + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + return ok; +} + +// ListNodeLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool ListNodeLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const ListNode * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !ListNodeMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = ListNodeNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + ListNodeNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( ListNode ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xf60ec899a5a69fa9ull; + ListNode * root = new ( region + used ) ListNode; // lifetime only: LoadMessageBody's first act is ListNodeReset + ListNodeReset( *root ); + root_out = root; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !ListNodeNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + return ListNodeLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// ListNodeLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool ListNodeLoadRetainMessages( const ListNode ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !ListNodeLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // ListNodeMeasureRetain and ListNodeSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save @@ -17420,13 +19137,167 @@ inline const TreeNode * TreeNodeLoadRetain( uint8_t * region, int64_t region_byt k++; } } - - // and the ROOT's own body last, so every index it carries resolves - // against a numbering already known good or already known bad - TableReader r( wire, wire_bytes, out, &ids_table ); - r.nested = false; // the ROOT body, the one that carries the node table - TreeNodeLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); - return root; + + // and the ROOT's own body last, so every index it carries resolves + // against a numbering already known good or already known bad + TableReader r( wire, wire_bytes, out, &ids_table ); + r.nested = false; // the ROOT body, the one that carries the node table + TreeNodeLoadBodyRetain( r, nodes, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); + return root; +} + +// TreeNodeNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool TreeNodeNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + bool ok = false; + switch ( type_id ) + { + case 0xb97e90a3784c431dull: ok = TreeNodeLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(TreeNode *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // TreeNode + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + return ok; +} + +// TreeNodeLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool TreeNodeLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const TreeNode * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !TreeNodeMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = TreeNodeNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + TreeNodeNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( TreeNode ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xb97e90a3784c431dull; + TreeNode * root = new ( region + used ) TreeNode; // lifetime only: LoadMessageBody's first act is TreeNodeReset + TreeNodeReset( *root ); + root_out = root; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !TreeNodeNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + return TreeNodeLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// TreeNodeLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool TreeNodeLoadRetainMessages( const TreeNode ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !TreeNodeLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); } // TreeNodeMeasureRetain and TreeNodeSaveRetain: the pair, with the retained tail in @@ -17697,6 +19568,160 @@ inline const Layer * LayerLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// LayerNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool LayerNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + bool ok = false; + switch ( type_id ) + { + case 0xf60ec899a5a69fa9ull: ok = ListNodeLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(ListNode *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // ListNode + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + return ok; +} + +// LayerLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool LayerLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Layer * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !LayerMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = LayerNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + LayerNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Layer ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x9d167ef77aed79b6ull; + Layer * root = new ( region + used ) Layer; // lifetime only: LoadMessageBody's first act is LayerReset + LayerReset( *root ); + root_out = root; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !LayerNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + return LayerLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// LayerLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool LayerLoadRetainMessages( const Layer ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !LayerLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // LayerMeasureRetain and LayerSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save @@ -17967,6 +19992,162 @@ inline const Scene * SceneLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// SceneNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool SceneNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + bool ok = false; + switch ( type_id ) + { + case 0xf60ec899a5a69fa9ull: ok = ListNodeLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(ListNode *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // ListNode + case 0xb97e90a3784c431dull: ok = TreeNodeLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(TreeNode *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // TreeNode + case 0x9d8b8aa2b404c2c8ull: ok = SettingsLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(Settings *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Settings + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + return ok; +} + +// SceneLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool SceneLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Scene * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !SceneMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = SceneNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + SceneNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Scene ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x4a9a31623ab5f213ull; + Scene * root = new ( region + used ) Scene; // lifetime only: LoadMessageBody's first act is SceneReset + SceneReset( *root ); + root_out = root; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !SceneNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + return SceneLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// SceneLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool SceneLoadRetainMessages( const Scene ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !SceneLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // SceneMeasureRetain and SceneSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save @@ -18241,6 +20422,160 @@ inline const Depot * DepotLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// DepotNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool DepotNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + bool ok = false; + switch ( type_id ) + { + case 0xf60ec899a5a69fa9ull: ok = ListNodeLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(ListNode *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // ListNode + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + return ok; +} + +// DepotLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool DepotLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Depot * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !DepotMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = DepotNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + DepotNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Depot ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x327fe6dc702553fdull; + Depot * root = new ( region + used ) Depot; // lifetime only: LoadMessageBody's first act is DepotReset + DepotReset( *root ); + root_out = root; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !DepotNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + return DepotLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// DepotLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool DepotLoadRetainMessages( const Depot ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !DepotLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // DepotMeasureRetain and DepotSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save @@ -18511,6 +20846,162 @@ inline const Album * AlbumLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// AlbumNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool AlbumNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + bool ok = false; + switch ( type_id ) + { + case 0x69ff34904242a73dull: ok = TallyLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(Tally *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Tally + case 0xd6458a3eef83d457ull: ok = MarkerLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(Marker *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Marker + case 0xf60ec899a5a69fa9ull: ok = ListNodeLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(ListNode *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // ListNode + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + return ok; +} + +// AlbumLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool AlbumLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Album * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !AlbumMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = AlbumNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + AlbumNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Album ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xd858c2cb7f1514ccull; + Album * root = new ( region + used ) Album; // lifetime only: LoadMessageBody's first act is AlbumReset + AlbumReset( *root ); + root_out = root; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !AlbumNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + return AlbumLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// AlbumLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool AlbumLoadRetainMessages( const Album ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !AlbumLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // AlbumMeasureRetain and AlbumSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/pointers/MarksTable.h b/testdata/golden/tables/pointers/MarksTable.h index 1a53962ce..1704d5ebb 100644 --- a/testdata/golden/tables/pointers/MarksTable.h +++ b/testdata/golden/tables/pointers/MarksTable.h @@ -4307,6 +4307,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace graphdemo #endif // GRAPHDEMO_SCHEMA_TABLE_RETAIN @@ -4787,10 +5219,12 @@ template inline bool TableNodeMessageSave( const Ctx & ctx, const inline int64_t TallyMeasureBodyRetain( TableRetainIds & ids, const Tally & value, TableRetain * retain, const TableRetainPath & path ); GRAPHDEMO_TABLE_INLINE bool TallySaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Tally & value, TableRetain * retain, const TableRetainPath & path ); GRAPHDEMO_TABLE_INLINE bool TallyLoadBodyRetain( TableReader & r, Tally & value, TableRetain * retain, const TableRetainPath & path ); +inline bool TallyLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Tally & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t MarkerMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Marker & value, TableRetain * retain, const TableRetainPath & path ); template inline bool MarkerSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Marker & value, TableRetain * retain, const TableRetainPath & path ); template inline bool MarkerSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Marker & value, TableRetain * retain, const TableRetainPath & path ); inline bool MarkerLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Marker & value, TableRetain * retain, const TableRetainPath & path ); +inline bool MarkerLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Marker & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t TallyMeasureBody( TableIds & ids, const Tally & value ) { @@ -6471,6 +6905,98 @@ GRAPHDEMO_TABLE_INLINE bool TallyLoadBodyRetain( TableReader & r, Tally & value, } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool TallyLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Tally & value, TableRetain * retain, const TableRetainPath & path ) +{ + TallyReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x732dfbcc9b0cf0bbull: // hits + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < 0ll ) { decoded_wide = 0ll; report->clamped++; } + if ( decoded_wide > 10000ll ) { decoded_wide = 10000ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.hits = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < 0ll ) { decoded_wide = 0ll; report->clamped++; } + if ( decoded_wide > 10000ll ) { decoded_wide = 10000ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.hits = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t MarkerMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Marker & value, TableRetain * retain, const TableRetainPath & path ) { @@ -6615,6 +7141,92 @@ inline bool MarkerLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, M } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool MarkerLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Marker & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + MarkerReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x39f7fcec8fcb623dull: // label + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 8 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.label, text, (size_t) kept ); + value.label[kept] = 0; + r.offset += (int64_t) n * 8; + value.label_length = kept; + } + break; + } + case 0x3bf8fbbad1587cddull: // note + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.note, node_index, 0x69ff34904242a73dull, report ); // *Tally + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + // MarkerNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it // already owns. // EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the @@ -6766,6 +7378,161 @@ inline const Marker * MarkerLoadRetain( uint8_t * region, int64_t region_bytes, return root; } +// MarkerNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool MarkerNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + bool ok = false; + switch ( type_id ) + { + case 0x69ff34904242a73dull: ok = TallyLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(Tally *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Tally + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + return ok; +} + +// MarkerLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool MarkerLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Marker * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !MarkerMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = MarkerNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + MarkerNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Marker ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xd6458a3eef83d457ull; + Marker * root = new ( region + used ) Marker; // lifetime only: LoadMessageBody's first act is MarkerReset + MarkerReset( *root ); + root_out = root; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !MarkerNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + return MarkerLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// MarkerLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool MarkerLoadRetainMessages( const Marker ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !MarkerLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // MarkerMeasureRetain and MarkerSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/pointers/PartsTable.h b/testdata/golden/tables/pointers/PartsTable.h index 6130a6aef..b1ce8fae0 100644 --- a/testdata/golden/tables/pointers/PartsTable.h +++ b/testdata/golden/tables/pointers/PartsTable.h @@ -4307,6 +4307,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace graphdemo #endif // GRAPHDEMO_SCHEMA_TABLE_RETAIN @@ -4689,9 +5121,11 @@ GRAPHDEMO_TABLE_INLINE bool ColourLoadBody( TableReader & r, Colour & value ); inline int64_t StampMeasureBodyRetain( TableRetainIds & ids, const Stamp & value, TableRetain * retain, const TableRetainPath & path ); GRAPHDEMO_TABLE_INLINE bool StampSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Stamp & value, TableRetain * retain, const TableRetainPath & path ); GRAPHDEMO_TABLE_INLINE bool StampLoadBodyRetain( TableReader & r, Stamp & value, TableRetain * retain, const TableRetainPath & path ); +inline bool StampLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Stamp & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t ColourMeasureBodyRetain( TableRetainIds & ids, const Colour & value, TableRetain * retain, const TableRetainPath & path ); GRAPHDEMO_TABLE_INLINE bool ColourSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Colour & value, TableRetain * retain, const TableRetainPath & path ); GRAPHDEMO_TABLE_INLINE bool ColourLoadBodyRetain( TableReader & r, Colour & value, TableRetain * retain, const TableRetainPath & path ); +inline bool ColourLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Colour & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t StampMeasureBody( TableIds & ids, const Stamp & value ) { @@ -5624,6 +6058,123 @@ GRAPHDEMO_TABLE_INLINE bool StampLoadBodyRetain( TableReader & r, Stamp & value, } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool StampLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Stamp & value, TableRetain * retain, const TableRetainPath & path ) +{ + StampReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x56d7ab194448a4f3ull: // tag + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 8 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.tag, text, (size_t) kept ); + value.tag[kept] = 0; + r.offset += (int64_t) n * 8; + value.tag_length = kept; + } + break; + } + case 0x823b8a195ce2133cull: // seq + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < 0ll ) { decoded_wide = 0ll; report->clamped++; } + if ( decoded_wide > 1000ll ) { decoded_wide = 1000ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.seq = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < 0ll ) { decoded_wide = 0ll; report->clamped++; } + if ( decoded_wide > 1000ll ) { decoded_wide = 1000ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.seq = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + inline int64_t ColourMeasureBodyRetain( TableRetainIds & ids, const Colour & value, TableRetain * retain, const TableRetainPath & path ) { int64_t bytes = 1; // the ZERO REFERENCE that ends the body @@ -5741,6 +6292,117 @@ GRAPHDEMO_TABLE_INLINE bool ColourLoadBodyRetain( TableReader & r, Colour & valu } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool ColourLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Colour & value, TableRetain * retain, const TableRetainPath & path ) +{ + ColourReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xaf63ef4c86020cd5ull: // r + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 6 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 255ull ) { decoded_wide = (int64_t) 255ull; report->clamped++; } + uint8_t decoded_v = (uint8_t) decoded_wide; + value.r = decoded_v; + } + break; + } + case 0xaf63da4c8601e926ull: // g + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 6 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 255ull ) { decoded_wide = (int64_t) 255ull; report->clamped++; } + uint8_t decoded_v = (uint8_t) decoded_wide; + value.g = decoded_v; + } + break; + } + case 0xaf63df4c8601f1a5ull: // b + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 6 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 255ull ) { decoded_wide = (int64_t) 255ull; report->clamped++; } + uint8_t decoded_v = (uint8_t) decoded_wide; + value.b = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + // ---- retain-unknown on a FIXED-class root: refused by name (§6.6) ---- // // A fixed-class root is a VALUE: no region, no node directory, and so no diff --git a/testdata/golden/tables/stream/StreamTable.h b/testdata/golden/tables/stream/StreamTable.h index 11f62058e..8ffe20e02 100644 --- a/testdata/golden/tables/stream/StreamTable.h +++ b/testdata/golden/tables/stream/StreamTable.h @@ -4153,6 +4153,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells — and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own +// length, and the element — and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace streamdemo #endif // STREAMDEMO_SCHEMA_TABLE_RETAIN @@ -4685,14 +5117,17 @@ template inline bool TableNodeMessageSave( const Ctx & ctx, const inline int64_t HeaderMeasureBodyRetain( TableRetainIds & ids, const Header & value, TableRetain * retain, const TableRetainPath & path ); STREAMDEMO_TABLE_INLINE bool HeaderSaveBodyRetain( TableWriter & w, TableRetainIds & ids, const Header & value, TableRetain * retain, const TableRetainPath & path ); STREAMDEMO_TABLE_INLINE bool HeaderLoadBodyRetain( TableReader & r, Header & value, TableRetain * retain, const TableRetainPath & path ); +inline bool HeaderLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Header & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t ChunkMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Chunk & value, TableRetain * retain, const TableRetainPath & path ); template inline bool ChunkSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Chunk & value, TableRetain * retain, const TableRetainPath & path ); template inline bool ChunkSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Chunk & value, TableRetain * retain, const TableRetainPath & path ); inline bool ChunkLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Chunk & value, TableRetain * retain, const TableRetainPath & path ); +inline bool ChunkLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Chunk & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t FeedMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Feed & value, TableRetain * retain, const TableRetainPath & path ); template inline bool FeedSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Feed & value, TableRetain * retain, const TableRetainPath & path ); template inline bool FeedSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Feed & value, TableRetain * retain, const TableRetainPath & path ); inline bool FeedLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Feed & value, TableRetain * retain, const TableRetainPath & path ); +inline bool FeedLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Feed & value, TableRetain * retain, const TableRetainPath & path ); inline int64_t HeaderMeasureBody( TableIds & ids, const Header & value ) { @@ -8658,6 +9093,73 @@ STREAMDEMO_TABLE_INLINE bool HeaderLoadBodyRetain( TableReader & r, Header & val } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool HeaderLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, int64_t index_bits, Header & value, TableRetain * retain, const TableRetainPath & path ) +{ + HeaderReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xc4bcadba8e631b86ull: // name + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 12 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( 0, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + const uint8_t * text = r.buffer + ( r.offset >> 3 ); + if ( !TableUtf8Valid( text, n ) ) { report->malformed = true; return false; } + const int32_t kept = (int32_t) TableUtf8Clamp( text, n, 16 ); + if ( (uint64_t) kept < n ) { report->clamped++; } + memcpy( value.name, text, (size_t) kept ); + value.name[kept] = 0; + r.offset += (int64_t) n * 8; + value.name_length = kept; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + template inline int64_t ChunkMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Chunk & value, TableRetain * retain, const TableRetainPath & path ) { @@ -8929,21 +9431,146 @@ inline bool ChunkLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Ch } } -template -inline int64_t FeedMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Feed & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool ChunkLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Chunk & value, TableRetain * retain, const TableRetainPath & path ) { - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - if ( value.id != 0 ) { bytes += TableLebBytes( ids.ref( 0x08b72e07b55c3ac0ull ) ) + 1 + 4; } // id - if ( value.frame.type != FrameType::None ) // None elides — the absence of the field is the None + (void) nodes; (void) index_bits; + ChunkReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - bytes += TableLebBytes( ids.ref( 0xd8d4335628b35226ull ) ) + 1; - switch ( value.frame.type ) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - case FrameType::None: break; - case FrameType::Header: + case 0x855b556730a34a05ull: // data { - int64_t arm_payload = 0; - const uint64_t arm_ref = ids.ref( 0x3a506cb501761960ull ); + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 6 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) || !r.align() || !r.has( (int64_t) n * 8 ) ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 8 ) { kept = 8; report->clamped++; } else { kept = (int32_t) n; } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !r.get( by, 8 ) ) { report->malformed = true; return false; } + if ( (int32_t) i < kept ) { value.data[i] = (uint8_t) by; } + } + value.data_length = kept; + } + break; + } + case 0xe5316cbaa025f028ull: // next + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 17 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t node_index = 0; + if ( !r.get( node_index, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.next, node_index, 0xcf4368dcf951e082ull, report ); // *Chunk + } + break; + } + case 0x5cc201a9f1b8274eull: // links + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 17 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) + { + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 2 ) { kept = 2; report->clamped++; } else { kept = (int32_t) n; } + const uint64_t walk = n; + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + TableRef scratch; + { + uint64_t node_index_2 = 0; + if ( !r.get( node_index_2, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, ( in_bounds ? value.links[i] : scratch ), node_index_2, 0xcf4368dcf951e082ull, report ); // *Chunk + } + } + value.links_count = kept; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t FeedMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Feed & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + if ( value.id != 0 ) { bytes += TableLebBytes( ids.ref( 0x08b72e07b55c3ac0ull ) ) + 1 + 4; } // id + if ( value.frame.type != FrameType::None ) // None elides — the absence of the field is the None + { + bytes += TableLebBytes( ids.ref( 0xd8d4335628b35226ull ) ) + 1; + switch ( value.frame.type ) + { + case FrameType::None: break; + case FrameType::Header: + { + int64_t arm_payload = 0; + const uint64_t arm_ref = ids.ref( 0x3a506cb501761960ull ); { const int64_t arm_body = HeaderMeasureBodyRetain( ids, value.frame.header, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ); if ( arm_body < 0 ) { return -1; } @@ -9456,140 +10083,405 @@ inline bool FeedLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Fee } } -// ChunkNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it -// already owns. -// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the -// index is the region directory's, which Load fills from the wire's framing -// and nothing afterwards renumbers. -inline void ChunkNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) -{ - switch ( type_id ) - { - case 0xcf4368dcf951e082ull: ChunkLoadBodyRetain( r, nodes, *(Chunk *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Chunk - default: break; - } -} - -// ChunkLoadRetain: decode the tolerant wire into the caller's exact-sized region and -// return the root. LOAD IS A SCAN, and that is the whole of its bound: it -// follows no reference, so there is no depth cap, no visited set and no -// ordering rule on the indices. Partial results are kept, as everywhere on -// this wire — the report says what happened. NULL means the CALLER's buffer -// was wrong. -// UNDER RETENTION it also fills the caller's two stores with the fields -// this build cannot name, and the report carries what it could not keep -// (docs/SPEC-TABLES.md §6.6). It is Load's own path and nothing else: the -// reader's data is exactly what it would have been with retention off. -inline const Chunk * ChunkLoadRetain( uint8_t * region, int64_t region_bytes, const uint8_t * wire_file, int64_t wire_file_bytes, TableRetain * retain, TableReport * report ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool FeedLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Feed & value, TableRetain * retain, const TableRetainPath & path ) { - TableReport ignored; - TableReport * out = report != NULL ? report : &ignored; - // THE FORM BYTE IS READ FIRST, then the trailer, and only then a body: - // a file that is both a newer form and damaged is a REFUSAL and never - // damage (docs/SPEC-TABLES.md §3). - TableIdTable ids_table; - int64_t body_bytes = 0; - const TableOpenVerdict verdict = TableOpen( wire_file, wire_file_bytes, ids_table, body_bytes ); - if ( verdict != TableOpenOk ) - { - if ( verdict == TableOpenDamaged ) { out->malformed = true; } else { out->refused = true; if ( wire_file_bytes > 0 && wire_file[0] == kTableWireMessageForm ) { out->reason = message_form_as_file; } else { out->reason = newer_form; } } - return NULL; - } - if ( TableBodyEndsEarly( wire_file + 1, body_bytes, ids_table ) ) - { - out->malformed = true; // a byte no field claims, before the table (§3) - return NULL; - } - const uint8_t * const wire = wire_file + 1; - const int64_t wire_bytes = body_bytes; - if ( region == NULL || region_bytes < (int64_t) sizeof( Chunk ) ) { out->malformed = true; return NULL; } - if ( ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return NULL; } - memset( region, 0, (size_t) region_bytes ); - uint64_t type_id = 0; - const uint8_t * body = NULL; - int64_t length = 0; - - // the record count and the data bytes, from the FRAMING alone - TableRefuseReason reason = count_over_length; // LoadMeasure is where a caller reads it; a Load past a refusal is malformed - int64_t data = TableAlignUp64( (int64_t) sizeof( Chunk ) ); - int64_t records = 0; - { - TableReport counting; - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, &counting, &ids_table ); - while ( TableNodeScanNext( scan, type_id, body, length ) ) - { - records++; - int64_t storage = ChunkNodeStorage( type_id, length, reason ); - if ( storage == kTableNodeRefused ) { out->malformed = true; return NULL; } - if ( storage > 0 ) { data += storage; } - } - } - int64_t attribution = ( records + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); - if ( data + attribution > region_bytes ) { out->malformed = true; return NULL; } - - TableNodeMap nodes; - nodes.base = region; - nodes.entries = (const TableNodeDirEntry *) ( region + data ); - nodes.count = records + 1; - TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + data ); - directory[0].offset = 0; // position 0 is the ROOT, at offset 0 (§6.3) - directory[0].type_id = 0xcf4368dcf951e082ull; - Chunk * root = new ( region ) Chunk; // lifetime only: LoadBody's first act is ChunkReset - ChunkReset( *root ); - - // LoadRetain RESETS BOTH STORES and writes into neither id list: a - // retained record carries its field's identity in the record itself, - // with every reference resolved (docs/SPEC-TABLES.md §6.6). The buffer - // belongs to this region from here on. - TableRetainReset( retain, nodes, region ); - - // PASS ONE: fill the numbering from the framing, so that an index - // resolves whichever way it points. It reads no body. + (void) nodes; (void) index_bits; + FeedReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t used = TableAlignUp64( (int64_t) sizeof( Chunk ) ); - int64_t k = 0; - int32_t unknown_records = 0; // counted once the scan is known whole - while ( TableNodeScanNext( scan, type_id, body, length ) ) + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) { - int64_t storage = ChunkNodeStorage( type_id, length, reason ); - if ( storage <= 0 ) - { - // a record whose type id this build cannot name KEEPS ITS - // INDEX, is counted once here and not once per pointer, and - // every reference to it reads null (§3.1) - unknown_records++; - directory[k + 1].offset = kTableNodeAbsent; - directory[k + 1].type_id = type_id; - } - else + case 0x08b72e07b55c3ac0ull: // id { - directory[k + 1].offset = (uint64_t) used; - directory[k + 1].type_id = type_id; - ChunkNodePlace( type_id, region + used, length ); - used += storage; - } - k++; - } - nodes.good = TableNodeScanWhole( scan ); - // the table is whole or it is nothing: a scan that failed counts - // malformed and NOT the unknowns it met on the way, because the - // numbering they belonged to does not exist (§3.1) - // A NODE RECORD whose type id this reader cannot name is one of the - // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one - // back means renumbering a graph the writer numbers from its own edges. - if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } - } - - // PASS TWO: decode each body into its own storage. A forward index - // resolves without scratch, because pass one already placed every node. - if ( nodes.good ) - { - TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); - int64_t k = 0; - while ( TableNodeScanNext( scan, type_id, body, length ) ) - { - if ( directory[k + 1].offset != kTableNodeAbsent ) + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 8 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 8 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.id = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.id = decoded_v; + } + break; + } + case 0xd8d4335628b35226ull: // frame + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 15 || entry.elem_kind != 0 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + TableRetainDiscardField( retain, path, 1 ); + { + uint64_t arm_ref = 0; + if ( !r.get( arm_ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + TableMessageEntry arm; + if ( arm_ref == 0 ) { value.frame.type = FrameType::None; } + else if ( !TableMessageArmEntry( vocabulary, arm_ref, arm ) ) { report->malformed = true; return false; } + else + { + switch ( arm.id ) + { + case 0x3a506cb501761960ull: // header + { + if ( arm.kind != 13 || arm.elem_kind != 0 ) + { + value.frame.type = FrameType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.frame.type = FrameType::Header; + if ( !HeaderLoadMessageBodyRetain( r, vocabulary, report, index_bits, value.frame.header, retain, TableRetainStepInto( path, 1, (uint32_t) ( 0 ) ) ) ) { return false; } + break; + } + case 0x0f838176873c8e22ull: // chunk + { + if ( arm.kind != 13 || arm.elem_kind != 0 ) + { + value.frame.type = FrameType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.frame.type = FrameType::Chunk; + if ( !ChunkLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, value.frame.chunk, retain, TableRetainStepInto( path, 1, (uint32_t) ( 1 ) ) ) ) { return false; } + break; + } + case 0xbf4b9bad694f4809ull: // link + { + if ( arm.kind != 17 || arm.elem_kind != 0 ) + { + value.frame.type = FrameType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.frame.type = FrameType::Link; + { + uint64_t node_index_2 = 0; + if ( !r.get( node_index_2, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, value.frame.link, node_index_2, 0xcf4368dcf951e082ull, report ); // *Chunk + } + break; + } + case 0x56d7ab194448a4f3ull: // tag + { + if ( arm.kind != 8 || arm.elem_kind != 0 ) + { + if ( TableKindWidens( arm.kind, 8 ) ) + { + value.frame.type = FrameType::Tag; + memset( (void *) &value.frame.tag, 0, sizeof( value.frame.tag ) ); // selection establishes the arm (§2.6) + { + const int64_t width_2 = arm.value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( arm.packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) arm.base_lo ); } + if ( (uint64_t) decoded_wide_2 > 4294967295ull ) { decoded_wide_2 = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v_2 = (uint32_t) decoded_wide_2; + value.frame.tag = decoded_v_2; + } + report->widened++; + break; + } + value.frame.type = FrameType::None; report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + value.frame.type = FrameType::Tag; + { + const int64_t width_2 = arm.value_bits; + uint64_t raw_2 = 0; + if ( width_2 < 0 || !r.get( raw_2, width_2 ) ) { report->malformed = true; return false; } + int64_t decoded_wide_2 = (int64_t) raw_2; + if ( arm.packing == 1 ) { decoded_wide_2 = (int64_t) ( raw_2 + (uint64_t) arm.base_lo ); } + if ( (uint64_t) decoded_wide_2 > 4294967295ull ) { decoded_wide_2 = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v_2 = (uint32_t) decoded_wide_2; + value.frame.tag = decoded_v_2; + } + break; + } + default: + value.frame.type = FrameType::None; report->unknown++; report->retain_lost++; + if ( !TableMessageSkip( r, vocabulary, index_bits, arm ) ) { report->malformed = true; return false; } + break; + } + } + } + break; + } + case 0x0c519da7a1f958c5ull: // parts + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 17 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) + { + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 4 ) { kept = 4; report->clamped++; } else { kept = (int32_t) n; } + const uint64_t walk = n; + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + TableRef scratch; + { + uint64_t node_index_2 = 0; + if ( !r.get( node_index_2, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, ( in_bounds ? value.parts[i] : scratch ), node_index_2, 0xcf4368dcf951e082ull, report ); // *Chunk + } + } + value.parts_count = kept; + } + break; + } + case 0x0369250deb889a31ull: // pair + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 17 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) + { + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 2 ) { kept = 2; report->clamped++; } else { kept = (int32_t) n; } + const uint64_t walk = n; + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + TableRef scratch; + { + uint64_t node_index_2 = 0; + if ( !r.get( node_index_2, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, ( in_bounds ? value.pair[i] : scratch ), node_index_2, 0xcf4368dcf951e082ull, report ); // *Chunk + } + } + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +// ChunkNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it +// already owns. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is the region directory's, which Load fills from the wire's framing +// and nothing afterwards renumbers. +inline void ChunkNodeBodyRetain( uint64_t type_id, TableReader & r, const TableNodeMap & nodes, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + switch ( type_id ) + { + case 0xcf4368dcf951e082ull: ChunkLoadBodyRetain( r, nodes, *(Chunk *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Chunk + default: break; + } +} + +// ChunkLoadRetain: decode the tolerant wire into the caller's exact-sized region and +// return the root. LOAD IS A SCAN, and that is the whole of its bound: it +// follows no reference, so there is no depth cap, no visited set and no +// ordering rule on the indices. Partial results are kept, as everywhere on +// this wire — the report says what happened. NULL means the CALLER's buffer +// was wrong. +// UNDER RETENTION it also fills the caller's two stores with the fields +// this build cannot name, and the report carries what it could not keep +// (docs/SPEC-TABLES.md §6.6). It is Load's own path and nothing else: the +// reader's data is exactly what it would have been with retention off. +inline const Chunk * ChunkLoadRetain( uint8_t * region, int64_t region_bytes, const uint8_t * wire_file, int64_t wire_file_bytes, TableRetain * retain, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + // THE FORM BYTE IS READ FIRST, then the trailer, and only then a body: + // a file that is both a newer form and damaged is a REFUSAL and never + // damage (docs/SPEC-TABLES.md §3). + TableIdTable ids_table; + int64_t body_bytes = 0; + const TableOpenVerdict verdict = TableOpen( wire_file, wire_file_bytes, ids_table, body_bytes ); + if ( verdict != TableOpenOk ) + { + if ( verdict == TableOpenDamaged ) { out->malformed = true; } else { out->refused = true; if ( wire_file_bytes > 0 && wire_file[0] == kTableWireMessageForm ) { out->reason = message_form_as_file; } else { out->reason = newer_form; } } + return NULL; + } + if ( TableBodyEndsEarly( wire_file + 1, body_bytes, ids_table ) ) + { + out->malformed = true; // a byte no field claims, before the table (§3) + return NULL; + } + const uint8_t * const wire = wire_file + 1; + const int64_t wire_bytes = body_bytes; + if ( region == NULL || region_bytes < (int64_t) sizeof( Chunk ) ) { out->malformed = true; return NULL; } + if ( ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return NULL; } + memset( region, 0, (size_t) region_bytes ); + uint64_t type_id = 0; + const uint8_t * body = NULL; + int64_t length = 0; + + // the record count and the data bytes, from the FRAMING alone + TableRefuseReason reason = count_over_length; // LoadMeasure is where a caller reads it; a Load past a refusal is malformed + int64_t data = TableAlignUp64( (int64_t) sizeof( Chunk ) ); + int64_t records = 0; + { + TableReport counting; + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, &counting, &ids_table ); + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + records++; + int64_t storage = ChunkNodeStorage( type_id, length, reason ); + if ( storage == kTableNodeRefused ) { out->malformed = true; return NULL; } + if ( storage > 0 ) { data += storage; } + } + } + int64_t attribution = ( records + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( data + attribution > region_bytes ) { out->malformed = true; return NULL; } + + TableNodeMap nodes; + nodes.base = region; + nodes.entries = (const TableNodeDirEntry *) ( region + data ); + nodes.count = records + 1; + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + data ); + directory[0].offset = 0; // position 0 is the ROOT, at offset 0 (§6.3) + directory[0].type_id = 0xcf4368dcf951e082ull; + Chunk * root = new ( region ) Chunk; // lifetime only: LoadBody's first act is ChunkReset + ChunkReset( *root ); + + // LoadRetain RESETS BOTH STORES and writes into neither id list: a + // retained record carries its field's identity in the record itself, + // with every reference resolved (docs/SPEC-TABLES.md §6.6). The buffer + // belongs to this region from here on. + TableRetainReset( retain, nodes, region ); + + // PASS ONE: fill the numbering from the framing, so that an index + // resolves whichever way it points. It reads no body. + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t used = TableAlignUp64( (int64_t) sizeof( Chunk ) ); + int64_t k = 0; + int32_t unknown_records = 0; // counted once the scan is known whole + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + int64_t storage = ChunkNodeStorage( type_id, length, reason ); + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS + // INDEX, is counted once here and not once per pointer, and + // every reference to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + directory[k + 1].type_id = type_id; + } + else + { + directory[k + 1].offset = (uint64_t) used; + directory[k + 1].type_id = type_id; + ChunkNodePlace( type_id, region + used, length ); + used += storage; + } + k++; + } + nodes.good = TableNodeScanWhole( scan ); + // the table is whole or it is nothing: a scan that failed counts + // malformed and NOT the unknowns it met on the way, because the + // numbering they belonged to does not exist (§3.1) + // A NODE RECORD whose type id this reader cannot name is one of the + // SIX EXCLUDED CLASSES (§6.6): it is a whole node, and putting one + // back means renumbering a graph the writer numbers from its own edges. + if ( nodes.good ) { out->unknown += unknown_records; out->retain_lost += unknown_records; } else { out->malformed = true; } + } + + // PASS TWO: decode each body into its own storage. A forward index + // resolves without scratch, because pass one already placed every node. + if ( nodes.good ) + { + TableNodeScan scan = TableNodeScanBegin( wire, wire_bytes, out, &ids_table ); + int64_t k = 0; + while ( TableNodeScanNext( scan, type_id, body, length ) ) + { + if ( directory[k + 1].offset != kTableNodeAbsent ) { TableReader sub( body, length, out, &ids_table ); ChunkNodeBodyRetain( type_id, sub, nodes, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ); @@ -9606,6 +10498,160 @@ inline const Chunk * ChunkLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// ChunkNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool ChunkNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + bool ok = false; + switch ( type_id ) + { + case 0xcf4368dcf951e082ull: ok = ChunkLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(Chunk *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Chunk + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + return ok; +} + +// ChunkLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool ChunkLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Chunk * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !ChunkMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = ChunkNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + ChunkNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Chunk ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xcf4368dcf951e082ull; + Chunk * root = new ( region + used ) Chunk; // lifetime only: LoadMessageBody's first act is ChunkReset + ChunkReset( *root ); + root_out = root; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !ChunkNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + return ChunkLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// ChunkLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool ChunkLoadRetainMessages( const Chunk ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !ChunkLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // ChunkMeasureRetain and ChunkSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save @@ -9874,6 +10920,160 @@ inline const Feed * FeedLoadRetain( uint8_t * region, int64_t region_bytes, cons return root; } +// FeedNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool FeedNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + bool ok = false; + switch ( type_id ) + { + case 0xcf4368dcf951e082ull: ok = ChunkLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *(Chunk *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Chunk + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + return ok; +} + +// FeedLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool FeedLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Feed * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !FeedMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = FeedNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + FeedNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Feed ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x3a8fe3852a245245ull; + Feed * root = new ( region + used ) Feed; // lifetime only: LoadMessageBody's first act is FeedReset + FeedReset( *root ); + root_out = root; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !FeedNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + return FeedLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// FeedLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool FeedLoadRetainMessages( const Feed ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !FeedLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // FeedMeasureRetain and FeedSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/wire/tables/retain_message_save_0.bin b/testdata/wire/tables/retain_message_save_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..62b372e13477fb591c4b52c9428cae4929b54a34 GIT binary patch literal 442 zcmZQ%;i(kj2u8Q7OPlk6jeH$P|NSi$c04bG9yacrclTgW>ki4qpH-N7X2qWo>gNhxBzj&2FZ!P gKXK2myy3cb%7l0Sp Date: Mon, 7 Sep 2026 06:39:14 -0400 Subject: [PATCH 3/9] tables: the manifest's retain surface, and the message path's control (#525) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MANIFEST.txt gains `retain` and `retain-message` lines and the nine rows §6.6 owes: the round trip at depth, the truncated record, the id list one short, the five excluded classes a wire can carry to the unknown arm, and the message form's tail. FORMAT.md's page and the harness's two surfaces follow: `retain` carries the COUNTERS and `retain-save` the BYTES, so each is one shape. THE TWO CAPACITIES TRAVEL AS RULES AND NOT AS NUMBERS. A record's byte cost is the port's own, so `short` says ONE BYTE SHORT OF THE LAST RECORD and a leg resolves it against its own full load; the id list's capacity is a COUNT and rides as one. The reference answers both surfaces and the oracle claims the same nine rows in the harness's own test, against the manifest's counters and the pinned saves. cpp retain pass 9/9 retain-save pass 3/3 c retain absent retain-save absent go retain absent retain-save absent rust retain absent retain-save absent THE NEGATIVE CONTROL is `tables-message-form-retain-negative-control`: it takes the message path's call into the resolving walk out of the emitter through an overlay, regenerates the RT set and requires the retain gate to go red on the pinned batch's own row and on nothing else. FAIL line 1037: report.retained == 10 TestTheTailIsUnconditional gained a map-entry skip. The vocabulary tail never names a map's generated entry (§2.8, §20.2) and the test's own table set did not skip one, because no connection unit carried a map until RT2 did. Co-Authored-By: Claude Opus 5 --- Makefile | 40 +++- sabotage | Bin 0 -> 2605010 bytes test/conformance/cpp/main.cpp | 223 ++++++++++++++++++++++- test/conformance/harness/manifest.go | 109 +++++++++++ test/conformance/harness/message_test.go | 10 +- test/conformance/harness/retain_test.go | 143 +++++++++++++++ test/conformance/harness/run.go | 49 ++++- test/tables/retain_main.cpp | 5 + testdata/conformance/tables/MANIFEST.txt | 50 +++++ testdata/wire/tables/retain_conn.bin | Bin 0 -> 571 bytes tools/sabotage/message.go | 15 ++ 11 files changed, 640 insertions(+), 4 deletions(-) create mode 100755 sabotage create mode 100644 test/conformance/harness/retain_test.go create mode 100644 testdata/wire/tables/retain_conn.bin diff --git a/Makefile b/Makefile index d62ce7ff6..2a2218c3c 100644 --- a/Makefile +++ b/Makefile @@ -2938,6 +2938,7 @@ test: build/schema_test build/schema_test_guard build/schema_test_tables build/s $(MAKE) tables-retain $(MAKE) tables-retain-fixed-class-negative-control $(MAKE) tables-retain-message-form-negative-control + $(MAKE) tables-message-form-retain-negative-control $(MAKE) tables-json-walk $(MAKE) tables-json-graph-walk $(MAKE) tables-json-negative-control @@ -3372,6 +3373,43 @@ tables-retain-message-form-negative-control: build/tables-generated/.stamp @grep -q "Retention writing the MESSAGE form is refused by name" build/retain-message-form.log || { echo "RETAIN GATE FAILED: the message-form refusal was not by name"; cat build/retain-message-form.log; exit 1; } @echo "retention writing form 2 refuses BY NAME (docs/SPEC-TABLES.md §3.3)" +# AND THE FORM 2 READ, WHICH RETAINS (docs/SPEC-TABLES.md §3.3, §6.6). The +# unknown arm of a retaining message body SKIPS the entry and then re-reads the +# bits it delimited, which is the whole of the form-2 capture. Take the second +# half away and the skip is all that is left: the read is unchanged to the byte, +# the six counters stand, and nothing about the batch says a field was lost. +# What goes red is the pinned batch's own row of the retain gate — `retained` at +# zero where the page says ten — which is what makes that row an instrument +# rather than a restatement of what the emitter happens to do. +# +# The sabotage is one line of the emitter, through `go build -overlay`, so no +# tracked file moves; the RT set is regenerated from the sabotaged compiler and +# the gate is built against it. +RETAIN_MSG_NC := build/retain-nc-message +.PHONY: tables-message-form-retain-negative-control +tables-message-form-retain-negative-control: bin/schema test/tables/retain_main.cpp + @rm -rf $(RETAIN_MSG_NC) && mkdir -p $(RETAIN_MSG_NC) + @go run ./tools/sabotage -name message-retain-no-capture \ + -out $(RETAIN_MSG_NC)/messageload.gotext internal/codegen/cpptable/messageload.go + @printf '{"Replace":{"%s/internal/codegen/cpptable/messageload.go":"%s/$(RETAIN_MSG_NC)/messageload.gotext"}}\n' \ + "$(CURDIR)" "$(CURDIR)" > $(RETAIN_MSG_NC)/overlay.json + go build -overlay $(RETAIN_MSG_NC)/overlay.json -o $(RETAIN_MSG_NC)/schema ./cmd/schema + @for u in rt1 rt2 rt3; do mkdir -p $(RETAIN_MSG_NC)/$$u; done + ./$(RETAIN_MSG_NC)/schema generate --lang cpp --out $(RETAIN_MSG_NC)/rt1 test/tables/RT1.schema + ./$(RETAIN_MSG_NC)/schema generate --lang cpp --out $(RETAIN_MSG_NC)/rt2 test/tables/RT2.schema + ./$(RETAIN_MSG_NC)/schema generate --lang cpp --out $(RETAIN_MSG_NC)/rt3 test/tables/RT3.schema + $(CXX) $(TABLES_CXXFLAGS) -I$(RETAIN_MSG_NC)/rt1 -I$(RETAIN_MSG_NC)/rt2 -I$(RETAIN_MSG_NC)/rt3 \ + -Itest/tables -I$(SERIALIZE) test/tables/retain_main.cpp -o $(RETAIN_MSG_NC)/gate + @if ./$(RETAIN_MSG_NC)/gate > $(RETAIN_MSG_NC)/log 2>&1; then \ + echo "NEGATIVE CONTROL FAILED: the message path never entered the walk and the retain gate stayed green"; \ + cat $(RETAIN_MSG_NC)/log; exit 1; \ + fi + @grep -q "report.retained == 10" $(RETAIN_MSG_NC)/log || \ + { echo "NEGATIVE CONTROL FAILED: the gate went red, but not on the message batch's own row"; \ + cat $(RETAIN_MSG_NC)/log; exit 1; } + @grep -m1 "FAIL" $(RETAIN_MSG_NC)/log + @echo "negative control: removing the message path's call into the walk turns the pinned batch RED" + build/schema_test_lists: build/tables-generated/.stamp test/tables/lists_main.cpp @mkdir -p build $(CXX) $(TABLES_CXXFLAGS) $(TABLES_INCLUDES) test/tables/lists_main.cpp $(LISTS_SOURCES) -o $@ @@ -3921,7 +3959,7 @@ CONFORMANCE_INCLUDES := -Ibuild/tables-generated/examples -Ibuild/tables-generat -Ibuild/tables-generated/v2 -Ibuild/tables-generated/p1 -Ibuild/tables-generated/p3 \ -Ibuild/tables-generated/block -Ibuild/tables-generated/pointers \ -Ibuild/tables-generated/p2 -Ibuild/tables-generated/messages -Ibuild/tables-generated/stream \ - -Ibuild/tables-generated/m1 -Ibuild/tables-generated/m2 -Ibuild/tables-generated/a1 -Ibuild/tables-generated/a2 -Ibuild/tables-generated/g1 -Ibuild/tables-generated/k1 -Ibuild/tables-generated/k2 -Ibuild/tables-generated/w1 -Ibuild/tables-generated/w2 -Ibuild/tables-generated/r1 -Ibuild/tables-generated/r2 -Ibuild/tables-generated/blobs -Itest/tables -Ibuild/tables-generated/scalars -Ibuild/tables-generated/scalars2 -Ibuild/tables-generated/backend -Ibuild/tables-generated/vocab -Ibuild/tables-generated/vocab9 -Ibuild/tables-generated/arms -Ibuild/tables-generated/wide -I$(SERIALIZE) + -Ibuild/tables-generated/m1 -Ibuild/tables-generated/m2 -Ibuild/tables-generated/a1 -Ibuild/tables-generated/a2 -Ibuild/tables-generated/g1 -Ibuild/tables-generated/k1 -Ibuild/tables-generated/k2 -Ibuild/tables-generated/w1 -Ibuild/tables-generated/w2 -Ibuild/tables-generated/r1 -Ibuild/tables-generated/r2 -Ibuild/tables-generated/blobs -Itest/tables -Ibuild/tables-generated/scalars -Ibuild/tables-generated/scalars2 -Ibuild/tables-generated/backend -Ibuild/tables-generated/vocab -Ibuild/tables-generated/vocab9 -Ibuild/tables-generated/arms -Ibuild/tables-generated/rt1 -Ibuild/tables-generated/wide -I$(SERIALIZE) CONFORMANCE_SOURCES = build/tables-generated/examples/TablesTable.cpp \ build/tables-generated/w1/W1Table.cpp build/tables-generated/w2/W2Table.cpp \ build/tables-generated/r1/R1Table.cpp build/tables-generated/r2/R2Table.cpp \ diff --git a/sabotage b/sabotage new file mode 100755 index 0000000000000000000000000000000000000000..9a5c6bb72658c9867d6d10f1beee1e1dd098dc54 GIT binary patch literal 2605010 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 lGT^}VseyBI|t%3QX*+bNeo$*3f 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

Unj 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

czs`x<3q|#!A7UAm>!$#K=Zg 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�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⁢7qpFOK1^-CjD9||vCGcRkE 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

fDoyde-yq3S){815xXhi7mG8`jvparhIJ*Rv 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¨%}>XuqPLMCikFuza!lc! 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

vSQ4Au2rJ2-rrxV7AR_9heIms4H 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 #}_miM1x9 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%0DF&&f~gt64c3pUd6NFu&`@ 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ΠlW96r_p>e4D+;gFI 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 saved; // the bodies' saves, back to back in body order +}; + +struct RetainCodec +{ + const char * unit; + const char * root; + bool message; + bool ( *run )( const uint8_t * announcement, int64_t announcement_bytes, + const uint8_t * wire, int64_t wire_bytes, + bool short_buffer, int64_t id_capacity, RetainAnswer & answer ); +}; + +// the roomy capacity a `full` row takes, the page's own C/8 bound beside it, a +// receiver's room for a LARGER unit's vocabulary (§3.3), and the form's own +// batch bound +static const int64_t kRetainRoomy = 1 << 20; +static const int64_t kRetainMessageEntries = 256; +static const int64_t kRetainBatchCap = 256; + +#define RETAINCODEC( unit_key, ns, type ) \ + { \ + unit_key, #type, false, \ + []( const uint8_t *, int64_t, const uint8_t * wire, int64_t n, \ + bool short_buffer, int64_t id_capacity, RetainAnswer & answer ) { \ + std::vector bytes( (size_t) kRetainRoomy, 0 ); \ + std::vector ids( \ + (size_t) ( id_capacity < 0 ? kRetainRoomy / 8 : id_capacity ) ); \ + int64_t need = ns::type##LoadMeasure( wire, n ); \ + if ( need < 0 ) return false; \ + int64_t capacity = kRetainRoomy; \ + if ( short_buffer ) \ + { \ + /* ONE BYTE SHORT OF THE LAST RECORD, which is this port's own */ \ + /* full load less one: a record's byte cost is the port's (§6.6) */ \ + std::vector probe_region( (size_t) need, 0 ); \ + ns::TableRetain probe; \ + probe.bytes = bytes.data(); \ + probe.capacity = kRetainRoomy; \ + probe.ids = ids.data(); \ + probe.id_capacity = (int32_t) ids.size(); \ + ns::TableReport ignored; \ + if ( ns::type##LoadRetain( probe_region.data(), need, wire, n, &probe, &ignored ) == NULL ) return false; \ + capacity = probe.used - 1; \ + } \ + std::vector region( (size_t) need, 0 ); \ + ns::TableRetain retain; \ + retain.bytes = bytes.data(); \ + retain.capacity = capacity; \ + retain.ids = ids.data(); \ + retain.id_capacity = (int32_t) ids.size(); \ + ns::TableReport load; \ + const ns::type * root = ns::type##LoadRetain( region.data(), need, wire, n, &retain, &load ); \ + if ( root == NULL ) return false; \ + answer.retained = load.retained; \ + answer.retain_lost = load.retain_lost; \ + answer.unknown = load.unknown; \ + ns::TableReport save; \ + int64_t size = ns::type##MeasureRetain( root, &retain ); \ + if ( size < 0 ) return false; \ + answer.saved.assign( (size_t) size, 0 ); \ + if ( ns::type##SaveRetain( root, &retain, answer.saved.data(), size, &save ) != size ) return false; \ + answer.save_lost = save.retain_lost; \ + return true; \ + } \ + } + +#define RETAINMSGCODEC( unit_key, ns, type ) \ + { \ + unit_key, #type, true, \ + []( const uint8_t * a, int64_t an, const uint8_t * wire, int64_t n, \ + bool short_buffer, int64_t id_capacity, RetainAnswer & answer ) { \ + std::vector entries( (size_t) kRetainMessageEntries ); \ + ns::TableVocabulary vocabulary( entries.data(), kRetainMessageEntries ); \ + ns::TableReport open; \ + if ( !ns::AnnounceRead( vocabulary, a, an, &open ) ) return false; \ + int64_t need = ns::type##LoadMeasure( vocabulary, wire, n ); \ + if ( need < 0 ) return false; \ + std::vector roots( (size_t) kRetainBatchCap, NULL ); \ + std::vector > stores( (size_t) kRetainBatchCap ); \ + std::vector > lists( (size_t) kRetainBatchCap ); \ + std::vector retains( (size_t) kRetainBatchCap ); \ + for ( size_t i = 0; i < retains.size(); i++ ) \ + { \ + stores[i].assign( (size_t) kRetainRoomy, 0 ); \ + lists[i].resize( (size_t) ( id_capacity < 0 ? kRetainRoomy / 8 : id_capacity ) ); \ + retains[i].bytes = stores[i].data(); \ + retains[i].capacity = kRetainRoomy; \ + retains[i].ids = lists[i].data(); \ + retains[i].id_capacity = (int32_t) lists[i].size(); \ + } \ + (void) short_buffer; /* no message row asks for the short rule yet */ \ + std::vector region( (size_t) need + 16, 0 ); \ + uint8_t * base = (uint8_t *) ( ( (uintptr_t) region.data() + 15 ) & ~(uintptr_t) 15 );\ + int64_t count = (int64_t) roots.size(); \ + ns::TableReport load; \ + if ( !ns::type##LoadRetainMessages( roots.data(), &count, base, need, vocabulary, \ + wire, n, retains.data(), &load ) ) return false; \ + answer.retained = load.retained; \ + answer.retain_lost = load.retain_lost; \ + answer.unknown = load.unknown; \ + ns::TableReport save; \ + for ( int64_t b = 0; b < count; b++ ) \ + { \ + int64_t size = ns::type##MeasureRetain( roots[b], &retains[b] ); \ + if ( size < 0 ) return false; \ + std::vector one( (size_t) size, 0 ); \ + if ( ns::type##SaveRetain( roots[b], &retains[b], one.data(), size, &save ) != size ) return false; \ + answer.saved.insert( answer.saved.end(), one.begin(), one.end() ); \ + } \ + answer.save_lost = save.retain_lost; \ + return true; \ + } \ + } + +static const RetainCodec retain_codecs[] = { + RETAINCODEC( "tblrt1", tblrt1, Node ), + RETAINMSGCODEC( "tblrt1", tblrt1, Node ), +}; + +static const RetainCodec * find_retain_codec( const std::string & unit, const std::string & root, bool message ) +{ + for ( size_t i = 0; i < sizeof( retain_codecs ) / sizeof( retain_codecs[0] ); i++ ) + { + if ( unit == retain_codecs[i].unit && root == retain_codecs[i].root && message == retain_codecs[i].message ) + { + return &retain_codecs[i]; + } + } + return NULL; +} + static const MsgCodec * find_msg_codec( const std::string & unit, const std::string & root ) { for ( size_t i = 0; i < sizeof( msg_codecs ) / sizeof( msg_codecs[0] ); i++ ) @@ -832,6 +988,69 @@ static int surface_message( const std::string & out ) return 0; } +// THE RETAIN SURFACES (docs/SPEC-TABLES.md §6.6): the COUNTERS on one and the +// BYTES on the other, so each is one shape. A row's `retain` line carries the +// wire and the two capacities; nothing about the answer reaches the driver. +static bool retain_row( const std::vector & f, RetainAnswer & answer ) +{ + // retain + // retain-message + const bool message = f[0] == "retain-message"; + const size_t at = message ? 1 : 0; + const std::string unit = f[2 + at], root = f[3 + at], wire_path = f[4 + at]; + const bool short_buffer = f[5 + at] == "short"; + int64_t ids = -1; + if ( f[6 + at] != "full" ) { ids = (int64_t) strtoll( f[6 + at].c_str(), NULL, 10 ); } + + std::vector announcement; + if ( message ) + { + std::string path; + for ( size_t j = 0; j < manifest_lines.size(); j++ ) + { + const std::vector & c = manifest_lines[j].field; + if ( c[0] == "connection" && c[1] == f[2] ) { path = c[4]; break; } + } + if ( path.empty() ) { fprintf( stderr, "driver: no connection %s\n", f[2].c_str() ); return false; } + if ( !slurp( path.c_str(), announcement ) ) { fprintf( stderr, "driver: cannot read %s\n", path.c_str() ); return false; } + } + std::vector wire; + if ( !slurp( wire_path.c_str(), wire ) ) { fprintf( stderr, "driver: cannot read %s\n", wire_path.c_str() ); return false; } + const RetainCodec * codec = find_retain_codec( unit, root, message ); + if ( codec == NULL ) { fprintf( stderr, "driver: no retain codec for %s.%s\n", unit.c_str(), root.c_str() ); return false; } + return codec->run( announcement.data(), (int64_t) announcement.size(), + wire.data(), (int64_t) wire.size(), short_buffer, ids, answer ); +} + +static int surface_retain( const std::string & out ) +{ + for ( size_t i = 0; i < manifest_lines.size(); i++ ) + { + const std::vector & f = manifest_lines[i].field; + if ( f[0] != "retain" && f[0] != "retain-message" ) continue; + RetainAnswer answer; + if ( !retain_row( f, answer ) ) return 1; + char text[128]; + int n = snprintf( text, sizeof( text ), "%d,%d,%d %d\n", + answer.retained, answer.retain_lost, answer.unknown, answer.save_lost ); + if ( !spill( out, f[1], text, (size_t) n ) ) return 1; + } + return 0; +} + +static int surface_retain_save( const std::string & out ) +{ + for ( size_t i = 0; i < manifest_lines.size(); i++ ) + { + const std::vector & f = manifest_lines[i].field; + if ( f[0] != "retain" && f[0] != "retain-message" ) continue; + RetainAnswer answer; + if ( !retain_row( f, answer ) ) return 1; + if ( !spill( out, f[1], answer.saved.data(), answer.saved.size() ) ) return 1; + } + return 0; +} + static int surface_report( const std::string & out ) { for ( size_t i = 0; i < manifest_lines.size(); i++ ) @@ -1296,7 +1515,7 @@ int main( int argc, char ** argv ) const std::string surface = argv[2]; if ( surface == "list" ) { - printf( "wire\nmessage\nreport\njson-read\njson-write\njson-hostile\ncook-write\nblock\nblock-foreign\nblock-dump\nforgery\nblock-reason\n" ); + printf( "wire\nmessage\nreport\nretain\nretain-save\njson-read\njson-write\njson-hostile\ncook-write\nblock\nblock-foreign\nblock-dump\nforgery\nblock-reason\n" ); return 0; } if ( argc < 4 ) @@ -1309,6 +1528,8 @@ int main( int argc, char ** argv ) if ( surface == "wire" ) return surface_wire( out ); if ( surface == "message" ) return surface_message( out ); if ( surface == "report" ) return surface_report( out ); + if ( surface == "retain" ) return surface_retain( out ); + if ( surface == "retain-save" ) return surface_retain_save( out ); if ( surface == "json-read" ) return surface_json_read( out ); if ( surface == "json-write" ) return surface_json_write( out ); if ( surface == "json-hostile" ) return surface_json_hostile( out ); diff --git a/test/conformance/harness/manifest.go b/test/conformance/harness/manifest.go index 8b085aca2..237912869 100644 --- a/test/conformance/harness/manifest.go +++ b/test/conformance/harness/manifest.go @@ -265,11 +265,69 @@ type Message struct { MessageWire string } +// RetainCase is one RETAIN-UNKNOWN row (docs/SPEC-TABLES.md §6.6): a wire +// loaded with retention, the counters that load owes, and the file the pair +// writes back. +// +// THE TWO CAPACITIES ARE STATED AS RULES AND NOT AS NUMBERS where a number +// would not travel. A record's BYTE cost is the port's own, so `Short` says ONE +// BYTE SHORT OF THE LAST RECORD — a leg loads once at a capacity the whole load +// fits in, reads what it used, and loads again one byte under that — and two +// layouts then drop the same record rather than different ones. The ID LIST's +// capacity is a COUNT and travels as one, so `Ids` is either full or the +// entries the caller's list holds. +// +// A MESSAGE row is the form-2 one (§3.3): the wire is a BATCH, `Connection` +// names the announcement its references resolve against, and the SAVES are the +// FILE form, one a body, back to back in body order — which is the one +// direction retention crosses the forms, because a form-2 SaveRetain refuses by +// name. +type RetainCase struct { + Name string + Unit string // the READER's unit; empty on a message row, which names a connection + Connection string // the announcement a message row resolves against + Root string + Wire string + Short bool // the retention buffer is one byte short of the last record + Ids int // the caller's id-list entries; -1 is full + Load RetainCounts + SaveLost int // the `retain_lost` the SAVE adds + Saves []string // the pinned saves, in body order; empty is a row that does not save + Message bool +} + +// RetainCounts is a retaining load's own three: the two retention counters and +// the `unknown` they ride beside, which retention never moves. +type RetainCounts struct{ Retained, RetainLost, Unknown int } + +func (c RetainCounts) String() string { + return fmt.Sprintf("%d,%d,%d", c.Retained, c.RetainLost, c.Unknown) +} + +// ParseRetainCounts reads `,,`. +func ParseRetainCounts(text string) (RetainCounts, error) { + parts := strings.Split(text, ",") + if len(parts) != 3 { + return RetainCounts{}, fmt.Errorf("%q is not retained,retain_lost,unknown", text) + } + var c RetainCounts + into := []*int{&c.Retained, &c.RetainLost, &c.Unknown} + for i, p := range parts { + v, err := strconv.Atoi(p) + if err != nil { + return RetainCounts{}, fmt.Errorf("%q is not a count in %q", p, text) + } + *into[i] = v + } + return c, nil +} + // Manifest is the whole registry. type Manifest struct { Units []Unit Connections []Connection Messages []Message + Retains []RetainCase Instances []Instance Reports []ReportCase Hostiles []Hostile @@ -370,6 +428,57 @@ func ReadManifest(path, jsonDir string) (*Manifest, error) { return nil, fmt.Errorf("%s: message takes name, connection, root, file-form wire, message-form wire", where) } m.Messages = append(m.Messages, Message{Name: f[1], Connection: f[2], Root: f[3], FileWire: f[4], MessageWire: f[5]}) + case "retain", "retain-message": + // retain + // retain-message ... + rc := RetainCase{Name: f[1], Message: f[0] == "retain-message"} + want := 10 + if rc.Message { + want = 11 + } + if len(f) != want { + return nil, fmt.Errorf("%s: %s takes %d fields and this line has %d", where, f[0], want, len(f)) + } + // A MESSAGE ROW NAMES BOTH PEERS: the CONNECTION whose announcement + // its references resolve against, which is the sender's, and the + // READER's own unit, which is the build that cannot name what the + // sender wrote (docs/SPEC-TABLES.md §3.3, §6.6). + if rc.Message { + rc.Connection, rc.Unit = f[2], f[3] + f = append(f[:2], f[3:]...) // the columns below line up with the file row's + } else { + rc.Unit = f[2] + } + rc.Root, rc.Wire = f[3], f[4] + switch f[5] { + case "full": + case "short": + rc.Short = true + default: + return nil, fmt.Errorf("%s: %q is not a retention capacity; it is full or short", where, f[5]) + } + rc.Ids = -1 + if f[6] != "full" { + n, err := strconv.Atoi(f[6]) + if err != nil || n < 0 { + return nil, fmt.Errorf("%s: %q is not an id-list capacity", where, f[6]) + } + rc.Ids = n + } + counts, err := ParseRetainCounts(f[7]) + if err != nil { + return nil, fmt.Errorf("%s: %w", where, err) + } + rc.Load = counts + lost, err := strconv.Atoi(f[8]) + if err != nil || lost < 0 { + return nil, fmt.Errorf("%s: %q is not the save's own retain_lost", where, f[8]) + } + rc.SaveLost = lost + if f[9] != "-" { + rc.Saves = strings.Split(f[9], ",") + } + m.Retains = append(m.Retains, rc) case "report": if len(f) != 5 { return nil, fmt.Errorf("%s: report takes case, unit, root, wire", where) diff --git a/test/conformance/harness/message_test.go b/test/conformance/harness/message_test.go index aacd0bbb6..d46527ed6 100644 --- a/test/conformance/harness/message_test.go +++ b/test/conformance/harness/message_test.go @@ -170,8 +170,16 @@ func TestTheTailIsUnconditional(t *testing.T) { entries := ir.TableVocabulary(unit) var tables []uint64 for name := range ir.TableClosure(unit) { + // A MAP'S GENERATED ENTRY IS NOT A TABLE OF THE DECLARATION'S and + // its name is on no wire, so the tail never names it (§2.8, §20.2). + // The vocabulary skips it by `MapEntryOf`, and so does this: no + // connection unit carried a map until the retain rows landed one. + if st := unit.Tables[name]; st != nil && st.MapEntryOf != "" { + continue + } if unit.Tables[name] != nil { - tables = append(tables, ir.TableWireId(name)) + // the id is the table's WIRE name, so a `was` rename moves no slot + tables = append(tables, ir.TableWireId(unit.Tables[name].WireName())) } } // the tail is the last 4 + one-per-table entries, in the fixed order diff --git a/test/conformance/harness/retain_test.go b/test/conformance/harness/retain_test.go new file mode 100644 index 000000000..ad93a3154 --- /dev/null +++ b/test/conformance/harness/retain_test.go @@ -0,0 +1,143 @@ +package main + +import ( + "bytes" + "os" + "testing" + + "github.com/mas-bandwidth/schema/v2/internal/tabletext" + "github.com/mas-bandwidth/schema/v2/internal/tablewire" +) + +// THE ORACLE CLAIMS THE RETAIN SURFACE (docs/SPEC-TABLES.md §6.6). The +// compiler's engine is a third reading of §3 and §6.6, written from the page +// rather than from a backend, and this row drives it through EVERY `retain` and +// `retain-message` line of the manifest: the same wires, the same two +// capacities, and the same counters and saved bytes the C++ reference answers +// on the same rows. +// +// It is the manifest's own expectation that is checked here and not a second +// one. A row whose counters drift shows up in two places at once — here and in +// the matrix — which is what makes the manifest data rather than a restatement +// of what one engine happens to do. +func TestTheOracleAnswersEveryRetainRow(t *testing.T) { + m, _, u := corpus(t) + if len(m.Retains) == 0 { + t.Fatal("the manifest names no retain row") + } + for _, rc := range m.Retains { + t.Run(rc.Name, func(t *testing.T) { + // A MESSAGE ROW READS TWO FILES, because a batch's id table is + // somewhere else (§3.3): the CONNECTION's announcement carries it. + unitKey := rc.Unit + var vocabulary *tablewire.Vocabulary + if rc.Message { + c, err := m.LookupConnection(rc.Connection) + if err != nil { + t.Fatal(err) + } + // the announcement is the SENDER's and the row's unit column + // is the READER's, which is the build that cannot name what + // the sender wrote + _, vocabulary = announced(t, u, c) + } + unit, err := u.get(unitKey) + if err != nil { + t.Fatal(err) + } + model := tabletext.NewModel(unit) + def := model.Lookup(rc.Root) + if def == nil { + t.Fatalf("%s declares no root %s", unitKey, rc.Root) + } + wire := wireBytes(t, rc.Wire) + + load := func(capacity, ids int) ([]*tabletext.Instance, []*tablewire.Retain, tabletext.Report) { + t.Helper() + var report tabletext.Report + if !rc.Message { + inst := model.New(def) + store := &tablewire.Retain{Capacity: capacity, IdCapacity: ids} + ok, err := tablewire.DecodeRetain(model, inst, wire, store, &report) + if err != nil || !ok || report.Malformed { + t.Fatalf("the load reported damage on a sound wire: ok=%v err=%v %+v", ok, err, report) + } + return []*tabletext.Instance{inst}, []*tablewire.Retain{store}, report + } + count, err := tablewire.MessageCount(wire, vocabulary) + if err != nil { + t.Fatal(err) + } + insts := make([]*tabletext.Instance, count) + stores := make([]*tablewire.Retain, count) + for i := range insts { + insts[i] = model.New(def) + stores[i] = &tablewire.Retain{Capacity: capacity, IdCapacity: ids} + } + read, ok, err := tablewire.DecodeRetainMessages(model, insts, wire, vocabulary, stores, &report) + if err != nil || !ok || report.Malformed || read != count { + t.Fatalf("the load reported damage on a sound batch: read=%d ok=%v err=%v %+v", read, ok, err, report) + } + return insts, stores, report + } + + // THE CAPACITY RULES, applied rather than read as numbers: a + // record's byte cost is the port's own, so `short` is one byte + // under what THIS engine's own full load used (§6.6). + const roomy = 1 << 20 + ids := rc.Ids + if ids < 0 { + ids = roomy / 8 // the page's own C/8 bound, which no file reaches + } + capacity := roomy + if rc.Short { + _, full, _ := load(roomy, roomy/8) + used := 0 + for _, store := range full { + used += store.Used() + } + capacity = used - 1 + } + insts, stores, report := load(capacity, ids) + + got := RetainCounts{Retained: report.Retained, RetainLost: report.RetainLost, Unknown: report.Unknown} + if got != rc.Load { + t.Fatalf("the load says %s and the manifest says %s", got, rc.Load) + } + if report.KindMismatch != 0 || report.Clamped != 0 || report.Widened != 0 || report.Duplicate != 0 { + t.Fatalf("retention moved a read counter: %+v", report) + } + + // AND THE SAVE, which is the FILE form on every row: retention + // writing form 2 refuses by name (§3.3). + var save tabletext.Report + var saved []byte + for i, inst := range insts { + out, err := tablewire.EncodeRetain(model, inst, stores[i], &save) + if err != nil { + t.Fatal(err) + } + saved = append(saved, out...) + } + if save.RetainLost != rc.SaveLost { + t.Fatalf("the save lost %d and the manifest says %d", save.RetainLost, rc.SaveLost) + } + if len(rc.Saves) == 0 { + return + } + var want []byte + for _, path := range rc.Saves { + bs, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + want = append(want, bs...) + } + if !bytes.Equal(saved, want) { + t.Fatalf("the save is %d bytes and the pin is %d, and they differ at byte %d", + len(saved), len(want), firstDifference(saved, want)) + } + }) + } +} + diff --git a/test/conformance/harness/run.go b/test/conformance/harness/run.go index 0cfc46530..37920ae25 100644 --- a/test/conformance/harness/run.go +++ b/test/conformance/harness/run.go @@ -22,7 +22,7 @@ import ( ) // surfaces, in the order the matrix prints them. -var surfaces = []string{"wire", "message", "report", "json-read", "json-write", "json-hostile", +var surfaces = []string{"wire", "message", "report", "retain", "retain-save", "json-read", "json-write", "json-hostile", "cook", "cook-write", "cook-foreign", "block", "block-foreign", "block-dump", "forgery", "cook-forgery", "cook-reason", "block-reason"} @@ -161,6 +161,25 @@ func deriveManifest(m *Manifest, path string) error { for _, msg := range m.Messages { fmt.Fprintf(&b, "message %s %s %s %s %s\n", msg.Name, msg.Connection, msg.Root, msg.FileWire, msg.MessageWire) } + for _, rc := range m.Retains { + // THE ANSWER IS WITHHELD, as it is everywhere else: a driver is handed + // the wire and the two capacities and nothing about the counters or the + // bytes it owes (docs/SPEC-TABLES.md §6.6). `short` and `full` travel as + // the RULES they are, because a record's byte cost is the port's own. + kind, who := "retain", rc.Unit + if rc.Message { + kind, who = "retain-message", rc.Connection+" "+rc.Unit + } + ids := "full" + if rc.Ids >= 0 { + ids = strconv.Itoa(rc.Ids) + } + capacity := "full" + if rc.Short { + capacity = "short" + } + fmt.Fprintf(&b, "%s %s %s %s %s %s %s\n", kind, rc.Name, who, rc.Root, rc.Wire, capacity, ids) + } for _, r := range m.Reports { fmt.Fprintf(&b, "report %s %s %s %s\n", r.Name, r.Unit, r.Root, r.Wire) } @@ -228,6 +247,34 @@ func expectations(m *Manifest, surface string, reports map[string]Counts, jsonDi } out = append(out, expectation{msg.Name, want}) } + case "retain": + // RETAIN-UNKNOWN's COUNTERS (docs/SPEC-TABLES.md §6.6): the load's two + // beside the `unknown` retention never moves, and the save's own + // `retain_lost` behind them. The bytes are the other surface's, so each + // of the two is one shape. + for _, rc := range m.Retains { + out = append(out, expectation{rc.Name, []byte(rc.Load.String() + " " + strconv.Itoa(rc.SaveLost) + "\n")}) + } + case "retain-save": + // AND THE BYTES THE PAIR WRITES BACK, which a counter cannot see: a + // dropped record moves a field out of a body and every reference behind + // it. A row that does not save is not a case here. A MESSAGE row's + // saves are FILES, one a body, back to back in body order, because a + // form-2 SaveRetain refuses by name (§3.3). + for _, rc := range m.Retains { + if len(rc.Saves) == 0 { + continue + } + var want []byte + for _, path := range rc.Saves { + bytes, err := os.ReadFile(path) + if err != nil { + return nil, err + } + want = append(want, bytes...) + } + out = append(out, expectation{rc.Name, want}) + } case "json-write": for _, i := range m.Instances { if i.NoText { diff --git a/test/tables/retain_main.cpp b/test/tables/retain_main.cpp index 9fc545338..ef7f1fd06 100644 --- a/test/tables/retain_main.cpp +++ b/test/tables/retain_main.cpp @@ -994,6 +994,11 @@ static void message_form() uint8_t announcement[ 8192 ]; const int64_t a = tblrt2::Announce( announcement, sizeof( announcement ) ); CHECK( a > 0 ); + // THE CONNECTION IS A PINNED VECTOR TOO, because the conformance manifest + // names it: an announcement is an ordinary form-1 file, and the retain rows + // that read a batch resolve against this one (testdata/conformance/tables). + pin_golden( "retain_conn", announcement, a ); + printf( "retain: RT2's build version is 0x%016llx\n", (unsigned long long) tblrt2::BuildVersion ); static tblrt1::TableMessageEntry entries[ 128 ]; tblrt1::TableVocabulary vocabulary( entries, 128 ); tblrt1::TableReport announced; diff --git a/testdata/conformance/tables/MANIFEST.txt b/testdata/conformance/tables/MANIFEST.txt index a72a07647..5b9b857a4 100644 --- a/testdata/conformance/tables/MANIFEST.txt +++ b/testdata/conformance/tables/MANIFEST.txt @@ -903,3 +903,53 @@ refusal block_count_past_extent bad_layout refusal block_count_past_maximum bad_layout refusal block_offset_overflow bad_layout refusal block_extent_padding truncated + +# ---- RETAIN-UNKNOWN (docs/SPEC-TABLES.md §6.6) ------------------------------ +# +# THE RT SET is the reader and the two newer builds: RT1 cannot name what RT2 +# and RT3 wrote, and every row below is one §6.6 owes. The wires are the same +# pinned vectors test/tables/retain_main.cpp writes, and the counters are the +# hand-authored expectation. +# +# `capacity` is `full`, a buffer the whole load fits in, or `short`, ONE BYTE +# SHORT of the last record: a record's byte cost is the port's own, so the +# short row is stated as a rule a leg applies rather than as a number two +# layouts would read differently. `ids` is `full` or the ENTRIES the caller's +# retained-id list holds, which is a COUNT and is comparable. +unit tblrt1 test/tables/RT1.schema +unit tblrt2 test/tables/RT2.schema +unit tblrt3 test/tables/RT3.schema + +# THE CONNECTION the message-form row resolves against: RT2's own announcement, +# read by RT1, which is a receiver meeting a LARGER unit (§3.3). +connection retain_conn tblrt2 0x59185ac86252d03a testdata/wire/tables/retain_conn.bin + +# THE ROUND TRIP AT DEPTH, and the two capacities. The first save is a pinned +# byte string of its own: moving a field changes the order ids are first used +# in, so the trailer is permuted and every reference moves with it. +retain retain_round_trip tblrt1 Node testdata/wire/tables/retain_rt2.bin full full 9,2,11 0 testdata/wire/tables/retain_rt1_save.bin +retain retain_truncated tblrt1 Node testdata/wire/tables/retain_rt2.bin short full 8,3,11 0 - +retain retain_ids_short tblrt1 Node testdata/wire/tables/retain_rt2.bin full 2 9,2,11 1 testdata/wire/tables/retain_rt1_save_id_short.bin + +# THE FIVE EXCLUDED CLASSES a wire can carry to the unknown arm, one row each +# and one retain_lost each, with `retained` unmoved. The NODE-INDEX class's row +# is the RECURSIVE shape, which is the widest case it has: an unknown outer +# table holding a nested pointer three bodies down. The SIXTH class, the +# reserved node-table field, has no row, because it is excluded by construction +# and a test cannot reach it. +retain retain_node_index tblrt1 Node testdata/wire/tables/retain_excluded_2.bin full full 0,1,1 0 - +retain retain_enum_variant tblrt1 Node testdata/wire/tables/retain_excluded_3.bin full full 0,1,1 0 - +retain retain_union_arm tblrt1 Node testdata/wire/tables/retain_excluded_4.bin full full 0,1,1 0 - +retain retain_keyed_slot tblrt1 Node testdata/wire/tables/retain_excluded_5.bin full full 0,1,1 0 - +retain retain_node_record tblrt1 Node testdata/wire/tables/retain_rt3.bin full full 0,1,1 0 - + +# THE MESSAGE FORM'S TAIL (§3.3): a form-2 batch loaded with retention against +# the connection's announced vocabulary and saved as FILES, which is the one +# direction retention crosses the forms. The batch's two bodies take one region +# and one retention buffer each, and the saves ride back to back in body order. +# `unknown` is SEVENTEEN where the two retention counters sum to sixteen, and +# the seventeenth is the plain read's own: a bit stream has to be walked past, +# so the DISCARDED SLOT's element body is decoded where a file's reader steps +# over it by its length, and the field inside it that RT1 cannot name counts +# there. +retain-message retain_message_tail retain_conn tblrt1 Node testdata/wire/tables/retain_message.bin full full 10,6,17 0 testdata/wire/tables/retain_message_save_0.bin,testdata/wire/tables/retain_message_save_1.bin diff --git a/testdata/wire/tables/retain_conn.bin b/testdata/wire/tables/retain_conn.bin new file mode 100644 index 0000000000000000000000000000000000000000..9132d362f2125ab04ac8de17d7d106ae09e81fd2 GIT binary patch literal 571 zcmZQ%?W|CefZFx9e@w_mY^7ly%ujGDp`FlSEGg%n9 z7&txrGuO`c-Y>|$DM-vu()TY&(A6wVT+;RnJMZTu9xjrruZQt)?Eb(r`^<0MVirbr zhA@N8udXCE+yE(s846-+d{AAmE64Du;F6awYgCp>p5kqjPVU>acFz$WfzHTndhc8E z<>cBYb;S3x`RMZI>p1%FZ>g~3V_@Osc^UMuap%0d0?fQOb_*ZnJ;J@8pP6S?{28Hs zF2UeMt{ghcHy!0;_zwj9ypD|}nQLd2?}za-PgkxKdZ!6?`GtSa`hM*Hogw&hUDKtg zYe&8K7?=dFNXPZ3zkO!FYcOx$v+Ey~LU^xq9VyqGy~0TDjmgP>5>@l=@L%7v?ZRyP z!}kQ3c;}TiNKX9yiJNzRH<&%yuG^l=jbx-Q)VTOZ2tve(a ze^z0TU9n=$jrZ^7GMvonm9D({Vh_WykWI&C-!eMOdpAV)f~K$iDi#K9g}1G{RgZP? zE?01yIy+IljD;a (uint64_t) %d ? (int32_t) %d : (int32_t) n%s; // SABOTAGED: the clamp is off the boundary\\n\", ind, sfx, sfx, f.Type.Size, f.Type.Size, sfx)\n", }}, } + +// THE MESSAGE FORM'S RETENTION (docs/SPEC-TABLES.md §3.3, §6.6). The unknown +// arm of a retaining message body SKIPS the entry and then re-reads the bits +// it delimited, which is the whole of the form-2 capture. Take the second half +// away and the skip is all that is left: the read is unchanged to the byte, +// every counter but the two retention ones stands, and nothing about the batch +// says a field was lost. What goes red is the pinned batch's own row. +var messageRetainSabotages = map[string][]edit{ + "message-retain-no-capture": {{ + old: "\t\tg.pf(\" TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at );\\n\")\n", + new: "\t\tg.pf(\" (void) unknown_at; // SABOTAGED: the message path never enters the resolving walk\\n\")\n", + }}, +} + +func init() { maps.Copy(sabotages, messageRetainSabotages) } From af87f57494b05752bf98b70b1eb12164b3dffde3 Mon Sep 17 00:00:00 2001 From: Rowan Date: Mon, 7 Sep 2026 06:45:29 -0400 Subject: [PATCH 4/9] =?UTF-8?q?tables:=20retire=20=C2=A76.6's=20owed=20lin?= =?UTF-8?q?es,=20and=20the=20pages=20that=20count=20them=20(#525)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §6.6's backend status names the reference as carrying `LoadRetainMessages` beside the three verbs, and what is still owed is the eight ports. Its HELD BY TEST list is present tense and says which nine rows are the conformance manifest's own data and why the rest are the two engines' own gates: a record's byte cost is the port's own, an allocation audit is a language's own instrument, and a refusal by name is a compile error rather than an answer a driver writes. §3.3's retention paragraph says both halves are carried, states that the record is the FILE form's own, and states the batch's one buffer a body. §3.3's claimed set names `LoadRetainMessages` beside the three plural verbs. VERSIONING's #525 line: the eight ports only. ROADMAP's retain-unknown cell moves to ✅ for cpp, and 339 cells become 340. Every gate §6.6 names for a backend exists in the reference: the three verbs, the fixed-class refusal by name, the message form's read, the second family of body functions, all sixteen HELD BY TEST rows in test/tables/retain_main.cpp, and the nine conformance rows the harness answers 9/9 and 3/3. No em dash rides in a line this branch adds. Co-Authored-By: Claude Opus 5 --- Makefile | 4 +- ROADMAP.md | 4 +- docs/SPEC-TABLES.md | 41 ++++++++++++++------ docs/VERSIONING.md | 8 ++-- internal/codegen/cpptable/messagecodec.go | 4 +- internal/codegen/cpptable/retain.go | 8 ++-- internal/tablewire/messagedecode.go | 4 +- internal/tablewire/retain_test.go | 4 +- internal/tablewire/retainmessage.go | 12 +++--- test/conformance/README.md | 21 ++++++++++ test/conformance/cpp/main.cpp | 6 +-- test/conformance/harness/manifest.go | 6 +-- test/conformance/harness/retain_test.go | 4 +- test/tables/retain_main.cpp | 4 +- testdata/conformance/tables/FORMAT.md | 31 +++++++++++++++ testdata/conformance/tables/MANIFEST.txt | 11 ++++++ testdata/golden/tables/arms/CarryTable.h | 8 ++-- testdata/golden/tables/arms/GateTable.h | 8 ++-- testdata/golden/tables/arms/NestTable.h | 8 ++-- testdata/golden/tables/arms/RingTable.h | 8 ++-- testdata/golden/tables/blobs/AssetsTable.h | 8 ++-- testdata/golden/tables/lists/HoldersTable.h | 8 ++-- testdata/golden/tables/lists/MigrateTable.h | 8 ++-- testdata/golden/tables/lists/ReportTable.h | 8 ++-- testdata/golden/tables/lists/SaveTable.h | 8 ++-- testdata/golden/tables/lists/SharedTable.h | 8 ++-- testdata/golden/tables/maps/CellsTable.h | 8 ++-- testdata/golden/tables/maps/ChunksTable.h | 8 ++-- testdata/golden/tables/maps/DepthTable.h | 8 ++-- testdata/golden/tables/maps/DocsTable.h | 8 ++-- testdata/golden/tables/maps/FleetTable.h | 8 ++-- testdata/golden/tables/maps/RowsTable.h | 8 ++-- testdata/golden/tables/maps/RunsTable.h | 8 ++-- testdata/golden/tables/maps/SlotsTable.h | 8 ++-- testdata/golden/tables/maps/SpansTable.h | 8 ++-- testdata/golden/tables/maps/TextTable.h | 8 ++-- testdata/golden/tables/pointers/GraphTable.h | 8 ++-- testdata/golden/tables/pointers/MarksTable.h | 8 ++-- testdata/golden/tables/pointers/PartsTable.h | 8 ++-- testdata/golden/tables/stream/StreamTable.h | 8 ++-- 40 files changed, 223 insertions(+), 141 deletions(-) diff --git a/Makefile b/Makefile index 2a2218c3c..9e6190b7d 100644 --- a/Makefile +++ b/Makefile @@ -3378,8 +3378,8 @@ tables-retain-message-form-negative-control: build/tables-generated/.stamp # bits it delimited, which is the whole of the form-2 capture. Take the second # half away and the skip is all that is left: the read is unchanged to the byte, # the six counters stand, and nothing about the batch says a field was lost. -# What goes red is the pinned batch's own row of the retain gate — `retained` at -# zero where the page says ten — which is what makes that row an instrument +# What goes red is the pinned batch's own row of the retain gate, `retained` at +# zero where the page says ten, which is what makes that row an instrument # rather than a restatement of what the emitter happens to do. # # The sabotage is one line of the emitter, through `go build -overlay`, so no diff --git a/ROADMAP.md b/ROADMAP.md index d07f38438..a3a8d545e 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -64,12 +64,12 @@ | unbounded arrays | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | the message form | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | bitpacked table message form | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | -| retain-unknown | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | +| retain-unknown | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | doc comments and tags in the descriptors | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | the unit registry, UnitView | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | widening on read, and the refusal reasons | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | -339 of 1180 cells are done. That is a count of features, not of effort, since the +340 of 1180 cells are done. That is a count of features, not of effort, since the cells are not equal in size. The table will be printed as it stands with every release from here. diff --git a/docs/SPEC-TABLES.md b/docs/SPEC-TABLES.md index c575fcf4a..a017710c5 100644 --- a/docs/SPEC-TABLES.md +++ b/docs/SPEC-TABLES.md @@ -4839,12 +4839,21 @@ damage (§3). A wire that had shipped would have taken `3` on that same rule. #### Retention, and what does not move **RETENTION (§6.6) ON A MESSAGE BODY: the load side is unchanged and the save -side REFUSES.** The C++ reference carries the WRITE half of this -paragraph, which is the refusal, and the form 2 `LoadRetain` is not built (§6.6). +side REFUSES.** The C++ reference and the compiler's own engine carry both +halves of this paragraph. `LoadRetain` reads a form-`2` body as it reads a file's, the resolving walk replacing every reference with the id it names, against the connection's -vocabulary instead of a trailer. **`SaveRetain` writing form `2` REFUSES BY NAME +vocabulary instead of a trailer. **THE RECORD IS THE FILE FORM'S OWN**, because +a retained record carries the field's bytes with every reference resolved so +that re-emitting it into any id table is correct, and the table it is re-emitted +into is a FILE's: a bitpacked value is read at the width its announced shape +states and written at the width the file form spells, which is this form's +third difference (above) taken in the one direction retention has. **A BATCH +TAKES ONE REGION AND ONE RETENTION BUFFER A BODY**, because each body carries +its own node directory inside that one region (above), so a record's first step +stays an index into the directory of the body it came from and `SaveRetain`'s +accounting is the file form's unchanged. **`SaveRetain` writing form `2` REFUSES BY NAME and returns `-1`.** A form-`2` writer names entries through slots of a vocabulary the compiler settled, and a retained id is by definition one this build's closure does not contain, so it has no slot AND no announced shape, which @@ -4958,6 +4967,11 @@ precedent. single message is the batch of one, and no singular verb is carried beside them: a surface with both would let a caller write one message a call and never learn that the batch is where the bandwidth is. +- **`LoadRetainMessages` beside them**, the form-`2` read with retention on + (§6.6), PLURAL for the same reason and claimed on §11's own rule because it + is emitted. It takes one retention buffer a BODY, parallel to the caller's + array of roots, and there is no measure and no save beside it: retention + writing form `2` is `SaveRetainMessages`, which refuses by name (above). - **The refusal reason values `no_vocabulary`, `second_announcement`, `vocabulary_too_large`, `batch_too_large` and `message_form_as_file`** beside the form byte's own `newer_form`. `vocabulary_too_large` covers both bounds, @@ -7390,9 +7404,15 @@ instance, and the discipline is to retain, edit values, and save, or to reload after a shape edit. The safety check is still read after `Save`, and it catches the drop. -**HELD BY TEST, when it lands.** The rows the conformance manifest owes, each -red for one reason, and **every row on a POINTERED unit** (the variable class, -above), the fixed class's own row excepted: +**HELD BY TEST.** The rows below, each red for one reason, and **every row on a +POINTERED unit** (the variable class, above), the fixed class's own row +excepted. **NINE OF THEM ARE THE CONFORMANCE MANIFEST'S OWN DATA**, on its +`retain` and `retain-message` lines: the round trip at depth, the truncated +record, the id list one short, the five excluded classes a wire can carry to the +unknown arm, and the message form's tail. The rest are the two engines' own +gates, because each asks something a shared row cannot: a record's BYTE cost is +the port's own, an allocation audit is a language's own instrument, and a +refusal by name is a compile error rather than an answer a driver writes. - a wire whose unknown fields sit at three depths, retained and re-emitted, the save pinned as a byte string of its own. Red if a field is lost, @@ -7482,11 +7502,10 @@ negative controls, one per engine, stand beside the fuzzer's (§4.2). **Backend status: the C++ REFERENCE and the ORACLE carry it, and no port does.** The reference emits `TableRetain`, the three verbs on every -variable-class root, the refusal on every fixed-class one, and a second family -of body functions beside the three the wire already had, so `Load`, `Measure` -and `Save` are unchanged. What is still owed is the eight ports and the MESSAGE -form's `LoadRetain` (§3.3): the form 2 write refuses by name and the form 2 -read is not built. +variable-class root, the refusal on every fixed-class one, the MESSAGE form's +own `LoadRetainMessages` beside them (§3.3), and a second family of body +functions beside the three the wire already had, so `Load`, `Measure` and +`Save` are unchanged. What is still owed is the eight ports. ## 7. The cooked form diff --git a/docs/VERSIONING.md b/docs/VERSIONING.md index 07587efe6..3efb162df 100644 --- a/docs/VERSIONING.md +++ b/docs/VERSIONING.md @@ -1071,10 +1071,10 @@ repository not yet behind it. The 3.0.0 release holds the list at zero. - #432: the cook triple, and the byte-order sentences in five places. - #441: the retired-names ledger. - #446: the evolution table's fixtures. -- #525: retain-unknown in the eight ports, the MESSAGE form's `LoadRetain`, - and the conformance rows. The C++ reference, the two report counters, - `internal/tablewire`'s own retention and the wire fuzzer's retention leg, - which needed it, are built. +- #525: retain-unknown in the eight ports. The C++ reference, the two report + counters, `internal/tablewire`'s own retention, the wire fuzzer's retention + leg, which needed it, the MESSAGE form's `LoadRetain` and the conformance + manifest's retain rows are built. - #522: `*wstring`, the unbounded twin of wide text — the blob record is specified and no backend emits one (SPEC-TABLES.md §2.5). The BOUNDED spelling's table half, kind `33`, has landed in the C++ reference and the diff --git a/internal/codegen/cpptable/messagecodec.go b/internal/codegen/cpptable/messagecodec.go index b591f319a..83596b6a2 100644 --- a/internal/codegen/cpptable/messagecodec.go +++ b/internal/codegen/cpptable/messagecodec.go @@ -73,8 +73,8 @@ func (g *tableGen) msgLoadCall(f *ir.Field, name, reader, expr string) string { } // retainStore is the caller's buffer as a NESTED READ takes it. A bit stream -// has to be walked past, so an element this build is DROPPING — one past its -// own array bound, one under a keyed key it cannot name — is decoded into a +// has to be walked past, so an element this build is DROPPING, one past its +// own array bound, one under a keyed key it cannot name, is decoded into a // scratch where a file's reader steps over it by its length. Nothing in that // body is a field of this region, so the store it captures into is none // (docs/SPEC-TABLES.md §6.6). diff --git a/internal/codegen/cpptable/retain.go b/internal/codegen/cpptable/retain.go index 2ea1e3570..1fa7870f2 100644 --- a/internal/codegen/cpptable/retain.go +++ b/internal/codegen/cpptable/retain.go @@ -1268,9 +1268,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -1509,8 +1509,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/internal/tablewire/messagedecode.go b/internal/tablewire/messagedecode.go index 2ab4c274c..1e281a689 100644 --- a/internal/tablewire/messagedecode.go +++ b/internal/tablewire/messagedecode.go @@ -156,8 +156,8 @@ type bitDecoder struct { // dropped runs one element's read with RETENTION OFF (docs/SPEC-TABLES.md // §6.6). A bit stream has to be walked past, so an element the reader is -// dropping — an unknown keyed slot's, a keyed key past this build's slots, an -// array element past this build's bound — is DECODED into a sink where a file's +// dropping, an unknown keyed slot's, a keyed key past this build's slots, an +// array element past this build's bound, is DECODED into a sink where a file's // reader steps over it by its length. Nothing in that body is a field of this // region: the slot or the element is what was excluded, and everything under it // went with it under that one `retain_lost`. diff --git a/internal/tablewire/retain_test.go b/internal/tablewire/retain_test.go index 003db64af..fc455ad80 100644 --- a/internal/tablewire/retain_test.go +++ b/internal/tablewire/retain_test.go @@ -734,8 +734,8 @@ func TestRetainMessageForm(t *testing.T) { // read's own: a bit stream has to be walked past, so the DISCARDED SLOT's // element body is decoded into a sink where a file's reader steps over it // by its length, and the field inside it that this build cannot name counts - // there. Retention keeps nothing under it — the slot is what was excluded - // and everything below it went with that one `retain_lost` — so the two + // there. Retention keeps nothing under it, the slot is what was excluded + // and everything below it went with that one `retain_lost`, so the two // retention counters are the numbers the file form gives. if report.Retained != 10 || report.RetainLost != 6 || report.Unknown != 17 { t.Fatalf("retained=%d retain_lost=%d unknown=%d, want 10 / 6 / 17", diff --git a/internal/tablewire/retainmessage.go b/internal/tablewire/retainmessage.go index 3cdfa033d..a541f8806 100644 --- a/internal/tablewire/retainmessage.go +++ b/internal/tablewire/retainmessage.go @@ -17,9 +17,9 @@ // copies the emit side, and nothing below is a second record layout. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain -// read's own verdict on an unknown entry is the skip's — a variant reference +// read's own verdict on an unknown entry is the skip's. A variant reference // that names an entry carrying a payload is damage whether or not this build -// retains — and running the skip first is what keeps that verdict exactly what +// retains, and running the skip first is what keeps that verdict exactly what // it was with retention off. The capture then re-reads the bits the skip // delimited, and a capture that lands anywhere but the skip's own end drops the // record: two engines that disagree about a payload's width would otherwise @@ -114,8 +114,8 @@ func (rs *resolver) msgId(d *bitDecoder, ref uint64) uint64 { return entry.Id } -// msgPayload is the resolving walk over ONE announced payload — a field's, an -// array element's, a union arm's — written out in the FILE form's own spelling. +// msgPayload is the resolving walk over ONE announced payload, a field's, an +// array element's, a union arm's, written out in the FILE form's own spelling. // // WHICH KINDS THE WALK TOUCHES is §6.6's list unchanged: kind 13, a body's // fields; kind 15, an arm id and then the arm's payload under this same rule; @@ -285,8 +285,8 @@ func (rs *resolver) msgText(d *bitDecoder, entry ir.TableVocabularyEntry) { } // msgElements is one array's or one keyed body's content: the element kind, the -// count, and the elements. A KEYED SLOT IS A TRIPLE — the key reference, the -// element's own length, and the element — and its keys resolve at every element +// count, and the elements. A KEYED SLOT IS A TRIPLE, the key reference, the +// element's own length, and the element, and its keys resolve at every element // kind (§3.2, §6.6). func (rs *resolver) msgElements(d *bitDecoder, entry ir.TableVocabularyEntry, depth int) { shape := entry.Shape diff --git a/test/conformance/README.md b/test/conformance/README.md index f6bc2e573..9e6316765 100644 --- a/test/conformance/README.md +++ b/test/conformance/README.md @@ -156,6 +156,8 @@ One process per surface, so a runtime starts once rather than once per case. | `wire` | `instance` | Load the wire file, Save, the bytes | the wire golden | | `message` | `message` | AnnounceRead the connection's announcement, LoadMessages the message-form batch against it, SaveMessages, the bytes | the message-form golden | | `report` | `report` | Load the wire file, the report as `u,k,w,c,d,m,verdict\n` | `reports.txt` | +| `retain` | `retain`, `retain-message` | LoadRetain the wire at the row's two capacities, MeasureRetain, SaveRetain, the counters as `,, \n` | the counters in the manifest | +| `retain-save` | the rows that name a save | the same round trip, the SAVED BYTES, one body after another | the pinned saves, back to back | | `json-read` | `instance` | FromJson `json/.json`, Save, the bytes | the wire golden | | `json-write` | `instance` | Load the wire file, ToJson, the text, as `.json` | `json/.json` | | `json-hostile` | `json-hostile` | FromJson `/.json`, the report as `u,k,w,c,d,m,verdict\n`, or `refused\n` | the verdict in the manifest | @@ -187,6 +189,25 @@ which is the wire form's own absence one grain up: a port carries the FILE form alone, and its `LoadMessages`, `MeasureMessages` and `SaveMessages` are the follow-on PORTING.md M20 already registers. +**THE TWO RETAIN SURFACES ARE ONE ROUND TRIP AND TWO SHAPES** +(docs/SPEC-TABLES.md §6.6): `retain` prints the COUNTERS and `retain-save` +writes the BYTES, split for the reason the block surfaces are: a counter cannot +see a record that moved out of a body, and a byte string cannot say which of the +two stores was short. Both run the same pair, so a leg that answers one answers +the other. + +**A ROW'S TWO CAPACITIES ARE RULES A DRIVER APPLIES, and one of them is the +whole reason they are not numbers.** A retained record's byte cost is the port's +own, so `short` means ONE BYTE SHORT OF THE LAST RECORD: the driver loads once +at a roomy capacity, reads what its own buffer used, and loads again one byte +under that. The ID LIST's capacity is a COUNT and travels as one. **The C++ +reference answers both surfaces and the eight ports print ABSENT**, which is the +same absence the `message` and `wire` surfaces already carry one grain up: a +port carries no retention at all, so `LoadRetain`, `MeasureRetain` and +`SaveRetain` are a missing FEATURE and not a failing test, and §6.6's own +backend status says so. A `retain-message` row needs the form-2 read beside +them, which no port has either. + **`cook-write` IS THE ONE SURFACE WHERE A LANGUAGE WRITES AN ACCELERATOR RATHER THAN READING ONE, and the expectation is the TOOL's file.** Every other cook surface asks whether a reader agrees about bytes somebody else produced; this diff --git a/test/conformance/cpp/main.cpp b/test/conformance/cpp/main.cpp index 59fce3267..0987775c2 100644 --- a/test/conformance/cpp/main.cpp +++ b/test/conformance/cpp/main.cpp @@ -50,7 +50,7 @@ #include "VocabTable.h" #include "Vocab9Table.h" // the RETAIN-UNKNOWN reader (docs/SPEC-TABLES.md §6.6): the older build, which -// cannot name what RT2 and RT3 wrote. Only the READER is here — the two newer +// cannot name what RT2 and RT3 wrote. Only the READER is here, the two newer // builds are writers of the pinned vectors and this driver never runs one. #include "RT1Table.h" // the POINTERED unit (docs/SPEC-TABLES.md §6.2): a region and a root pointer, @@ -452,9 +452,9 @@ static const MsgCodec msg_codecs[] = { // // A retain row is a REGION ROUND TRIP and only that: LoadRetain into a region, // then MeasureRetain and SaveRetain out of that same region. The row's two -// capacities are RULES rather than numbers — `short` is one byte under what +// capacities are RULES rather than numbers, `short` is one byte under what // this port's own full load used, because a record's byte cost is the port's -// own — so the codec below runs the load twice where the row asks for it. +// own, so the codec below runs the load twice where the row asks for it. // // THE MESSAGE ROW IS THE SAME PAIR WITH A FORM-2 LOAD (§3.3): the batch takes // one region and one retention buffer a body, the announcement carries the id diff --git a/test/conformance/harness/manifest.go b/test/conformance/harness/manifest.go index 237912869..4eacc5fcc 100644 --- a/test/conformance/harness/manifest.go +++ b/test/conformance/harness/manifest.go @@ -271,15 +271,15 @@ type Message struct { // // THE TWO CAPACITIES ARE STATED AS RULES AND NOT AS NUMBERS where a number // would not travel. A record's BYTE cost is the port's own, so `Short` says ONE -// BYTE SHORT OF THE LAST RECORD — a leg loads once at a capacity the whole load -// fits in, reads what it used, and loads again one byte under that — and two +// BYTE SHORT OF THE LAST RECORD, a leg loads once at a capacity the whole load +// fits in, reads what it used, and loads again one byte under that, and two // layouts then drop the same record rather than different ones. The ID LIST's // capacity is a COUNT and travels as one, so `Ids` is either full or the // entries the caller's list holds. // // A MESSAGE row is the form-2 one (§3.3): the wire is a BATCH, `Connection` // names the announcement its references resolve against, and the SAVES are the -// FILE form, one a body, back to back in body order — which is the one +// FILE form, one a body, back to back in body order, which is the one // direction retention crosses the forms, because a form-2 SaveRetain refuses by // name. type RetainCase struct { diff --git a/test/conformance/harness/retain_test.go b/test/conformance/harness/retain_test.go index ad93a3154..632a49032 100644 --- a/test/conformance/harness/retain_test.go +++ b/test/conformance/harness/retain_test.go @@ -17,8 +17,8 @@ import ( // on the same rows. // // It is the manifest's own expectation that is checked here and not a second -// one. A row whose counters drift shows up in two places at once — here and in -// the matrix — which is what makes the manifest data rather than a restatement +// one. A row whose counters drift shows up in two places at once, here and in +// the matrix, which is what makes the manifest data rather than a restatement // of what one engine happens to do. func TestTheOracleAnswersEveryRetainRow(t *testing.T) { m, _, u := corpus(t) diff --git a/test/tables/retain_main.cpp b/test/tables/retain_main.cpp index ef7f1fd06..2fa365964 100644 --- a/test/tables/retain_main.cpp +++ b/test/tables/retain_main.cpp @@ -1032,9 +1032,9 @@ static void message_form() CHECK( !report.malformed ); CHECK( allocations == before ); // RETENTION ALLOCATES NOTHING (§6.6) - // THE FIRST BODY carries eight retained fields — `extra`, `future` at four + // THE FIRST BODY carries eight retained fields, `extra`, `future` at four // more depths, the map entry's, the list element's, and `parcel`, the whole - // table the resolving walk reads — and six unknowns of the excluded + // table the resolving walk reads, and six unknowns of the excluded // classes: the enum variant `tier` names, the union arm `pick` names, the // keyed slot RT2's third variant writes, a field of kind 17, an array whose // element kind is 17, and a table whose payload meets a 17 three bodies diff --git a/testdata/conformance/tables/FORMAT.md b/testdata/conformance/tables/FORMAT.md index 3cb847350..dc1a1915f 100644 --- a/testdata/conformance/tables/FORMAT.md +++ b/testdata/conformance/tables/FORMAT.md @@ -38,6 +38,8 @@ unit ... instance [no-text] connection message +retain +retain-message report json-hostile cook @@ -75,6 +77,35 @@ refusal every reference is replaced by the id it names and every length recomputed, and their reference bytes are expected to differ, because a file's slots are its own first-use order and a connection's are the unit's projection order. +- **`retain` and `retain-message`** are RETAIN-UNKNOWN's rows + (docs/SPEC-TABLES.md §6.6): a wire loaded with retention on, the counters that + load owes, and the file the pair writes back. `` is the READER's, which + is the build that cannot name what the wire's writer wrote, and `` is + the table it loads into. + + **THE TWO CAPACITIES ARE STATED AS RULES AND NOT AS NUMBERS where a number + would not travel.** A retained record's byte cost is the PORT's own, the + page fixes what a record must carry and leaves the layout to the + implementation, so `` is `full`, a buffer the whole load fits in, + or `short`, ONE BYTE SHORT OF THE LAST RECORD: a leg loads once at a roomy + capacity, reads what it used, and loads again one byte under that. Two + layouts then drop the same record rather than different ones. `` is the + other store, and it IS comparable, because the id list's capacity is a COUNT: + `full`, or the entries the caller's list holds. + + `` is the LOAD's own three, `,,`, + and `` is the `retain_lost` the SAVE adds, read after it: the + report accumulates across the pair and the sum is what the safety check + wants. `` is the pinned save, or `-` where the row's whole expectation + is its counters; a row that saves more than one file lists them + comma-separated, in body order. + + **`retain-message` IS THE FORM-2 ROW** (§3.3): the wire is a BATCH, the + `` names the announcement its references resolve against, and the + SAVES are the FILE form, one a body, which is the one direction retention + crosses the forms, because `SaveRetain` writing form 2 refuses by name. A + batch takes one region and one retention buffer a body, so the saves are as + many files as the batch has bodies. - **`report`** is bytes read by a type that did not write them — the evolution class. The counters and the verdict live in `reports.txt`, keyed by ``. - **`json-hostile`** is one tree per rule the text form states (§16.2, §16.3, diff --git a/testdata/conformance/tables/MANIFEST.txt b/testdata/conformance/tables/MANIFEST.txt index 5b9b857a4..bb1c6ceaa 100644 --- a/testdata/conformance/tables/MANIFEST.txt +++ b/testdata/conformance/tables/MANIFEST.txt @@ -15,6 +15,17 @@ # testdata/conformance/tables/json/.json (§16). The same # instance both ways. # +# retain +# retain-message ... +# one RETAIN-UNKNOWN round trip (§6.6): the wire, the two capacities +# the caller declares, the counters the LOAD owes and the one the +# SAVE adds, and the file the pair writes back. The byte capacity is +# a RULE where a number would not travel, a record's byte cost is +# the port's own, so `full` and `short` say what a leg DOES rather +# than how many bytes it declares, and the id list, being a COUNT, +# travels as one. The message row is the form-2 read, whose save is +# the FILE form (§3.3). FORMAT.md states both shapes. +# # report # bytes read by a type that did not write them — the evolution class # (§4). The counters are the whole expectation, and they live in diff --git a/testdata/golden/tables/arms/CarryTable.h b/testdata/golden/tables/arms/CarryTable.h index 1d4eacd66..1f23ac0c5 100644 --- a/testdata/golden/tables/arms/CarryTable.h +++ b/testdata/golden/tables/arms/CarryTable.h @@ -4251,9 +4251,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4492,8 +4492,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/arms/GateTable.h b/testdata/golden/tables/arms/GateTable.h index fb451508e..a9ebd2c4c 100644 --- a/testdata/golden/tables/arms/GateTable.h +++ b/testdata/golden/tables/arms/GateTable.h @@ -4251,9 +4251,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4492,8 +4492,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/arms/NestTable.h b/testdata/golden/tables/arms/NestTable.h index 6cd57f00f..83e7a3a7b 100644 --- a/testdata/golden/tables/arms/NestTable.h +++ b/testdata/golden/tables/arms/NestTable.h @@ -4252,9 +4252,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4493,8 +4493,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/arms/RingTable.h b/testdata/golden/tables/arms/RingTable.h index 784cc9eb2..8b5467daf 100644 --- a/testdata/golden/tables/arms/RingTable.h +++ b/testdata/golden/tables/arms/RingTable.h @@ -4251,9 +4251,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4492,8 +4492,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/blobs/AssetsTable.h b/testdata/golden/tables/blobs/AssetsTable.h index bc5201390..41a6fc31c 100644 --- a/testdata/golden/tables/blobs/AssetsTable.h +++ b/testdata/golden/tables/blobs/AssetsTable.h @@ -4157,9 +4157,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4398,8 +4398,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/lists/HoldersTable.h b/testdata/golden/tables/lists/HoldersTable.h index 3e97ef490..cdf77684f 100644 --- a/testdata/golden/tables/lists/HoldersTable.h +++ b/testdata/golden/tables/lists/HoldersTable.h @@ -4288,9 +4288,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4529,8 +4529,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/lists/MigrateTable.h b/testdata/golden/tables/lists/MigrateTable.h index ed606e479..673fb6f5c 100644 --- a/testdata/golden/tables/lists/MigrateTable.h +++ b/testdata/golden/tables/lists/MigrateTable.h @@ -4288,9 +4288,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4529,8 +4529,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/lists/ReportTable.h b/testdata/golden/tables/lists/ReportTable.h index 79327f572..272dd543f 100644 --- a/testdata/golden/tables/lists/ReportTable.h +++ b/testdata/golden/tables/lists/ReportTable.h @@ -4288,9 +4288,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4529,8 +4529,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/lists/SaveTable.h b/testdata/golden/tables/lists/SaveTable.h index 0e195bd24..e39a25a5a 100644 --- a/testdata/golden/tables/lists/SaveTable.h +++ b/testdata/golden/tables/lists/SaveTable.h @@ -4288,9 +4288,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4529,8 +4529,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/lists/SharedTable.h b/testdata/golden/tables/lists/SharedTable.h index fce47b79c..2d96e5e3e 100644 --- a/testdata/golden/tables/lists/SharedTable.h +++ b/testdata/golden/tables/lists/SharedTable.h @@ -4288,9 +4288,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4529,8 +4529,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/maps/CellsTable.h b/testdata/golden/tables/maps/CellsTable.h index 81a7b1523..adf64015c 100644 --- a/testdata/golden/tables/maps/CellsTable.h +++ b/testdata/golden/tables/maps/CellsTable.h @@ -4397,9 +4397,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4638,8 +4638,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/maps/ChunksTable.h b/testdata/golden/tables/maps/ChunksTable.h index 54599fa71..c036a09df 100644 --- a/testdata/golden/tables/maps/ChunksTable.h +++ b/testdata/golden/tables/maps/ChunksTable.h @@ -4397,9 +4397,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4638,8 +4638,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/maps/DepthTable.h b/testdata/golden/tables/maps/DepthTable.h index dff7a6462..fd4a95826 100644 --- a/testdata/golden/tables/maps/DepthTable.h +++ b/testdata/golden/tables/maps/DepthTable.h @@ -4398,9 +4398,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4639,8 +4639,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/maps/DocsTable.h b/testdata/golden/tables/maps/DocsTable.h index 4e771afb4..9a396ad11 100644 --- a/testdata/golden/tables/maps/DocsTable.h +++ b/testdata/golden/tables/maps/DocsTable.h @@ -4397,9 +4397,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4638,8 +4638,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/maps/FleetTable.h b/testdata/golden/tables/maps/FleetTable.h index 0ac00ec12..f16195132 100644 --- a/testdata/golden/tables/maps/FleetTable.h +++ b/testdata/golden/tables/maps/FleetTable.h @@ -4397,9 +4397,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4638,8 +4638,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/maps/RowsTable.h b/testdata/golden/tables/maps/RowsTable.h index b65043c58..a3a933517 100644 --- a/testdata/golden/tables/maps/RowsTable.h +++ b/testdata/golden/tables/maps/RowsTable.h @@ -4398,9 +4398,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4639,8 +4639,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/maps/RunsTable.h b/testdata/golden/tables/maps/RunsTable.h index bc5d76e86..e5d8159d1 100644 --- a/testdata/golden/tables/maps/RunsTable.h +++ b/testdata/golden/tables/maps/RunsTable.h @@ -4398,9 +4398,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4639,8 +4639,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/maps/SlotsTable.h b/testdata/golden/tables/maps/SlotsTable.h index 92cb149c7..b9af4b139 100644 --- a/testdata/golden/tables/maps/SlotsTable.h +++ b/testdata/golden/tables/maps/SlotsTable.h @@ -4398,9 +4398,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4639,8 +4639,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/maps/SpansTable.h b/testdata/golden/tables/maps/SpansTable.h index db715d5bb..f3613c8cc 100644 --- a/testdata/golden/tables/maps/SpansTable.h +++ b/testdata/golden/tables/maps/SpansTable.h @@ -4398,9 +4398,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4639,8 +4639,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/maps/TextTable.h b/testdata/golden/tables/maps/TextTable.h index 226a9affe..b3163bc37 100644 --- a/testdata/golden/tables/maps/TextTable.h +++ b/testdata/golden/tables/maps/TextTable.h @@ -4397,9 +4397,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4638,8 +4638,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/pointers/GraphTable.h b/testdata/golden/tables/pointers/GraphTable.h index d727af246..bc454bf0e 100644 --- a/testdata/golden/tables/pointers/GraphTable.h +++ b/testdata/golden/tables/pointers/GraphTable.h @@ -4320,9 +4320,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4561,8 +4561,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/pointers/MarksTable.h b/testdata/golden/tables/pointers/MarksTable.h index 1704d5ebb..09fedc842 100644 --- a/testdata/golden/tables/pointers/MarksTable.h +++ b/testdata/golden/tables/pointers/MarksTable.h @@ -4317,9 +4317,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4558,8 +4558,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/pointers/PartsTable.h b/testdata/golden/tables/pointers/PartsTable.h index b1ce8fae0..8642f4dd8 100644 --- a/testdata/golden/tables/pointers/PartsTable.h +++ b/testdata/golden/tables/pointers/PartsTable.h @@ -4317,9 +4317,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4558,8 +4558,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) diff --git a/testdata/golden/tables/stream/StreamTable.h b/testdata/golden/tables/stream/StreamTable.h index 8ffe20e02..acbece913 100644 --- a/testdata/golden/tables/stream/StreamTable.h +++ b/testdata/golden/tables/stream/StreamTable.h @@ -4163,9 +4163,9 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet // message body produces is the FILE FORM'S OWN, to the byte: a retained record // carries the field's bytes with every reference resolved so that re-emitting // it into any id table is correct, and the table it is re-emitted into is a -// file's. The capture below is therefore a TRANSCODE as well as a resolve — a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a // bitpacked value is read at the width its announced shape states and written -// at the width the file form spells — and from there it is the same record, +// at the width the file form spells, and from there it is the same record, // laid down in the same slots and read back by the same emit walk. // // THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain @@ -4404,8 +4404,8 @@ inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) } // one array's or one keyed body's content: the element kind, the count, and the -// elements. A KEYED SLOT IS A TRIPLE — the key reference, the element's own -// length, and the element — and its keys resolve at EVERY element kind. +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) { if ( entry.elem_kind == 17 ) From 949d14e0d716fc34392a367784d83e545351c0e1 Mon Sep 17 00:00:00 2001 From: Rowan Date: Mon, 7 Sep 2026 06:48:09 -0400 Subject: [PATCH 5/9] tables: drop the sabotage binary a build left at the root (#525) `go build ./tools/sabotage` writes ./sabotage beside the tree, and one commit picked it up. The tool is run with `go run` everywhere it is used. Co-Authored-By: Claude Opus 5 --- sabotage | Bin 2605010 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 sabotage diff --git a/sabotage b/sabotage deleted file mode 100755 index 9a5c6bb72658c9867d6d10f1beee1e1dd098dc54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2605010 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 lGT^}VseyBI|t%3QX*+bNeo$*3f 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

Unj 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 z%0D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

czs`x<3q|#!A7UAm>!$#K=Zg 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�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⁢7qpFOK1^-CjD9||vCGcRkE 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

fDoyde-yq3S){815xXhi7mG8`jvparhIJ*Rv zAlbt_BR_@ZHSaD!vOB9%c)vY}Y(5p1hS}}~A@{qvru92Ws#d&JSD~-c#Ca}4`lUKc zU!`$gm-cB?D_*R#DuJsy{I zXw1wwVSeXw^#GQ)k`84$Y}n;y{TA zliyk;h!@-rTo|*=FCHIwKgJrjut~LIq*ZAtwCJM1M+T{0MdO?nA10T#MABOdCYQ(~ zAp&1CgTL6W1MV=5%f8$U{^C5X(!_6=V_W}zA1b=zxww6FTPz>QJQ0oA3mX}*4jdj1itFl=i82_AX3XatnYUy(!O{NjYYq=Y3{bq`|z> zc&@1N(miOeXd3rOSUTbrb&*HB)+P??#P3;D7kR|1ZCa&?b6A0AGwQpzqfN_%j7nn- zi?lQ>s1(j<559a~a8S3O=~fMRvm+NIW)qM)J7(1w+%#9ao34fvr|fLi7<_V~W}X$7 zqWZHTR*k{@8QKxdJL;|P<1}F)jMG%(#k!&(2wyS)sjrJ9qRh68yWSxX;3mzUd%kNDfm@=ebn;!YRk6=Id=01X4y@{r&SBC zj7kxwv1yP%dVu&7#77-Dmg%b$R(5LqhgNBvtBO*XG!uxoEHck{vnt?%IpU(u;Eai9 z2T3&`8NhAZ+p=x0RIR4ZGUF=&ftDcg#&%KY?s%lLdod|;2i&x8w4A%805Hq0@JGaj zPZ%9-`C8Y)Fzzo5C8fUV>sKYMY=wAOLJgh%?{cSN-Y`e2G|@ZAs#bh7Phf{wq{R8` z<9XU~9gCDzt@wCeZ%w`SG_I4fw^`!BIXRUkt{G$tO~N~f7nVfuOPTQKo(lh%Q&|ku zS(QRxmnIGuuH$7`mBn&rpm{E4BMWVs=uuWYGF2MRkLcoq-UEO&u`+uv7rGWJ9K(c2al<_NNIjrc~iiQR);W`z`S#T<>pgL!nvE6gKR zMA2zj#6@GUC_bFuYu zut`1>oKsLKoH<9+s5E0E@$R5)Y9t<+r2~$rf3Q^}i3etBvAo_a+vvObs5J4OvMw=I zTm&*nJcXW4ty07%ZCa&qUR)H;FU{5>F8mXFct*_a;S62vclHo~8TBXq&FB0uJQ4XsV9-p0) zI~Fgh6dtcmsyDu^_8Z5^riedDCr`#LO_O*t8#cPI6XITZcTL<&zA%lZd5C=p)FvCt`(6A^d>G4d z9HeRBM`nZNI_hufkYu9VEqrJk>p~9xR_8->#~dvT%dLZ~2)=jB*&h7znP*)l@Xkq*fJJN@QsFc)>B`qnoRo84pSp9AhPb#>RM5|P zl~9i+T6ieSJhLnlI}NxETs5ON()C;{Ll;#G9-C3+4zJ(2qFV6i3>_vI6mosX&KC2u z&nAcXRtiGdjyX9Y$D-RRI3330St7QPhA5Ua^XyX#J-mIQR%x8Ga}kGYp=19YvCi`| z5sUSa)|YrXLmvEgPQ}q7{#?Z zFUvIX@J{`z1uLS$+G#wqbEV*-WyD}iU!`#44DBZ9R^+znu_4x1DO^88<8ZCg_;`qA z-en9sDUyMSzwTUNBQrD^l^~X!B*NNKG&|vtI3C ziIlHSW6RDKH*{!8!%ain(4i$MWUT13%#6z7lM_qs=4=`g+?+qm$f-2`DqfKpUuE&4 zFd_f%xzi`&L?<>hfxjV!BLSmRLsQvKSi8|x%@+mu8 zNu%e=hzI|b0ZGDgQcfkXQG$$L?$9btEE`f(BZ>2m4^nqJkbGvBVqkXkC@7JL*{5>Df9U#ZZj6l0^Y>iF#{jfcNtRf<@7ynHRc z@c8js#NX&bT>X`PmBM8wbSh;AY z9nb%TdnX2>j58jHjs$snf-ss;DR08S@$=U1X} z`%bL6UuS%!A|?<+>|G?LYLQ^EcTxH|E;{JG??p%W+R$WT1uLqR*fK-Yhz5CqtAD(G zh8FB1I54AH@$n2zqY}8PBd1yz_%yjGJt?+!!paFc#SYUpEKZVT!Rxh0pEeWp=t%#FsnJXOne3C^P;-1msY=2WuvB2buF;mb zCD%)|=ejX3M+_|re`g~c`_8dirLk<+qRh1{F8Bo+R#Xe#lB&FJH5a%5cjlQds1~f3 zGZ#l`+@&h+6z_NSpRb*vDc8w8y?2O3dnr=a;y-n00ti^ZLQ8ag?%Fjl;xmfsxwGx2A%0R~UZse;kJBoRTZYQbyYo1AZ-+|8%O?7a`@XMI#I46^l_h?eQ)#?6 zw5YN;?>MbeL7Dq+h<^V0p_V?4#R;0&#WpjK>FbC+Ee(#$5qr6e0KxISD{FEa_vx+` z9IRubgUrJ}2>I~@o*gC_7=s4XA=rMb7REk}g}aKx4q9K0#VfNk4a+Kxa|cV!OeiZR zV$mIo)=6B3vOeJQZ*}EV7F(xl$HTp}tEEv{;=*HdDos4UtGKH|h;n?WO5ybBI=DdV zX;hl{bl3nsOvWBU~ z+#}q(TQX5rDdL7>OLDD+pC#_wwbH~)lS&a=rUyL7sl#k0Lv)lVPS|-G9ueZ7HPtSk zkjm8XDx%l(nRkxQ!VUPo9|Uo@_2y}~!Ves>IF&{v(0!~}RX^I*ssvF!R`B`9?$@eg zwMr4+vT~QB4ZUdB0SnKn6mB}^b9?>JZUY7UBDz$CgTr|y@W-TNEkexFSaju7mU!)$ z;8_1QEI8KRPS2?{@xd?w8g2;G3@0C>gEa()x*$1#Q<9FSN#UcPeeU(5WbKg}UuE%^ z=@PIZWbl8_YjUtZOf|taQ1W&OjH`{hgp2Z;zX_X!)3DBLaf&hvq5^~a8^TGtFwCht4VgV zAY#Lg1Fzd{0JF485vz}>#)74Zdv+U8Df}*&3APTiG_k!LKH5~%_580TRf@Ry7;(~k zPE;Fm$uaGp=yvgLHdMSH|I@HjT>CZ2FR_!*`wNc^h`=+u7F8>8$*}=Zcy3qA@ia~e z@yLH`l_pjutW{Br+McXv+XxpwEkbU1vL`ekJc(pEZn`KT8Ni^qg5K`f7Pl4 zvBfo9{8j5aAR^{Omb}gX6>YiH=R3}cnuzSVF{#LbO%`t9^ce6e`TL3H`8DYD{v1diT zBz606)d)+h%WKtwP122=DY0a@7z!fK2P_>Wtia=wvg7My|~MEv-oBuqY}jW zUu%^nF8`WU31Wl$b;Z}LYQ@T9a&EgGb)8(jV<(U7W>FsH+(7~~7oZ2cF-Z#pAV(;F z;4m%d;5WHYi?-&M(Xrh%Jeerte{jjKmnJetd?EFO|8a{cZ_=2ez> z;^dmhaN@KdlDOoYlm->?zSBrv{|&f70-qq)q>lP4)N}e zPDwZHZXuywvF~gVp+@A=6!FYaB{95Ni;r?SmBJt0K*Wo~E%PcxJbF~gP3G$1)>kb! z>(|j$!;`}+G|c-dg@=zS(Wp_xhc3nB;x?^D5nE_gis*5_wn`*Jnz(7#iem~|u%rsm z*fd-Ws~H?uQY|>I=FKAl>3JU~lxReSxB94@>+AO6j`)R=&}B6p-Zi}9DhcI%v`O5v zU*lZ8c5(z5H}Bz;6(Yt=5<6AK&k%o`nG0-e=uQ-gtuwU%jQldhw&QZnBI?%FBXf}` z5y3JlMZ9}dNu`O!@+!W8MkR3h(K(eS9vEawS8UK!F=bvZo4G5)6lD z_o(=oU2+KqH1jmMkkMK*HCk(BPZy9co_|5DuoY}Z%%Vffq~ek;MdSu&T9(tH!7xiq z*OJDDd2R^eO&fh03@)PH;uuX|45rqnfoD-Kk$VNln4WcXPNnhI?pE!GvwyACSm)oE zB_8e6PQCc)aO=40g-7L7nwYJ%lRXbd(lBZMdajK~fP&9s!lbb-&UojR*G#u;3c0Lb(GL zym60Wc08MX470?hI!l}-K90_MFZMBcdXe~~#Ib#31q&wUeAR+K{Hh8Vi!&AGiRY(? zp7zpF7ALpoFaYaI-LWam;xhgNCg z4|`bre>62Mnk}9mY4OL&IbXG)RI^2kQkB4W>>YXPcHk4)f$vzg53%r9r5eTlyL(ub z!qQ&_c^aRCb+cXaHS0j(_ebX3UcI`fRVi$DiMgDsve?yA8w0_5gJ_>pc&!-h?iJs$ z_+XMI##rLly{^B9ioNdbs+3hJJQOxwm9l}d*vE&*ILm7apUjpEUDc>Ai1$aCi_^rG zJ*?kMEbP+6r**cOCXNFwexX^WiQ}HS3h`E*6%z~EHGZLSy|)qDJ9Y5uo;r&gyEOf7 zNlxb|2p6*~sh}ncjON8{czL@;|tUXm+UowgjFrLsaQq8FWU;<$>;n623ysF-&F_16MI!8VVm#c z4yi*_2v5nmhb)M1tDW)XDckI0sHNe6T=N4Yg?>yR@xEfMiD_fXs(nxv7HYX%t28#I zgfqBvS}uTsKwWgpUX@VWwQ`yp8;|T|11`7Or@>rJ(5lrQwocW;imlw!;**%g5!$i$ zON0vK*`ro_cw?$|@cg^IizOd`)OLGiP!e35c6`xZ%0_-j9i*iA-9U1y~<2Rz52{%*DF*u^n z0m1yeEHS@BQxTmBxsoO5;jFZdqc(uW~9)T)v0(n}lU{-r)%op0xDCVtN)4iSE zP$jUms8yQyAZ2N!!2G2i@!~XXogYh+N)zXP$Eqhi-1YsEO5>(x8?<`u-?d8P_usK> z@^Ny09X=ajiBt00X$55mWfvEW><=(N5FS*sL2m>O`}DveEh*=8&lS;6+nTEcLI zRi7tbqqsQLPrpe(3(pqU(O`NG!z@nJLG)jISDL4ZYaNB6gu46#e)NXDEK$sf+HJoI zjnBz=W<&+o%+>UpgudW|VlNH5na4zpu@*UvPCcoI7;lBqmz?!+q%93jOAQbgh%1H& zVKuOH*VOHf;}mzZ4owrs87YegiW>7rTFljxY4FKp9cpF|?2N$dFJE`jgD!hpp4hUd zrH}3-HMZ>OP%C}8(##9_98=7i$kz_eZ=$3c>Y*(KG2C#F`prT(v13Tz@gt6FgL zv?@tiA*EJJss*=At75l5f4xG3&3jg8P(D(JPIF7Uq8UHC!;Ia3*tDmmj|-2~@-NXv zU36rxuTpqzivFjyDmZWVig@^>@amLxDoylMJ#V1vx)f+KZoyqnST`OzM}^Yx%G zSYDm(5qBPwQz;D0(!uYO2U}mIano)hh^=H^O6|4ajGA5A`t?ddN{gdIBUbEV-d8R7 zaB6j9K9ucR)y<~BboBbv>aLx#Per_;*3r=Tss-=Vy!_(XNzIFQq{|@X zd|Q-jbHXXn%6j*4DvJxIl-#v{@$1&A6qZfV?)U3ox3XO~OwEZ^=nHg>c=_uVp3P!L zDI8!#DcZW*_DLqn-Sj!tS1G(-aPmyV+?~1406gov==dQE;O8 zWrg5gW_CQYzRKdfsoGtG|D!|TCnDT*)6k`F_o3u3l|pwxGq2M4XdjDdn%K>%7Mwq& zDt^4ZPX)i-!_pAjA@ubb$536~Y{RT!nJES4iS6?QJ#YS%RxK#kfW(XYR79M_!o4dh zftSB8OFpmJ(h#3b%`s2BxtGOR)3lG@?QMP80zX4Tyfih3kM^=YjY{B+?`shYq-aF~ zue+K2zPW-Ew1@=>;E`>F+trc^OdX+#Ad5C7i`vFIqRTJT=Y5ZxmxKCbSHVnh1M5$N@eNG8hNQYaV_ zHz(*hFA7jY+*?<~EnT`0C^h5FL7KA!Zgcx`&)2PUk~A5oBRRK_3rQAn<36FO`1(Rs z1bu8oMYZ6%Lal=&HjD_APe0SdewKOSf!)Qrf&Qa44G!1X&q|JnD{A`c^()L1HyxeB zJx&o$+<3I6MbBPxV$A=8gBAdM)xA8oxuO!RLX!kiZJt(AEjX>Zm&EcB6~b7pT5$U3 zp5r@~1>$>}SR<){5GxjNTaXy6P0&N|R}}Pn;Nl3KEFT#e^xl*uIsh3MQKaF*5dX}t zesI~yWTLFHIJ+Pk<~R4TDoebZ&pFib_C5jXIJ=M&m&tuBW@>mgNG#?~8!Vz-H)D8_ zn5LUUw?ZdJsx0m*{A=>ljZcZ098xTf&0I7tvM z2t*k+vyc^aYd{e;RiYEw7@Wv+`H~Z;E|ys)u(BXhO(m3S{vgk@#3ncU8%9|Cw^k{< zkk6?!E+657tMXcH$ALnIrhu*pdJjB3n$tNl;U40Onr(Q>f#PL(t;l%|S9t zNZ_ZTQCYk&IRNj|Mh4*h!Q`Au6H7)~79>Uuk9RsZ(EuN;7-3Zc8(i;y7azEoZg;g+ z7QOj@4T#^`+xn^j7yT*-ueoZEjWmqyu_bcNB>r%uCf4m~ae2*V{4+4|*q+-Qh9BV$ zee;%y&i&~4Qh#^5xgi@oSy z+>_7Y>1X6z{_KYTyXPX=O_}$7oKy-4)QGdA^)A>qnJB9)&X^qd+CLI5_L|8#mBvFO zBVYRuM5-;gYw*AJU?VR6y6wj7XcC*MlQ?VNWTFgId>?bGqW9w}GHrx6+HiefIf00kQMsT9idgt!N`jMF{hW7SVXbZV7CWrw$E z;*k;k%+psX{C1KS+~+Vrn%FvOAb4Ozi7Wh=@B7Tt_cMM5q7=?#GjM5qeBaObeujBo zqf+=VudzTXhXj{S%n~2EQ(Qd4iWa(eQtf2Z#1o_XCAkZ>bZCLP;BH<#(y9braeMH0 zVc<_9)+1IFkwjcw5!)zvi+zXLMC>jEOd<^qj||om&Iykxfw%Teb~8f^9`Joj!|X!5 z=R_)$_7P=OEbc_GH8o$IKRQV?RES)OrkU8I;$$1K7W6ni|K3SC;YLSU=A{H{0(VU+ zsWfrJC`-esVRe!$4f~kycahf;+3IrE_Y*UOfM0b)$z9t&?i)bzb4TPP&B?wNb4&P| z#jiCBmU$_ml_!Q+#H`BV~U)w16CoDQ+vQ2m)CXO4P{erjj zYLA${-J#b%HdwcNEHKZ$#i|8&9uaZ-xV)i)V@si%#M%p^`Q87GAd*-d&O|bj%5}e} zPW1L~RD#QY@h_q+CRY8M^AlSCiy%zuseiM~GoxCt;+K(}ft$Zkky_19)mdk4_@aOC z)!!IcOoL-fEa1bPEtZ^^!|VT`dE)>L@xck2Sh9;HK0F~u!x}%C`OBmIf9o5`M48@H?%H4Egw+3=4Rn;^v;0T-{&FcJm}YDwZu-Wy zAe1Zbt1OoM@}FYY<%pc4XjY1bt2Ewgu=wuh_b0M5zdWM97R#+~uquJRU;ZO3ho@*& z3vo%!IXcl(t|4waPW#Hk$v@AjG%-JISx_l_{PVz3LZ$KIzgb_UaM>?34%aG;#ow^Z zXW2wU%+c63^#8)=_J2`g-Ts>rO;NQFpZ%f=HE(^R;-o#t07~$`$@o4Fi(e zO=BD%*d!)$Ltl--!;`fmP`8b=Y7Fj}Txt@obj8Sx%(|?rhjc6afz|8k@?BIoap86Z+twc^TOO8aXYEM{rRUl%}bJkXrn zDwDl8ZPlLGlGox$I9sbrJ!0pglZW%_NsoBSv+7b0mv?G5N?d%}`oXL-A%`Lkp#N76 zB}?2Dnk?T=TX(b0{#i~GVPm4j;MN8^EhDvWGBmw`N@1Ex;g3JBMG9%+g>MY_Y?5sj z81%)hB8#UdYS-Yhu{Lr ztZF4r`=u7YJy#$#44<~tl;cVz^pFON+oR;+X$EsNOf<}LBUEM%Q2 z%1|@wGyW6}<58|oVd!W+^QUlfpg|1`5fs~7@ISnM@mTMZ4B!T{qP*rq{~XbT6a@wzTPJ8;eWX%uA zWrm1b%r4Oo{lkiQaJokSun5+0|8$`f&+KY(>9Lx4dRMCw_|SE@q}i$j@xk}CN)r|7 z-d73YefR#i&6Wli9GfGa-PPjqV>Pki|JZ?86h4|*)f}9@UqwW?VHKbGV2|^}Gt+w| z*!y#jH%{+WEqLL-A|gxl>{lTi^EoM`@&{cVZGPW=0j6^PH4j!l#c%hMT!58f7Jr+b z3;*`jNW6G>7`xjsh1BE8@lJIb7g2Ue@va^b*b+X7Td$ z9L}qG{^InK3p&HnVS(10hIo5=P9=yHE_>xVfsy!b%!BkB`;FqW?WmymxGl=-Jg``>~o>@PF(; zfZ~!Gpm^B<#lyQ+LQ)}{x#HMf8sec{cZ8L`V|!H#POCZDjr&zFqZHe#&hzR9$NE-= z0%QU&?w{e92x7X z&wp3@d{g!LvfAe(u8E%izV>;c`uv>Q=gX_l&#isFsrvllZzdBfR0{9^wAYD@r+w2( zup0|Rdx;oTp<$1+!wX4s0om^#7GS2c_O~<`Jb-x`%DO*^dD^+9KOM-4KFwmrr_gYH zhK9JcOA~k0RTyj7N<*&iOE@}5%*oMU$N=VOqC+>)a52q-ERq!rvB+u6)Y!#R(=_WQ=J699 zrn6sueY8od4@f4;M6BX+0#htb-9AlYUsEA7-e-4#2A?I0I63elce!2V9^u18kvM0j z#w&@6BMyN_R~+ZgT!*(36&l9&!dWx76K^Ie=+I3>X{IAob0c-rgd0P^#A^p66XhN( z+eHGM-aMhiJSERQ4N=*ph!0Q5;p~JZHsc>$vZB~f{`P&X(!{CFMSO6A_;GaaV)4-l zIh>Iw{?9!)z25t-lixNMnI}Ftp(MqCu~UeWgc-|cTry|IyV=BUHi`d9H)DHmVVrk z(eB;+tz=@wH3gbQDod+s27+k{VNYL;1c`G;|GLL^RizpITt+o6%` zuC}MHun*OOD}NfHQR2}9E7;PhF)4>pRuzc*CIn32b>Ffy=ykVo!dA1q$Y;Tq zdoMcRvMLa_P7q9lJH91JHgB7tSwxpsY25WKmk29?3xAqZY2x{BS`j;nDvR^OV_Y2` zJKKWuos$1>-|-sPeZ>;Ptxwa$JdW0~jpZjYu>*1LiQDn=&K4J*n8R~B z+YE8eiR%Ie+sQu}8XR9z3F4w?Det>IICY1mh+~_Pe4u$Bg9LM{1W|F54wi%!b9(Vc zb<#LN6E}2eTtC?2mRTjVYn-I+XcOLY8S4J%^WlS@Uh)dLw zi75Hf2ctF4|8_D_=Hf=xLR@%g6--@aSX9s3Rw+s8SV};;WoZQIlJ4%#r5mM}M!KbA z>23vUU3p2$LnE=LpXnM(A2l zT&jb|zPAJHYITT6t_1DsaaNoi9?qkAP8FkU$Q`l_g;Ryk)0y;Kqeo0|L~N>-8@bon z3-`ayh%)e7e5HBbO`a5JofCHHKGx1&=U7c-(yAP5z2o4;;y9@)dt}E zQPrTS)4$W+YR9l=fpq9mgOV*^gmA>!k`>14ixBOB8p2iOj^4Ur!-ghXJi(A|`n=Dj z5nqdJJz!yE(k@@b*f}&fg}#;#4c0}f+hcpleAEDvF<&sLF&88t6znOG5f6cw)j zYMtH8Y|#>L$3LLf-1FH?aq9}^Cp@68(NU)24%97c^v;WXQ}0X%r0!vlyr!8Y8DNji ztY)CsdLbCWfjjPAb<*}%1_lmj0l1dVf1ukT}5_|23@Ef)d@_ zYE!Tr$beg}Wc!^{0wN&fqJu3iCiDa015V_4DH_0eVxN6%?-z+K?_eu443G)BT9kIu zq^ql}>;L-5wwjlm#IH@3bqxeru;m)qHaqs0+pmNFma?-&-r_9^iEWqYg|1ac($G9X zf8fu_f-twg9w!4DLpX_H!MhN5x0a`+<5)xLkhVFOr9p`?sE=P+8^;GHP1eU#<{bal zSCB+IC;ITIziqglYk5HpfutiZ-hJ!&aTL}RDFtxqx+BN`NV&^`ZsU(DED9iI6P$+& z2@{pXmv{Zb`#L#?Pi>R#(2`FD-XMWY&$ zQJZBSvEluz?Th(tJmR$bbe|yPQU`mbb;BWkwg9J}M*gm&;x!@qtS-wT!~hve0_HR9 zVLff^#_jDqC9B#tKr=#Xyb%#?L*Uobr#YA|{AUB-ZUVs;c^q1^VX-0FXLeC)L51S| zB-E))RER($%A#m^ro8v7c)hH#YRb}IFLBw>4yvSgPQdl*RRApTU8r=+k}?Q|5(S;? z$=0l_!MN^^9apaRw%K)YTLwCSpT4l8snG$UY_$#Wp$jCEB<^{~I;pU(p&+|UR{~k?I*(!#D5ft@Lp1DM8^A5B`{%1KV4*&}zs25eY1aoa3j#GCKhS5E5aK z94)LzR;(EGZ0Zjr(LbHZG-YK-HPHq0NaG*Ndu1?uy4A_c+e$-0nyT=xLUAHQ$?B^T zZ<~bpQ_6zMH`WB%F9Vkxo@mWe#WSbciX84@xenx_7I7D9k_s;ii=iYlZTVktCuREr z&!imh?cLW!a9Ud^cqh?@m;`3rHPw52viBXv-0F3(T^}JN|7xA9&GjRrgv1YK(1XpE z7o4bNHo29_w6b2;n}in$j;5i_y4zfE+;p`w`f+F_F{e~kl0LTCezVJA>!@LWYh3Ry z+~pX`D;X?+(=;(}ww^##^61B43SE7-yGk*vXOVRQ1}G_y4Y8?(g8y--gsz{9=2Jt`7`3-1mV`pGX z-8q%mm?pfb%LFmsj>m9W@~{xaO&Qx)9R~6n-h2eA`X?Hk@JI=qPhgdvQ~L*hiJD2x zINt;k6%%aIzrfHE$CB@TFBfbe7iot8b397A@$Ir7<`1llyI``Fu@ znvOPQ(UJD_$5_;-vWsroDC3t?{26G*y8mp5eFoQ!C0n;oa~j3@NG3QeOch(dylJ1A z+|kjJG>YKC3wpPj%>MXV(G$CI4+All$C~&IGTwtKVj}a zfYY9FPl5=m2&vQo=?NGBu#NTDTTY~JNMu$SKtQS&mrF8}?2+;k$*k&0d#%Une6Mz@ z4wpp|M7DX;VVwjrh#;dMt&4l~&-@EE#6@6le*h8eY|h|F+oJ8K9@;ckDI?YluU@X& z5O*7BBBq-i5d7e(=>R1Ezd&s3-9Y;^M?<~@fYBb)a@L7l)lyk8>B?*V1?wP5tS{& z72BsF34ojH%uBC!-C<^=qEY6K2whNrkJNJehI?Jw$R_*v6T>h#+V9I0y3IQ#Cr~_T z{X0NB28iG&lm{cZlrA2+FdI~445?N;b{eVgT)n2oo5p1P8&T)}o=O0dV#S|DJ=nWE z4t7n?oYmN2QWRme)Mg;;?I6L@}qoKQAlhdz)QL06# zzB5cvB!c;#nIU2-W5HPMNuC5qYB4UNOXM2E^ZhZ31|nT$ zGPO9XQ0pKMm+Hev&@{47Rb|js>>SO34rp~9Nepy z{zVQ~cTiHJS&A>-4+G5zhv~gfVULiP7v`o#JGKNo1 z`(;Sy@vlihNDP7!iJg+eFNLYlxVP%IUE-trr`lw7C#BLMhb*$`WM9}Uf=|9F`OS=I zWG;mYX6w&pmO(&r7Er4Ue?MKR|KuZT)TO|47^D}kdHjkEYW!r??5N%>XLU!*dUYx-8> z%wfRaq`2;H{3#F$3TpJSh8kvbiArR2#Z>$Ueo$Ry~2iaN2eQ)GBR z|9_{AnShub@^%c;y1}^O)y=4E)asGm!n&~{i4N0lY}lR@>#l#!!Sk?V1we% z2>OD2Oqs)zcmB%(`d6+0wlU1+@}r1U8TqZlf)}#(Kjl((fzEtcdyi6)7VPH*hn!AB z^W=wqs#;AUeb~?CF)88~lGy3RPLG01DnreVBA1_FKnU2=eS_Anv6?dg;KR8{%^C}j zJ!^(!COO1U7JxO#B|?cv_az7(S5Q`T*Jznf7Ev`Sr#zScp3uS8YWp^?f)&u`GMS;m zSixB>cxLU&$TCLChDyF@mxBBcEXrPoa>KYP&gZrIGgXa~&F=}Q13c)w>heyA8kLB| zk7wYlyvli72F3j_Q;ADR^spZ1<}VJ2Z3WZjjdN5~wk;^JeR-}3FvO>C^R?%QxwZ<7 zPPCGom@@>~RuE_@C!{j-^A{;Q%_i)u0PSDav_p91t(NT&&#*EQdYwBst&u*0I#4Z~$V^DD4`;|18Y63mZPkq(hqNMTNLxs7`$MLxD-8?&bejlPU zKS~JEEafV*o;qrCVkyn?UNw$hdErmW@y2C!-xLf6)0&4QF8l%%Ad6MhLGSifYLs^F zRaHvLiEjNDxrM*he$?62etIPQuQUVaI6I%wCuk-;7HLTvG9sZIy`KllWR|0Uu4nDq z|MO}PWUz(UL=UHOZSM@@C42==IAqxoxIMhbQ(32M?&xKRM(`?6%z-au=Xn+gaXStj1-C}`7zl-xi%ESvs3V!SP4EJl+nn^u=-2HW38ASSyU(`_pO7QKh&fc zjy@2mEs9IQe4~~Y#=xlCxbUGAjZ)S=e7RqR5 zIe4_piY#bXTc$~VcZN}bRFnfzvB5n#{sZjD2u&7s=hd>VgSgW29{tEZOBDaVny=0k zHEhj_6M?jLs?pATLzAPOgf1)*`fIfvcEqM@+GfD=k2dASR)wdmJC{sdpwaul%cbU? zH)Hg>4F&B22_mVnl>GqJsgvRt(#>1oP^P*R75yhlH2VD4b!jnm1u}=WxOHx6EUm7H zDEp*7L&^~Emp4FFvc?`E6{JbV70`;II2;(G&~gv}_o~$mEN;?^Rxd9zyoe?C6>ryq zNq;|#-Pc~`KYF6CI;+#{5VN)5xI_W;*9Av2aD3&78K4aKCu`^x`05BBnTn52W(lU9bmpeE$5KFI}-q>c?FR&#o#}qpbRr^dfb+B-iN><(}?qZ^}WIK7pmC$vbGG}(UA1F31cBAFz_35ww zV(7h&bu08A?)#%5!_;>H>+kg>)BgSS(k|>A84QkhE8VfA{JZnGOu$~v>sPYbl>n|z z*B9_L(bauM7Dk~>jpH~ne)9Fl)}dFzhFNHRdSHl^9+$xSMoL$2u?u%U_N zWJ_502J^M8aqo5lnCb$$3vPr>&eS;BuBSY`HF^6-3^yd3;jao1I)ke>^NoFgy_k<| z)Ik+>kWN^DaJZ?;u)(fLh#I^)wjpIR4!$drOD$XIa4aRDS*s|rUe2xnM8iBBpi}Fv zU+s7ym)M-Y@+@dovofSh zZ$@iCtAA0S?+M8W*Q;><7KmtB~NJpTCj zJUWn$aL3C~)TW z8<_ln((5F=aXq_l>S_QK_DCOUea7Nyu3R|`zP|6_X?kb6p*QyS3pzA<#ir|RyzJ5a zBxHXkUL*ue5S7$}V-qATDf!|LvJZ5?fTa#!YuEQU1`TKkzFFhpLJSG88wI(n@v_tZ z4*o~Fz6E<1#IZ(-|9!qoiJ+`!m7$=DsNEUZ^g<21TjlfSi*!KsaE_}Z$0VV4D-+yS zkwZ#E0lSp=&*rcuyWm-h#Np`tHRu#!$}-D(-Atv>W)0=2wR@Wo_s(P&{Um=*pUBdn zvL>uSq$0AQOoQRl)K1mpv`Exe9O2I|K11 zx3O7z0~_8XkLAP-evlJG4F@rifoj-0OPfCUzWdhIS}=&FUkul)Rc%!&3Q<3^O6{1v%XS{c|Km(ZWEM7~YjP^d@sHf<>7%_xu}@!K9iKtz z%i|qd$QA^V7(#JR&rZHy#uUsG%`Na*%SSgXUZNl>d-y|^?%R9KwB&xJoFS(gXjDil zdCh};mQH4X{)|qO6iA%*6>F;%qsZLPm~}LFzBDN<@ymBAK^2F5MyWI*(g_b_KP+F6 znlSEXkLZ}B3_pE==zM&v<$1P|XK3%SmYsPi_fm_@x%`LP2jc8KzkaLbv1-qEJ?mT( z0q)HZVUF0M3wWZ!XU1*WqUp0 z;m+G+}Z#@fMu4w_v0$K0r9$$-DTVy&V>dw_~td>bX zDQ(>ynfAR2pa9vvotVE1DN!$x+p5nGL1ip{zY6)5^XZL`2{Dd(+Z(;ZyBMpDb^Uk! ze~$i{mC)FSX-r=xD=_Keo1N>8i&@5&TO^5$I2CJ*iw!f+yX#DzD}sB<_n!#BC-r~w ziNb?UiDK|$^+Q#-@rkf!%;xz-JS;yi@2vU!tPhE{yZW($S7Pa!7)9P99qKa2)i>Dg z`D109x?nQH4hsDIY$tkp;ao08*)-Uk`eS8ER4kWn+Gk}aI}UdD9dBAS*+<&fkI9vF z**n^9M6ugKw8c|0q5Je=V#tok*Uu+D=m9}p@YF8$u!=Vw!Z7W#wX;&cw{k&UK+QRQ zv%IsS@ymG{I6$eO%*W5CRBX*D+U|1)I>S9exB&095|sr)m}ZtyozX-S!RPdfRe|wbbPmBQ;cMk-aonT>qvjoOPUwir$?$QbT z5rrmOy4Rz(bNK&kWqBXsJ~!i3izh7`>aosLHo}p0c}G`NO}bW4MiWCKK$CYh{7rX5 zh0184j>OhdIv?!u_%+&dxVI5t7T$|J+KqW96I8DpFcW4`{6^>FA}SYMMk72Y=c`Tq$_l-8pUiK-o`TnK1NdO z#KUhB&+$5V#RZm1svmhvu$8p`P(C3jiv!qh>05rX+o)Uc z0a1oGwR4te!m0V6&g6|FpYxNF`8u@HUM`8ih6yu$u5Zi(yc;r}O$--@y}9z>Q~mj} zez>yOaG$@r(T`JC>$SVoZ;cmvQq{2{B0m*!xbfH-1n1lxpOJ5fPtJqEhu;a5-e1aA z@cn}%M%}s2(k7LFQ<_ft8x0eN%J9|ftBT68;DC~NXdHeM0HP<|!I@7q6CL9|DgItA=?D?RcTt+W<6y(E+;9d##1HuLN5&!zjsJCRiINCRlew zG@k7?cY>JXe3-dd-w#Mr--jP%BP4bRphwBwM&fn#72h#E4hWU?g{;sNZOf**dWpv~t zIG->!e#bGHh8+auxPQlZsubDtW*ZyoQKE0o%NQMbz%TrG=95s{Fy(I2ES+02&HGh6 zn}s_it6I#8p?wZ)>4OJRX4M)X0Z-$P6~k#JXMU5-!wI-8lZW!CY@P1OwJ{%ga0!|X zXm)&Lwgdn6oPv*TX)dvAhmq3&Ds}mcgEkK)5jtFfFlwC`jP~?CwG%`bfxOZ=8a*}4 zd6GH?iJi)l>_3hi)gE2VEOBvcs7GVb$PF>~8PciFh&MJzo>W^j3q_=@dIH0X^-aKe znoq4}-SF3M6WG^_b{TuD)g++>u<&@@ei!>R@DCF_(e0Fb`bj@TEbPFMKf`Z;)ApzF zlW+10%C&Bp`{H^Y%5?it?RKuv;>1H9<(R%@E6XRQ;mfQhM-JVI`26WNPuiJy(bn$kRvYJusdtP>b|f39D!wvV!&f5hdgZl{1KjNB>%^HS12 zR*2#XcXB*g`sDW8dZat0ZDyV^V3{M(GRBHQM0hu3_AX9Y#N?T@q?|i;a2e-F4@f!h z0PAl1xBu~iJ`z_)o3&@LT%z5@kz+HN;rI&a=TPwNrND@@bITx5V3upY;QjzGraw8U z8f&+9$4X=`m*ON0-X=Z|sN$3lHy(45m*unxyI#}+{{A~~+@W_5&?v6sTj`JA3bQ?j)2k4*VudE+% zn4`!r(8~GY9JuDQ1y&hyJ$-dW{T~t{fI~E)cRA^v1h?*zUcH`e(S9ry!+>e;HCZ%C zkF4Z3@yF7Z*KcW_^x!yR)M`xMjR(;1)Vjq`q8iT?zgQAybnV;ikYPF}Vl(5r=|*o) z3ezXU8ikA$+MMHm$V|`8SU)CnsowdwhJW9-_Wd%1{|@tNmyF14ML~M4Cc|GJYy{iF zmJlTk1yRME-T~D_-eI|qZ}4Wo#@vaLU#lQ=sc&O9z{W^2tmhQz5j8@6GDHRnArxm) zFO&(#TzN6?-hqt?RJzsY_t#}KPotI5EaDjjnksJ?{vKXTG{5+1Bk=>}zW7z+TY`0N z4eyuJzx_-ka2t!2{ph1#50X+iFnN_jDU3JE94f=nWn0pvE(~(wqB@wVq}0)`o;z)3 z;>M!Y4TJ*oZQJDR+gl-0+$Mu;?p5WYp~E|d>W51|de)%7@4RJc|J6aymy?fXD*A81 zv*iY)4&T0P4o7t>y43yr@jd_Z26+9;&0rN^dmQ%_w<$8&NWxunreS*U^izmY#zu{% z-vV}e#4%bV0lR2B-?VG`fHdIxcTW4NyoSlS{VL#6n*$tyz zUtc+%`5EU;a*GpsG&jXJ>J6g&^hcF}qgXQbPCsqnt!bxIcd79DtMHn08cWqF2lwO# zwn$~i`<26wiWwMVZ^+nBa1U4LyBL!SB6X83hbWY{kOrUnz6-~8zGnP%G( z4a8O9Z2ukGb_~mU)raY@5#fNq4K-MNePD!%-dSpbVR@c8DUmp0fv|uNnHc8pjs3WC zgp!R|HT>$ex*Zskpi=4kYBHXRVQx|x(Jd-92l&Pf+8_;D;e%T4>k*I9!u_%6ItvCg zTy9IL)(n@g>5qEb$ZPCzTp^@XgLgAHBXJ)JZ=0WsZhl}8Bo41#ExfDLg7M0;A8rI02cZO1XTC%wo9&aBP=Bqzro#GkkPa=Zr=zIU1;;jpDKtErjZvC5Gkfcvs;$ptYgxqvzSCfQdGw2|8toso99BaAM|k`& zAAJ3@A9ln;`{SYgKQ7=hdyL>qSB(y`jSlWkNaj$DV^P-D4YTXX9Pq!l9I*T(X62%a zzrW%Ucfgqf_OHv*6Rfi`$Hsq;?MHLN=qm6{XK!_|`^=v1d-NNJ@#+j?RPv8sz)r~@ zS#43)J{C;8@`1u7aJZGO5H4~dfkj-MPw=Rs3evioHXNFL?X zAvgFX*akW->go6W`get@N;q?GG4Z7FdR0jk4xCMj{>o9P(UKW9Y<{ZPWgssB9Z{W| z0D`)nri@#@oi<|O-n7BB^HYqXQd`(LN}{ZS^L4D;Z8C?CxF&l<;+FvfMcxSOuDJ31 z9;Ih&ag;WLnebSy;2|Sw5JRjZ&L&B5D&y42L=`W5j5lt##m}0C+r}@vH1%_qY0VTX zlu!NtnW`;?f6Z-jz$rK*9%Twau=Sz!Iwbfb0xdC#2}&GA{-Sd~@<^=YrdX{#;;- zTw41YGaZ7#PNU$D$<7-#dM^eW##i%k1R;Cy{v7Y=1Hz+bA8P9FXh?^DjuWc==OWB3&V+OUj0Qn;peFHcg~v8 z1cg%wM;y|{xa9~*6tGa8%o~@es77Ae`G!h72Gcwvk5d`J`S)V6#odGKtAXJxi9M)m zBY0lMCo>eY@Va{7>hHkt!Y(CpXK2MS2iNJ`NeNv+6}yP{Xl}6=wR9fIaWwJL2y;Ft z+~xJDg_DVf<4c0wSVAlszhRP~93jHCvCeK!5H30{Shk5fq@>XdZ6qVBqR_!(hqsBq zua8guvA>xD8Dc}7o+~vN0y1Yvi0CqVtA;V;672oV^vaq~lphznBQ%;~(?kz*uj>zA zNvgrrn?;`^cM3s&*>yw}B+d>hDjM#hze|ErQ2G%j$}iJ(Ttatt6KgS5NYGrY>SjZ@ zq%9h(E-u(n$`{>F`YJF(f2GRg72nGmk5wW5nSRc7c?DtdzHD!#^T2*$$QPtoIB@I{w z=B*__2~;>WuVBcJ?)GgCOi+xZP|VvZ2PQpl!-HpE2>qOZwP%c0dZgVD4Lb2`-OqXA z7a4U1$p&G5KBkHZ{j_N=x|lr@YA{~Fn~?FsSqN!q3?#{=uDv(YDt{$RF2i2Qwclb)4Hw#Xq)mR9D0xTo^$}O5Fsysp52UUJHNJS&HG*utt0PncbNq z^SC7|(sQ6H6?+k3MwU4G%GgX=5Hz;AfA*`>Wz9h!XpP>B$sPwyqDw_1)dWc>>EIis ze7`QO-Lo!w*P}W3UO_shxwIWLDm9zgw2B?;s@FJ3Bwoqfpj$3l*Q$YHG5>%BNWkbv zm+XM_FhveW8k#FEi7XM2`e)pA4r7K%?_o1a@==nq1K-YA>~_2O93~BsUz5;z0lW!qWT|6COV5oQHY)zzZKaf_L`@ECLkGka zf)agj4F%@zC_9pwZrW~n%a31=W0xPq>@2=2{lN$%k2nL^9x@}DY8UBB|C8sY!4U`Y zO9N0(*$vi$q&dXCkMUo`de}LHm)r*X-n@`QLSJWUXf|8U$bt4{Z(Q(X=X%bqL > zcyXhR3HdV$w_0{GFM5r-s$VXFKZUiP`E;4YK^`oWG`P7}@fVsXlcr z!e%~XN0hX5$c?PF%{06(VM6Y!))ET&7U&W|Gt=#<7sx9dp~e{{1CYo_y1v(Epge23 znnaJF-!E=)0WtPxc3)`M=Ag=FKXGO0t<27@=dQHQ8%7${mAoC^?!3f_QCzVixwMCa z+OhiY9y}N0dExnxH4fjy0|0o~nw#m|LvGbPoSYhn$k2DZbCoSBpM!gw7?zcGtdJX1 zX2wCIkJ%h?8k?M`qZIXu&yvoEdz|wc{^AcoXe~)-`IPLr(;a=37-N`#xt6mNG<|W1 ztYeL)jQK0`g;;96nsi-I)UwmvcA!YuE}v6~^#oy{qk8!YQ+d#%92!zG{Xz0fra&&? zjcFe13%`K@&q#cEB#^Y!YW_(N^7x%3++}-;lTK3$9@+!x;l4%eHS~4b3a}HBJXRA| zx61vNVL#ktWi|bgVPmPw&Aa@Ql+5$fwA?;4%ca~xV1^z$F;o>bC=a;Xi%rKR6)@bx zIUXFFJ4k1{o2Xv2EI-KDcSxtyNPu^U6<6Xzc@&l=rblF|!H;h@T$`iP^G;Nr;os27 z$E$zlCxNtacA6=GVSL5xT;&S9!iACSw75QgGx%oZI_**~*6TSQ0nfOP6AKFc z9lsZz8QNN9X98R^!QdPwsnT(DORM17YxgR0j0ZGN^8IYcI8k~vi@L@e)w$~DuwBxx zr$;)?(60(u|Im@u9qHJhAiN^woT!!f9F=vj5m7N|y-?cgHe4V(hnjn?5+#ONBmm*O zK3@)0+kKi&*k>xy^QgIP5zawxjdnZo9^2v&&d7w7)ob@*2@ojP_Lyf??Uxn|U5rDI zAM`6ypcWJp389SN{b5mG42p3HugOtKJ4mzFM!B4Qo%{4l)^g1`-{HH+&;hNevZFxb zY%_97Uiz`fNmPX@X-Ox>%A>A*3%AMj%B*mn(jLu9tBpr39Kf+bF<0nlU#>M<$9$>I zB)IJ9X$XO{eNMT{C=Z`;8VIN2}yTQPwdF(vK7oIWWzRM)>l`2~u} z{pKBl_t=o5)&b%+V~K*ht2W$sjz9nDYkgbt%WtlBLpKf?qn&Ep1ZM2$OpRiE6J+)* zWr>MLW&IZ+6Q^bUydpooy%MVssdW-N*jPKA|6s|dG+?qH3<_H9GwrESxnsqSS4>jPQVjOZw8KSN%O5|(|x%^`-|n{R z470tVS<2=kj_E(9V>HU`nerRr^F@1OjJ)iXFh^2t*-$Z~ z4`-wPy`(Phn8W+$D9oKfXG0-RAzJ2IB>ha*5rvm1M3YJ&0A}}0N97v2@%Y&CXW)>B z(C_(}D^5Gum;(Mgp;9O#>Co_i%f#6}{{VrTNFA!-&WoqKebe=(8$kzOF-^8Zaq~H9 z*!$IBgHrHc3Q0qf3iz^!W8NKvTk!`ctQ9ESeZOCj5#xcstp~+8*`?)VCv9x+M4S@p ztShJ|M=D^*f-+D-n-MJrARsKF#(BI7z0>yBmCRU2^Y>dF6iH>;Ktrl3K+~#OWMQiE z<}Aqw@zH7MXZsBSq;@9%SZtWr;Gz2Ys~KB_H;rza1L9+fuE~K#)6|T6iQ{_!DTKm% zFN+5km!{8LZnB5cTMTO4<`dw19I+@dbaiQasq-i!17XHNIeOsL8^Kl=SUOR7@9gHc zHdDsTcg6)es^xxCGa+k|V5ocfy7~D*<+naInmZurOJE)jYX3kQYhb=v#l%>(fZqA# zZN-=-fwfKr9=#ioqJ_SGeC_1jC2x!k16>3KR&ow-B*#F@9qVdH8pBJ58{k*I&CTBn(?`#VX~okM@CcUrQbRzQ_<;(Nps86 zf9X0oXJ_gSA)(#6xE*-9t%SF&qI#9AiNalYxc#shhTe+!5DL0epeYCah;68@xW zKCaAlzuB^1YXb6A*IXZr%eS?oL~59^L$tjKV6GYj{PM$r2xR;Mo@V!06Svl@)FVk5 zbMT*V^p`o>v?7~Or)OW+!eFG!{kT=|g?hdYF5J>kHADYFq6HXt2`y8?M>&_^Z8=B5 zZQ)a4#7Di2U!hxdCDosBy^eg+={K{qEKT|G4_-A%+8_Jw9VVK{4=$$|Idn)_mrhaP z7F=;;__{I+_!l$&lnhq_6Xj<+k?gn&5jTuFV%@zAsGyva+z539#MCV)@l+p zfHd&YR3D)v*0&q<4>is#V_?o2qb~Nfml0qISEBWsB}zDl(JL0m*FPg>YMP_irq36H z;c(xPHV%UsU^)@(VLz|r&R+t?K;6X_EDLzIWq&P)qURG#)ORu+?dblL^m^{={UavV ziqzNJnb{Sp69f_`;UE+AereNZQWFi?eV8(J1z9nydv7k#a-Poit3JIxh^iw@5W%^f zoU8uS;o2ZO5xW(z8m!+TaDP!nEuQxj`HE;!UXS&ITzA#|4z_5JpY!>F{QBhEY0c4h zq;+xPkIoIdW{zc5cRZG4>_1krg-nV{P0;khGi-9cmd|Wqm zYZ;jn9v)r>=a0)f1EH{#J5&A!PcvkvYVBMWHy-8#A+v9d7N+I+HkMvxFl1}Oe#6N% zcJZkzhEZ9_wAK6{Pg;PP7+1=|Mr+EvqZyEb#h^3xNf6_pfm>h+DE%P9LSdD`m&&zr zN{b`GCU=dFbaHwNeaQoxK(%4Bj@tIAXyP6hs<4@B!-~&-BI9i`6#GQ5t0|Hjuzb8cOW|XTOl3ALe5j*UCr` zTs_*$%ikrpmEYwpLLk?1P0VC|xW0`7;-r#G=Cr!-TdUIL%EzQB*PoQ0EM_&6Hi9~W z<1S~ly)fu(ezKMO-yvgQ)$Q@M3go^#;Zzx@^8v(Ny^WvKUzd96pRoxj_1 z`WF3MUxV)H*qh7S`g_gh%spMgTY(SwQ4TsS2JS#`p8A7F2*(QN8QG4&M162K%f0}s zR)XFkEcoBrcJDf$v;>uG+7{m@CK?N2jrP?9~W)K%mMvnXw>&GnMwkuP1YZPql1$Baf>Bg~9&0 z{H-n_(UmGf(8<zJHGTM>C^`o2}2rV$h=fiOh&x$d+A(P2+xT z)`Yqe2gi+cr^}xWNisoy%#+V)zr;Pl-=w&P>7N^Tr;-Wj@G6Jb6Ytd~vs5V(-S8s| zK3c9H(GfN17FTT<$oP;w>xKCJZ$7>z2hV*<#Z9 zk2N1s0&r9PgaIu0d_hj?g(H$bv!cx z(}0I%k+`K_Hd!D>-E)?2+dgCvWr|5jUYGx&UPG`U6FswPEV#9VfUpU2}L z2FpH1nksH&PG^papF%vC6?tvYUz&;AmTma5gA#xTwYqgnF39xL>0RxYfHu(rhRq9a z&T9R4P*kicHI1&!!P9ZtI>&i?e#7|iNZVQtQ4@~ZqbX!0adl?Jza*6aNY?X=D zu-UuXhz5V$HyzqJ@N~+=6W$8AG2q_RZa?HKn|z)WX3=1Mq|1`Tf6J$m7x+&+rbbIQ zt>|#3n0qLa8WftaQnSl7eK?BdGo=CNt6qkS4>aeXsip@;nq~a3%%jtAIUeMDnm0cd z_>pcP+?fb57V~?yG{Grr0B0H+7PaQHa6vWCL@*QCSgOmm60&!LgZX0t4Mn9P^e>lU zN2MIWt3@ci8AlHV=*Aq#qT{^tcJFW`=Bni;g{K6M)N;l9-AiW#h7#KUW^EcYm&Boo{NCgrn}p?<|llQ-rw@-G@X;nTS)6?>DRk+Zdy@ zz>UW39g*3=nv?HU8iil`$-0bI85p}sqh9kF!ANVMpMSIz_ztn(3p0Do2IOWjUfz)Qme6T`3{kpL0y`3mYh=V=uzUcd z-v{WTo;ld7Kn0f56U~0Arv1)*^B`%b{ac@M4vOPD!Ae*L}Qh-}&KQZ;(7JrgFPtbFd#z;mu{&9=bFm0B;`|siU9I6~*mf`p*t709Lz{Z+>wu9O)C>5+4|E#h8MtoK z?mO^fg{E_J`BXm3O=C=iYD&2U(B~X;0yyrwWbH=m(rGp0!v8R3dhy!!vyW=oxv46T zg=mt<2S!B<)^{SbJp8fxiUza&!eCuTuXaG&Qp%t^6=+3NhWAOEk-VAli|k3_v#_WT;v;_kp7{C+T&|Mbkz$^b zY>=#&8cdUrP8jQ{r8@Gk0O(Bjg3_UGI$K~~61Cl-Ff=A>ex6FqBb;kL)VFV+2il{d z(sOjA7xDBX%9oL zIZPIv=9yz_boahOm+b@)@m)Y|&8r6^zB~|?G<(&3*z!DmfX@Zbi;KX$J77u#80PlL zepN3Gcjo;%PCZ#}$0ReDN)6^)t)4l=Sb=eQgWluJPTib!YquWGfwO9<1qj}F2Cn(k zoTu$T1u+1T*s1EQJ0&OfC()1s1Edc$wl^W8qqnwH^E1_*GX4*ip2Knh8){OtwI`)O zE^WF*Kc-dW{O%`HLRz4Zf`0%k)bmPAMno-NBA+BP)H4X#FW6O5ZQgSTOpbLD-S2*} z{5CO%6kcgI)V)~nOYz@-gTnx}xKS8wQO8&sNgPBjbd>E>vjP^2jK0XvA4Jr`(-Q>; z){ULH+xzw?8SuMQ7MUN2O9`=MoKVo` z$I|QCSL@g>l+Zzj^)Hs8SY(t#i^cGFla2JU@7mx`3>6L+*YxG~mSiwPo>0|q7}Xm3 zV#{-t#E_d4W1jP`Ll_(hp8DQw%YX=P-gBTKUjt4NUVHU88CNGFo{kp8p;faZrHj{= zWk~pu-ErT6$AnKUoPmETr4lcEM3nv@xl3hM5gO$Ob?irLhJBbc3TM|O5S|WG+Nn!k zyH8FJt;uINOVq&vtFT3`*`_bBAlv$79m8}1TxCTB?&}xW@DhbNLrT)l(_57c8d`YX zX7n0eHpUQf+D?vCZdL|QjF#im!s84;!+K~waeh(Q!$}px`QC|%u}-cGe~}@`)w*i@ zdnwemrSWfE(U}JCmwY8BhzNB6VTK7ia)tiqzn}vJ5M@H!DZa?g-$Cr=(lAUaqwDVe zAsk#in@Gk-7M@x-pYgUB`rE8bhW)(@+)hJys6(;x?z2D8aL>k_Pd$&CV8mCZFhk|I zvJiQ-ZMN04p&phvceB<%qz2h>i_@YkVg@mA3QU+Le2p)hui!l7)r6NIvjybW$@K1L zK_Xos#6`0zZ$A$`rrXx**Ycuu!so7HYS%4 zRs`Pu#rYhj8C^Q9hqZwf^tcshG!&H81Fnqv`c%y4;ExF|hNQHVpE$4DU>f@A4f+zw zgsX0zUU!~C7xDQo3U0CpLyqbe`!w!OBJ@hG^ogb@+NbCA-z`^@iitL}F&i^JMKEe) zXfxm4D~i0gRP#f@qkw7njZzO*ZD=l0AmI^K;xY?1S8{2?6d0H{rC?U^m8+n;69~dU`m%Y4dgT7E+~g&Zmmg*J#})>7PCL z4nqr%6KW%NJ=k}Q4z3%_FSXBk$w-JQEGo7$2ub;U6x~7xh&%OFrpa))07!Nedm@zm z(7!V}!SX9>9Q9&K`8|F4fxR{sL#^SNMY--EG#xNU_G^=d?a?qDZ-2K)E`#(D$3I{X zKF13X6#~93@I|p+ep94A2x&tV=e)g;>n>NGZyzut*NkrEFATvC=~DRq{F<+xgSRYG zj`J3&aKpDrozVH1e-!(EMZ^yES6>2fc74O$BGDrjQV2@+*{A^wE#x|BOP3TX| zh$D@sa{Mbr-}AgKUGEwkkpE?Ese8sh?AeUm{-&& zR27lWQJx;t%f{6+|7Xj*a@<(f>h2vY5KZe@UIEWSp;GV6%QIb}RFQJ2wNayuuUn@B%563P($~ zV{NN}fGX6#S}-WN^(CVChlJC&N6CyR8-4;5z^zB+jZKL?bXS?;&tXPgUXH@L4)b-B z>)D(mJ;XPkh;eV#W{67!Ci7vI?Nc5AUAP&hzYbyhm!bKu&zfG)84ESI5WV|myuxL5 zC1A^9D3UvGbCKQrB*{*A=919t)VFSF5_zA}+`R;M`11Sy zyZdB!pWVARGk4CMGsCsMSTQHHMKwVH*W6dcO4?2@w2|V{ zgT|zs?`}?}s+deD9{LF(r$5EWATiUB0 zJ1UXG1!~irGMzlV|BLpBWs|M^@r$ZQy#Cqw%Hzc0JPXI;=YOf{)&%+8#Xm3Mo5EvV znGu+#l8&)FdD5L7O$dHu6;ib}zNh*NAhQE$i_zSlWJxVtdXkS zc1lnbg)_Btb9o#I;N4A4X**? zVWz6%!1aeAD{+cW`{G|z$EDz|0Vc*77FH&Fw=nF;Zj>>Lns2ZVxnVR zZK=rd5re20^Dt!zbi?dVIM1T!rL{@!Hr#q-)f_NzM_Bz7E;t)DImun07)HDwd&mHZ z*Zu2Ro`574uhmvYt3fLn++SoFOVB%x-5(9>!ii(&h}R;Ati1b$MQ23d|8HxU<(pvz znJOzs%g~V0FYw=H{44DI!7eOP$x(bz%ehq&LsY>tH}`oN9nh&XUoK5>eb*&Tjb6Ow zV~7xaKweC<9r{kb&NeTjQZIS9wWsg9ard{xPa-+<~bhIsy_4? zr(m7z2SBl(f>PJip7@k(;hw?tL1~_&8anK|RE;t~IhA1^|0?T=4*Rt7e)ljssnjkj7+mQ>qG~~hR=7a~1zbe^} zE)tq)sH<;(&6^a7&upy`RsZh%V&&9^n$6>Ay%#~2pgs?O0B^XKtHB1_1$eO2W~1NU z5ie{t_$ZW958`WPrc*W|&Pl_lnJ%!n`lgzr1aQDdGOhf!_pj`iPBe;u--zI2!KJ%v zj5Hs*Z)rs6R9&J-a+9Re_;$8#_LL^7?$(%O;cgcvLx#?;YlBhYZ6Y<*nl_&}i`h#j0fyv8Xqpye$OvLf=j^s#|xjk{567L7#Z8M20F(P!y$@ z67b%>m$R_?nEqc;;j~ZfxlwdxM8z$WG+vEf#razj*5+$9TOKWGh3fl&^~U)%uKex| z0j0U637`4ro9ca=QWLR-*mZmkyVeXDmV{}FS=z@(NlZqv6sjke_V8%A%U&IIU1nN^ z+qw|hptiX|eey)D4%L`WZ*TcgsYLW3hh`K<_d28}t{!#^94&1on;U=BBa7%rHVZE> zoiYO*Ov;ao)?y1F{Wn-JjtK%deVe(iCc}Xq&Ik#SW`yuJ$&G=jd-ftTtW+NAL&>svq<_-S+$p`u*^yaEb?WeK%~zys+YIOSJ9Ib?AF~Ke(CqR(!#vAP&jJQPbS|2u^)xh@FFt2 zf|Ff;&{;ghMU02Y-kmOwWC^1ME!d`7=TT&MHdFwB97&V*u3d>mH%F%wdNd8!U@xZb zL?!DTS6xw!{BMR04xf0;RHe>K#fUXuKk`v9N9fx_1<1WQlHha`R;`FnqDkhh1E$j7 zPM0RhR381-(`-~=>Fzc9j)trdCI$6iipp60mPLCl_!zpsB)Xv0rE=BrnNZse%?hU( z;%Y?3`%>bhYk((VWKo9p^q+jRzP*H}Z0^wYL<*Ciw>BkltZe}k#c|2C8x7E<>YQzv zRXEoD3Hi+Y&$KW{Ybs|>e@B}rkc6X3S9aAz(`4Va1JY8D{URO1Zn0s=Kf^rkE% z-MX6Ydf+#QDTn*__$VFK_{o%|uJp+D^Y3GQYbA^viB9$E*mb1QUh^fRMAsp_PxM+P^@lBIQlT^l0Z0{gG+UzxLhb_ZBZ4}Z==Zie!C?*(zk6rhj661=t#`j(Ea`<78woplAh#TJjn z!MZK(xbdIbwS~&$Wnt;#n-2fd2|cpqF%2)Pch@nz3JG@sQD5}#0aLu+`#F;>aN@Bh z5{jGH!68Vr7C1eEpD9|;=W#@`#tEIY?2I8hpO-g^fgPQaH(pngu5UdK^{;Og)c&F! zsaee5oY&2&a}65~%GsnDA-%C3i4OQC0;R_TLfBIG#Zf;tI})O3pOZbeOh}V)Uk6L3!Gvubo&A{<(nXORd#AJ3#;i zvt9oCYt^mJGFmHDWPiCxR;nLam0!Siy{fnKZ@7&A(S@94mDp)6Ec zKsFCbM1_GY?<`VY;|a?`BT;87VXZ!5KY|$Y_jwX0@55Oac@t(gMczVYYs%$L(E4cv zqET`kcFU$n5(D(bNK=H|$}vpawJrkzHAP633Som}3#@ZB{U-Rm7#Pe&$SsQ@c`Q87 zfd%sCYCa2gq(T+gi%QgJ?pYe8qkSx60zx)HZ zv6JDtvhL6=|zi6wOv83HkxB>iaPvLu%=*u zu(=5TUX%G0ldY*Bs{aYn`}ig48-ygjW%&>NO2+kXdb`*C5`dHMJWZti&1b3@TBecu@iANF-~wZ{Um`H zw}bq)g~7FIdXoBF_HJK$sL)cw)MI1H<}=nBCwjqHd*b_huPA(om+j`D0cvkO9`C*| zco`XeEnC5~k8`cv$&5{!XvgZMjgv2CpXIb`D-Z2KS^#rG&(5nv;d#i_&3U|^D|PGk zZ}0a2;CO$6%+Qj+1d+FydeH8#sLRN2;X8G8{UMnH5Lzl9u41SqdYgb zPphZ=SB);F5(RKdj;IB{hw`+&pe~G@*Q0I~h=ZvkUEe>L(~c(>Nn$692XqOK^*>>_ z5@nDmlKp`A#fkoL$ds$$dro9su9XifP+k#OTlC#;)Ka8rMk4g2AW0q{v%aQ**VLRM z_qa#~o0H=DK}M}rTBzWXQFq8@Dq4iBav@kKyf|wV%OwkF!60sRjTgd1odmVg1o2B` za9qTGDiBS7ZDXogHoXyQjpP-3=c%lBLnOE z=?p6B^P*F~m?O?4w1P9I{>2yNeA(7K@1)bD67mPnP;8So^V?5l(5#{Vt=j@jR z54$3|k#7CkVI<8qe08ghAm^=>j{F=S6KiMQv_;s(J6i=WZ-_Y+haQ*WpL`@auR~)>ITgz_gGuFlN(U#QtOXuW zRnlwy-_Sx^v2SB8Ke5>U5!_Zku^3ym-}K01G2}G`o5$*#A}{fcG&pd_)P6+pfpi=fK#Ojv#jA<2M-Ob-DKJp#r&pVf- zn9oJ499o1J-|xK<22k1ivmo3z4+kDuDFwEqv`q|_ z=xU*aBF-TCceMz?f6(NIB1PRU?QGSIo7TiV=o{Xp80LCc*kkc{t?iwpS#(n$|G?G4 zsKZ&=OW3h}bg8h_lZmUOHodpF`4PevKjDK>Gn!rN4q%KexmW2C3aBLh^%w*16e?&% z2*Taknmo>DHxm{VH$bqkj+Tu@pLn_R7WwnTj({Q%NVy zGK1X)1#`Ky8B0SlPDiw0R{wLuAVjy?(VTjgXYD~L6YKJqhI zAdXE~Vw9wfSq~$U!Bg(kQvZt6{+prZ^i}G&Bgr>{GWVovLJkASr4&wJ9sfLaqdWfQ z=1)9eB7pEYE^?pEJ!Z+GI)<+D^i@Xv{@u23q=FGBD55}UKN7Ghq7bcx9#|t_Up-cI zX?3wsq&7ZZQYVq15|Y))n`QBoNzNa8XDfjL%~kt(>CPq+^pfe6P#Qo3ZNoa(VaJDD z6-u}OkAA@ga$=edy9>&0|M_Ve*69^z>mC;n=q@)={SaS1qMc=vV(DdmqN6{9 zC1(1A4ajCxx5Qo&oz{>mhr_nVOfv=<_OwP9T0m(X9CVZkUAIHs4>dlTQ9&`YMUiB1 z;h4^#W`yW`pv99B?1uB17ITpeYN{Aq8tExCh;~ti_u!{IY`iJy8F|ry9LT6LKs!}| ztB+~lbj~DaiZ;D9(q_N%$q+{1p@(>O@E-H<7J^7!oG~7n9YCUFkp;x60_+DazX{R3 zG6&AXxD~eKTk;sbbz@FNK2DjH1{9e+R0Jf#mf~M zD}r5TXi+i}J;9^`>N~0Il zj^F}?cM)DJi0$k%$_b$5Jak>Itr+n@U1$TC&7XwSp9aistt@l-2pon!^F$y)OAK@6 zwr(-mEA;BcoXO4cc(B}orA=< zfo$072^R|HHxbq7*q_wH13mRD6C`P(Ji)qyiJV*bH^{)Q-_<%u@1g>E69Czk@d-P~ z=KvJa>jmXKsf1|Jo7s@Z#!dGG6OS}lAjU=`YSKf}okebGf*XfG61R;V5aJHpLhkFd zVtuKVU9ke9>>-JzDq-7b;^<n{^##7(Y$jS!P2G6v1SW_LNRo{q_>nRDR*7OYDcVmtE+FeshUws6>{OT4M!Domd9 zGp|SaX(eUGM0U*>Y&|7cO~}}?lwK^sIWC_j-z9VTE#1pQ`GFbelNp`W?;<~dJxX%k zgeVwJy0DMf@s09%Q~{@1>c<9S1wh<56zpbg&Y>a9u35mS!N3%yE-3D@ok7VlQPV72 z{TLhuFZ}s>l1)!?URvU1&Sjgrni$SrD%Fia&Cs$G674R|u1BmMN7X`tGNB`FY}dFH zi5d99JjylGW9y!~ik3|>5@G!(E&*+wY5T$+Wq5T;zdrgrzI-{J z!V6vbPgY)2`0a1+fNsvG9@*-`OCC40XnS6^VS9^@pRNmlca@6PyCT1izkOPjd*dD* zd1tHjv9HSWvF)Mx=JP$>cRKd`x5GU?`{~`b75PBpF~$QDWWK)H8HJKwC~1CLZVveB z*$>i~j^r8Vv*6@;&YHaNguBE81Tu8N7 z2$#rL(~|Ih4LQFZUfiDjNPT-z@7ATZ{_zCZtq5W-Haxt}j6Rd}1kjbe?n#$h)Tw~+ zX2H|qgn5CE}omXs2DK95IZEdoLUjHs5_+ z=6=cV$3+kMN5%!Z)7wnxqk0F-%pdaSPYP~KCP`y-}#_g!Q_rf<)-m8n8<(a1Zd@3eO_sI`);UiE)@fht}L|rY-gBR z_m#qW;qW<<*1Jq={o{aySE{wZGF&Q7sP#(;IOBL7#otbt+FLSS0=K(rsTXv zF)&vG>45F)gJXgdwf4;lD~{WL?Buz(1oWSiinI|&Wr%CH(Df7XZkO2*T zVZ)0*8&~kn?|sKCsYET?jV;?}v>clGiTxkAPF}>?ldnIEC9JZLpm;9IuPeRQ73cw^ z-n2jMbS$xT91zKvBO&^+;?r-(RTJihSEZ(V2lmMbQ!rogBozPiYv;VqT++12o;G5zo=}z$(pPYdSqLW)UjU!WLiDG zN%ra+lq;kAs}>k<<(m{w$6Ds!H&2pxJ^sy~5M*pRo;`J!+4e|;f-4S)n1|L!&3TgSXOTka5!Q3d0zwQ_>F=l8mhAk~AG z8uJ<5q2puKy!Dy!wLF_2_?tLSWYB!8`G2u;PSK&n*=*=|XT1Ng6GKUmH)OO1SBn|+ zM)=W1nh0v#uq`~Oo@^ps5lY}(1NHM)^xv_KbvCBnUryOBlPQ(%63O?IV1!A?y=8?& zu?lIvzrBkWnLqH*Kfia$O%Jggo^`r+VQ*MFDDqKy^Vq{qw`r;d=5{cD-(&QwVrXWo zQIXoK{!1qyUu*N#DzKsUpi6XXM8wgWpWQROp`oH?K^F)X_I4)WJ%jfK#YtwC&x0{lvK_59DwFS(RLA zq_Oq-1Y&{YRLMs6F<>1 zB1a6Fo@AM<-y$ff;JYxSi3-v6+>BU31DF|DTlBzPm9`FDFv;!TkYwPdSbXSgyY{~; zwSKaKKBwXgVS9L#z^qoDHkJL{C_^ra(&-zE23u?5NM84yzHc%(_?eJ^Aa$c=j!Z0N zi@ibY8AwJcT>V0sUyAj;l(gkz1~7k#yCEf5J}(Ftb)e8dS_^!uuxq^psFYDemuaeuHdR0k6^sKBfN+y#sA{A;I4sN z{kv<`mTr9h-P3t>(bgBQ4jJ0@u>%akwuFpWMb6f|YA_?sh|JY+uWHZe8`+oq5{Azn zxuTg)q^{&06+KzRETTZmi;rZ=$=N6eBuL?N_`xPW^8kFqAU70!(~`1;OADG*j%6G2 zG%UNR^tq>hJK+b`@AVS_ma)%9jW44rU#H8U>OHPcYd#RXt2tZkkJgp+>+~oE$jl;; zbi&;K{+aG=j)Oc}b_ItQfee+~`)zJEi4=qB)b)F}o)>_rLjkkv#96JFQWy45-%SV; zFA=T*)G49;U(q>r6kvER*JC9scFE-jy69fn0Rad4fZYL!33sk+B48_+n^yeI37Vj= z){HGy*+xlq8RjA7GO_$!qhA}%0h|Qqs`#HwF8Razog}wr+8zK=TVS#;cKBAt)%`~p;SgyrlFCNCH`jP&4Ng2V-6gEskeguM!K~7aYOVa2w6@PI1 zU8o@l(C+fCb$uYVT^N`*A2~JZwE<`u9wStSAl zhPntv*UE^Nt;uv*H2tLRYOk>`VyV^)+q=&DKckQZCE3g9@P(NMwnPD*eITW}{(xhF zFS^}%djq=b-ShjlKS(#oUUPZnaf*;{_jr@=iXyMC+-~Mdx8S`I_&~68Pp(s?>~t*% zi&XDoB$+vL>+!_?t83F+))mh@js)&JI>C2s>{a)3#3>yK6DC(X!W<;M%^Fv}@g-I@ z;{qdPh8+W9!@JJq7w%PoW{l{o5QRh-C#Z3eK^$lOQm*rZ36Lh>hyi*V_Bz*fS4=Iu znnL|FtBNqqjWS-!w8K{~v4z)wOE8|pFyix2)NzK$vZj9Lpg|2BE6pxqU2dt&9wy9? zJP{|&E|;%<$~z&}P@YnvC~jIw)6 z$!2P%dr?Jc2vv!=NKh(|$Ms#=I8~A596nFx$5Q43R)SR29$EPwk!eP!t<33xT78RsX z8CXj<--Q{CPA-&37>EMu_`(M6yu>fd2DqWl#IBBaZ3|lC?{QzLVKoEHGI1wm3n5IJ z+wAf3f5$F{jW}YR6n5t3hH9vpDp{o*q-z|6<7qF|Jg00p65$D1*fnjw8T526{GciM zHcQ>ykJ+!;j(&ZA*2k}~A=lPOLP|7Ky-Tx4ETo!``Dfsk>Q!30!uTkFG_$EmJIbHm zwV|Sy#-4mVNtn;RwH-`0hsG?=Z;8KUNysvTGntlpp-1MdMIhT z!q{dXD+*KKxXyllA-7ytgbMY$kl5C*MR2hGU;!L6$2cDoh8Or(3e& z1Z^h+c4n==M>ucYIGph9Shk5%IH?g(3fnr1nLnzni(qvRsT)?%oqn)**K8t@G2b1l7M`B z*HQT9@Do=c&i*A5^8rE40*)z1YTd&mHUuz0f8IYp;qvq#%nC4=5sSXSl+gZZpO)c- zXNKZPUJ0Xjo-fom$m*Nz;u;k|>g5>2fHrpdxF)w;_B9=rG%1V{&)Fk8VvK6me9Y*W z!e^{POS!0H|3I*eG}}5zT*92~BN+l`dd!&=>bqVDAwOj_J^9vn_?F9;Qa=^PtZo23 zqc@&yB$^|H^(W2{4#l{SsP7~uj0ifRJE&@+CFh=z7Iqb@I@RhtwR)A@{vI%V{S{i|?^y%qOM!A?piKTF_; zAVa@bQH)geLY>{<28crx*@^&|H%$inj{&EF;#Er{9(_dE2>7PmYk92B#!PmtV%}WW zztrChuFqEWRdnQ_P~Fl7W!s1MfmxrnO5VD6me)g1TXHBdT?x`O9>NhzAdB-)XETz+ zE1#Mxw3r_PhogdG!~>;~qD9cXZKUO6eoZVAHU^-3L|ZS`GjzQfGFd(-EFZ|pQwN~* zt5C~$-Bjh4(;6(~`~CY_EajT{7Wze~fmpIFu#~>kbOby>rfBALdr-)aBcyYv5XI3} z_G7yzbY5B~H7d+Hn)rgoIeZBt;5UKk18nF*xCWmm8B3NoLhpom_#o~Zrv*8X&Nhem ztp3mLp9m|`z-VF^jdN~M8nUaG@H00-a|koDLfn_Q*&ptac0C8jojjj47$5<`ralGb zglxFUhj65AEJGBQk)+})A5=MT0N#VUPvGpY+mKwK7;#NdY{_hI23OeG)$|@2D#wv? z^HPuh=#4%u#^zNXX-vJBZ}LA2fhAatnff%65ijvPGRVxK2`e1>mTo&9zvDY#m=w7M zXJ)dMvp9jy%=5#DkiP{W!n&=Et2l|y%u*U#S5#bG*`T$0UrQaH=9G3wj@$Ae$St(m zF@`po=0uFC!Z&xUL_agz7i8Z@miZQVq|mRWlZeT68=5h+h3N;ri5d=KiXz)we%Gi9#v&K%WOCbix(1xXkg*OZA#=P=Gk@z6rs!Hh}ul( zDG%n9R?2fT0O#MxsiekV?jh{yDsRl*uGN0KHSs<*GgDFQGiJsI3dVjT=jl^bO!DEHNHz@ zTAoXcQJMJAn&m=8KA1$IB!qHGZQj51uvy0zYo4_I`yO#|;eY{@1&;AF`KzZa#F@?P zN{wpg4`_{|B*$_MOBBdNO^Pj7CC}if_=TZl25ifCJ%CxJcPm>l5mEsdzOU`h{EyfF zfVn{A9CLCSGsG%{(w|PbM{cV*Iq}7hOd&%L3W`^s0^;MxyNVVOzMI%_N$r=K^_hsX zvYGdn;kzlC)Dj^oKnHPOZqfhYTN}q2Btn!uh#J%7cI==uhv&62^>IdRC zAJKBjU`ekXz0s<})D<bhn;A>E5$!5U&jCy0^*RP0q*R}(}YWn zX#b=r03&>W`{dC>PHhfsrIwg5rmjNhFnrh>cjWg3SpC$aBss^8`;vZiY$cyQYzw&rNMLc*c!y?69q!DgYXAzU!c8YvmY_dh?u80^4m#jJgMtJlLDd zY`Bm%jGD?q07}>#^Ph3kmP0xlbJN2}Y2tqG@*ZjERo6RPj?)bD3$cXW9B8c)^B&H4 zjT?LtmAxaJaWVru-*azL;3^EVZ$B%&C?(&sxE5UC=;4kl>qkt6T*h+2-Vf7fl(bP% z7m=R7ebls}Hu#*p8Q;Jaobs*^L40GYD5pYmPx1RMHkuhVgDhzfchhB*2D^?4Ab);UKcC8w{s^SBSiLH{X?qoZw)XL>CH$v|Pb*tWJo24xXE|(_TGd(`fUQP7mt98~kt6CVQ zX_|?=ugPFAyGwkQ<-qeHq`n}3Q1^vx`koWFumU9A-?EVKvI?-AB1?UQ$lJE6kK)_{ z8)DB44cA_ns+2;E59wVGDfiPoD>g2pF)gJmSFXyG+_{|TXKqM^|Belsb`iVf8>fDB z(#Yi=W)$V9P4#yrFPJa^T1}+M3ay(TbYz5xX$`j5A2;3G!#W*#m9lC~HwQGjg+`;W zB_BFheOAz{R}>)A_fAFEDRARx>%WoxY|(nc8DnXkEhjZp~r+mLcBy88^~)j!|EsKHc`ku zteY&Cv~s$@S4a8M^sM?JicKrl2) zj2hF!T5I6tcCb8FI?OQ_BTXhm=et7D-#&%dVomO?=2<1&;bP)B%_^S8b1?ozPwTf6Wt(tC&s#jsW@S|5GMA!8XDz#XcM{a*9H#9J? z*L$ytCuFyh6@6fE?9D~D+)TlV|69ah7K`_5q;*Kp&t!p08@Q{5o?|P@nfrzPRy2t) zImu9GTaPV24v$-s6t8q6%sG8G@|0IJXNt9Lh~gXWy|IPJQ82^NEucgi-Dk0yg5ATr zFwCi*qam<@SsKz3L2~k`3i_7~q}UHSb@FLhmitzhy+rfCFB48Ut~ueTM3{8vEp7ex z*2$n|PM8x2{XpGcEz5h1Ql52G@rypv?hm_KaC%s{kmMh#$Pwl!9fB$Us+)9%k9@A_65w$#?1-I7puwu@4zP+&@tEp|@gZg<|IGa}-B~x;qdbv7Zzjf(o{oYYg zc=~p-!Cs%FB&ipq2CK}&XZ zk?=R9e+Z;#98Ry&!-m>#@~x<^1mpqdI&$@XWQE<4a3w@?$l+`>2~X+Hd|1%w=&T4s z1h7^A79SD#IeM+#cfd{y8EoJZW#=?=Qg=LvKmUTI5=&xPMwzF!)DgF7G(+jg{Gai< zIK3_-%6NSEPOHL48`jNIMtPXi0%NX4zJr*l3e0JOk>bNTe)D3$k7>5^dsrGkx5>_6 zo-^h;(t}IE)Y{FXrJG3e0S=V;PChH-tfY0Fq82zjk?Oz^3ty=)ZMAjow~PXlAc3x7 z&LO7%Y*`(iV)V#wDj!P9BNm3N1wtHh@wkxBzAc9SXDW#v-smT^9jPZ#FB3`ZCA6Ip zT+pboxzPsJW2V0J5%u)o&*iE!#B(<#wM|YJ_oCT$9ztZr^q_w;W75MuS%mvGv-JDq zZ00<3Wvdtc`H`;}uw>V$XHecx`~hz^lx9v#-hU}F3GH^S66XmCBUW6Tn9tlY{eg95 z*w2L*49>NE*UNUds~2q?tG=b*CX&O{*-+X8zEJLSHRY!~l-2jpWW0}y`r?9&SHLy# zZ#kof2>6JX@aUE?y?7;->8I|TyTKo;j2RUrGQpP zg=wG_$wk*3$c12dk`>sYG5dkx@^YF0I)p`06_<1tE=XBbh*wQoqp1!&m9d?KEeGD#~&O!TM}1h(oM*GJrr{< zWU_;pZ7(N&25L;duj9_XS@rys7B&dYTfQtK1+!b)H)DU( z>CJSLu%GeLrxJ;7nEh(;nq!{=AOQ18^WRl$@jrYlyBuaJd(%1f&Wp(r@sq!Y<4ICB zHTW(B!J%;%uo!OMYV^y(Rb!lzPcN+FcO%Ypzyh{RBfh>%vb%n*u{S`)G! z$irT`2~XHl*g~(0I47P$t>89%aHpseJhh3OaD9g00Yy$JT^03E_C37;zz5_DD#p5f z`$io-=g1mh2TgP#{`w^%+gLu2-$9F@%?JvwDr>1J;%pI5{SlWT@GT^W*JPZE>M5Zp zA(d16Y=hEUsV3a4fS?V0yx$x;QJIQbUi@#C5GZWHDC&Pl_H4>V3n8jcE*Cc*-}cTD z_rjJ3OciyjJkLwPIc{Iy;QAYl<8pMF`CC;=v;HJ6LtssXO%_Hlw^t`18%f+zw*|j4 zRIBE0=#Tsxp0u0~_Egh4Xt1rVK-_t@YXpbfs)Rhj#ypj@ic`6nuHP3*mN&Rp`TL`e zF|r6xSXzx&>s@ecr%NtB{&I~RNeh?6G>OphQ?VA5yaraGv*rA?c6*%`sLZN`(OCE8 zv*-JqT-TzhrPdXcs>drCXORR*#d|k({dS!fDL9YY1mv*Rq6mPtkPvXNi z?bh6ayd}%P;Wb!hA|*>J$`;OcE%*U*yQVcczm}JTfv8TYHIrt9=Wc1?*v!G1)Ieuc zwvoMo3NLX=oSjnOyt+j84~0dO4GpLQ3wKI~mD`Rk`XL@7bqC6p_ZrvIn4mRGxrS8` zHQ`e>R{z^1078U*WEgSRK8{8+llPZx9m_>kglJcz;Y*>N=?8*w%N(FM@o$glq~9Q9_qoCb66)s;rM{dR`QH(ekl`im zuTb zmkOGYASWry7-k%<<{6tEhYNFcC(No#j#;;~zr3%_wat*5jG3uBCw;ZBxj9#eDjJ(% z;u-8>a=Vx(1Z!?``A{{Ikm>8W?V=Q=Bpx6EfRWZ-QSB`Kx*&~BS83GrhCA~souAa% z8UU6XlF^5)4MBCkA4N}YK4MwsvCKdlItHK~I+NPhalT1zyQa&ky0i(MeNr8P>H+J5 zy&TO7LT!9DbJVPG=5%Rbt{gCu^ExsY$Az7{VCNBUcE&FFxO=U@fl9n zA|>}36;<)z#CaCBu>Y*%zvKq@ZcZCeSne@?&i-BPR4j}tSIDZS{x_n z8IwBvu~D^NN;OB^2Q+7a-F`i;)BSF`WR{Z5B2`Ci9i-^U(HRM1Z56kjE{2-5bWs2K zi)#^UlS4sA5f+J18GM^M#?zIRit0xe%Ghn@T|pP2wG%_wL%sySVGX)12@|dH227fO zCKV^VAmLJ{p1#YyayY-H(QMIbs1v9LdCL(6|3EumPkD#H5+cNz5{mWV&k?Kb^~r?s zOMjgq@g<49*&^nL>=z|!QL6&&obm|O0)0;$#66@ax&DWs*5N?#j4)Z6Ddyzs?q=f= zfy4V_dlS`MfT>XrY-&xN3D1|jREXv@^xPqtpr0pVCTvE6Cl}7(@JW?!0B*&?HVEF1 z5)LqP<}Lz;d}11{dEP^fHv`ZCqktjJ_{5N8Jf60I3i?5tb-R%L4q=W+xbF=)0)<+= zNKOwiEJh2KQT_gbqW-YqT<@2It{l!wI(Z+b=(^AVs6jM=E-W|F4el8E0*$vRs1<4T8%EOx% zCT90|8iVvpgdsFnh;$B#b`vye-~^LxPG{e^hOO(%7a6Bs;uH?@OAyQQGw*X4ZYLEx zs0Q;%z+BxWGPBH0vRsUygfqnjyF;7iO7V9Z6XEQ&yQ=_{OFmgXql`}@R|Ts3OP1EH z|3-pSakibx{{2QIWw((%Ls{1y%wha1MYw?#xXpaa0toEjQdK&4UW8+!<-BN&lPKJn z-}z(|q1{PJCJGn2hV=A~Y)6sx6jA>6XW2O+UD)sUJxKjc>>$lD$i+89jF;QaWgD?>o~v`f8EpH&Zpw5|)DcH1XoE)q-}V9qW*` z-b34qFs3?JDL17TJ8_G1Jbj;{-iMtoZE#PIRtZT&h(xL&jUKz2hCpec#G5Y+xYADIAvKn%M6Jys#xVQ> zW{^`#dYI)nGM^Uf_-QO0kBRnQCeayP#s*)gnkHEeXB^0}P)=~GsFG>lB$5Jd{*DsW!T4DN_UUEeEV=DitI6Db`5#lcjgnX6` zir7p|rnf_5zxpAfYKFep>FzF(?u`cNZWyC`qX%s4-S7Wy&vTx;XXl)I;@)q3zH#_< z^q)Myq zk9iE|rS~b!_{(D^TL&i5f1hkBbvV|qg3Q}8-b{8s_(V^&)$ri&y4Ww(fv3Iy=5hf$OoCTdrNxMi z;}Jgxc^o#ga0F?p-dA}Gqh)JonW#<2GMaRORe{lm$)zh~{$7O+e%1BMHR= zic2BR^oTYccEZvCe{elVcFn(`cKOjafw87YwHQT)pMY%)`qh=qlE8mT&L6ulL_TUn z8!gpd;De$em{?K^jD4!NNfcIW{yva&)NjUIHr?e_zoEOEr6_afJ@}1p-?+{T*-~ou z{zpAymU1}m9I9s$JqiUD8gDEX9i7Rcy7>gTyyq>CjCof3(OWbQMGKO^I=VR$(QCLg zLkTVEb0}BxXZi5X4vb#~l@6xA_YHWcJ4%c3Fvs2ex}Ju+N3W>0r^s4zqk_c!40|Oo z7_<(U_D2?%=%R5;$3M>1)Exv{8w&}qhxiXTjdG->==kaR%cl&E?rxc8RHYkxjs-3M zI317ARSt`!PRMKj4HOz_eo?9I=3Hg8eBeBaBoXy@>eups+bAIb&urNHIT?Ju$Y@5t zZ-c`0ABg^Bsf+(TuWmbkZu%smj*`LAu{Jrkiio4$w6%ga+?AUmc+f+X#K!Rdp$w+=4*bdahQFFQj|Ef9R#c__f(pRkso2x~lCZE*t8{R6@EnLN{zT9^uADfnaxGeG~6#8%#qaGcD_o zwo+q@&T@>}a~=9v_MSKGQ{wwTmk^vMEx4E%Cx%QHM^NqUyZ>fr{NOpeN=CZU-)H*< zJEbIx@J{@+9Kg4l`xb`7f8IYXP02yG7KJ;X7tQ=OQjfr1+p(^8idU0nPXV)z&|g|{ zUU;I5VXRcQC3?=^iWWb&BlK(^gq@FXhd!0*H6QVQ?g_Ap6Tay?6F~Akvt`p(rgeG- zk&b9u^c@lCAcS!Fv59OjXvEyI=UT1Sd_phm87VN}(UsAPdKset{lorHM6xp<3-jQR>@DY0 zzIGyn@Ha!st)Zy z$N0dhH;XF=y2dNTrq}ttQQt5TlwWm(q14K{FTOmD)u+ED{-XE%A6JbXYv6=>B72n= z)x6EG(Tyj&U80s^7~ejc8J(~e3ZW#s7sQ_Kay6k8s`9~H7cv>H&xs*hOXEp)tfnL< z=5lcEJm>h?DJ$7O59%}i0=O8*@~}ACKN=cPqUZ`-4f6n>oT31Eydomvwe$C-cQ>f6$KJkIWubL@JG3oK?gjxj-< zJ((TLmlk4krAoL^JknQsy&8WwOsSC*T;`)B42;9#elpdM&`EKe@R~jmnu>|cI;nK(aj^w33tY9 z7)|>kVE(Yd@GSvyoSt13&vJ`PBJPO|*XOs1ytOzonw|NR zpR6Tje=%Z_BzJWdWK8x_m1-iKL;)3U`Ur`%HQowMM)ge7JLf@t?m}QqxFCac*!xx)=I@RozyFSA;|IbdHUjoT zTpW5IAanSEabl2SQH@_OX4R)9jBl#P-t>A`2|{A1#jURn_k|{(Ivim`q{tBK)}YoT zJI2ar^2>w259J(&F1H-ZP0Z4Lr-b=dR9YgdnUgbsJ=oUEU#45=4HAmTg<|k>hU+bjVnwEEc~^jP-all7uT%)Q)}vYpFYK9A+S2?v*3!`n>T38^%H8a|^%S(om?%HeGpx3lwpW*&6H zkLXNo7m31RiJ7{gx(^o#*YmA>L?+Kfnwvj^J{zSp`Wktdn2Z#tdYJI7)GenrH!{L! zYOCCQA!uBuIqIF)hu8f zsjX_dRo@*qv2*Q-vNUpvHr`9ijb6#z%d-EP=Hq{n^=u~Q+*~tb<*UBo$B|8mF(=D5 z8-0oSxT|;MT?|cA*l!{t)QXM38F%6@IJ*Xzk8ECsXliBE{Niivzydmz7v)ao7a8*X zv5+%#nQ}3%m~k;-yC79bV8~k|x>38sx!A@Q&2$Hh?$q{wB=OQn!fM`;W-;syqo=^x zpYW64AfLC_B-q%^;tHFZ&?49s1ss4?uH8}cs-YbD~)eeTkA{c0b(k^Ki2ZB zD>2Tx-hN^C+2pHw?=6l6$^w^^BTgqH@=Hxpb_~&$C?D@4qn9aj9lqT~{idP%J2B`u zwFg46@lq)NLLK8#61q0y`>qnv;gQ;vCh3vMP9G}F;?Ck_yS)&B0C6-z5^@v7^@r@5 zDe?Or&!#=**EsXJzjwwg?Rs^LPwHMhh_2+a<;;r^azjZd7q5c&8{KwZ1iN>oLW>4N zQ8P3)Al7GO)}M|eLkv{jS|X@P3P&K0?6q|pVW;RHUudbDOHdh z`2(2c1ozcHr@gu$h*%}3Df9g3YajA6XSwv<$Ly%jVFGKPHoo+s9`mzxbKHR-8~3uN zSLohAFw1DI(CC?MA0=q((EU1WvYC8=PAwSvH5>UnbcS!U_ydY&v+9Z49~w7E^@Diu zfvd(KI+dHpf*fOH1Dc3gYZI7vGPmq~z%{RD7S9%p_I6T|o&4dOrU$Y*5=SZ-bUAVKv#n)+<p>x$I zK&tAm-dHM!_64g3{S`sT4!nY(_Q8)V2m_B!b2B4mhg|Mb4*jk6f7u&%#V!BkQfp^> z2FaU200ODC%}dDPuDpLdsMDhEmQ_TRn8>clxiC;%=SjH zSK;>%mU^vRi1f{;b#A`sXN~;Efv+XBEGB_EE};3)ZrMd!U2LMvWk&v{Hxz4 zv+j4u6p0i3nMl7AzG%`Xa)Hm7x9dfRZOagpG{Vi#KR}*MwVm`qZf(~N%16>gp@phzsJ>uYo6b1)D1AN8)T5Y&n^ z>G`Qtl{8&bXZpvcQEVb-LWGGTpUKL|gQk(+UPz~Y{QFEMO>@Agr399t#SM8^|4B4) zk^_MtUw!JR$kU+55sazxN+5ytb! zekajfV@{3lOy&=&qn`<1!1WF1dpL-`IDkgEct;$UF#M!ifzRPO!S6yy@?_GT^nD`} zJO7{QI;~tWFo$8CtN9>iW*>`fvU4Iqr1e!ZLYM=*Pxx$d)t`+YA=a%fI=`zw5gdz7 z88e|31{milZ@Z2N-tQJBXiYr&ZizPCLRC4VUz8mnzAzpS(BC48%~ zGg}mNfgW`DzUmPme3mUcc+sIqFp6mxz4yaOOiJR=!HCTkFn&xXU{MNicENn(>KMNm zMVstpEiDi9THM_cg!y&+#0<+OdbhEeS7dA*%xpt+N1#Pi8nVavXK$eESyMyAuM9D8 z@ocTy?rL&|9q0-tQnujnN8|aZ6s79!tof#$?#*kC(RWo1RWa*U%8Ez)hKsARF7_js zdCzl=(0;FVKeZUG%UCgK{V9+lQq$SEgp}^QoXH~pZ~c|&Q)U*^b|)l!6VrbfbA6lp z60X&U`1& z91iXZf?)9&4y1NdX_x|H&OOeI@G`zAQ;6!P!cf0RvJ!OTM{JV7EAhU5n`FAje&Gf% zMwv}3%OY8!+x@aOK8(Lkl{Fu*aJ_5Vzv+E2J*xtCb$-aC2-f@zx6T_wQ7o$+cLJxN5hxnpwMqj<(cR7gaCG+<7}9z`9uHI8pX1Q@R`{kj@UV7WNy50iW+>< zkh99oUQX7_Bb~s1POa1d?qTcTp~4gX{z@s~W5g;5v{m5U@sSP#H6Hk*P*S`!Z1x+)~Is&@8t-&K{WB-DQfs2*A;8h#x1_+_I096Xuc zlA5fsL~`ZnNpf+i?w%`h_VxLX9hS**RHmx;SLMT=-yfYQ3m>~o3p$#12rBtTHoCh_ z4Py&!0-}i3d$S9#6N(t*$xmh{6rY1W?3FI*sk}GFGVuIMkXz(B)bGNBuR2XR{yBT< z&N1oi>%ypE0(7FE1NWwG}hoTM`WyJpJ!O-+XVi) z-hCCQjy1(1bw!{ASDtkmJIQZ$Mp-*6%G$l&-g4~d^DqT!RT>^WM(X067lN4Rvsay% zoGK;dPs^VML1lR92i%l+&r8@#>>lJ`IJV~m6Vn09A%iNk*@WUAw94G_#qz1jL&Xhz zogT<`#wZtDvR2uyAR>=DK;W5H zE)~h<-*i^%lFg3`dOfB7YU~N@kw18%*o({F{DEk6v{s5UHL!oUOe|s$XZOh5)0q6x zoJ~81-mUPh`WyQs?5mANNAF7<{@qdn<EI=>hV;h z&}Wv89Sfu-ZYX(L3?Rd~T*;yrO<>s;|?1{e0*k9)f7 zd1M4gZ|lNsWGhTsmY;9Os}e?J;n8->GAS{gmQHUA!>&}PojZU0lQ=cgO4?@pwNlr6 zM~^Wz${h=ap8uqsHL-|cb2Lh~t)clQddP=X7H?7d+%wiJK&OeM4i9{q%i1x25Lq)z zgrE7FyBz07i}Kq6>rO}5?j~iFX<)FB3!MqMq>Q}&RF;8ibr*)#1wKER9c)~}b`MJ6 z&tm=JhxqWAj|nQSG=1A+p0x{|sbH#?W-KksEQ+2v481ycoJ%t@4@hP@fxb56-Hsb5#$%K{JZ%SE}(TbZHMpR-}B>aY4YkY!L+TMo1 zn>-E^DtVvZFi#i9!~}Ehxo9fDV)pc#I=Qs*sAm4by!fv7RTTNs@j{{}=V>+9%}@V? z@iW)!{E->wM((A&Mus%^eVbp?VJS4~iCu3J95nNIAcN<#5m5~{EJxk^tVgUdFm8%rS>t8Rt#f4hE+wxQsM2N_c(tH=A$1aH({Q6TJh%_ zyT}aH`M=U4d+l}YX~&qo7ju-qnK&ceqD+O!e)rW5D}51a#a0zlohGxEtC}(6$cpzl zyhNVd%1sTe4_)KnZQ*oD0Bd56yLRV8SgSPRJz1zemNfXw4T8JW;=E=>$c^&<_RO&3 zyo!>3ygxKUkSCvbqHhsb5tz(XpGVTTxU^*0vmleO`Lc)Ro|64v4L()%d{G#!I^t`T zL5FzM?+;eIC4QSP<#7SR9xIYuF`rs#_;Yex6wN-P$NolNf>{2oeogSCRE0Rb*p{}j zvYkp~r@T7w&n?-neqgGeH!sEb5?_tky^Y1BFFaED{y1JUNbDc(=ofzWwJ{QBiX~}B zC5M-mKx%{zFpgb98U4%pL!dzoj^6dS%fa>ekYYyM+>CX6EUQH2G5Ox3k*3@R-jQ06 zHOhx7l{jFq?pXtGnow{&)L!w9NKc_0r@yf%60en))fvu!R20lF2J=2w6Gnh?RjPy_ z`CV-B8bv`nTu9G?r5n_)B5SuX;lIZaZB7w$)}=1=+$JQ=2_qk)A8Z>0F&!IDwl(y- zIuzuPc%|k1`o&eKWv?6ipne|Q6C80e6Ku@zLc>PDr$@WUh?Fe9AW)jOggC|T2)z$> ze>(|zYneVg#yfb+O#iD%iI0zHd6|sy*QFYpdBYZdLkyat>Mjq>su_v`rl4v^T?EAL zX3^=~rn9n3e|t$CeN0O2n}15pr8oumH}Vd)DI$HE!YrYTRPCLeHdAk*%t`xpXXigW zNMj?=XSC<}lRKY|OzK?Mv*t$!_2h*^$E2@9Xx)uKC6Zs>wuLM5nJGq{1>Zba@!ddcKO@4OWK%~t-b#8v**~xaK0d= z>2}Pc$K9A_++IK}#lx89%jkp-T*uOge9$xr#W`ZUI^AJ6PFDiIcx~ zCIc>XPH}emb(M) zgqC78awgL@x@LWD>Arz)BD>pT{g*u8o)1Q9+yTZ6| z*4` z1|{Hx$?-F+$FbF>6uH6~4D!_opFT8BH9-Wtqf(3V zg{e)~qBA#B>V==_dnCW0wE}{TVeAn?px*6Lyah2*M|I~>+{i%k$NVSkzCI?-UP#K2`Q@i=k*WP7WKU`NcX#ad zB`W1NcYe391XjPYEyNyx6Bc&qPoFK(6+dTy#lHNba$DJ^&b1}WGrm-D6<|~MZ4myO z8g@;|@qEiO>70RQ{rR&pG(|B^(>ptWlAT6|vHrMD(sj5hQCz~=(rcR=%_~Y~^Co}Vk?(U5wkoeqEG%L;LEM>{1cI>#%Y?(0y*w6kWkW+3 z95qET-F?Kx01JPI>h3<;J9W{n*B8cHYcytOJY&G#8s_*_if#-4z5#TWl1 zR~D`?x@A@jBGN7P4$eczMBN~whB$a2RM73wl+16KG>E9&+RLJtml636`3EnHZF*^W z^gt-1+k<=0bsR&%v?SMUOvxz?3hvo{X}Rz~c<>VHm;GA>VSfQ$f@ZGq(#oYzq7{Ce z&j6RTxfV0>G#~-Vx;N3#1=jVG|0oB{-v_%o%NKjJGdSzBkv^C2 zR%aFKXN8~x5|O!8_SyGp)kfd*C%^DDeH2u(Vers(L`rG^p~HiUtJ}N52x>`#Rn#fpY%? z+A;G9syw|(Fj#2rkW!tXIW$=}b02Tj3_tpV3n;Yck~+$g`j*RY;qzxVi(wkj0sG@p zeT({@X?AhH2KS8$_JB zFYu!y(~VMSE(+5u)y7mWoZ$~%%gI$W8<1=4{prR}h^k9PezbKiw)?o3ao5Pmg+1b} zKPK(W6a){5EdFn})nN}BTTA8;$?yAT;2B{cFJM-_Xo=h|fOXa;NipGZ+VE?MLaiU*!u{ua;QYxp7iRJ-wR` zhZSdvl%T_5Q(d|HL@7KZDB7VL39oSP%LvOP}O-%2b5`qd4M@}qKgyptutircM`A1Q%FtMTIg#scJ*k5g`32zRkv)_9!K z(b{Us9ZUXR2eStz81yDDq!DOZ6&*?2bO>ayNPO>1xSd5YDW*Pc1aHwUP;QYcCk_$i z1aRJE>bOY$HxP}8Ac5dlHIxG;PoKdP;v)QFz|Uay=XVPzbN67ooA2%!L$}*U&XcE_ zX?t&1r~}0Oo-O~nbX997X)P_(uk%fmLh=7a(1D@&!psyuobp<) z31h@Ik1!K7VRg5$DZ2aAdlQz8w^=dl_3(>Ud)9g8W=2SaNoVFJQL0x+bN}N&s^2fk zWdCAJH-%Fjf08dzVzrF4oeAb@4Qtn`4N|?@(5-N0_TI8JK{;9clcv-I=pwG|klu{h^|Z>{5pyVWL0f-J`8yy!qGM#M zRQC;VX*`j&w+;3~c{69^&jfsJ4?EbMHuzHjRqZPOmROKnrx1zUC?t6;6O@}%b(V&= zTUV9Xu5%C}g3KFyxtY@C8u|PcE#RESL{{6vtkT8Lhx)mSTs8~`+0gMP6DXE`z9@=v zKF1b_XWes-xSbeMp!r)znh8uzA&Zk=)&!5_Fg<{Ny^TcW$TFX_DOgG$!$k0oTI3Qz zk~V^jH?~9Hr@zAiM-{s1Bg-6VT;styHvtFa2Q{ZRc1at2l@ral zVWZk1wY(KzPDro+Dq20*cWqv_(sPc9OtA@1*0`yV4BOn z#L0VJ%r~YF7ccI3?DJpOoDms}J7~{Wx|<6GfoQgz_-1TBt+c-APMG8}zFERh3aJl? zRRKr$*fiAvBYR)*jb&4>oNi4!LeDK`ss=9O!S#XMaxhDC4yMshO<88W0*89?WPlV-HY5ebsL-Qi#cdgE~+duv^asAlfH7wzmv z)X?2|yTE}%FoXVDJs@*)FxS=YDuxWbM}Co+g@-m6Sf{uku*)SEKV77)j>*?j^k6Zx z+dZi925>A^U-Jm853P#?$)*25s01aJz!KLD{fqed@#SpKwyMCx-VIRv<&R6=T-%>M z4b#Z4avbHLq#9^0el4DyYX3FozF9c;n`|#=bQS@c-p_T_pLYR&FFLV^+JBs~zSWjg zHlveOdf+ARskudMY+;HpyExbP_Y)SO-n`(#>`U`dbtiK{-~OXlTTMSpR_N`cAq)O8 z@B(qWF_?p_=NJrjW?XfPVz0qGpSth}IWs!jFQ7b@oT5Sg!sxBQOb;LIwZ_x$4=!|I zH`}12M3LaZlgP!7NXdWI8>ycU_6>}+k4N5o>Cms3nfT@uf%vdK8Mk7`C)4Y`Mqmt6u?9+cMf^X3mE3L4mrgM8T+P0Jb?e-F^8qdvsBP^=nEg~~>dAY< z>f7QoKw&5OuL5Cb`OiLYFI-M;TtS&(&)`E7n25J)a&V#S136fs&O>v1ZH)|B9)E-B zzwkjGZV-1zl%XMe2zYTHl-;H8TnaO3$~8-%`W4+@`(on#C6TZx+ITpk^O~y-tR*>MOD7q zQd}sy0Yn1-0j)WJM}%;|a7zUE-%(7i;Hd~Ww?i~9k&`o=qT|#B8?afL><6=6eaJdX zxo{pbnP$z9-h($|GcTbv!IiD0nqZ#tf0&}pa|T9H{FEcS=-n;s9$K>kJsbVSM3@rp zAO7xW_0lJg#(2kTG?09Ae3YiGH}O{9KVJF$b9u;Z%ms;!>?*wT(;oYX*A&9K9)h?2 zD%caW*}3gNgIvGc8Y-19ACmMACUd1e(*F4Ur}gDT7PPRVe7BjO+;bywsyCz=XrG$( zazB?AgqW;jWZ~EJNyNwk%}Fb{XzYy$o4W*Hp6?kW%IK!?9Nobv_ZFnuF+qeHAht#M z#e{A+KWjN4*-!-S5gWwQuuCe`c&7Jaxb9L}bcF>c^DR0Yu*LYmvclpVhk~_1c!mrp zT5d7*wIt)P_=mwZAeEQj@FG+?Y2rzc=|xx4zZ8+H$haJF5I3UJjI4b^w5|L8AIbUz zCJM3}wuN{%0J#IhfpZ8+G2dJak#Ow~FlrV6$8DQkHv)*V?zhy$EnC!aQXyDch)=_= z-e4y0?7M#d#G#EdVviPfsv%lBlvGw>r;66+T*6<{Zv!^bKOasWXy&t`Dx+H9q2CR`WfZgfCz5i=CAn` zE(`>Z-{Xh<@RKk7?Jpta>MLN~a=?P2D1Q%p5)J-VIp3K*l5=$TV)mPXm4t@j*BBUdqlkuT-PWvd*ALPu%W?@sJ!t)gwuqsO+!)CR3c5Fa6I z+$pPU5~}Kh*ZIc!D8*i~gy-?(JU5i#ambNTnn(ex&q^v6L zI)oC$Bw)&jKh!aZ1X^9*Vj5bHL;Pf9IMT_H((>QfrTw87&X17=S*cF9(kDgRbkn(B zs8Ue4blL&gZCHcPPj(tOE6ptpHmC>91;mCu`k3tI1xh>6GmlHZNIW_a$RMa~+U6d} z42ipz!iXME>+_g*&Prfh(XSqOn!f%-51-Q>Oc8xmD?(4{h0yFIiUk6kW(~cZ5lr8$ zKl|8CTg8Q$uK}th4l^EfAIk4#hG?vwPUCM&a<8Y(eFBUexzAdtFsr9wDWiT|<~&lM z>A2Rtq`5W81R7*hMK(mP_oSXyex+qag}QOZMIh#aMAl6@lhXVLzC)BBy24@hAgkV+ z7ww|_=7A*eO>ZTpb8C@B>fVX0(#mLI#)}mSyXO}xMFf8cAY(a?kt%3mBo+rpLCquJ z;vW_Oq32d9`|Hn0pKmU5&*2}@tPf#8w&E|_P6Kf2t$hCkS|DNqoB38QVieY`42ci_P&Rue_HR7IT`+dj$PN%imH}d3cDR#`dIZ1&+aj(+5Y&qL z#mxxdUYK?XF->**{8w__m|&wUtiU4MBcL{sW>Hf#amZ-lJxS%UP%XeT=j1Ph$5&_| zbNc16GzFz0o(#vi#NE3Mr8~}^LbsF;*&BNkfAn`GlKI~VB80C!DtwloZx~F@#bC}7 z>zjsUowdD#)Ml-YjI6B6JLJP5eB@stc%UwgSXfvwZ*0bC~)3sUmEsg3Ya&C)h8B@Osv#?VgQ$vO1^79xc{fzdXIVD$<*cFz?UcRbA%qS4oR1& zzXRUYeK{gpfsFb4(`lo)yW8#dnu#PPQqN@Hn)BSTb^kp(IDT?BGJ>4BL^Wj7%9-w6 z;apNq32cf@LmM8f3|8mp4-1C5!PjIrc#zc7sh>48n7($yN6sW8i%t!^ z%n4eC%#{S?{Uh3*g6pqXcX1DscQ&`)j@LW*y4**=v>U_&rm+QVTa?n*-Gb^)FB}m} zq>LfiUY+fb2yfQ*$xD=H^}rFI$dCcaI^v^wggaUj62bgapmd9Vm{ml}tRw9#<@QKm zYj7X>lLW$3oj3}6Ku^jArUSf^cSh+E=AT)9kZ= zsRWbl_7^|t4kp2x)8}@j@(+$u>RXmg29nz5ltMlv@C+6e?CFMEi;ueJ>F z^uucnPivgW4l)bB7r@p`*D>I=qvwl`0D_6d)cH!%Sx6=!%$?TuEV0XE-deSLWDzq1 zR*|9aVgV#aV_Yc_7`^O>EG&X?d*?5IVf)uIGDC9+kucZ3{doEYKHl-vo%f&}mza0_ z$;jmS3HQoNtyek&y2z1#6Lri@(m9#z&dDsFgmt(JZY1T%kT&S>I(=I_=OI^7-~j0L zf$|!c@rPd32UJBvDj3go1eI_Kdg*E%UVm>3SN+Go%IaF5?7BU_%Ip0Pg|kr*l!AF0 z+6;6}_jx!;a*ge~W&X6l%#Bt1fuPRLdpQ(HSX zvBFLgKdb*`X7>&5Lr=!U{ngbUXm#x!Q|W|YG$E$HZwQS2_57iIo6tmdA)`2D!s~%A zH`=fvP-|T)FEoH=u-QhkZ;zgRui?PQQb!R$0wD=(&-qQmIE9Cb^cL1T(>u2?9K`SZ$yDwOay-OQ$fBiH~8 zIndQ<`>trl7VZrv(9d2a!VhAoKLZ;Wb=5C%4)?;M`m(;TO~g33Zm~x!(E@k92QIM? zx>GQ*fRv5m7{?C|Kpr`!5>zT`FaK>H3Qh%{Lp~um+W#53e>4`Bw=OjS_ap0K@J$G% zH^1?`i}Pl}G4~|(#RxcDiN87DKcpeY>vDEG2uTPv+@h41;h|xkgG#kCTVyzLl45Rs zu%ftG+9M3SR7yyB^%KJK%vzo>JDhBRu^j8JRM9|kCd}=%N9Gxs+#_iRd|#w(%ixm- z+0x5lAozVShRy6nlnDuqD~SXqL0ByDRsfGggiwx~@vQ z+jZ*U>&%UaV#;fpj8Kh%>NbERk``Xg918rI>O%eC6I|~uXS&UIf#(=qeKYp(%vU$t zwU599qzBsb&! z?i<5-wtK4OxO0toS=LU~_;~n8*4c3@^|r3AJIUTtI(cbIuo*>g$(1MDm+zl>L z5|3S?@!XK|p>%PVLn1CZc*<4NJYiBZn?kGhE|DWoj*zzt(vR?RZf~+dHTbm3<=0oB zTY&$dtx*3y7q_J0QkQMwGk9STe3a%@X*xis*K2A&|2owTyyL|R{y85>(lBJb$Ae`- zJ~-L(W=n6BTmJTfo~#)pXtXn!M(|8>Y`(L#6sLyu^tW1l!e|tdTG=mX45>5mQF3A6 zHeG!foNe7zzo(z)Gu`eW-9Ad=>et0q)Dae39DE~O;*t&)24iJvYN(eL!0JWej;jNx zxR-c+kCl*32Q!qjPARA+5pd0()jU#md~Iv>r+M^?K~=kAo7HIByiS#gIaJQP&oGF$ zwqRo{uEx~j{N}Yq51T%BphyrW+%#Rw3tYOD6hPZ$HLFS`-Gn0 zgi63!<2zyddW(6#XGeT@JeQW|qNT|8jT>E*#Tv{_q>yfnddB(Y=$q}yoB#gV)%ptp z#9@%dZ;%44h)W4N^{pEpF!@Q$u%{yeJJ-4k=VdP;cq}*j#e~jj@EGjEjJ_}1GP@l@ z?3?L>6>N;c@AY1e0klhe%WZkr%O*4EC89YkCXP-Kr7+}yR&GAqP`X#95K_QV#nqJ* zzVvz3{a}*Lgb{2nhBARPgRWJe1E4w%cy%)LXy%e}o*W!X*}sQtCTSaDyO4e$pYas8 z*oK`<^%(X2?41qzs0^HUn~!;~p-=&tjB~_)7=oPCA)riF8l$cV>OJDwVgO3r9i;g| z88zEdTthcQOr!+Xv?`D*;mmpK-nwm97MbogZPW7e)rq$`?F~b zZmkPfC?o^+9eXzc8tnc;vTRc?h~7_pzt)*A+Phd$*k~67&ChoQKFR%eC71uF3KdGI zGlH0sjouyHab}bOuRP>GD!Yt}1y}JjHt3I|vJ5&`9xOKi_guzYA4s1@HuJY`#mKdV zUg@-=!2+d5W=JjtUbNKB4c|y^Xf{dt@Ql^J@B`;gZ!gjgC!Ge=6*acu)!Y~&AqG* zViBa?A??qwuIz7pm5k$>IiY^Pw351YxgD3i9FGT%+vJlW3*SjuR2S!8?4FVeaT%QO zdvENpp=V4Iw|)9ZDg`X$)+cyLHqRVF_;zziIJrxX0yF|M8`yi`IGt%vQoB1d+rUSL z0_oyRX)cNGoo<9Ke7M5iyTxYLl^vJZ$$mnpSD`iJ4)nfO7!2G%gV@DL_EF#dBW^+ht35k*IG` z5J+dRXFz$JnKVe9ThFQF)!#RW@xhNiEahfmaftN&+@{7|vWcjdj>V9&aQgRj^8pVl zA#sNTMeFD&gvnY&8ekaNxO*cKSBEKxXDJA__@U&^&Fi6(x6d0Gc52v4GcKR-HCA2h zhh|yuO$c4!jiXr}*rlzwr|M_u;EvDT+(jEQQCz#s$Oa_0U%*m7%P`S;%o(e!e)eOD zy?+eBHh1k^(YwqGu-{f7$ICgyP0D@!ZS+*HuLU$!-C1q8@8=(@!2xFD`A~Rs0(Xta zEsi^@n|Oo}DriIb%(|DXLD-;&S`anuat*b)kMQj}P5nKZR@_;2)btc7C?|}3k;Oby z&~=dySyB$6xeZDO^t1{^9!?7ULRD1VBjWpXQ!nEVNA^d_er0+SDAxQ!6Zlf!6N=jo zJTc!qKV>$URz^`Hl+2iFA8jFcuC(Sk7Nf5jPn7&#$z(>Z8u|PDGFgSo@IH!Dzx=qT zZE$DSq8UPG!5>pAIxRtigehC@T}<>7t=}ke!ee_^DNwVD0;tXR{z0mV$rhH0WPh&| zCboFVMs9NlaZ503GP9bCfhH`WJb=f~x+GF;8 z$W0HNlyU&(YQ)a>#?bMfI~3g4s=ic(5$0;6$$h6}!*-Qx*AJ~7%3dMXwDr$(nI88F zGNi^tyzq1grbp;@Slk2z#yv8mETv~qXK6`0|It_l;xBOV=EoC8F(-cI3>ciOr2cl75B>x!sk(;8+1`R z3#GV_aXQE}_Jgtf6Otok5}m>CV$zQ~hGP3}g~nh6>-(;4Q5Hif`ErX2M=%;~9P}!iV?zo)azwDg3;J}x^nFh?t|ihhbVbPT$v9h?oHs^` z7^GxpQDkl-_7#PFzvmT!&0nwScuZZJE!(rOIbKe$mQGe)8th<9H42K4%=fd!u$j-S zTc2j9;iP>Rv+j7wA9G!fTd?sKP(TPrZl#yD)ix!xAa=Dn5Z!`K7eM7tvZ0~G>W1}-W5Kvw&!e)RBy zwuKT{1gcuCqqOw@IJ)+DrvLAsD3x20l*?8q*GN9O+lt&nNRnGbbdmdI%tquAk$bL_ zOUN~s+|8ZbZxLeVe&5DscK_}B`)7OXvF*M0-k0+_=Xp5?>yS>F3f>@yX;`tg9k~`- z!jMbwbM4|+ZXzvb2`c2+wd+S`o`uettPUS2PMAJq9MX9wuT|f``pd-tRmjf)t`L~n zVo>AU_q`TTtCwTN{)msq(le>Y{cbh7^7V{aUrUho?9w4F1zmyaJ~TOhW;_+oVGvs0 zkKGNMl{M9>$*KN#jy~GM?B}B{wVqkE>|qb0KiT~<($sEJN`Qj(Cf7m?v;t!&foXc7Is56U> z>8OSFLPnZPyF>Zjjy7$`FE@4$C#sNt^fm%-_CM4!=7yf4e?L!KwcGY+j%a#yXx_RqL+-97J6VjUC*eJ{k&SN{Vp3w(Y z>i(&7w2cKmq$JW~j~|##y`*jKMOoq4M=7BX2A(7`uHzsy4t+ud(ZG%DGKMzZYfr^w}KO-jkPU65U!C0mN1FPbXJu@0!#JkbVlavm*rm ziLHIP(DN9q>PnTA2kcPBPZ{?dq}Mx~Z*>D0qx34d|I~NF_`#z%mdM)_f#aMEcq-43?wg-T`@VDD>J83rfD6RlP|is@C&@T*4=aMqVsnC{ehYr zaSmvQFAAbJ{`3DC$hBM$QgjcQ&~dTPhpmZ;S82EK2Q}P2_-TLoHFbP+tQw(P`^%qiGygLzKO-8E*2b)EV0r6Dct;xnak8vX zu_a;17{!AKOjdhaqO`@FhG7E6#jsx1jr zcQ%jbutW*C1G^H4qtzIKVIG8Q4K5mGYg7gM^lRNVAm_lBdX+K=Q#dzvrphHyfyxCA zEG2jL!k-;W><9eo^XQ`lf(#vCz(rQ`ja`mL%J4zB3mD;q>g~yjmiIi%qEw2v))GVx zl%7QOYP$84Eq@E;jLK7V;w2#Mc-0%ph+Hg1U*7F>v=Yw<*>CAWU<>TstigL{s1}f@ z^ov8+RO`VuD3~d)GA%WeceI~6k6nSppfZp-+wA|n^w5`h9nzD676o4)wLEV+wD@ ziGOU|W1!P_xKF_@0e@FvQ|-txJ9qfTerpID0rR^Qi!PP!a8!(az`FJ9{c{%MJIs8|cA;JX-n>rkD3uVW$T>hvZb zgwUeO5gB^`Ny?tLzUHw@3$2Cm@7(&rY`qZ|7b2w4YRCT9VG^4N(_HX^R-MXMW>S@#mzC#AFe zPPk6^&A{eSMZ3#@hb=?9I&|{uYXRx#^0rrC9X2MOMvWYbgsUOXYp8QSO1i?5AP}CN zaE)o_cuTU~cOBYn{BQ~jrr;4k`b(G_f3&j`s_q6DtM5NCJYHeWr4O zJB0I&9$M;8GVe137D_2fg>H9j@%l1Wxtcy1X*+UCH|3<95Zp18z5=T_awCJNHs>S` z7B)9;s^6tPE&_czFi08Dnp|{E1uh_Ypk>O|h{y3dCt7RopR$bMiyvN1HrRebWm%S3 zC%r$hC;t>Qeb-HVkudfV_8e%PW(5$?f#z?r!3MBt$c$HY7w+=JC@um|gFYn-!Se7k z-b$V<_X_CblS=>uPFsZ$61Sr8^vepeS#`O>w$QZn44o>!9Nfa4C$lY5UEg@t{6-8i zNx|96s@b$jGZ=Zj<0H7}(qr?jEjnA^1mp`-`&9qN>h-l$_y&9sCQp~8my+AMc(jPP zf>4KSVRyC?$~G8#$iKtCGccJMY3@wd<3I1<1E=1jC$hQp?sMBddjH@_O$PUkV^L zU|UshJc=r{iEvlWDEMVLH9h%Hb+&B}c!$_{86n4khQ`+Iy($Wi!iN3{;=3nL20iT} zYw5swF$Ht5uQ?ZU(Qs)jKdU0dbN%4PwI*5Uf90X!fcswz9=YPl`KJNLTtCY@IN(fS zc0pssHYMhwjj!mp3rinx`5H!3M6W8Lp5$qv4BpPH!j9VGlua>67gH^&pI<)p&b>k! z#*Z>3HT#|OLFn6X%@O2PY$Afm z_ns&eIuENg%cBXB3k{F0J{e3jzJt})GFN}(D<(~1ktnAs=0^OfUUBcl`o9b749P1G zpuscoM@F+hju*s{VP@tYUmjT(Yhed*)=YwxFDB+C8;rir=>R}wqWZr^z`BYT#ok)_ z+Z<2h?VFjQdNq0$XkRpkdZWo7Xtty@kBpSJ$e%SEmpK$rbl6fY9~Pii@FhzC;3M;s zpbL8q2UBkDNfnGN5!PIq{dG);%EYhr;OBf!b`#n;$AX7#|2<#lz`^qd^;1Q$ms_u` z>cCum$F3@zU0?5!&jz*edJt&S|03|}q|LV_aG8XLZHkK3g%*>kBFF{!XM|Y{^ExX@ zPo)K-t0r)U3_ZF2$zal=q72&E0{iq@K&Pj*sy$N;QrNHao{4o`jca0mdm_86LmYTV zUc|lzCKAhZ;rtS5{XCAw1DC!8ySqSrBCGxuUqb4|hbBs1uoFO?YIQ;K(SdbZTg8;m zvJFOuiSfJ}R<~>J`F@4+VQ-z~fmzQRU&BPBzU3|K3{h26spiDsYJnG?D*}Q)#tSI6 z%b(K;k-1jmYA}naMwR+sbq-v)Yr%7W?;C*UUU%rxEf+C2W4Zl)~*`afCMiigO1{k0_ITVNe zQzhFjf=v`*N((oOI{y_?ar&RMX$QSc>$n?Lnb8Glqz@0n@sZ_YzCwZg-Zv;QLFwJ9 zV(?nbv+uxNAHx@U(h~UE6O)dXoACR)BkR8|YNb+9D^$U6JrMWb94#F0h(pkS_>iTj z(?0WE>ywI?HZy(5cDtC<4$n0ED6?yN;m7{NwnjbjL1^ohz_zo3*Vhi06VonUiY)Kn zBYib3(?D>cra;Qj1Pr$V`DJ3Q-7VRApG1as`>hEpvQUUJ_8lO6Q-*l|JmBNSF4Ppf z_qbJKlu7<0O3Yj&&K};OuU=`%+nrujMilf$eE?IPUzw4mq{PVItR>0(2Wt5U$&ZN+ z=<5L3n;d@Hw6_ykC+w%_&ZvA_^36hE-NOsfGUB6|w8YU zL zw9Gl7Q^4QBcoAdsh7@oa zamnr_%>Zmb5L8Djc2nQYqp3Cj0u~NcDcH@^c4{7H?0pgX-8?5Pdeu+rE-IO(82_!3 ztO^*~d~KGzBHIm2ZeU&7_|sW%ej=iq^^ZeEK>4J=!5)zXyjV#X z4ewlMj}T(Y0e1)+oXYp0$l7*4(-CkvRSVpuBnjK8aKQ5km2GI?PSVHUizoOY`}G8V zK69qJx7icZ=a#Z?)tc2Pksi^k;CF|VFy(hC8wx%!Z_Py-;_IJn*SpG}9M<6U>l7m5 z0k?OP@B919{mAoyL-6vkhbdc((+Jv(H|$*gDIIaDH1=g=0)8kdTEF<`Q{T z9yJ(Ly?#{Z744Vsnehs^0`;->=p|}}vyXlZj*J4H&8<*eYkW$5>c!&tz`&hq0dPb+ z+t2AqZ&#uc(J!rb(&Nswmjk=))URHUlFCB90iSM_MC6iA6CPc)jP`NmbV#ha3Htaq ziChU=JNr>y0v>UE*C+leWp;b%#tdse)jw0>@! z&l2%Z-g3sQ=1_YDk8$bSWyH#qfPxqnxliyV`j8=&Nw6^39R<#hXTJ4+Ic;K0fAgnR zDm;(K^9s(@xK4xc+LUuKi|Gf4ePVq!@nYY)6dq9?X+K5w(73QN2MS$Hd{ea}z+d1| zvR_7fkhs0v>1rZc_6k$VQoCmJO*!-K;m+MLDzZjIiYTxsqZh5=64WlbYfTlwy0_7p z>ODzZZ2C|<)*IS5$_~zx8;d0IGq?iH zM4l~TJ|3}|KR7FzIBcH`eM;m@CH-Tvd{qwZu*~t#NjIvLwmy%de1iMlW3crvpUdeY zwTi&7l_P}|*}HTo#bQ_h*MMpq8R zTwo}6DPxYmCRIG?s!`S4br+iB{g6>)X*b6GDyk2YbD=Q7iCpXXbidcGQ5OSJ7OD*M zF8wGUio;2-SeuKpz1s_D=MHS)>7bu!D)=Jnr1ji<+w}x8wE8mjzB&IGa-9V^>>9ng z>h<|*yOXW?tn90VhflVYUZ0j%8_Qx2;h^5(tD$TjaB$xkdwe{$1CwVf%+yfya{0;9 zYLcMgF4ldc!D#^F$I{O!=YZ@sp1uvVrJx-!wvf zl!?Up*1o!YW?kTQMtvm=@8Z_K5l|_Fe9?y~AoDc6T&csxQoK7X;}ARbfz6I0O!7`> z2WC2pEd0vm0b9FxnCsGPXeZPv%e^=zNH%Hb4NUyEwREP0cWVJ6ePje#ENHydCc&h; zLlBSdq(69TA9VP~O=3QZ>GTo0E~(4gQKaYQ@BQ0lv4ydBanBWE%Or(>#*J-}z*Bsu zjkq~#7QW?-PEEvDsE69?1Iuuy-4d@lUl0nD9jE~$uckuniNV?M2)=4AcVX<6F={dT zJfa?X@P+A(neVHbCD$=~FI2+E{l*YnCz6%p#vIo2xGc3C?EyxZF0TgHJzq;5!tNh2RTU-X|q|vMLlL2UTaoK05QEKM{tX*89rj+lI-mC#Kvip%bA zQj4?EV&n!Ww|aOxp6}v>^1gGWnJZIN_negAfc2yTQu6B<#?Pz0VCS6`UFH|V7Yt)-nly2yD z(Iz#3Xcv{X@_Jk^&8qAE@coS}MSF3cpe=!M7FZWH5jF%3%W?6}jROhWl}A`5cdl8{ ztoLLoo$t8aL^a$A0#`UaXy-dD0O(i08NV1emtVQSAN8|5zvO~D=l9vw{~I>kc`a#e z!fy098Xg%8i}~xSlMrxKZnBICjQJZqZSsxBwRAd6wDlUJHf;zUywe$wX$&ktz5rFi zed|akx@BD^G*2kQBb72IN4Xh^bZoF>Yz5@G!&;6sQv> zr+UIT^wzxAvc&g~r{GPA>U zYkwK026Q%UY)Y~I#oy=`ff3BEzqjc_*xn(ptTvtk0xi(vi1M4Y6ZrKgSg8Nz>@f8` zD?`s)j1v7~Zq3Y=_x0A@CGD19bPv~%w>waYHk+ht7Mtpx7NZ93r7dGPx+_|F_RsRE zE<5uZv54ZWG>Du2H$A#o9FOne=DRkJPK?ZW$O5Moa+%*#GTT{>E&_IC=m%G1W0UhSEGshU8#G)ZpOzdtPQBC4*Jc?Ldm$oZ-!Ga<8R z^(}|#2%_HKEiW2PeUv<0Oxw|JOn4bn`9m;Yq>QLrF|VGGn5N6dE8;*!j05H!k%<>{Gjp=)rr)TNCjg+4V}*U5hd-&bJ2>{(PRe z8%6%B{Ni8Q*nJ^u?%NLvPV`P{1I4CdUh&W_8u4X%j|UH8Sp~1{cT&uZ2g|{FKF&e@_4LzE?_u{FXR3rb>q05!zE`bNZudd9ML)dNZ*Y%&7^ZrWzVcc*$f z=lB8mB5isdwEE9<>-bK$0MVP-etP!->86fRVrp_DuK($@lr0xBq`EEF!u3^?6qI+r z(xjKI>ScESIyPD!2{fWv(BC;5{&{2^{BQFxE>C4a2j-sQSkN2n5pUZVFFZ*s=ssrJ zt!Vpj^QP(u=#+{P`0v}Kvf7&V#S1Ff|42I0@&!zFuR~<;^Q)ue^KPcQz%?}?^9Nm< ztBmO53e6X-=DB8jklk5T`TGxye;??-w@SE?t4LwrN1d|wt@7~&25K3ep(PVP=!uG) z_PnNtyS|ASTrFw!m^jcIgYyNN0jkmL+c-fXxASdG7+jp;9&b8G>xF0tZtEmFWP;dQ z-GEs;!#8sigik{?a!nc{NdB%&#R3JDqHO%tyhb2sG@EjbCWp-@S1?Q4splPHIcMR8 zfLb&vujVlC3SW7hC-2xWn5}io_8=0o4e4UKQ|-Fqt_uxgXTlvcD0eoy z)3(C6goe-5r&8ZhfU{+tv4QH35GLcC$ZC7X9sppP9|Mn0?egTR4 zOox=nJdj%y4m1Nj9YZBqxSsfQViTcE-QK7TbYL>5j=>hFBp1=H70KCd`GrgKk*OK{ zt1D$<@FWjv|M_cl*9AhlM4Ujcm|1&f$tM@_V@~4m7@hNEqWK>6I#mAt+T6@Ff5yre zv6&+HlLQ^g^)ORsyJp}S`!$pY*$xEj^}PgdIkFnUJv_W0ov`Sz+D7pCN-s2Z$thxd zKv%SHPsoqto}zlBZM0UylYV@95#5wV!IOkpG{B9Bmp& zp5dbxzMsj)N*E}J4sz``GO`HItig3mxK0V}{~T0YzpnBj;=z_Q4c|XF{&twG#*vyb8S%-H=duK2uOyXvVYjWWjlARHyPK!`00(5 zIpom~>yXI1h1Hi1)4g2k_m0Pcupdm2ZIB66&dIm2@`{x(C>b#5}OaeSm^B zctyHExPUhChz1mu6ewQa~*5KFs000Br97}46pa3X(nGl z8LT6pg<4vw_`mS%J_5%d;}w24Oq%Z4!6NKT$p$e3!E!HGWHyo80Znf4{Ncl32G#Jy z6U03j`V<92-Jxh5MCm3F`U6I*T_WCDZ@E5a;R)6fWI3%{Yv2}cx^wOm*RqcP9XY!K z%vw#&UzgLVwb=i{*EaYxmZ-5j-MJ|w=MjvAcyV?|LCbaQBd#sY%~*LB`oD7EtSh$* z;eVP5x6}OMWcaa5l!%`JBlP{d^ew>4M4^ui@3h*RflI|NL&Ssfj`-cc^4+sE!05-0 zu_UQV=w(6Oz=y0(E@%YK3Q&1C_Gi>7oC~z%QpS_}38F)P0zHUUt0U(fS#DKzja@Gq zSsRBj2T*J$NWu*=bDllj0#V=eDf&i;a-whx*tWN)Q6T@T$NXS}1VwNXym!IRWI5^& zHVCG-{BcwoSAfDjmx_-#xbl(5DWKGyg3PCd0?<(w}svOhM=bO#;(vTWFf_(`)9q6z5 z*W+?VGUaZmHadMz=$XT%`jk;)6g$MZeZ?y78c0pP4IP|0%lz8omPT~2v#Wk17vjp8 zuKGlvB}^qGk2wIwRB`<-`9)_3pR8!gow*<#!YtRWg2DP#DJ}ZXyUf za$HMwOUqlewvbnUjF=M7Hzvuc!qL zro3xBq!S~i=Jt)XHNC?$Ihko^lUIiFP$*rdnR-y}K7rnZm0|~eP|jW3HPh{o>YpLI z8Uk4M&r>xvf8Xb+Pu9wUi;i8|bU72?)k`Hl4<54+BO`L2>1?R0`F(wyAM`%M<8Qia zqg%U~uvR>mvE9}a=#Zn{_mA`muWeesXw=<=6{c3Of(e>zldMTKqOT3Ni$j{t5xYb} zguL^TPo%>=kJk-8XFZj8ddMlzTjut<7%s+{qX0psY^}Z+%CYZWi&HKu(j}y4QzSV9X8E1QEedD@o(x|Lw8nf?-)Q&~ z%>m?b;B3`r48bJVBGUvkFDzx_%8?({L<_I~RC4AyXNJ{9@n{5la2*P6C#GD(l_0-- z(Lr80sb&s(X4r0rg_*-Qa7pUgPrTocp8SG+K04ZfIeN?fT-!+O)2cmp^sM#r>d*ZL zR$Fb+=1(3{>Q-Ev({B%19EQ%ht`W^_Ck`P&g?(JH-#+g5*vm+9)tag|$HVe5g!H4N zzWx3)a_3m8ry{Q0H2sg#*s_=-Fl|~f z{6y!K%_p!+BJR`s;bf~u#xq!=+YpZdKkt>-7a$g79NX=bObU>GsWLnN5-p*jSdW7) zwVx^_^!}3Fd)A`WwY#5?D4596s_PZS9t-oaLO=0d7W6F{v|9{bU4kRhW@fi;GtckS z;wGjRwy-a((}@>*i;k~xVK`> z*#sZ;_+DY;5zcm4{%W&bD5cKZ5tXYgbMS9w_koV|I{P4p z%@1g7LYMmq0H4#NGkLJ$%ERaOkR7L9w>UaxIZtECtFGjCW(GfDE+aYMFGr$xJkdL+ z3~sDoHWD=)si^=LYM0(VLJw?auZ1+0TIEH$GJyhQA?doWj;(RYq$&N%vL#lAlY0a- z?$?LC1eE*jbIf7NDM1UkCO7zUd*p86UR?EVQ6m@oUn zarna^+8Fxl#Ywch5G=IuQoPhia@zAgMVK-+-zyee=Dh-Yt$NT)?vxT}Psf>FZ5L&* z_L>y%kjs34Or250u)w)LfqqhH&Cd7-xFOS4kQyMe7ViwtU^DBJr_P7)%zs`}AXBd^ z0QO_gYZk`|Y)h1Ss7vg-V$Ng}EbipuzYEGgTL}2$da)HvYvtY>W42>j`2Y4p5rZFA z>72M|O@}`)AU2=0r775R`PP`itCIoxRtQ~7{+q`xONUjt@`Un?9@8+sbLCGi!smdo zzQ0=_JM@G6zRl`c)%@A_!53~<%K~1FKQ%n;IREQaTC0k?WRau&*Sk~S7w}VZ+eva; zQ5N59ieHg0*?@c_Bt#unR&K_MmzR5yYQ(*sh?+*Ih-Rkid&WIPd{WyH*WlV=8}hwE zX@FA>f)CngKd545Ge7(=>d24-Rmxu57>EKjfNT-D`a6`@t)>@-I-gC&Li;!8K-==C ztoD#S91Zk>f<{TO`fN6di(g>9|0sQrjwxNq5Bd4)dlY#X+Rv1445q)$l0~fv+%u81 zWpVIrw-VOBWKt|2(yK=v)xMz!x9~Ef?bFrLY6*^O0_Y3S9T~YFrkx&F$2!fHk`hh{ z%&BK7JGaFEMR-jiyL5?VO~e}k-q@+n_cY&_wn)V6|HkkzTf_$*)-&`|QP)S_FlVYa zmN+zYmkzLRs8d~*%jUz@bEM^dAQsOH&U#QM3|oi0A2TY1ksn}9lFD0vXYm;;8*{fe z7HC(oz0iR5f2UV;*Hvn#sIbGbju8rI-^Ubp36)Rix_j}T4^t@kjw4-Ba~q_@Saw1G+xvJ}+nu{%v*Sxi-t;zBjI#kGF=7ZemD zOgdWWW7JO{-0P~(R8jR}Ow;|AL*TKEL2b3m2RC0d=>liH9NQ6#=WOO6Kp{t?t9zS& z<`JiI5*Aj}qZeur>&%__MmM6XH$*A==Wgwz<3jrOrk2gdN%SUv&E#Ud^1a+oRvE5Q zh!@%cq?c5`!jot)Nu~5Fpz*hxUr5?iH%|7ZpMMR>W- z-hF(w74_E&YCu1LzQ1%{!FtUU0}quuwA$nL9!%I?@aVSJA%;~%il|pz7koQZy)^0| zOgGuq@cf3%3)wLZOTb6z@mMp!PqWim_ZdZ# z@(s=CFnE1?I{e9$7z2KD@0FR?r*s6vodMd)_m}PQc*clXDe$*F-x4JI;ez-sio&{F zK=wfw^)Bjuiro_%6RQriAV+oRtj?`E@*IbGU56nFdT)T&kMsMlHpD`&F@itElE$Fq zOaLMFUsNiI?^Enr_e{5B@H^@s7$@l|E^2?lDw}9=M_vNQmXn$c;hV5XYdPxAD;q@Y zt39@L4%oMq_&xnOJqmsrYUbhGx*R$5wb)5B6aM^1|Ld)}xh)OfhnY$H$r{{h^1ynI z3{A|NpntGJjAdahJ;XR+=OwY!(9yQ#CWG%Jy2>AMes|%i?KF6yt>wk#e7Poy7+qk` z+OboGH^)bu-ALv1eoPD^wK#F65Eb&scXbvtHp8Ar%YV|yUS|#Ujfu`rwWdW>Dh5ZD8M|D7qQqYE}BL0K-pZ#p)IrpRN8f6+E;RaIun z{7z-3E4mv^=*`5QgstFs=y@wHIe=XG3@R6W+%!T2Fx+TJ^|kQX*_=NO3QFtE3mH_DLqq=D&X{5#5H_UrRaOrDv=-H93P*VSq`o zwzyFof9238jYIc5-(GLS5IH{OoNzI?jZp`LuGRmp?fKHoCur;66Lm{6gzByodbF+^ z9)oL-rQJ96g4zC9Pi*APEvgK>?A0k2k0wW4#A6^QGlvL3?oRp1zo4eOeM?!&T_!Y<^)P|A(lFz}>E4aac@z;`hk&31X%h8oV@{l5Wh?oO#$vWpExNrjL*%L7?gPs6@_~9PIXTyS z^i*z(?AVQ(NI2NDr<G0YRS{*}F?Vdo$eoYpdT8Z=ouP*q`ogew^ER!Zbb zEe_=9eZsu32ky4-%wDNau;Wrc7pF(Q3uQT!+C~BYK;L;BESflccd#fzR&&-3{gzs8 zbvWO2DY%L|>x45f?N!@CyP`QcKl|MHJec&nR~5Dek(mw5>=!}T<-UfEp8O?|Z}ybg zGQR)3;dMf=o{8A5y-e+8TDeW^qoKU%JXGbq)t*zyH3R)azmS2G_Pmq&-1!uR!ckFV z9Y;4jk5;%*;QnfJcbv|LfNI~gca9_E{|n%E_~UU&`Ej;~1b!E5bwVp$X%%_Ut*vTp zzoSPnSq@=*_i8n+kQocS$f4i-bCPt}0q~3)IQlbDkR+#RSE#L7IERyTXE$N`ON)*O zA2gHSp9uHgd)dpCjt#HuW;pXM1-C7&83I~I*Zx7AukQwsOPp_2L#ehSLvM7Flt~6p!blY zlCfdCn?@^51>V%pA3d=hkVT($T6LjCeAUNriq4^BXh}lO1*(%uV-+X(No)GiKHsjg zAbNSn-x@-{)MpAn`Z&>a1-UEV4GqRYNiF;*uT&bZ3zqOPN!iBJV3V#+_A1xQJ<1MG z<1z9P;aNP+4tbheGP$eYiwIw`xhbw)OHcpqN47mz$18Q)SMUYpR0mA-afG*|nxN(g z|1%^QyV~j>X_h$xhFr@VRVw?Tw=xe%HtIf3AqsmO#nErwS^6<9zbxW1NDCs&JFV{O zaRtzZlVWXqn{;Kl?cZCl)Y+tsdtLYNH0+zZs+no49K@d%2a$}z%Sc}Tp(9N0l$Y`kiDQ9dwso_6 zzo=Q8v4Qjad(r$}cc^v3^8Q7fVCpY#=xyPD4v`r8loM$T@eKL%D)&KmsVV93KlxJ_ z8gQQ9;pI%g(+|aVEFc7$f!#Y31B_x_4G^@-q+_oIm0SJrWDwTFb4EG9mbWr zI*q-r;!kdxf*~&aA%fiRlUDQkGlWVlLegxhlwD+ zKg5aq?{17AHI&2mpvqe>gGXTjCEJPcUssPCdZaxDYdKk*2ktk=Op^Q@=Yd`gJ5GNE z5RbS1g5xn~>?|1ruvb4Cf56^cDUvVExgJuJZd&Znf%i2D@-Yc|YZ4S}669(U6krlm zC7KhoIO_{UEIeT}ES2Az>2|8L)2%XV9n2x$wv~T(G;Yxgfpjq|3P%OfLh}V%OG^E{ zMHG)YMZG)I_DWd5KktVGj&L*OFY@L9AML_Nqm0pU}Jxut6eVy%)j2#_*8JQ zp7IRW3q9HgmGz)00HRk7cfpzT};hAOr$B?O@ADcVC=np9a#@eg@y1!|1ccxw^WL5m6xGAU6O$#(n+|25Ju6gIcC@X$mN2>+ z7+Kvh_Wbf!?35~t)}5GRMs^kS(*ANa+vcW6KmT?Lqx5^QdMM<=&*VG%lb@Zk^_!1( zA8hV(txV-t-TAB)b?)@`Swn%4gw4y>M{Tu~E!2RBPU5?;8zZR^Fj5;@=zc%_A%<14 zW$Qv_!Q1wqb=j%VZ#0aIU5~(MzyfvYp;sc+hvqQ@W@aWJFOf)6m~pQT3AgcCT}oc0 zx0iNns>NqAn1A~z+&BS`e7uAf79LW3YHJCR@R=<3nRNA;Oa`|41wBtRf&F(c1OT4@ z6gxk*7DnBYlG|WM&d%Z`fw34xMB>T{^eZSg8C0t8s`@<>klMYL*of~m7bY%z1=PuS zl?WW|rmn^%)b(pK^TKb{_6VvQ{UUY=QEK;ll0Ea_XlUOwm=E8mVw&Jn;b>Qj`Ft5e z3h3=uxTiVK&Ww9rtw~oE1xzt**GQ0-wXs!^w?Q!>sXmkoB(BGZALP;h+6tj7B{!s# z|1>bVJFIX4-?u@?`7A|b9pg%&9_>QE-!I_nA1XkJPO7BIyO)|$rpZ8-rF0Hjd|Z_~ z;y$IKm!LCi7fiUfc*H?^AslUgcUAAOpo4-T2ag3agK`+eYS^_vOfy{Pm<~;B__k=c zRXBUbjvCmx;=o!&#J#~L44oB3KR5Q}J^1YG*SSGqiWS=u^tw@@fDZH*CBC$3k$H^d zegcF$zM@4~dUQy2P{L_*knM8;;*Pqg$i6-$C+}!K0<%8bJ!KMi8Mt8AXVsr+-v!(r z=mZ|72lUuK@=rx}2ZVv1V~~RWHGbbxqyCF&d~wFu_^`K@Vcn`80JJ*lPaiz4`u;7w ziV-epfA_>|05#nk^Mq&3mg%Fsmnf)FJFnq%8fiXo#9d6Wj4U`)z7{-@T1*6_faif& zM!g2zzWEsW7|l_3Dc1Dr9A&m?y^c3~;-ke|2&ECgza7JwXY@v;-S@ z!W3S$RL}5lu5Br1jB_pqwdCI1dZ5@ClS^SLSWD@C?Hc{v05a=e?Kh{YKFLy>e`j4QWg!zlxmk#L-JDQt8vq;7pL$8r3s#%KZvh@QrJK#v8hE6k^}t-v z>8dNoVUz8@05fF%g{(d?HEqMpnF9_t2ItmhNCIu<8IGTpxM-6@m-UN#okyL1)q z;kvo`>1ae``hl96zVyyADGheY*9@E+2{`Ed2G`ZhkOs{cU&=9k*UtX3W28HSlHG%z!mluNVO36)U*#E=3-tkPc4~?ng*?{doth9%!wm3KC1Cqn&b%w zNsr;GT{lg=Z`bmL?ZF0)^`5*xL^*J&6NET2S;i1VV%sewTXR0u2pFc6)UNkWxy-|1 z`xESQIo}i2Zy#6F%3^=JzkpAMupQU^H4(kIf#Lyn27Fo%fA@oQCwPjweluG>(#jf> zN48Kq$dGIwgc;v!>j7S-h$f4^cYtjcbm$#=Yx6wU#{tv#^Y*fWgS2z#>5R=9csjZ71Zo7LS+vu|K;OzZ!a2Z zTO?v6Vf0txV8&=6ge6NO^m)AKFRq3_p&w5NY|>Y~(#mM4FCMs7y#=v4UVnGYxZz)Z zigzM@)$|F;HHhcBwEt6%2Lel@%7Pjf$odByIL=>h$yuqZ_e+Hc5r;}opwkWyDc^d| zMrR+Yw=uYzB`aS9Z~h&_s*j+4$fj@c#AR%SUrt0_lgdHyM0vS{JbAn2#3oTpL!AX3 z#$M?LQ4LEY7W5YBIg>EmjfP%%)!XvscQm~Jb=fIDOYc1f(Buw{Vrer`O@d@+l_Bbu zA%b#s`S%GimU7)QS9DJ}-Xi6DPl17tjPGd4<#phgD>4l{Y2KjKfA%^_*0#_89UNco z8u>QBjdCdn9!CyroAHB}_qd~>zszXAJYnf-TNveidg;86vb_r2i8dkLiU|q{C)T0) zg?0|TLh)k{9GtAS6YeNU9qKiS021T9$H}O?qh0Ay#4|WX>tu~}&K-3qO(<%Ad=LdU zi<4R5zIZ}(qApV1De_?ndx~S=`VdpGUVe&=??E~7k(U{Re}6SGpQFG)`J~KH?LuOX z@g}jUKKGfldP3hQUua0j13tR_E}ju8SEFq^7Vj?oHS>y&i)z22z;A6BKwry2lv`Xfj$nHYGAWa(KpmKB|jY*okv2-&H6C))we@(a^H&DC4VumDmL6C z-rk|_CD&nu9Aihi3kU}*0qXq^fb~A~(SU(6U(2>)+iM z6{vPg!EB_5g64^Dh{#T^`9T0$cX@MuPD?#*RtQUskg^9n_P}b-^CV=l4=D!U+M?0S z2The8{&zqKx68iaH8J;bqE_%KF-)@y!9j0jVriqAH9lA~{mg;Z%Gp=fJ_y&aH2XKE zRL!_c>P@_FL3g(+RSNYR4{kSZZ~y~(lVwL;Q2Uxf_(Wg^IN*}^?VB5_a{KacufI=D z-%YKy3D$p`1HN_I?$n;zPz%tMu>(J|l~0nXjBR9Mm(p^A#Ht9p1x7Qk|Hs{v6iyc0v*cU6glf_Uyy}4bCk`92 zP;>l+gl8s^o7#tj>}15YZb3OJcExhKfA~xuH4b?JpGXzv3BGc+KBT3c0o1VCZ>(kA za@e7rslSD97*mCpPMx+>fJqE%=(Q+6v0an+t8wwP*gH;;{hgNaAi&mY|A=}Es5qJ?TzK&iEa(Q^;K75t2M-Y3A-KES0)aq+yIXK~_k`f??(Qt^+w;tDbtQx(jXT+d#RlEEpDcX_n0n=4Sx!)Z9LmoP~B8-i9jR^*tN4 zbgIm9&#jg(45eK)?eUOhK{@wBpV6NXUD)yJ%=Wb{8VFk!uvtgOCA`O3PCK&$U>rh} zZUoO@qNlJ{BJ@OyaBa2td;ktW!ERY=MT!X+edUpQVunld|C8}efQq5YmT?P0QV4g(+q8uUjl#bLRbs3;N*=4j zWJirGCM=vvF!9W`skB{8HkHx%p2^zX74oN%4K;j@4(mW`FAMY2Ty!$>RqC3Iib($QA zeGl$@lXqH&F#}u2v5`p^KANbl^--nCd(Y77^abDM0{{kEB>}v>58j4@|oi;f>^eF$&y%OX%f8pYlf3MLXbve@|wPS$Vs(Fb$$9->CfA$y2UaH!i zw|5K=G9dN4r@?GWR>NJ zPLCt15kRd|8a!)9V`&frB)wn01mqFdzkSQ=e9<1nTjQZv=R%|Cf08~FWUx>2QrUft z)WP82q*!z7wN1Yz z57WFRX?u;o%#lOi-D3~#&!OvaZ7bSnOAfZb3Nz6m7H>GT$7%=~Y}qWBY{D-6-1GG`+)XJayuVHwD%3}i$G zGA5HXER!`VlQklvsPBFB|Ge{7iVU~5+yg1nB&>vree;9n=<}S#&6)vb{~$)%KpNaAMG{L8b68Lie`XA?6uJtwA7n;OY|paNh?g$x`KuNFViu z(mX^^IBTM;zDf^Q@jddFUR4dP)orG1dtX-QxW~K>`0p0hbX*}Fp}sI(Pts0(@7k>5 z{w-Ko%JyoDs_qB@Q)LGuDLJ=sY}@+kEM91BmDrGhIKnQ7DMC}X+Qa;4&ARolHB#J@ ztf=S2EA(jhz81%g>9e8xVvcaq3rZA)yhnU*OL{pZ;|XQ^XsP(-;NNE6Ru=Pvd%Yqp zjYe)r%;{D%A7+d*sqw4*6MO!P<_47L@Z`!oAgWi&4GRokqAW@{QEhPgtc!18YT=1> zrb9+ok&?BiiMGTEJN#fxa0YY~4rD4TKhz_UqDe~aP2?QSEB2bq#fkZC=(h>-9{$eE z7z94MCZMiQ>@7u_$;BncKuuDTjuwY0`&$p(&H(V{oN#Tnn>dc;=WWv^gjX&W3X@MC zxw5XpKAQjA^I%roE!j|I_c5CC`jMqoXOmzZdyEE-&3nZ5sodFAu<|oW|Je>(NPm=^ z$N4k9cKeTJbEmAvn9`=2n&K)4nAW}L`yntYM=y0~;dZR_&or^J!X>_=QpX|_EcPca zRe@3=b@5BE4_8B^shQKRltES!w6%QnzH-PcTV)XMn^BumAHEdli%I8LRYe>KJN zOnzRRjwA90;m_&j*vkhNr<@Wjq71`tTEwxpJ~O+zYn^yT5H>u(5OB~#+S zXgHhlsY;BbC)Xb8d}I-`cVWAs0olGJPlWpg3NPy{ri+trGrS55Os#)J`jC#sozDsC z8+NpJj>A%h-1q)HJQ4#l*=z^W+e|MpF09PNR!tm^&pcCv0({#23SZtfHxe`)xieZg z&i!qWm#+L_%lL*j>009?Q0G?T-}TD>bP@~tj`vtL4@Kel5^Gkh~i)X%2qyLG^FSWtn|B29&?M$W zQ(#%+{j!T^Go$_&J;z*hCGJ|v_D<@R&j+D5=?@C#N+ofhGAD(QTRsZazrUH-_^HhQ zqzO|Zv0**l+tacTp4z=-1jRMyeQr#SWY2@Bw>!Q^GBQ80AL=YN*?1pEF=?w3q3lp$pN_p`e+vMm4U96`-#5TBJA}4 zBc1ZVZBjDNe1}M5dt*1hFy=(Ew(sAqWKr6ZlWe<(7}PLQO$ZDCj%=&WrAD!gedfqx z#9Y#b-*zYQ3jbh7z!XHQIgVyO*VQA!VMOwiNksbIYnD%*PZBv%{IR?u#RA0 zm2ZH1(3FlWREkH>&xPE3VF2nLmE0_~9dyFa->l130oa(EjE_Pz7v2F^-Ia*GR1nL3 zaE7T=EDMSd^sH^X&j(gVL;!0MQ{;Ywg#;Yvt?fZ{dCL^n!w zfm8P}y6J@^{UBg7^jSncD8#Glp)Sks$maljh3~HE_kAbjo%-fQy(At2!vW+!UfvHuPzO3 zzVL*tT)bek(mGy^s6mm8Te3I(ba+@+;~}qg`Z-&Wfsv=h zgeq%M)|vyM%EpnT@5~pkms`l@0h*&7llXIi)lkd*nQblAA1>vsBHXSg#asNXg)r6m ze`YOVgnAD(J0;idO&X93ZCtFK)$odTq?TAu+#7xdLonB1*5#)sf`m&Szgi+U7YJ7e zZAQr4+^%4D*mVLFn4RPGA4KTPJ&<^$zDT;h4Gp_mI-OCGQoUK;((>8%ChW9>GIUG{ z1w(4wYV=qD46X{X);&t&G#vu)x}OC(f)>?@>O7t?I{ZBuSuIl9gqL>OA0B)zcHxMB z(3LN@n{1mtSqwI__Djui$HH{rI42)y#*0=aTO6#j9ixTfwdck3Ib`z*YJ5k09mVpE zt~5UGW#W7%{~;}y?CIN``SFei=8Pa0lt>re7tdS^wUw)HSP-bOK?5n^S96=#Es#6V zt_11Tt(pL246+!%Rn&YeH?-2d`O3T05JhK6q{-UR{&2(t?4styIpN}Wnj3XF%+Vey zodnPf_JuOPz`;<&F~ZEa(7VbAJr@D_8EI8 zeTPtQ!ZB(aUN9IE;(5*U3dOnuQmO@xd5uqRj`Av*PxhM3?kOH&nVXV!nNEOHbF%Tp zwE=fm1jV zJtW^$2nzsjj>Z4P8~fH}r`QHDUF9rRP3OXHnT=oiuX9`0f{%#OewT*fGn+UqcS2m0 zd_r$emVEozd+POgtI1k~$}L5Ui@?jx@a1#g?KT&+=B%CcO@Oyoj(%9=mqsj%*E1s$ z?c&+~cy4t(XWX^nqOcOh7cXR>@6$Td8}oszlu3z~cW0)ZBA%yha7_vwnIq%no$jJ& zGw3TeVF*%nIM4luygpyA*$u|b_EQBo#WlWj&ZqvcC2Odtx}_PHy4m%Z@4k~>(GK$~ zuvc%6QQkWaNdGSR`0uXwGweW_0*`O)X9RwOAwne=0(~V#y$?3;hMZtAH{fZl^tl$; zce~3Tl9Mv@Ms5C-eUorg{(3X`usy0n+3}3I9w*Rwvi$xeF~Z=)of(ZImU0Q~ul8B% zWyIYwUD64qGn@N8!@s*4g#y?4pTm~^u}cOl61cCM`5ItfvWymSFF z#u`;DrCilV@w&oXTZh!ySR`da%*FI9J$^LLq3+RS7XS$7Z{qR|p$5ALU3YaK?J-%nG!3z?o_ z`xF8kLblr#jH>OLkMYdXx0Ho>N8g-+?B?N}xhR~F!poLx2sv9@L*B1Ss$UVflARhv zQno?XDV%%ARdUQ7oOgKpJ_30!!$>-3d=G(>FgZ$HV?S%D&qlJ6JV8<$X+-*mbLUtw z26d-yOg2X^jwka!&jboCQX7wu1fH9=74fnR?5P+8AO`9*gT!3CRu82c8Lc#Pm@<*0?Il^ReUo&4>VFuy6S9Pe+U| zOZW|IWylW}ulGjtjlOmQt7@s4*A~oV3~{wRRamcZYdFr@9%bzTi~EPLJR>N*RGO+! z@8bvM*xU9pDL>SmUk~L!u_%K73Qx)t_0eC=Y_f2t^M0xvwlb<0S4b*Cx9XvHl3{H>uNYSux52oX-=RNc{+&6L zrTmBOat2YKAI*sIIaXf%Mq!bzOq+E0 z|T7O6@58PmWHHxN#9%51Uu``&gj z)3s`O#(3^S$HyW6sH?S69HZv>F=_)Sx?``;3)k4K;d6U#6P0jBg2WV0@e#)wRq_Bg zt71OOwORvZ|34aR%e2TC8gbQv0}=nqi8&yc9Y40VwOh(JCL!47SKugQX&#=Hf|@jG z@)+plr*XY7kTkf{aV2i#%l1+*h9DFga?uuhtjpOWabk87PKul6X7q81-}i+zTu0Bd z&Om@^N9l*j>*TA|y4)7t(p4xmL4aY%q>4VWfd)NGdfb2XpW5;_Y~lU3e#!a4(T%k? zIt0U`XL$Z)`fgigt7tK6;|Exa@@mK!NrWhpITdf0AIh&3PR2+(IkE!I(e8gzI`k~S zwuu1@5i@>!OcMVzpmJIb9Z{J5#-Eo~GFL%jg>~#B9?5M;MAcbZS2|@6-@aBD?BVf@ zcl2i=s0(xvS&!67Ko!Y4sd^KgaQ2dw%pP8FNIf(EdO!?8e~UOoyrIJArRW z(Xra#(l+zB)PwQSmoHd+=UBOSQ?RNK=Xs+?L6x>F;aMlcp}@oH9Y5|1dqF~^Dc4#C z!^Vy~6Rq7BV+ZycFzckBLzc@rxVA;YkR$~+L?VO4kcdwPddO-3msD| zJ@%;jZ7Jx&4`lVY_l{k%^E2btLH4Hz2FjU=_fK?V<#S}+0#yuA8TPGoc)Av`gsd8` z6Ssk@x1B9mGB?JSuyBL!xneRoW{W7D4U|fh)uXTn{$%hR)_cFTpEp7_o~gnP96k?$ zQr)yzC1lMHVr$lC4x5Hggb?ht*WbAtOZI%)p0V5z3}GRP4q+amj^}PE##fyWSW2%p zM?z|X>@WW{jLA(Xe4fospuL~S-RP70cf01s;q!O`wB(QMf2G`fJQL9NTs-^lQV@P3 zsE_p1D=|o~+CCkQ#oob%#lqg!)X2%yokiT##>UWz#oV5Sm6?s3nU%%H(#X`q)R@KD z$(Y5-)y~Dz*7X11GMSqgF*|sI{%;v$^ngMSxOiVQ9}>0pS9iC#=nQ#FIwVo0#h@cD z3!~V?I=Q8~w3Q5#RNv-S8OZmkky9$Y)&)ItTH8qm4hspqgwJG7mDwBQNTJ$3NBDFf zzUL?-!r|v#yu;Iei;wvE@pbt!nYT90>(%Ql#07e`cJ?&N+j*J1AVuWQ2NKEU&>uFJ z<9$Zh+U=K3e+!zL%LJh!Mz~!i5SaHlLHZMW2k*akc+^cVtk&nWJI`!349 zurT9^a&$JKUe2kzNzY{3x!U$nQpA_#XKdc7{CYph$qe$QE-ptuPC!;oDdG5Vk`P(K zHm*N#Hcft#@Dz%E7o4;Kp8OUSK7zB(;QlR(W1eyg9`#&)-OaK}s<#aBj-DTe@YgvC z@h+GjX8hm2tbP^nDYYUQ_)}%f!XzvK_XFH{gem>fxn9o8Gc(8`3=T(EIgDatD^+(~j3zNrUmRg{%0L)5Cg*yoB!4L=5%hm7!8a~UfCSr$ug{*OYkYT z$i5Qiq;O{Dp#bdZ+#}l~LSIypDEwGaNKs^9-;&qBc3xmDl2BcOX~FK#ttX{M_*%B5 z-*Irk!1f8SmA>4#8$(-X6^Ueoa);L4X>>`~Mx%!C8iKBrJB2j5XNil0UDu~@YLZ2n zsSfRrMf6+MUfIuLxd=EtMyo8zhlu~3F6k~86^=^`>N>L603HJtvE+b1AaazkUFE#^ zq72v35A5$5vFZI5W)!^o(;FHlB>ZlQ3EO|_a7MnoGs(bJA>0xx!aZwcu2}a|X5>IkoAbpErRs(?h6t(wuiB@X*}10*S>o zx!QAlzVC-r8;0JJ;Jtf6uZpF3RiVFTOjIwl*7@+_ytc7D=zM%78N)gk%q z;Qa0llp!J5q{(cS(-v-hXzMnQ}b;2uiusYf~L=<*S8EcIhA-|SIR(xP&D-4GqE)A;^6b!De;j$*!2+VW6eRMTOp}u&AA5#Vz=ebZXfon6|Mmn-f#^J zaR@1k2|A4`M^+uxwa1P8L|2eq_y%xtWV0zzNR=TFsz?zNLW%Mo@+^#-JqjI&HaT>h z|Af=RnpmlNkxwCTda=y0@k^kbY>xn&Atl|&%P#cWZ&h;KnX;dKf#&e8udVC>l5_?f zuDQu{J|EcA`-%-L5eLykETW!tF4X|5>!qaWU4~a-!fr}BIiT!JcwQb;Z2})QTM?rq z!57W4d&k2lFQK8GSqRZT*HfA^F>@sL7#H9$bp6j<*t#)NgAe?|> zBR3AUc{F*u4{ApgW->Pe)Gp_%!x zH!LL1(W4tH+(dam^|@u-m)GmaU57!A-ddV+B=eUa&@?;D9d}OY5q#Wv@8$6pQoixazUNJgW317Jg6=YEd^v<(bEm2?*Z$+dW5uCo1czpDXq3Yx^JO0CQ9U0DuujA zJ1wgWsVAe&h{6?5fzKoFq(C@{`y0p-76FwAK13RKfXOtV>M*Kkn=8V<)z^1TKh~i{ zFkkV(DQ>Y79-tAls1@+QaY*T5lOO6Vd6P#w$YJqC8xqtu6g7@R3V7H!{s*&{woGTteP| z4;JT-gtHER9*+@9oBY!faLkR|L2>GJR7ed*X`G{dz+@7-R22nFQY>(? zz^g1uS`6*Nzitg=dzt>H*PioIPDXf+@8H^Q5VMhj;$f%xh9tfSNu$+2v5x@$EDNQM zME4E)7=rdo+q-#wtaB2*H!e*eu)mz1$kx8tdL|^ z+%2|zLOkwQa6QSOeHRxf|Ay8w-`u^`yCe7Xdi2Nl<+WEK+W%3liXFL?mb` z))QXG=5-db?k~U85?>X{;xtK_(8f+Nqp1Am_v7cgjoR>y5ZyaU-Md!srwvN9|3`!lc(S5f1~#F#cjp*; zBX6Pl!T=~A`~lMHkh-EcE%(c!?-q34smM1oYys&TQ;+UF#_(wTP z0?kT+D=6@%lubcOAzw|)_y{euHBcBiLk4cTaIanbz8xvY*}V}E4R;z_ZW}Vk+(P|( z-53YwA>_kWRT(LHBLsH1=~F-+_ks;{%}R(2?I|L6wEa|JE<(`-ow_Tp_RzgH6uFsf zZaMZV`DtP}t!Ef<^XRhFr*v&Rgv<_l?9sK=LTGNfxzmgHOA|M5?>dD{S#svr#!k4>-`DbOlts6B!B;mui@Y$nCt7JTHAH%4-VT5m4 zgUhbAkBP`EqG4c!=W0g)5%q!Ll0H4*1FvTnF?06yqC{8UDqNTI6vekxPO#{+8}@mE zJFtul3;Zb*W!%dG`+S)n#L-dx#v^Ee?_+-uv4!s~oyemlNZ?EmY2H9_277v(t_wvG zLAzcBbjgu@O<4#s5Wujh5%_yy8j~iUC@g?sQht_Rg>unDQrvdYqr^atbGG@5yxta} zAm5;rEmI)kmPcLE!%i4A*)E&W#D4QnoJcI%IiD3{y#;dkM4pf=mN9_`spQ8W%DV;| z-ISDGv%~gtsD^;%Qe;a1Zb4T_;QW9n?Z^e@Q|mXs77=9;Q!|n7qa83C4Enc|k*iOo z?Dd`u$%l?k>ff#Ly+zZYsnGh3}hp?=iHh;-?tC z;uDh5A~8kgru+f~PMQY}k9mYyIdPo=vh%!fIZd}U*3_pF7lxjw+#`e3xj zGNYW6@(a$l#(i?S_$QqubF70XgkMO0mgDV4bq%kKi>loF(KP&(@H{WT@zK44tt5RJ zJFTP%H5(L_3;o@nycyJL&|;$y1vnqVq!O|k&+i%C~+nz8~c9gB}ufOjhOse@Xd9^N1||6i+dDI42o+Ru*31DQZ_8iII?=kBzo7P zNcq(h_I>k5M^B0VHty2sYEi=a(}VO#IdKe%snH{egY`MAO-4ma00SyZ&YsGgfKSO@ zu$5FVKWM4^3qx`>k4lYcNCrNEmEt%3N<7R+9is<8)&>4a*0`aY^}`MWpHMqWM0q;c z5=og%*?++6XD%Ug=9$vR_1OF!zpk#4=`V>5A29kJ%)Vgj(cBQ|P!g+Dl1yl(Hsdj5 z;q-8RXYonpBf9H`sf46j1#8KK&6x#_{R&baUPGCz{xslBDQ(1D>NZ{e z3+;V2La@HNNxySy4X4U5{*{PnO)`f4T$pOo94`T@p|N^Z+HP+Wdb`mD@Nm<5G1q@N zA*1u|7%{iQ>?Um;Z`iB(_qqUQ^FrwTWH zklhAs|2vYP3JHr!N!(su$+pxl*yr(_W*HiW0wJ@${rJ}~+0x_ww1x7|+r`e<_Mg~x z*yMh@^Ps}_T2Lpf6=M-J;>+=ex;UhzrlvZ?Qh)y~!k3Lfz>tD1s5A(c7yHFq-2YA5 z9M2d2WpQ*Muee8Saojbn% zrqZb_(hD;#O4Fs$O@Gz!G*-gx-0Fr*)Y33PN}j6Uq-;6!8c+Ni@?zB-1QLLRa)_-Q z^FH^NhRFP32rKX!$F{KekWzMN7&2x1iOn>usALtF&Hs4q5uZ>^;+KfnD=Oe|h?$ps z{gM;Uk}8wo;_lV64{t6x6YGj?33=@7ho=!N1T^`}l%;`c1YIDjHvKRwTONCN`__VO zizOIc?UGlxljtNR_lX7n)1pco%xZ!vgiDR^H^E54`;%fB%X$kpH{-g(g10JRyEQKZQy;578l0% zlFWB+^U;$u1hMdB37M;`klz4&6p}AcHjC(iu%_0U`j2|OUDqeJIN*+i2Z1{565%() zyfwHUGn#f8^6yM$K9Y^Zqc&O1(-c=siKt>snq-7bWTyT}DNmO2Hc8*DOU_hympK)+ zgrD5t&WAb)jE=#v>+uy8_Dt;W=RuYx%4WSE@YF2jKK93Ows>3hQhk>{%-#ACjy=;S z+e`JkM3!A_1{`iizqHvCEtE*NJFd567R30OfaVaul)0@^l4^b={a|N`0ShJ>2Y!OnEgxmN_MFbhD!PYAjH5ehGKym~m)j;VemipoVM zyZx`YHH}eH1Q5dFeX|zTP?K;aKAop$kGkTT%n`snKa|E-;$V;Y6jA-fG_Czy{{z3a ziB3mym}zgn#Ds5QhQdvvGWTF~baC32^x8Co*>8?el{0>9o|@>@f4uYOXKjdoB{ielHNsn(!F}QJQ3|6CGmj(Q!ZN)Gap3Ztf<-zR_84R3?AVGu6 z&=8sB&&td_VH>~N77XwGwoR~BELwY!)~SmB7Y zZvMJeg~-9x#<+nVyh&x}qy^9O*v=xShVprt=rAk4v+bvBbcH2ooVq@S*k&JadUJPN zzO8D7XZyv3bPOncj4)a-u)j3Aa{)!9C}dk=ep`+Ba`hZOuJJKqbGdVM_s3(# za{m|`Nue#sftkDJHe5rh!a+H2+E{pi#r{qYLH9wr_yU&!r z|De9kcEv)blP{flzZ!;)-hWUo*25TuKz(Ms-?evO~d}eXy8BYWsm5qDI?wH?NvLKRabv< zF@d~vZNz4K`icMVe$5($InKBLQZ{5ivTIqc{XSZ9N|BMq;*cI`9yURmH%Bo;=+VBd z#ca;oC0SqSM)&+dd{JT{-SD+!pORNvsMwQA%Kr0jprrGF+1nrgInAOE6`vicicF6% zu`z1w-bc3>v3;!ssN15tzAMt`S(%XnA;SwfH7folh>17uB<-ODOKPpx1PM0{`SURW z@Hx(_*WYEaT%W_7#u*T0Y-O`2mPAO){v%tWiF0y={QCPt&WaboI{l#FEfq>oEfzimwNiKom%*43DzQZ5O>kYWh`FrV!{AHFj zgV^=Y`d)5)!Uc^DQQ%8lIzhApOc^V#0PH0-1u?!o_g#_8)wxBXSZ?~=U1cRm**>py zmW#{?()yyHJ|iowL$&o4fm}&*ZBAM>jMWRJ41V~`SR9V%uyPp&Y_>`1Vc6CTeEgo{!(ihuA75Dh&Wf!~GKgLH?amRgfE_bdz5ic`-8ZZMbNE zEyuFWViYBcQi%5iao7}V8-3uX-8j!H7GL}*n~3cFFFUDPW}PIH<2v4QJ1jT)VtaMh zpB~^?AlMWNuhjs=6cGPqsmH^pdBJL=j?-eej?T9oGaqrd>m&_vmmBH!U%xN1 za}#|Ce`8MEe&P!=5y%X_s*}@J{=%@H+ zr$8B_#a1{2vRmBYsWaqVrdKMah{@wh`!=*SXLqcDB0ntuf*x8>hZ9W*r1?2CTnO)QM;0k z_YMu_j4F(VkX*qFxM&!lNI&_4Beh=?Hoa}O=-MdTF5s==a z64{*-H7N>pk zo-4xZl+BVts2JC(LvEq)%EvOX%F4LKFY6C2V`s2UtVF}PIUs@-ke_fM?e0`BZ`((dE9T5%M7LtE`=;ede^NGh)S0bH9xEd;E{OLq>6yB$Mi}Fr##h-qwbF4-u*kevZ zHYUG$XYR^0$Io5q^|a*iiHyb0gXQ*&*@)BAG1TKuWp^VnA2{n|;R~T~IprP-yT%zs z_ILd{k*QXn=3%PS;!6M=UFctAYD_GLdLQ;rA0YUoY`i_KXx$`W;d%r?il06{BMEgi z0ybrx))n9f%COEOcEYv_Mn6OWhf6oPjk(XmFtc5oh&`GSEJ%-#eKJIj zBJD(u5XbLecIz=?%D)wT8YWtjTNaSAVWlfwgju=r=PzRm^Ow3JL+vYFVE$6=$c{_% z`nl=4Kbc--u9#i}rcz?bDckma zQyFk746^s8Kwr{M`UOU^xL;@88ZZ*v0o-=nIi1YC}esczh7$w_+i%KTrEm9v1yVxVPxopy9+&^{0*anw`} zL}IMxGlqP@51RSnh^grF?up1gEpl_SvHlx37+Th zXf8kFWlvN3Sk3_(h_9>Dc}BpJiCU$T+f)FBW`#%UXIqA$Xlio-6Td$H7Y|C3V6U!Y z6H>-F-irtB*nX`#aQveqG{rb7=>|Ssg{oy+3}V`|`f%^dhItJyB-{7F9Vwu|_Y!W6 z>Xcl6^&R}Ui;2)WaW~7+-t9mU7J|iM4d`6${Nq44+FwvACL_p42g7aSk`rFX0p~}% z!nZ;?P$~{BT*t7(kC_w$sySf|I)8if;-ak*WWZG$fr8{!Xr1@nQPo6|Kx39GAc6_j zO>H5NV7@lOJMrgaERi#VG34xlYa39DnIN(MsV-L6j zMIOH}<9G7|45XGCm%`SB;KD9PmUWfR~e{{}~R?Q4S{~6i%F!(i@Y7f|$jmlxc7nhq(yTvO^^&nAms=d%{@!A5!2`~-WKJ-Lwm=emI~OiBx9-bri5 zOFqH@ggCF^?Rj4?@HAEl_hwLh8_f3#i7hmitVTu^<33ZeSYky*MOO@qsnrX`eMAWQsEVQ4PyQE4_lYY)?#EDD=xWjcst#iWj z@=I`W_q2$UG{wm}EYz4nhngeL&S9OXj!GanC^vLsI@RS)&4(7BlsM3b*df>O zPLEwDDRBwSYr<=FbE#U5#mu#Bt+GFP0g>Z`AL0BUI3ThjIo#eJ7(D0bUEIMtK!3!J zpm(-0&`{P9ifm=#i%?#!qu*#CSCNPuVX1>&+X*e&y^+qx&9ble82s5s5w!i<;WfR< z{CjCNK-j%n1XN{rYfon6Tdk?vlMGn%FK0?d2dR7@mRUJlm%_`Q2j4~y$1zXP(pR6D zVT$!7UzXSf(v#-lydRgajEST}KesTjA0O7a>3^cN_V(&!7S&ktUUxKV&T2sSS$n)V<>f1x~KMwJ|)%HU~zyi&Pfp2?-n`Q zQ-{xmAZu6ZqWbK1iwqshu3JNp*PC6btD*?+YtSs72V~c~Lf|+$>TsGiy*aQdv4bFP zaOKy~^^Y+Q!4RH1yKKxZZ1A{OB!ow;)HX{-(AZ|sl%~94;ntTvzG1>zow!|cvAm{?GT@uUq{LWN7N}bJk@Tr!$(wZP{>40SW%@ zXyY|d>hX>r^?wL@ZR`J_G*)qaY6SV4cVT^D&*9b+DLqB$XhQPen@#8nxE&vlzGZ{f z;M{ExkS)Kt6drk*g}WohI*t4M7tnO(%6Qn&LWl^mh3_&}oyqa9Fh-Vxg>d}&XW{Jc zmi{bO(Eu{Z2?mgf*Z}B%@e5|FCcu_^W*lr`%$>qEC((&jglE2X>i6mqep@A=**6xp z$df9wd3s??vEMcXMT|WJbh7mTS@xvEN~A60H9k2iT=GUBcKVw6ajOJ&FSlEeQ)*>cHa0mpG2Q)xOOc3K@&5f5CxN2*ptM`8?KL-zW}R3M{1 zO@dn(YYr106w#QoHvpm{Z29<-0!)9%x4!lG9dUm8Y;FWe zgW*|jOcLN}Qwz4Qqa(^2Y&?P@%I=?3qU?pEDqo+iVCL*ZK$vo*%ZJ0T~1gT%VnFBph#K!1Es%xO^!J%x)kUQ z1PGju7i-dF?OnuwUwdu+Su|K@WIrbK=2kR%nUpOd-_e^X1ep?Mh_Cc4-PysbHCBP{ zXtXe6?=n@^$?~rl$sA`Yld7vldg2(*dmplXqSQPHml}A0Rkbr`Kz(}zlCI7rgs1J?QSMO ztbHX2E+6`7QAh066Z9F?!b@)#TH3ej(GhApl$fM$kyE`_t~RFQlOKbvtC;sP4N4^P z>d70BXh>dRuWhw5)Hu`Dc6=wVfxujh{N>~V|5{1+6j~}3tZvA!i?1uE>emK;*L%_P z*3R`m$XGt^S^fR&KbP&1!G8~^PR98Ad@RiS;A0hMv}ixLOI~f zbfnl5ZhVBW6Xt%+MmTtlt%InrI%;V+#`zVgc?eIz5O-F9r8R)-^V zA3KYK?JEdn2%kdF)mfI=?R7=iQ#L1{zbB9m9JvXjOKR3%hhym7dx-u1B6s!xk4twxWM}kV(4@kPvea$Y#>|Y&bBPO3C3Ej~vKhQNuf87b{i9NI# z0WnWezD1?kn^3I!;(3Y7sPes)$$J%T8sQG5(cGkw@~q=ohQ@Z?$ZQ6S*=#biDOu*y zH&iaoXcE)e@<_O+%dsWj4wSHo{{f>d5GBGdn-xF7ptS9B{2mwK$!;N^ z>+-6(D$w?ob?F+}&M^yYoSDin}|--QC^Y-JN2^-QjNkbI;*rH!Im}GD#-S zJTn{X0?r_#0se@-Fn=SwqLP z-QmcjaL{?jaZ3>i%t%=WIW!Ys$d!)!K9Clq3Yj&|aY!=1Xr&tApfm8X*tH;DVey~= zAmH`2YLg9l<|J92B!V1;Y*7>p21BquBHFD{cppYBwWf*V^-M@4KuK5ta4w-$kF)E z5Zn;26NEkpRsgeqiV_~Ajw<8~VKEyDUpTup8fdzGtz8EeLZD9sL7nf$X1?c;Wsw)- zeh&yy$dc>ToBPnmHQkvuP0#b00xZ5^;u0Z_DFZ~vS-fULFpSK5a1btg@&pNf5A^~_}! z=IN1?W&L~ykWOxztAJXk(zjP@V&HGP+V8AAmPdIe0z^KG=k_41kES2@ee-m11Ar8g7)!<;i^G37uF;la zOw^j_vY*r-+Q(M~Oqmz$=vQhtJU`#!E9yS}qu8M{mIk2diS{p7zcKEF7xL!-fMj0- zSS?=FHyz)Ze^>3^#S zSkP!4FcxXvL^TZ!NXxa;g?T4Cz!_7Wu1I^dx>0N2B8E$H*SOYM)rt&WdXKxd>2flP+Lgd(vKurqnD$U9w4DNjb&ch@?+~umDk#>O0Ui zb^dpC-Sl1T)-_!nwe$1_@QLzA4U^H`EcZ8vUwT3$F~4xH4(M`K@w!Q+wY!X}KYYa0 z^@vDO0W@S9=U0#&@!QzFdQ9YLS6|m{fPU);K7>Aa8nSbpnW_`UQ)9%2Q`-Bs_c!jD z%F{f^O?l8zGs?7oRD(+74k=YH3ViROTF=LK?qB+_|La&P)sWiXe?UJ~8%x(jjwxoa zP*&AX8ej@Q%)Fed^^h%tU+LCN7<*-BW_rws4VY(8+j-+I=9L!n8MUr=fvzBJo2O~noKTZ|;xh@^7$H@(g zX_6X`BIkZ!u_uBPyt23oCixOvdrB9{W~HC9=Y3NU(pPSZ@^$T-%o>{b>_DNro!MMG zC#&T?@Qct;T$7uEdU}`y+tF&nlVl2iMxSZ(V6WN1&Y@_)Yq`Px7I=aM2|G46c{mX0Ph3ecvXKo+(mOR*y1HzAThFI(6C5 zton$my0q$8t^a0>`Gdgi(CP_*L+M>+GzGpm^g$`@up_P`X0A$^Dedh>HW+@}wC%le z&5TX-?Dy~qzDw@^_{BCAe&kjbFV@7TWyF8dkOe-w{3$!4raIR(kT|IE_Yo7-s=!ENz(|zs9b%0@N2G9^Ho+x+LwE(r-ZGft=qFj3Vzj5gO{o;a`G4}@(Qfu!@6gFF~8%aXKlOy_c#nUgS#PDz&uof z}s)U4xfkH`0seL`J_usAWui5DMie1?a8EO)_T%c!TiWsc@3fl}Dj#$iK zG?r!!JrKYTCMTGxDs%wLI>y^`4AMw}@P!wgY%QywdpR=nu`{J*(eyOlR>7b~6EDn--)ql#S}?7<&)w z(|;1ZgqqR+?BFK`9RA5v&)bml+G@(SM+dfm z8KPO=!dbX2;YpBEv>fZP-ooaG)iImWg)wUGk4K$r5>;Rdeq5|&XM)DM%Y#m%yk+>M z?aI0;33@Qp2S|*-tgXL}@+6+x!ue1?b3tVmbZL~m*b(!!^Tm$C-o_AI_sHmW=+?E~ zJ^%h2hrQ?p_>R&NSUou25ID|EnjYla&bOVj+hwq;Gc9leL@*ZLda#BM1L&D6jGeP~ z4c|>j>G!}*$d?<1Kr4FviS$1_yy`p4os*t_;lZY2lhb(C$BX>x-HsE)*1?TtldYUo1fE6&>6V1*%5@Z*EnN`1G_H>ZhD<{c( z%B#J&qK#MVv`hMV*MSKAqY+W4&@q51b?ZVEAbyNBrwxKv$Lp8zpnHM+j@7UXGXrB^~-qccOE zgN)C%k*quICs<89rg(+xCVqvJxqwYWet_tr|0P9?5A2T#{r7n-&th}YL1e*=T5y!{ z^n1K|WW`lrXFT~o?h6Vwlx>u{CcBL`7;2*Yrb~cz?1kldjkk0E>X&@N-oquZe;0Ly z+6M3;aC`+EUZMny@AThr!KQtx!LdWAk)DO02(5jIJ`gQBU6HO1r+t(4tH7t8xWJ~3 zt$jt|9KaQUnec$UXDu7D(!LTr*ax|x&BIsWW5W*WX557L7=d?z_!KtcucXK|4qs)n z0_ewTQSoJFW0NPgK8~U9+41Gv7pJ)s~F3aPJuA$2RuZOpKcMoOswyge_C?TOtx3{h@O}KV$8` z3kOC8Yy;q*Dfx_Ry^5y#Y?q?qL)#X_?^A}5@}BFXkTuP5099?8T|0NR0-pl>);*nH zdYcTOV|=gACFkZaTPreW!0wbr?p1W#E9uOpeIwxrC>s9$Ofdo>I4aLL-Ss<-|?v(hSZ+(37D zB;e4S%_3qcU$WmCd%V6}=S2f-lsvz@Zhg zIm6b6!*>sEOZ1MhvO=|UF6k38h9rFDF-WH{dVrOTvKnAKuB+@1>YAZv@#*n*iOXOI zwgSQ1=?DgRH*=1{Ibz+@x47*z11AgzN1WhpxssTNk¨%}>XuqPLMCikFuza!lc! z6}iu8+IWd(w&ixESqD_vla;dEuW2PR0Q3iPXJdDXVL(Jw;cgz5@o4^|H#TW5YR21F zZvbS&zKz=2tVNkNGQDlG<#W_ie`Q;;_HAEuX=Dguq;-xWNhy{sv+e0-``69Bii%2m zhuN=4Z=14IngSW{qTu+>`#CxL_x+Vx;~bOy!8g&yg8s+%WA~y+{J8H(*tZy}eK=h{ z(~CID4Ym3A*$Cwa(T%` zMrMet$u!A3j{5&?x5Ksl>ZCAYA_N@!-V@|Qpk59zio7=_#HF>|HY|!-usC%Gz=OnsMxZy(ulBwCRbld{+3 zI1ZjoAB{u8k9i###Z>SyiP_0Sn7*6R9h&Ib|CJ%N2E;7EVL6l>{aP;&rQ|pKgFh;~ zV0*beCu=Jg9ItT9gd&{=)8Q{)xnDs0F`hN;-KCd$OoT(dPXo?Pzm_ez2JPvf?$(Sf z8LRqttQ)aSWrx7`Labi_s*~vqY0z;o^TyJDPRkC*?Fi`(M7=Y9`2{el_G?h9IV%wr z>!0oD2vF%KMPwBA_u`eBO-7}N1!Z_-2GDW9YNS|DQ7M2{&=+m;+bl6}jNMiK9PsK8 zbgY-V%b0djbC6Im@~nL5lpV6(Mds6h-V*~ZU$~zCa~EM1EzGc7>-925a{AXWqT*9b zrv`5xNXDjBaE?XZ$cNbrObJA2n8pLR4?JIeH2Ogt$utpO86Um@mne;1`-8OdQ;sve z?lr+G*)#R)Kb5GCKzlo0O~Lg5Yb*^KNcM=49wD%2-A&YJ9-g?}a z1^iU>Pr;Gv?5UMP)TM(+j}6Gn0Rh``qBjNh(b zV11h+nZLZSTy>&cZGQ7NmEfS7_x!oe3QZ4qBf9N^w?%2w&zfH{g1Nba|81a)UF!2Q zV9Jn=>l1k@a$x_B{>2VX%_pZLjT$$4D5Q^sU8+D1e!Hl$NY*x7d||~GJA&?7lDrEX zu>2Xl4to>a1z57%Z+^JMb=V|KtYArUB5);!Uy?XJsZLHipx9jjvG@Hs!}Jq z1WLJ~OnS^Z@e-*qd<`8mt`%fMyxF^QtUxZ&CPpW5Q6QYI@-0JRh=D;5W3u%x-RDRw z6N4-T2mElewLJ);c74mBg>wtgL(Agi7Q1Q>uE*kk+ zfN(#Ek#4T*N}fJ5Axm?XaO58;8VdlDZAhbq0U0o6W`C>ZQ4SsmwhDgrML}rHAIxBg z*1)p3JwD(qXcthfI{ z&%^G^&A)>^N-C%8Z6I%u0b1Ma2g0yMNd3X}L!Hvt-z4b{n?sqw@WC!SW{XJ${)IP8 zoLfvTJDN`j3+}HF$45d+GDK5B$@OoA^KPxetmRGWA_cOJMn3 zr4Qa^`$Dc42l(28-i5gT#GE2JEC&eAJAb`8aE#1&uiypCu@r#*A-i@i0t=RN-8c>A zV|vZEkBCQ%)BWN)SJ)#5>zhoG0&$Mw_yRA^ISzPDbqt(1p)kL!6A8!_70nD zFz=FjGOY8nugCn`@yU{Bxf5Q;pwWL|> zrRvxZc|w(+Gr4&$pauA%j(@a^V|P<$GQ>0=Nt0}j*e^R>wJ5yKoCHo-kCen~8oh7t z^WPXsv;CaVk;9Y}Z%^sp*Ly2>6@s`L9HNw5d8bQLi(Y(=W{L&HR81}4zw-pprRy9I zpRMl?R#XArC9xgKw{YynT~88>obw_hCy9CIyL`Ff`Qc_&mNc!=TCT zC(2(zZ@Q0rpSlDDoY*l(5oV7!Y7v09`@`iRPR90H7RzX{?y}@0Mh{i>ZJxVl5!i+& zUy{P#K9~Or<*ky_BJP}WWo|4;%%`!%R+z#IT^b=Qg{_wSMC$d}(s7MdIZqD5-op;J zq*N4AgN+i0o|=^dmKy5F15kgHI`<2XjF#Yw*J5%YN@~a?$J4SEWVaWX1r&`tT5t%z zOnyowG9gLA9ue28Fa06@ebjsQ97X=_=5yQ08RDKz<5By7*2Bt%l=ymllrjb7@UV39 z$tTmi%y5SBp*sd%iB^yjhg+s$wO*tE(FxGMZG50C@&h^+{&|I06M?TuNbe646l?*8 zycRQ~E?yX*?=J%eze3xuZsig~C*36a2oZppsP=_ZaK4M5g_V3{ovIsr2E>KbF~AG& zo%-<;{212Z;b0yNZ~Lceo#fWEB=&#tKmYKxjVQrCeh!@&NOKw&?lC=oa6Q_2Aeg39 zaX|~}S>ccRb-mu~+50w;=1=2D_`LzP*fb*Owb7&YTW4=p<&nra`%^m)Of|XrEkhd3 zl-*rk!X8iZZBK+}=8RRZOq^u_fcJy{id)Uy@NjY%ok7u^abS2422#t*Qz+zA z{m#Zsk|~{L`Hu{@b-ghSK=WHGyL59g=qUWiPtN^4mcXMiVj#18WFb#qz)^fz!5T8S zA$cD`ty2TAX_%`o2Hiyi44Nqz4DK_N_DOul{|uYg&4N6Y5e2ZDe~eGg0cMd$tnU5b z9O*Zw>K|nN>?#jY2O-z7ug08iv)4K=Q7pU{l-s9uw$x@r&h>1`L`|4f&fmg4z+?)W zjLc+Vlcz2d9GC6=9%|p13JQtZd&gPbEHz|dye5@eDPfuG#%Mf>aIf#2S8kooeNou6gCk5li9(ZavI|V$grJtTd_E#2gX-(AJ`n`CyC}D_jDyTh_8SL;s?>D#S7na`0{VorYW-gMESO& zpU;R_e%p|h<>tO|+qVd8820zEk8JMNu+2a;1?+8q-k2MBuq;;@+k?nfEVnGS+s$s+ zwIOLPLbt8WIkJ7m?jxjkUh89oD0vS^w&Nc%c^!Ac`SpDEX2EC$@HKnqMENJoS8oUlnrW~UKJW(F39xBC@SfW+Tmu2J zUs@2_pVly%_vFN~q`ktWc{z`G^J{z_Y1))qtOAr7Y0c6iClh3-lcAePnM zqJR+su{tdPLAU5|<|*y}^FZ&RIJBzQX?VB5PZ_I&_K7jBN!xbBqEaEnX$6ls2rhr7%R zy+FPzp1l<|?S?$*aa~*t79XGeFY3h=fr(V;{X%=hsU~_AA6!GCx$kTMJ^UqTB!Q_n zR6ql^;bR%m;f9D%N|JwKN~FeK)+StnkB#x$J)jzG`al6uX!5fFQd^M##JQLx=CIeV z#FsNx?yG`-kKKL+NLkD=_ECr@mTTGy=#Nt#X^l(ttk=YxwU?G5VKhIs&3<$Iz?Ab+ zOkNZJuP2}mK%wJ`{Wu;{d4XSCR6JuMia%@^11ohg* zhx#WDA#ZZE7`NULWp2qP4psT;-8WgIYqXEPCim({8`@Iy9W-5B?b zZyla?v^?SR`*xl+w!NWU0(aZ(idW$0hb&N_}3Zz;vRuUxXn-bMu}NzRE?(paY4FSZ2??4?JUT(FCLBy8)HIaP8&VN zseT?*$msYt)3rm~BQ|bn>sMOENOw#_b4Vf$yXWr8I$Xwf&|6tYKj`-Hr)T+|&U@Bx zx435`^aWrWP6p3Sk=-U)PHfi;d{7hQUoluq$%N&&hvc;HsY0agDu!4NLi-Cs6cUe@ z>52Fq0V?mV065TUDB09^gCPn9Wl_j)7XyvfCU3_I6|LX6W}C&u`)}D)yLqmGUROC? zuPDddJ|*C{isil)w=6w4k($i)N|&d_m_hxoKjDND79ROE0ZR@)9C@$HC_S%TcYcnp z9-DcdYxBGh9^H5FqF?wLpDilhfh9*)C}~D@UWWYkC5#i<0Kw+630yz*a|^%I!riZV z9OrPF4`g3j3eORb*zMKjS{XUXsF+@zl2!T zp!;ar067`=+Q$iYQhpo#>+ zKW3D`*5A16!IY6c?2>)T*~a##Jg{bqO{i(P((9RW^eltqtlpjPV6?vK(@O9HUho!L zZmN9=jJ2i@LgHPaag0z*ySirksKiU-OJXQ8kN#3)vKo{=aTbqn2&+hTTu=>1H!ua= zl7Jj{SbqcoUvmaVw1_!CG80AEX!H_+!GhU4^x!%f^lmk7SmW}6T|0zFwSomT9vIl4 zX#Bm@wg8U6sqzQe{;Y_gPEmqDm(;g*&_iUuppF@?kFMue3r=p5S&0Vx9}nH5V;8BX zfFNDz3P7G2o9O{jBes8o2ctk%x=w&)^YW&2;xmX86TGJuOZvebhw3hI%9k>5(?nwTZ+xx%Vyn=bZAH^U^_%=;&z11f1y4((rpe+&H z#d!>W%5}7dySu(4)({JIl2vbdnZr;M8ctpZkvVxZ&;DoKD?i)GSpV?E;&{n30K^x6 z0=b{<#rROgj6dyr>KR_l4uiS#h6o&v7<2l(EznKyy-05Ee^Op}|89Mp$2A~yvQOsR zs;sUVdOe_v9%5zTQSJy}>PA0fwC!5|?bD3$8I79H{k%U~&GLC{%;~N>M8w%SrX9$y zobcQoHrmXZP@N4vRw33k$TKpmXUcGsq(MkokDSSbG`?UNGKvB~3B;7!a*==k!~iUo z?;k5}iN9ruwq5`IFCBdY0#L%1jPiG4bUP5G-IKatUUh&VCs<%dUI*uJd}F>rYxC)Y zRe}Bze5)6$H(1sEP_TQ22fJ{dMUs4xUU-bYk-@opb{)_*P89gur`}ZYcc$VJGv?Sj zsSBQZH~FLerorueK?OM{@i8V{0SUhY1t!$RaMjw)9Uq`?R&S&G$h=jr0CsiH{l92T z)yshN7;o#hepD}Ood(*+vOo9h?(d-}M`e0h@BAzl2W&h45EOc~R{~o7JEkN?4XgPpR`JgQk)@`x5IoRYUIs2g zOm%NKb1F+NcgQ_gS;@43$*uZh2xHGm-OTy``E5B2!1eW>@y|u{Nz@+mI5ovD%;o8K z#n!_)32;Zht7$FWuIICn5T!E4J@GRE)ajKsn4Yl(Sjpeqx516bZoY}7uv-QUs=K^Y z9i#mpJ>6QVpZ=IteD)B4AfQYNu$_t>$~9><6H9HrP%!Gcc8`8p_S`ZFIz6%X8#F*5 z`;|JJbC;Yyr{m!Qtg0wJ(7$!da#-urlC_t1w~j_Ib_{OA7qpkUv|7L`(P2}47V1zM z?s0OuUuQP^a{Th=n8ixCZlOr9OYoS=0Dqu3$!&qk0W?R{XP$Mn_knHjo^cr42gjwk zQ0;}ugFjLY!WKsHzU?5UWS@0a?ub2Rk zP&G+sKe%j=k*I(Ff9zPW&kY%pc<=@ASE8`7>y0zuQLvC`z?0(P4smjm!+SJ|<+fRQ z=fROELPC9AxpH=$tML?O^*x-4sVjs62UTdnvxp%u!k~bqp&6_LQ*YHT_{32M+6;m( zAq}Q%$>v1}PQ_-CIe^7Qz$bve?qGZKTfV2tIA_~ybL7O;otpqJyTauuE&M*q? z=0$&PD6Du_aKa11Zn`JJ!b@nve>pv#t30eMmk$Ma?>3a7E&&8U=eV6bJd}s~koaB; z(s-Cvi&Csi*-~$)$G-$E4R}byu=7wpZjV0}pHx8^Uxuk)?zJCOxnqmSddAzU%Z1Bk zEkFe@bB3g^BNxAEJV6&~`@Nzp-_%rufR^;B3Ns!@DzW2;e$Dm0?u4&+K_9jmg|utt>N97rG;+l#bRjS3sf5Q;3T^|7V7 zoPGGSovzqGee2mYRxPAm0s1-6=PfF#cD6U#x<-Q=9SB*<1XS4NuiDZt5+U&I+$VC> z+ANC-C4(odxfV3ibQ3C2lK9KtKRhtPlkqajISU~1!*tE(i#TBp{|nZOa*bD36CRdA zE~&_Aszj&EepYWrSo^u1$V3F4unQ))O4A+|Q0f#a)O2A`mW~dutxQKfB41=+MNwFn zkK4ei3{?avg(uT4icmD?cV|#$g^Ma%xZeQAyV}H+6ixLnRty}ZDHD5YUgBkg;Ylbq zl1+o&Q_WGR0e9Xt#HI@|rqp~=bP;94lOm|Jbl0K9>324^R(7pQf+A&rZeZpZR9v)G zZ>V%-?fGFz0s5J4*MGRz3*UL+U5uBxplqmAsN=JoXvB7NC1bI1T~yElU3g_dORH$- z6uk20eYK{DcASpX@k@z{q2J5S27ge;AJXNOb&(mcHEF)o&$A2_|8%h$6_kv^z%wj8 zNffkf=s}f>z|WwRSXkK+XTS>UsUC3~ETu+|p@Ms(0HqoQpmFDbdf_S1i?L>`7eg0{ zzE%pJDRW>->6Bx&e>GRE)QA}#jmDH9I zTlsJ38v;mk#@_W)QTx<1!nK_!cuu=UK+0D*znJ}_Db+wyTSb*ZFO$=fp)Yw{*rlM6 z96u9!eNLP98v*f~3l(BvWABO}eHV%PCaI;Zh`_nlLmN54SquiZjtyvq2&IS&iWc!@ z*T5$O`LRjo-&TI5Ndrn8{(RyK?CU-=?VMegLybU|q;dqdPQQ$sq!O7WLymI$_Y!gH ze}Ol7DguoVX9a5n&=iV*7L-+WqKLmH2E^>MBH27@vAv9$rjc=I&dMCgPKEX>QKXWs zFsStU37r^MLJy)lsm~HEPt;aG4ed zxmpuyi=v>GSow^wh&B^Cvf`wXwMDK2c}CG*P%_b+uodkLK0Jm>&>2anC^2C{eW#*q zU`T_*gb^BxnIyvS$zP!iv3?P4&~KB);Y5{abojek_Pl;|3iRXC0te=wAq{Ty8GmDn zS8@CTB?tC9!PSv9YRUJ|*5Cun7w%z#dt z7*lyc5>&_{v#hyG3_|FV4wN9hHXtTEw0BsV^g|djwrq^CXt))f^?!%#l>`Y&o0A^yF3_=Z+l!o1$6&&3qitJ-bWnPF+)N|P3k7{VFyJmMH_5Ww;^Y{hAo z1$-Vy9(JGPlyLi1OwD_jtzOpxzLGIRos{@;i0hz+rtiCXXyAyTaN))F4+`rZFZjQ*w87CnhZ_ykqYLe!N3P3X$3U`b(P zhN5k%K&rx_7g9rRt=W$U1SR7(ff^wdix+1En-de_T*G$8WhIS^Y|5u8*l zqrEH0clmzs^(AcB3KB4u<#G1(UEGC%Ojar7?|{o|-H3nZsITw^lFp6#;=xm?sPSL} zhpz>hDv@Ws(A6t}L|6-+%n@%3}HJg(tVl)P&Tw)|s#-|9C*Rf!rQ$hd=b-+)55?|9n}_2ZTFXj(Ir4u>Cy~Q{1uKra z?JB5^!+NMCK&U_+eA4+TxZ1(@IzejmV=@TFQc}qvqfWm>>3!?V8`R!XMfy0^d_QtE zYa&z?8?S@0=&CA7a!s{N_!UzqQyfN!aJ!w*&5d{|*43>4pfLGG(P$a4Tm0HDWfVU@Cu%OSnB`wq&^RE?-Lf`(1cfIF1Ls&z#)X~>)#;%~vAQKu zDz5oTU9DlbQd{l)Ah$rdA9lPWp4Xox$z>)fR|E^`+*BW7;x9)P$d{}_$U&v@W89)! zbI-T+$;U+8G10NLapb7+Z;NBd5Am@$)D zlsdd3&TRD>;7|$3asQquq43^xcUsSr|mte>&m$oilP*E6oLPBd~#DJ>c zl{x>CEhKXG*B|6p+!*!ahd0UXAv}+pDJz6{jdt#&Tup#MlcS-G^0W&rIuvZ zBriMreK6DU`jcvRSwXo3c<=?*PlWu|pe9v>VtkHyzi?Z6TrN8L&t$ zi}P%S_uCbMzJNRj!yVHz5+TrYk$K}0iO$Euf~xI~aGqB#<4{8=9zJn^9eqYLlDH*= zZ0B_jQ}po2$T~h8@)aDs=ZqC;Tx9Y7S{)Q2R-j*uAp{8pG@vn4`EL>|D=-N!H=x=? zHn}pl6bX{b9`Lb-beL=#gok1dnSPId?547Q_IQO1l%byes=?R}ORUOAkRS^^Hw((# z4E%}I%vw@_5xA%~rcHg?mJ%x|Yr{0Q5;z)}kN(~%npb02FG^{IFZ64*eW@Ka{a0XK zoD|}{(nP)!Q>lny)9H%>NiLT$FZSW~XmxMl+%;7DP|eym99;9%Qp~yx^51;k69|Th zyI;3{O)q^pH%{UT5!nHc_4 ztCge`au7Z@*rgWNWN|YPOb9|rp?-a!;%oJq!(I{)U zUsA(kHBOM1^sH-B!G0d48A12EC>XAvUxg!fBT;gg%unK4Olm~)$==3QR3sY{o#Mty93)taEQAQ<@3q;c;fjY&iFgGi#a4tn z?{{HbiWSM&Wqg#egfwvN1-$Cac0r21PL%wbYdV+MIQZFtb-!7WC{#UC=@W|)aTF*p zw|@T8vHq3EsO>#Aeop~PuL(33#-Kg$_=W5@YO%;?BJ*vXxOSR`VFFc+eB*wf`j<4_ z1rHNhd@pgf@X0U z{UO?kkH@88dMw1cA}qTvT6qB#3Kvy`X)3woNEtOx2YCHqf1z=Q$yaNx+qvj-+1KIO zcV&^pe&cp$1z1B0l%OU@%Ia{Jpqj=k))i{`U_7{jFdBboQfq}qIiJdDE;*|H$HXBB zi)+|RM|wg{Mh^{&FZC=~8W2hr>w8IJMk=j!_yQPo`b)x=V$;5$@*7fRHy2}#gjg-w z9yit>_qNU`HK|c%csRD=D`Qe*U^y;`>qSggTP{aUxEdZYF)vj9{Q2BIFee*HE%G>w zfyQ2@+-uZoxL@fZQi1%H8+$ADB4)k^fk#=_-H6yWQ#~vnv@efXupicd7c)zVYK|oy zC;J!@zi8b(pxC@rJ|rx%dHwYjuL8u6_|v-cx>r-u*j4S5grirn8T$+c7FOA2muyO1 zWK)~E0ty(w82(Mey@Irr_rn-8=sLCAQ&N^cN=pmRVoIDrSSbr(xps#5s%I1;n`!7_ z_KL>Rx)CtS&b)0Ct&!v#aZkaLIh+KwrA1wDE=X!DGb!>Cp&0h6gTku@n;uvxJeU|p z?T~x2V$6Re({={t!uMWQ>Qr^Hl_w4z;;}pW9+ZtrbWUSRW>GyQa%f$wNU@Nu!rVlW z>`0Xd1v(?O6eH|VUb-WHt^4dcK@27<5 z1wSk`KJv>gRnn%##f*s?kb{%|iX`FLKdRb2c5|kw){^fR_2)musERU0u|>_O3M-}A zJK|b5=?u$|wsQJ9bi$x}%Vbs*PGn z&Acq~w?!#pL8klr&2wbP8t^BpKEvi)Sv4n zw56230(vFekPxkI5TqtI!Mc_{Gl9wuN1+VZwPG1AD7_co>jf8=Du7#NS_pLN!9D`d zLg@>&p-AmlOy-0jB)ZKoVe=#`&V*-3jHC*j5<$d-MUWP(tS)k*hi;rPU~8knmbdP8 zlT~_!NodGJ=M=NS1ET3E`X*~RnEr(MXSvAX-^ zNQ}zeLqOID2?+KXoNi0=pPbsZG*B`EiyICG6#_Wl06i+KCj+*m^_qAS7;3Z`hPJL! zh1F4N3r*1=83}X1U?pGlzPHqd<{_w^Dy$umV7y*SchD(=EI%m0Dxzo1%5kzFOs$ek zZNOiXp6~p3M4(tjk}W0?0(=;V6Q0~@DiY#XmAjHmaDYgzDmSXpL3E1)x#Uvx-ivQf zWuc!#j~MgtPc~d+WQzU=m)aH^@(kYM0jw;_|3cSCw3SJ)dA{e8kKE`-&^cG&aBkoR zUvNd7Qip$4#)^>JfJd)MRMVBRDs@(tyHZxtHMTr)D>I8;26WiG5+R1QlqC{wiz#+2TC~#BYvSLe zu8pR|n}V^VwT(1VtIp1AGX#zA{%k)43a;K6J)%Mo7LYWhbK$`uS@sIb$^^q|nVM;2 zL*a%G&($)$mZIsv_tK0yq-t6nl|V1Y?+U&Ctoq=H9 zB6XpYfP`oGsxU)|wMfAx78O_?uKHzbguVuY7*EpT9Z-4*kjP*5rSOn*H}m}hoAe4P z{A!fLVbG%^vV|WMFW>Mk*-VRJyYlyz?|!)sY*X_21El0>f9GHJ z&jw{{pOw9}=?RbvAw;9xZh3*jdyZ>`K_x(@q9ER$Uv41^+dyW?h{&sLRGOwZcs)klY0%%y;3c1LAhEfgeJva2?NPydPYtL z+D-aO@^I~}S-&-#nwEwhOx1_ARWheJv8&^jpN74)n1Qa(-jv#CAnipaE{R#DEoYtU zz|=|;rw(BiI61Fo$6VGRM|`KJgHc$s{HUU0uK7C5p~glKMa3ESkeX)Iz+EjDi%11A z>OfCeM3U8C&UQJX=0Yp&OHxE|S&h0HZZxR?aJ~CD@j)D!k(xRfPRgPX-lZ1AVj+aX z(Bzb)LtC+p#g@SakjDhJB?AenTLjn=eY;3!v{q{MT10K7!NZ(TbAh?EgB2>mhLYq> zgUY)Gyx7u{Nt0n^u@z1n>ZF*Guz_wXr_`iexX3ecW>!{Z+NT-wRQq^)_7Lii+_Q7E zkAck>0O(PMJ1_OCy(2t|xNnr)QSj^9-bqcee3`fR*_7FN4GT4%${-i!&yD~}_0EC8 z+>&I;V3krK>$I{HSctG>Jj9?rW(Goe@kIc}H)b7{B)M5Y*SN>LSrS#N#BSc=tf{B1 zx~g=a9csy|bM-Dh3mvLl_j2LgtA+Ea_UYcF*{cQRHw>4%(SI|mUR%v~=0!8Frhv0* z5M%-kk8?UQpu$sG-tgpOEJK8erXnHwI~ZnRM>%y!99lfLV9N$WE=U?Whgp-b<02QG zD@~GoPn>z_J25d30b$G9NnaVt-BBm5Vdisg5MT)EBA^sjW~w{x;x6~$2cTJn&S+}8 z83%T6&;_d3Z>wXh%R~fKlwY`b3^Z!;rpnI?Z_OT0ZRcm8YimUeo@m#KtCMCKP?1j2 z$5@ZX{w$z02~I||%_(-s16DQ%$;S+@nX-8c%tHg`eIvUyKaSxs6m-{P8)R#BD9|K> zSGAShQdrR>#aHDtc@oh5Ofm>xOLUsF-mylnXY`lyr@h}Ar zdW8Ys zw|Y0EN?Jo&kqd(Yi}JRt8>Agtej~yPr%4|NwJ?F+pQ3;4QjVl=ZMeQ>kj5=3pE%@M z9TCSZ&AkVNDf&jWJ_P%aRu(3J*DWfz1tuGv_sTY&{y@k@N6ww(^2f8**pT|~q6%6$ zus3;NN2qJ2Nz75!KfJE84sFeVb_QoD?>aTj%qbHPBD43umPq2YdMEY9lc`3I*8M$p zoWU}MkT$Wk>7=+y`Du763#nt`mBw#A{+lN~;tWjxRL)s3IC<_GrBk`Nz#0|y-^ex# z!Zh3~8lxu&1(kiWOag=}CHFzb>Os`0slYi^3dKe)QRfnAf8U^;Vo3Z-tPE6tXM=of zgkpwgVa0jySuVpDsUpZ^ClzEJhNBF{ScjEP+f*dJ^O86; zF|UyU>ZjJ4s9<>!d+g*zXL^!}>!xRd;No|g2V||)v#NGiCh)+VP&Y6sFxx6fhn4Zs zB+OZGlsfr-4oviHhV~V+MA~aboWOOs2om&2(KF)o7c(D{V{U9{2kX-h@QB8EF_d|{ z+y>cX>BJvszr9Ck1rgkrou=;gfudDqn0f7;tKuL84{CL0V%)fqrmA9eiE7GrXH2dR zF|2Hf_>UrI|FsVj55$w;nCNTC6W0+1&E`g^JLxP;RkNSib8s4;eamOZRn(sFMz&MRuQ76LNs9lULiMg%)$Tzy)5j z?R17ERg3ISu&O28>qI(_B}*3`hN;-!hVhZE%9=zD228zZ zTfphzjaSEmyo&{n31c;EQe;I!qcUSEA^yL2(D5<^>$wst9mj_ee0lt!OYmJ zep|H^BC%I-4c3-l*_mP)P{$F$9&B0O52iINO}3>XLVhMhoZepf)h5L;r#wi9G*8-k zV!B54olctXcs~j8(P_m$E02nZ;6*UEyscf7 z*AuR|pO1|*TV#3gt?d~W=_xmxwY=5nox_(hi{QnKXPx0EhK7f|b?hs;+Pq(X97Ja$ zN5xEl#{6hcMRw>>p(^8f;L0{aH?n^b*UI|l51AcX$?!TYNtX3`_aCSv^!!ThDj>G< z3sHnvyUYGDBt#T#qpZ!I??l%L@l(JZxG@(yz*xM9p5 z9=rwThTJiU1{Ro2A-uKi)F2ML(8bj6{d@=wqd7_<0(gy!ORNO3YbU=&$*k0>O3O`z z>0B0<$O%wwFMk`3OEh2#iV|}dxxp6NoYT)dK6Ak>t!b5L_R?qV9+4+C7L z0Te|tsmbstCt;vAK_BUoJ~0YsN1Pvgv*LRlUgwe2rqQmh$)ZHaZ3N>TE^bsKDN{ob zkoxSU28(Nq1%iEK-e;#;H?NC$wCkv1ekgOasz7R%^lCKB7du3kcfOrTLmirgSH08cHRk%liIHm4mm%&FIaU5#b9 zEFVvY6Kn4Ou)S-#g?IC8VDQ4MuFbA`ymd07hI`NjS0-Zf{`*QAWI+~)-C)~7Z@YzP zi8)p=+3*E!aE_f2gGhG;>Hp*nvRS+V7?t-skjQVwzz$i~p>a zzHpEv#%!86-esYUZ!YsqlMa?x>`mbG*aIK_>P=L;j0*U$m^AZ+Yf279ooA$@RY!*- zkF7gDPd34iWOtKODdcjtf&QqR;=1sue^7v}G)&;+MA)dO2(fo_2ybz6* zOK-ExZ}Lh)@{5X*bX7!`eF??;-+6U|{Fk#D(CE^k$#c!pDgldEyz z0=?-qt+cb*i`B5w!AWULC~1~vc}CSrKZDIe=_;RIP-WoK(bQzuy!2ynH!XHuziMwC zKF0Jy*Brd_EGa%%Ov-T;wM4-(sD#RKG1Pr&t_jf`i7RV4OMwMdf#hkJy&e7dX!jCn z4^VMx%wVr=nXvJ?t$2pHTtoNdD9Ga3SJt|$hsYJH6lfNR;u%HWVML632I{m{Y_bcP zMFFiG-<^nYVd!8(nDF!(0(b9Co`@h#&5*k9{fyuw%#WS$1p5}uuTmuPaW6eUl)T|L zHOVdFzQ|&qOTs>h+HkE|kkAP)hIkJb%BT=&gBu#weXXBtw3TQ7Y^fpTdye-7OU%z zV;F6}korVu{K1#kQgQiyR*^pizoqz2T$G=_Fs=o#%;SImy(UC6jfn&n)`*lJKAt8~ z{x8Q-ouF?PmrcZtjK0-dr+^%p6ovxMJxAR^<8XB2h5dk<$IhvMj^tLhWQ;IFH1Pxm zyVTo}2tKBbR>da$!B)$U@a7!0^fQ@ZQo}`38`U)3M|+X{JuNp!ajHpye13AbsyT?E zhj00m1uAIrO7H%HSX#EGB;O#GdAEJpt=qFIVHh$p#}h@17f#iuvpvUpVc6}=#di_w zTIMH1&zqsQjAysk_xb*#t&v@PO!_prY^5Hz|COlBVr5zR>nlNnlsUG=uV-GLpKL+WVZ%KmIQ6Mt4N&o)JNTfj$p_a_yNb+hEy-Uu&)`pDBh zq{MIMAq^+@qn&Lv@dJ0k8)aizziMkcy=bS1hfgxj71HhltD9RH7xBngTc32hLA(VF zP1gD6dva7FR49wiWSmVfT<6T#7J03|^v-L|L|F8V8(;tOuvh8%rJlRd;$g~ys6TzS zYwxPYb#ZDRt*AX;^J@N9<8z8J)xZ@Xe(z;KFF(N(|Nq==+QkR!yV>i+jnLC z1u7CdP24l`6en+Kb}^cqtJdcs<~328&AKLC|3Nt|r`XYwYq$fOA6sP)5`C_4&ykih z4Y>b-bp1o5nV$7L&b0lVqOAe=bKPZn<-TCni=#(Y!?Aj*XQ76MDd?an)x6>lrbc^xk*N>>f_AtQE zNSs&FOhg)kYxmIgTe?#?9oM?Rq&z0NKM9VemyAq2_*5@7Auo3*HXzmu{rrP zV;n8D{y6=QgA5q7AoP#tO3tT6aiD01WVnCABb$;gxBMA*HL6akg!v5~ZN*DH9~7NK z)NbrkDOFOdzzEz_(RRb#6M23jN(;ixy!z#|NF{YU|&ioVo7~sVk){fAe4%4LXgI4fD@yF?J}= zBXe}HGqYOD$L$Zb1;oZr))2co?;j%s@M+1=-6dNv8W^v$cGN94$M0h{wm{DIy8C$( zUb+P(Jni}ip`PzmB{Hw5pgAJL%&L#}OeC5F(Vl`?C1ayl=E}ji+?@&h7KAKr3D% zg1-9dmK1vA8cLaax1-;H0(ztt?ed(f)sji&9+qLImUFvm*s`mf@mCHl2mR6rNo47k z*uzi&7W>`}VO2vBJrZP36)|;Ay&;&4B&%1)U8y!)EJd|3=3e_Hh6tl|RFY{ar?_fQ zEtjY;44_S9(&MPf$iW;K{WIX%JVCNUt;>Yvs# zd^0ls+GGP8Kfl1dQ`>~!Ffuj%XY_;$s2#p+jT5{4mC&lGtGP?=5c6ZaoHs&I^KB?kuZDD)Zh1OoTHt)3UUE6SFytW4>c@&R<@{ zA^&Kn=16IK4qNCN?bIa*5-VR=nhpQed}h*RoAyWopeM+r+`FU za%2Lm+z{j(Q=zHE^fi((Ds7TG)5A5U+*mx#v<|}EW_`ZMD)o059DDR*1kFZ8OXkR| zUM|D&97iy&PpkpOX`qnvpM5_$hxKBXeO^ko&f1mwBqnRF#8!JvfHpDW9pt76SI^{} zxNr-=eMxa*pkMnqwq4ClXu1!P6lp7-Kxwz;4V|KBTD=Sf1mJ0Q-m|7Cn8G1CVyGul zpB0u(LU6)B5{dbyBdJx*^ur$3`&!awRBIoWn2F-hllzo`P<5=9;lr8%g~zj9jLaAP z)s#@!8B9RXNf>RgO+ND%^6t^}1tT|=(QJj$zjk}jcs`{2W-N-O5Ct0+248|n{=sY)_$Y&Jcw3Bt|KoQb8SUf zv$HIShk_z)oJyqSC z)zKd~2P z6|WVLTD%5@uuC@fwvExaa6{n>KDIXYVz277fzS2R9g7t6rTPZ!9DB9N(_FKgbtq{E zhl0kIEmBicgrBEhM{!l;CVnZ@xrh2BI_Tmt_@BPmgZc1u{qqjFsi9Wu4qH{^Xez4C z19eWx`6%s&GLfnPUUtkOBX5X(7mVJZs{K{2!OJI3NsIk+T)9mUy1ZQ)M3=cZ#a4hFxW;QS1e#laWOl4RNC709axnP z`&l+J5_onSCd_yQLY=Dv>>}5Xbu=6MTSMetFt4*tJ={V2Gnfee$c103hp1JGa<1H1 z-zqo@xrwU(Sg44_%3pJWDSjz(gjv927oX=Bcf#JxEa~?e@@M+5f<}!z?dnBNPfot2igN5GJo$4Y4-StIN|_9d z+u`5j`tYVsM#L(k%x+orh%|`!<9?Qyc;`5B+*q0%2L+v@0tMmTixYTlWZ+nlW}n&2 zP46c<7{?RtfmfwrSV|AB5AfKO%l}IYe^J~HR?UMvv4U~5uSZ{Jhq_-^k(+;@-wA?8 z$m5w&A`Cm)-+OWJ(BiS4Yq77AS9~{-dC9Ba!#MkgGp~3V&&Qk~mvN8?96Z-ToHZhJ zHhXKRpwB}R3g*R?J>K~ZMX(QGuv#ll-_gIZzp9u5Zb};?-ubhNt1Hb5EVzfZX2S}+6LaGq?yb_-`?6NRYuS7SVu1Ai34;krpjjz?IY#^;y=91pG z3pn`PQg+%QqLDil*4%ms^{j$W-oL1wI5@qkrE34CGl-9})_x+`{{&JoOE)VjE0(4s zN#1t9{U9_WBy97p6EVtTFiMZGX@*1BM#LfGya{at&7QEoKIerJ#bABi*4zgJx^L&4 z2%q!G-q>P5sJtzOih#n84~6Rx;EjVJNHG>dF%REhAw+M6pJE|});6f6_+eFQrt{VL zz_uvr%fyJtc-G^30`%sf){aqR zYe}enTs4yOj{l+;R!=nX`Pkb8*q0%!gQ8>XdPav*rkr@-u@x0Go^>~Kqk|DsMk?@F zt4iE1!ADWol7<6tRq8Yk7{##V+Q8@t(lAOJX>^VS{6?I&kc1=f6H=v6GAz^m z0~wvaSoE{RBg(9PKCx^GAiCf&WtBKrv1pp1Xz8)4eQR)50MQ4zv2-;)qP@gF1WORZ zysSIHzh}I}KYmHYR>o4j{j%(#UI)cP_MtuOy`GD&@WRtG#ALUmdJfd0LTqJeKHNvA z{ty-TU|={S(dD7^b+rxBv>-&}`Mua}=HQQaV)TKFON?y5mh}ZcT*Ud)C~2hF@2lv# zfXghT>x8e$@%N-C<7I=-nBf+=K=^T#Pe|{!2#4OXHksUA!lzxq3xYE%PrdbG0ghoq z3+nEtC5vTbKlraOGT*k(bs2B(Y0|dHDd28tQO)n~aq^;RU|Y=kd?{c(uB0W#Bjh+d z7RE>DPd|?54`jHeNp}wk<(a>y#lmMj<|>TM>>`63J1$rzld~371=!by#@F6`?cw5h z+n@tBkkPBFQfxU_=YYpLbyBZ{zwQA>z75d;cwA?S*_K@=&}853X^6Q=IO3m0Wnf^< z(gSQqVw-MLZDh^I_!OE}@J&n|29Gep#|`z-bo$AnzcJL3_OW$;WudxA2-=RuiIsho zzX4U6fz`CBpgmR^9pISu6!S*BpS%Pq9pOF{;pbEE_@gY4fun9bF#1^e)!|xkj;z25 zAGe}!3ROtP1ytm2VsOGEv*FIP!Ev}|FeV-_v*(iH&s{i<+zqXXk7LDZj(++5Zu<=c zI1Y2X<4{pWZ$bQkzTM-L5byU4)gnIjR>3Mof#AsB_-(c4BgL(TTp@yC!iaDVz4IFA zxGBzlcx8|FN$&C0H@}wRI1T=GQpg?p{O1BG>c2WE5TMN;Qkxyx^~_H1^SJDXj!crY zsQa=um@Z0xT#htIB{CK_@?FN8#WV!lw|9Bha6*iXp)D-tT6D<@K&!P$FY8Lv&s8cgcP-o zMdLN1`|U^%iIUc=m*9F`kD!Y5;HHsHLLszQc%H%Zoo4NWW~)VwCt1`k0kCdem|F?W zk)uksS{Sk6AylJY`kao1Hs`oLgj)<|qm_`ZlA{!llK*025#W*u6-{q4V?rxKfjuw> zM^w=$-DLuc6!EbJI4a&Exx(o~_e}Ia8AwHN>v+UeQ2;SkSp}}G!?USlD|!&)D<3em)b>Dv{8b|l#e9)(5h5iaxg(h$`B6S`QtWe$cao?NaLIEtZKrY|% ze--eMQPrGPo%ivK$M*lvf1~cnNat9z#ksk_Vx4D6qp&P^3^R{lhCrss(WB&QRscNZ zsq&!>{cxls5DtNHBHBF+C;W1ePdy^1K0I{2tWOtU4^M^QkC2QeoqsvmSqKA10Vz1gQvXLiTx|_ofGb=C=snP(U z_%-r>3;r`|QYbWFlWZOQJV=}DskMy6VZ_5Am>rwy^ycELt8m)SS_vpEp53FPC1bZ% zzE6~4Yik${Y@H$y-W~BkkbY=Z3HiDKywf>GHYKSN123{-!1l6+>~PE6l6Zz`xS(Mj zo^cuTTbd4XOA0-&+kGP)Fp}v_0-E~`U~fxQ@(ENFX-|WeX|kU@%1D4_`ug``Rg0Xu zF~F#TqjA~)s7Xt}810BFpViLM21eE_ZzOANZk?aazcUaaXx^)2Fk~TP+Lit6NSuTq zB&}e|+I?C^D0$Y(Y4T@={V29cotqlps=@LcKb-BOJl%qqS91EMfx$*TOM+1TnAjT` zsSs{U8nT@;g7a1YEA$c!IGCXG`$jK}$q>{rgkKEfVfVy4%3Mtr#r5F!#v-c4jN1)zU#lj@Rv1$2{4b zO!!}e70Ex{e$ZvS{{6rxP}gqn%f6&LAv}CXwr0G2ix?qns(UEzVndzan8!M zn@98p7b`fLpOA)dew!?UMM-T)j)+^tH?ez=wHP5GzA|uwz zht0%@PGS3cMwehHD&@Il?$AKdS{}Sr2OB#6i~;>;bml)Fo~6`9>c=`Iov_W@Ywu3B ze8lr8;cO$JooX9*Mf9MhlEYmu^w&R(am?Ko8_V+U;W{(J=UvKTN4#srzqchyvQFrK zHfQG{v^$Kmc5dhCRTa$r-1QO`vPK5Z?oV91BMJ)yc=QX3152=*DMqBsU0Z3K^wRv#qfJ{TP0v)$_};V z%?_iokF!=d{d^@adudJ(^)u7TUuYK-aA{d{In>sdSKH*=KaWhuIZcwQ^m$9-f|fWU z0fZOn?apcJy}{3xs$p<(r)Tubk2k{MTI$VJ>65>~`965IbgAaw(K+m&z6kWPro;^R zxfVcvzb0$JHDk=B%Fs76r!I-V^9`jrK5_W_LOwng%KD2>_Rf{;;7Ir1@307D&6a;& zAgA@K-AQkAPQ%n*uX7Z!Vr{mM%GBrne9R%}hvJ#7L4(`)*}5@Xl{+BM|Ldoh#{vnR zQ&{0+9%82_4xyiKFxS4E{Jll^v#WeMQQl|xQAf7%w)n^Cm0GFLpkhg$FY>I`?uxS- zUS4uFY5Ao81=Xi@xzeXhhQ4Vz)vx=l81hbKeOicpXxLby&=+P%WwetPPMxoOEV;O( z=X+jx|2i$Fm8$ZazQ|5aMmgqrD2H~-%AnWQ7r`AcHvcxO&(C$K&7(_c>xqcF+p_?bB^=v$zpy1~SGPPS%)xd|cH0&t`zkZgP@ zgelPIt8lPe?r&Ben^J|oufc^xGpHe$vOsn0Jd#nC!B|15K&u@JCnkxsqQDhV2z8-~ zRiy0c(jmi!4g>o`zs}N_>A7Yh4){5wG(2*et_sV;jA^KWy-mxUy$Y@wX^NcfB+}C`i z0@OksTz5{gt7DtHn<~HgSe-NzTXi7Z*WG;uy~3mK%^F&w1!DMQ==F;}kW|RPTzy?| zbI*mahVAMPz2AkX^-@Fo2sAc`d^96O61yGY8Au({M?8{W8@XQJsSgc4(IejdEma1% zK$=)Wk5&^TdEmWMDY4sa;70K}k&ngENC(}L+HvQa#SB<_W{*!rkoXZ)2Sg#lzpIF} zXB0yZs**j%cs#ie)4(je4PN87!xpI2R04L70bwx_X>d7CHNYQ#D>&6aLLJgPFr~2! z)K;?&mbEvO71Yp-Z3H3`Ea{f50dz<25%!%I6bn>*I$ESUbBpFHm;A@5yk@kjz3{vf z#+kJ(QDsmA(nnZVJg5#6RgiUT-p7L%-xM|)*Agge5+x7|1GV#O_!t9Lur`$^bcZ(y zHA#OK+jaNWYAIAtYbzrBc0&N>}_TNAl)z+w+S0>k9P=YJ2X3 znLR(Wb5M*LUuu{&VUgxEahV6#Tpor7;RW`}Pq(raeZ*Kfko6-2VGg(6~W&%)bVHaf7JtLRw1 z0H3A}t(K8=p@( zE9FcLg-@>{k|ZvTf#sd~oJZv%)x1^|o;WS^g?FES+X7hm2P9*H|bWI*VjU^!-t$gHDf&)Z)DM_DL>yJ}lPRm#veX{VN3Kk1fPuti1O zQVE8EdXThGERD{Ljoh2>V~{y4OP4LIVrHXmil=r>6MA2-h?I&!J@ep?OzBTxCSwKOyBkImL4+&B2%A^Ofh%mq zLE3&*M4DH{@*h+F;IESZ@nMTI`HXpKXQ>J|^R2!mevxh%HNNs18w%s?e&g3}R2#qE zT{+1fWEi=XewRY?a3vDQ-Y?FCl|-e&*nEJ2j_};8;VhM;*bFpSdidYk?_){ZbJrT{75c6b0_sQ6^{@3G9S%cjVF`}!_`)0sjiSx|K)%ln& z!r$KOTfQwuG;*Fh@t>90d4_ATuW%wNOLD}Sc<75Vaz3p$oDO3E_eL0tvS78a-n5Ze zuLPY=_b@-!PgVZ={h}E!!guD|B_^j#>%*~jXkJLFLhCa(<~(+|SP6GOqB10f&IdCv z4d=s|4=GKg@wruz*hz-FtWp_Dphn*I%!ha<(9EoD$Rm+T@BWO1f2>A$T$e@uV?shZ zAu1TNYy4fF?>A$p&^>OLzg$wkT@q%XbkgNJ%3ya@s_WTe=*vtg{9{HbGSnv)VrnSe zv)SL-WakeWLCBhQ7YGrF&`1Lfcb9N`3a_-eLGA3d(?2=7CjSP@*%3oiggRoBc@b%= zda|J2mc{&D-L5I1x8x++nJa3%hBeTw;;kO!+X_mdFs!_ky+I`TxN>-DTv4wTW0&okJNpcO#KB#)yn}%(y5j@t_ zrIbDI*Mjrc@)#}o65a`^?lVRlM7?tftRbMolIs^{r<`J9rrzwBOk zzwHqbciZp)tIek_$(P|ZCBKJ*5u1GbVHC>q|@5keafzLmsalW!U zfRMn;+Y%w;)LV79syD|EgI_>MpjXD}H}x@&KG=A;>ej`OQa4o>1R%tx7wjwSQ@1LGq<}n@;6%2kMxWE z{Vw!(vd02*jBch|&2@Q#F1WhYBIK-}*|nI<@tp6wL z_*^ce_em||(%b?K4t;PA7UL=Oqa$X;??}hixoTU&f2httF%PGI(Jm~T`2@ey680LO zF5gJI7+0w+xZ5q9YF1cJy6>*ca@c2BelBtXtZTxv{2~7v0*>_0wQ4B8Vug4Vg)@{0 z$)58+NhEwD`jdyu39AUZmv_O)67Qgx%i*h9wOgynP5RfkN*~6kOO}H$o+{2kF<|r? zt&1^V`AvVo@6XtuiB>*@tm4xye`x&%#LDQjjjD2(d5w=5hjOLZ< zT^S-#`v;2_uA2K|w-ij!KA_#e+PD^)%}zWSIiu6D0hX#3=GoS7LoKz zrT1!xFqt_ve^$wRp7d7MB#Gv#vI_%tC-ed2$MU1*dW{ZKNC9hU&VNlxA?-%W#W=^O zt<#fduKIMD2(6sT?uuN#<1_ldOb7FISXN4RLjh*|lBbb=r$Zm) zcXpjtc|;J3$p2!ySc+loj+dfs}v6+oc5Z3Y@4$0;C#;r-FACboHr;v z>ZHL-)M{+bjn@ayaPupF%_(X7@bS;!?<>Navkx`PQX+NC@UJVkti4~9b=h}r;J=}$ zn3UukRx-KDbQ=R^gol0y<4Pra5aHbKFW<_G?wgqwG*@}*xgTzSp;XQRpQN)H&*z&_ z(U^5b5Ziib4Sgn+95E9QV=6`?c`VTc7cxa?Ad&9GY{9_ukh!ao*Vq0 z_NVl}(E8mJzqOJ+*6ksvj;*#nY3iFYG93nSnJZ1O;Uv;gz7T%E7s6SpvcNyc6(-cwjxR#ksk&2q z%2F_@Z+M?RF456CP5)=;_{$9JWN<&wvnYCF`P+`4;ZT~O+ z6p1`AT`hNM&ePJjU#4Q#?uZ8%)<7*+zxdF8J+^(f<~Qe7!KG0Y{z~H^Z4>HcJPm2) zasV>m6iGJd$67*1dSG7yl&Xp#Z=Rw}j6r#VpPdh>_^ZHR>U>!)0KBDgLrmlU<{2tG zkMBy3UQeCJ8Lt-qEf`!lIQ$Pu=@L?b5rSy(BRc4$3`dB+Ru%K;zwDCL$^$o|PqKUg z0?^v+Bs4X?eIU5qkfYANL^xMgsLLG;P@6J%;C0Jg!i*mA2mF9wZ{pSdXP7PEUNq!| z1B7%fNwF0>avTx7c>OmCTBNNsFPN*hT?>i!Xs=c%%;>*zP>BS#nK`!Y$X6K2WXQYf zu;&*0LEqgEQJ;(E4&atWWFovYMv0TgV$fm_Uu>JJ@i%I8@Aa7J6y-kTa+4B z5fth{%^RcHyrPjuJ(4mR{hWnQ;X7k-81~zd39{r5k`K_kw=eMx`vjr)5B=B$0uj4! zcRNUkQjN1#!As}!`mPeETkAG?YraEU&1`=eSR1a0Sd+%b9W5qXESzA)#v3Dv6n`=C zb>4oEW`9)j`@sf%*U!!4)O6$br1k>&jF3qhxqnxgzll7~-$}>`het{7liFU|*!|1d$;Q z%)#!jiC0OHyDYcZ5%9SPFg>|XNcFx*yVARk#D%gLtmEZmFjaLY)J)rk$S_HGmC<(x zB16cW=q)uBF5+LUpjdbp<_hG+v?~*pt_I{~z9UN76l&o?sEd<}K`zr1}{H1cX2=exO zT(90d285yi3bbWYpdPU?z3hEs=Oc+XSi5G^_yCpGw)C=*RsqZyoLfn#o+70K5b-}g$FNM zQIE3IHO2CA8j=SD=oP^^1R+||=iedIR!om{#lDy8!Qim_b;20o9U3iFLj<3$E9iK` zj|U?LFi_r)G(`<@)eo6aJ)CsVq^)pTPJ%rooICsQftpBa2)p{j20_}2!G1R6X10Wg z=g_+W)rnX60-^W4B17SxaF^f!2>uCD^VBnPmiiCX3Za5Hm88~15qBScYf_hnd}c9L zV#jt;*0r}ipP?F6Jsblen|U52)X*#3FxMqV%6Z1-af+I3i{*Rh;@wDT1B6{&;Im8* zj1^HmB%Zt_YU^&+HyoRR&G#V=fMfU>#{KeRksglBfoAJ32*~Agw96SBj9k>Zfz(QCWl<`UIh*sac4u^=0u;UPAJsN;SU8YC{={aOu#4ns!E}C zIRR5(m2E_nJDuT@=Jp-=XTxEhSDlMIT~WG#@*+5Jg76Q6(Qb(WX~#gT2$R_ZTyv($ z?gqDs#7cAoAAU!{#!P~r4+p=a=ZX9tfSc&GY+U3d17qXp-2JLsq>>l4$S`}gWx zD!oraEOCzXU>vCXw7?Z^V6K_|;L3f-9JLeoiB{0JFoYFzttm5=!D#Nrb1L)3qyBZ{su0B9-?-3h6xCxt$ z^#RACf?W({1iFG@-jyD!U|vDOtiMh$taT>=pNv}NrlDupV+7APOFC})m9fIkKT+<8 zBxgW(#E*RR?~AsV+c_N^Ay6SLHk7gu3DB|qj$gHrr}Sg1V14o!X4`( z*t}{DJ~nH@AN@v$>!|+?o?&qpnFmR!i2vN0#DL8m{zPYk@Q#Mh{?iq=zN?}QsprH# zKwUx>wm2jF_LEgaS4oJP!$o(`l<&1CI>bO2v*+Xwm)zRAnCs;Q_zVlCM<)1w2_T0U zY5NZ@B<2g;r5PjA_7^S*9UDI;V%PzSFTKp7G;ftw6-d)r)C3b5NFOL{4P469(=-nF(A#@N`V5kkDq3Vu$ z8{m6*yg;gkP=+iAy{mv|W&$PD#W^FApn}j5F`N&%k@(s^xTwk>#HNYmza%rUV66lb zcxF?6G**Fgi7(@19W)c&IaJ8$aBHOhh|BTmhWN)GzhP}l&1%>l2Vh$VJs}qy`UZ&) zPg`~WQq01m=xDE}Ai)Z4F3rQNqj-Rg*quiTDa5Ia=CJ@R;JWHX*Rtz*5dBekfh@Uq zV&=G$Te_Q&u>BO706VWVdwRKg4sc&`A+sVNRXnYu3=JiAV$6TAcZJqd4)%UW8QOt? z+m?xi=VR8u4@N}_e!gTxiuEkuG>wxFfN@HfV}#Cwh3Xlt$6J>Kg3@bZ4Z68bNO&5Z zN;Wk0?PVy|0p0>9uXVBZ-ND|*|AgtQge!S#N`wB9(7ROdJtQ5XiQB|!k~H}({uMsV z$G~&1{6HSXHUEEpq5Hvr+VY2Cr&WYQ-kzp|K0?TMn(xX~ zUx7_v2og%L_uM^j1DMspV_T#0;NrtYS{S#M`l#H~uzkSC#3RF=2*A1?#`zb%3sRuqw zt%u9>49Ws3Bp9k%DEtM#RfQqloN&qlh9ZQFVXPx=LBE|DeOj-%kjsO{C5$qoSkZ&H z4*$&VN*zQNZ&BCII4#a%9$2G`Iv}g0&RN`s`nmHtj+x_aL+R>+Yq;N*1fgs=@`3Ja zD(BXpd0=%fPS1}wiP)&^hFYth?Piw#KEM63ezBp$dpKeq-< z)jfjR@?tz4;t!xdtinVQs2k05$n85WhQlLQs&>sS)7- zJ-8J4Ofa5}I0ijbSons;Mf+JU=swj z+k9<^rnK`6g0|%Vv7xk&u*4OMk+iEca&txvmFX&fbymr09aSnFdnlf^cMX;0w9mx~ zKv#npLeG3X)l3YiryjUk0(WUxjg(so(GU7H!&^&ZbiO|mX@vLa)^w#56qO=IjJGQc zK(R@B@kMG0tn*e?eKw@XKohjEUqVl!V&Sx5J@icP2(xmvvGE_j zF|74DP^q3CO)#SU#KD2+$G^g{3^YMP2ywC)(Pt3zvo2{TE>>nd5YITsO9RT~ji_5{ zK?4FM8;1h|K*H?cCy#}z!T20Wk#CU+WSiB3@UjJaOq2o5DzQ68@Kwdpe1ZSm(w~u^ z!t_+i0C|^+&;MdZ|Gd(%zU)KnV@bOTJ>HG9W?L@^e891-s#OhrzqGD9aqP@%jds5T z!FrCH)uU+07Z=$vAODHQ(r7=Nt_$M>iNYL6boHHg3s(_R@HS#Rc=HM^ug*GIQ~+v7 zzJ4IQYy)BmLSuLd+@z3e;-3r+2fsoq%fTkg4XNkSe?MdGzWL*t$%@wBSU_1TizGr_ zexIjyyr3wu-`YFmlWt&N(}sB<1g>JTj>nQh2wNjFshg9|7%ZmAJQQY~dDu^Q+=PyX zPdj?!>@#6Er-7FZ*80?DD(~-L)1mAq7P0b9Qv!_{E7xB->8hh~&g{Drn|l&#i{Ba+ zY$4B6co5nm-wl*D)h8)^ART|-O(TM{(-?~X1tu03{R{1x@gU=LsL5e!u#CEq*z!PD zCh}F%M4$ZEbf`Yb66*Gb(1;!ok*@nfdmQ2Ar;zsyIoSp$p*S1Ff75G7^CJ1yjnR7J z(d|~NInDGvrtFg!$((%W)V=PN&&*p4G9~iPI}7H-S^XNoyw^*Rz2DmUS67zWTj*!T zf4L5kFg0Dkd;Pf-@rnzmezAOv4U4|Vq(S%MP?0qEPE%QS zE!JgOg>?&nnn#Vu&4z=Y6A+)9=H{tP5ATtiWt5y%EO~9WOVgUsEa`j>=Wwp(#{i)0 z@Iukof4;edH^iH!;+TGI&&r$GUlh9$K|u5LJ!aCgp#1DSm7Db#zCPu8y6&d<6Pv1m zz8CLV?=#?8s(}6LTn5D=IxJ#h?gNhpbE7ya;9EI01;!-u|S_OF*BF7H4VEy4v~LCUVyWQNys1O(*!)^oNT6)b;=@JY!?*a ze|K;~8Nd2f03)_%{bQLEaMTY;>d}+&g%VB1W5>VcW?;JTHJq7c^oTRt_FTMn?l ztw*@l85qcCx{Dxk%9pV`5pT$qEH$1XV5#_nRsbD2^zHq=k8J9DHg(3<1euFcn&vi5 z(cWw>D%6!5dbH>8J|77SC#>?6n>-q?2zmA?r>!`SGc32)Df+vW{A0W)2l<$9$_seP zy6o!1Vr#KY$S1i;43QY$yT4!bdPQM;U$CveZ4zZ~$#6=vM!Q5B4G3B&>$Hei>;`#S-~(&(h2AgofujtE0#|u8 z1UKsd^!qRlb4eSKu?OZb&zS=Cnn|Gnzyxq_Su(WV!#@NAR{*&Za}=BYB$4If+tLR& z#!3eD%>Z}#3-1jHzY{IuDDa5t@V74yao%>U+hH7sX{%hqLR`EKjb}sBhC++s+f)pt zmZ|kjeFe82jiq$jQ@0I!!dR$ zGb6tdK@$-5`OsH%Pk4oN58x>=!JO^mv0d_eU_p(ndm^)Y%4quZwa1 zmuGCE;Ea!|ykp3=+1()B)~Z84*f2>cOicST8sU3}c2&JQc=SHRCFt&7rBtcDGAcgG z-MbtFjirkBMtDm(rU9m1`k%~k7OjGfT8tu8|P&!r7a zKEs>>s2~l_MZ7ba>zpS4rX5?pt6B~o$DB|QHfrr1r<_EcO-nrqzw)0eYu%^?d*lsR zc6+HD9_2sN_kK1_*^l2Ls+aM{x$%{c=23t)r2OQEXi1j8H@lKh43N9deWWJIqEA9% zAm@MGZI}E}R1N?uu$+y<>|UoQh0(jCVVO$2Q!V^6)i>YeZ*7vBfFsQDKUD`)yn5Ku zwq&(bqQNGN;L_kzfFud7MhGosjX5QTs-O;a)YgUYYrhE~-+S*i0k}~E5Yr|mxh@IL zc<2XtG&9Qh%xGk>a1Y_@i6)&P^_G=#A%s}KK*rbuUB-Td93hzV+vkCt{~cln4gqta z=#UIYIL!~?jaBJ210{44=wg@RK4ZZM(0vIEv?)d~^1914cqZUo-%}9`wD<_C>mC#9 zLM);!fT*fvS!a_LWxC^(jE9A^GZW2SwDJ`wbQlw&09qn0eja2x7?Awu zYe)wwBch<19}8Eqzquf#%GG?|aj_TSxWV+*SoKet#47Wg!cC6=?*o)vR%=}5w;*56 z@y~yBfgS1f{Gb4$1rDUZfMsALi@*Q$bZZKTotEJ^IX5 zPG2FNfM^Rvdy>BM0~+CKL%}qacq3Bx49hH64dvU(G#q#t-Dq-Pq``Eko;b)6oKs;eknSAY=;gD6hvcvN$aLXv|&r`ZN1}TnqRaoC34z0tFb7 z25swQ+Z(xAPi1M~s0`Qg%klvm)4>GaI3j_+nzNGIY zM*;NJt6S^}^9-1OgZ6_`F2GEvO$a^-83(Dr0CVEKd|PQka7DR2imh5ij`SE?8S2$y z4gHywbz1jP5=zf}ID;nfhKbHkds%$d=JP8z5yqKt89R@!6$q@zS1wMPK>Koak0DP? z6SOl%19;_uWzWBFAg-&bTvqr0j*99ARo6K^p4+zhpQZdQ=~o{M3j3?&0K@EiK0?Tk zn5Ma|c_*-K+On)8T>)+Z1Iap4S8gKd@~xcex!d+%S^%2b{Nh*W%Fh_NaCgMJZMUsb z2iBTOtZt679qxse#V1$90|tP{#=Ikyz5aup(>hX=1@J3y5XHYv4>&JBVz>wP$8H&= zY+Ye@9^SO=ke(4N%xnGj-WHZy2f*E$f~1EjEfBNx8re^ocvY-PhuB@At4Rd{Y%KUI z(pK!=za_!>OzJH^-QhMF0eGcLAL`KvU_BmK-OYY&+$o*GvtL6C;0xXLvM(XVDBGf~ zk>QpyB{1(ZW3_zrYf?|ty&)RYPcs-h%`Q)KMY zEUWu_D)DcYS+P79-K1-}TT4i!27dy~S&@d-nJs;d$NGvIw%3u1!){ZI!j3u=pi-s( zn7Tm*=4_uzQ1j*fA=8xwtamoqBcieZu5Va)heEsBUSg7SDnLSbMHwFaW&%4!&LspD zZwuz_Y|sg!d&*zcnBjKW2eec;(tz(ClvWf2CtmN93#Z;EBAivyvhc(%1w1WwK%CoG z4u)2kvaf{wd_vPJFE?I@$y!%;)h(iSaQIMq^i<^>U#b_5(IpsY7ZDq?h!ZbbQ+Dj_ z{)}NglKJ;S4}eu$@wJ!=nSo+`?kx}40tGG(D9#B5059Wq<`I0dqXd~yHw4JX=hwge zffn81{lxb0_@T%ZL#%6PK5i=kDElyn0RNeg0|_A2fxfmHNC48QT}SrW=NYK|rrGeo z^3>!09w47eqMKkLYxw_n{Om0yNswaM07fFrwiFzDPy89jypSI?o+XpbNMV_E2^N2= z^@C5C`O{S;GhmmLbvTi)EN3Crwf$D&XgpeO@7DY0EVJ`5Q5~A{2xsoqn`(vs+n~wuH;V#o*Hc6*wn~dcB_sloK;JLfHC^FzXB#kSl2I^4|rCw7q^sD@%CUf=ZQ=Nv66rDa)J)hfKp7kaM zS8O(e!(crR$ts18(qJ|x?NM--a8*4f^(1}YEg80AI4TiuzdY(eQBKJxZK4WJW)-8* z+y&_~p6LVsoEE!={6~C#isAtfv;X6aGhdSRRycZ(uaP(Yz8kzW3@k4Fsb%!$@pd!- zD22GEE05{g!%D~>AG}3j@ZajwCvd_ile?U2>7_Y%@I+PXePYl*clV~({YPcUFoz1- zhwb|P2zKY-QKsf|I(#}q|1+QfO^+das0zz1p~-V>>s z1G899-nFE-v#6O{FB5Km)v`cgI2<001T4c&$3(WyN%uK70KS=6_b9FGA!Yse4}O8w zq10oLkGZKaUsM4fwg3|XqU8fW5sA=9D8dz)Hj_!rb0_79w+kGxlSTL07uwU6P7p9D zMd_3yE%4m-!!VnGd*^|JK5*h!Mn<%` zEE)%GePhdiSVsSvtX@CZb>)wON17383hbS%RNZK;aRsL*<|^;4f*8b6ietU zyHi+BucewJIpY-iG3j7dVS|!+9x;ziOYAq9h5Z|p)~Iz;z$w!fNVY9{;V(JN0Ilk{ z85J=3Lm2X<$>t6fB>o<3TpzU^V2{7Un1kH-+7)fWPxS$rSSsC?zdl8f)=9iJu5=aW zYV`rI&xZ}2h_3A&wxJW>wdPi4ZiGnN#}IQwWt4_V(boe6QDUpo`%m{C2{oncMGUjd zJ`SJmm3odWdkfZMW_;-q>p4d!4(iBN-4HNPOvggO`U4)SrF@8N#U zumE&s7ag!P;(B8x=@@0Gb%WD5b&nM1+eODH2?QVb{KrXizH`%&HGcaliKC)fV^QHJ%Th~_Gaet+jNHXmP~hOm%M-Ew&~h*4 zwW9r7;0l4;Iwsfs4+O^Me6A(7VQ)suRCdFjFjc?!hnlw@_ILWpaXQ9!A7vMsB{f*$ z4oDAXL7tARaI^AQy$%U|W3o`Q-In$PAnZbxfMDWKgTc1_BgquIH4<@)(7uUWQH#(R z=Ft~V@;psDfzpD|>i7nzV8GPJWufozFW`1`=iKVgFF$bWJ&Iycc@spBnt&aJlqPm_ zJT=SY7Rw2q^>{_K$o&z#;*og8yOA+j;sq-Xjd&BT%`8>{GONSrqcrJPaMGjuVLmid zswHU`!q8I5~->w?ZLwV>k$IOQVxdfr z!*O3PeLi)mGtOXK^^zAo5K_G_C!UXLoZHlq0Y)@qRET*kC*&+|MtI@YM(Q5!Dot({Iozm(j*DOO8Tft-`+ z`;*tt)~!I?-0E(<%W|P2^-u`+;IGO3KN|l+aGaKg&CP!J`T73c@!VlElDw_8NTjRb zs?{&Vzd0{wTd&Ehy;>{WdQF3eVjCkZ$Jf2=^ht{445oHe1`leiSC#Gb1szG6$vPXF z>W|zEt`$q#pn^1McDcJ!gOd4 z{qg@0=g-Y#>Z>eFSZtv6b4J0m!hF6EGig{XW(RRUBvxMKLay3V+8)2${9#@}E9DX9P`LKXD2Z_5MFCv=G zExzNm+U#i3nu~c1oS~~=hUx7vmQ~UwnOKX}O4E#N5t%RldeU2#XadpK{;7VP?tjEH zBP`8lXuF;4H;gl~Yrtd&1k1(Pm%lGtsTd$!6mNW=@h=uF&4msdQ|>?Kgre*kGOi~W z{V+RJNN64SSg@;q7iPZM4Er)RhxBoGjNtc*gWX3hIQHiKN1F58oUvbBuxM{N_}i;< zzYWhGggTSvRMTDU-Qu*^V9m!#(7jKm*sZ?Ab&o0(B+9(XxS<+);qi7L+6n$>h|@Mj z*sYb;XlVTdRbT)+qo?0vmaxQteYw4kP<8PlTz!= z5(bZv8w#Tq1$y{1j(M^E(bEruK3peri*#}VE=1V>-? zNR(``BfouGv%=_-U?Q#Bt*k1?m2^P+d7Nc6g=$m&FGm=s&V zV2yGuIOX#V>b+w2q1B_GQdg9-p*;rK$I}+=kK>4^b|CDE^J4^>FSW4=twg64BLLZ5 zHNXVxYQNETAo@QPC2gEeA}q(jZ{VkukB+C&ok>!X*Xs^F?peC41GF3d9xc@*5TCA} zH@}RCIgLj-a^#CcZUEv4S0HQQ-TG%)!d`1S?tQRXV$n-Xxb{>Obj z%P&n=BtR1wP=viyv$VAC7DJ!*So#{0Aq zw9s4O=F9;^xL9d<-l^RwY{_&jdSP#{?&Vib*li8==&S^!sj0l`%de%*y7J=#(PzGC zYHC_=`GU80IFVHqA~(WT3>x#IO@~S-Tb!lw>zclq7xPWlWT39g@+kkUHJhxn?fnNtGMDpOWAssFoC%XnS z@Q1|Kc7rs%g09IT#=z@T`ckIwxGe*}g8OUe-%bB2r_UU4Rx>y|R+t|A0eEmA&G0JL zEIETe0A!M3{OQVOkcMG0PTu=fk3_0=aXrLv*LpDE{II7Iqbd5IxxZ8{vZLY z4`84Ee$0Cp3H<*!%)QJ%`O4jxya3CwY;y>0`hdF;h|+m*gukEOVjSqfR0M6qaGe(4 zqh#LZ+@q8Uy~07KihSCqQA7jrgDFiI;f<-#k@fD{b}5ah23q56*|n+%m>jiij+O+> zjp}79*nfl!kzQuZcE+i$rKs3Tm;*?8VGX%?2(R%U>oUQCmt{?WpQgU?mL4AP8^?FW zZ@+FMK+a-*Cz+;DvBFh2nmo`q%HSn_MWP^4O!x#co+{Kl zKu%b(bH&|kH%DEs4mfog4>g=lt_}cy_`%S*Qt1r1)4h@NPX?<6hQ3XKZlj-8tM~>R zXPOfyrjl2PYB_zR(vB597l<&KOzLuuM!g}R&o74-R8Jl?Zbc|@Ce+`3zL|@m#4Nwi|xCu zlQguZQ0mss+{_uT%e%ucSgYb(0j?S-Y`*I$6;&PE=@FLjt9yfOc*Piyh1c!aD23%_PaL&C^(o?#;@6cGolcD8VO8Knf6b`V)TtaO*F2w6A>3k{p4?FIWb`;C$C zoQ6JGEoRT^IVrlE0J!lev4I+LvrAgSlLoza&Ix-C;ftR!jj1Oram{c4#=(D9S%>8+ zUWf1`bVLQ8EE7OdaJ5PBooM1+(fYk#8DQ6YNg2qNp$qjW!L9y;|FvhSdQ5Qb*v(q4 zN$X*3Cxp*wZ76~&-mS?9P;FD9i4a3DKwYJ0H0v(BeWz$8U76>Ya%eUP{I z1&v~F*tTJ7Ox-U6XzaKrwo`i;*WQ>RSbR&;Wy_bRP6w-71JOIkjb|o+weM+Q6f#o{ ze;JgEe%70|y%E6UGUmv(+!H`pculm~pOfJF6*AtPH^}CBNi!gQk@evhIjGCB6Q#F1 z4s<`T0VdaWYwSe|_L_2%d_0H0Z1uwJaTo4eYs$ImUcG2K|s*_sT{n@yEi5vwovDecGuvw z583G%8|Gqh13XmeO}dYKMc|1W-=UFd+xjbAH%SZbA%go$-V{e}rCxo`RbB8Uo;Oc0 z4a{ba7w#Wnl+8{rT%)deuKAEk@5)*_(~_W0pyY-jRPnO&Q|57}7xsF>1;ZJh^n{}E zvXcCU(p67Gj?3f*{N?5bxOP+O>S9glSI_YKd0tT`tl%bjOOU_RQ_%*vDk8_W0Fn%2 zpb&hYNr-X;EDMjl=@Y_2n{as9^?QQ{*rk`UZ4kY$k(;D4ofFwVU^J3v4@R{;){qWQ zdTq3Qx=5?{Ln>^6uOjtYSK_hSvVVYhu#uT((%kqEqMbTeEsn-s@4DWQW(H_cwxO;g za#(r`I+>%BNiLe;Ek+dVhJ@2*+jy`x;OJ%%QF!F^nx5 zJRK8V#SnckY^Uhp$};o;b6v$CMV}~z^pf%0$pa=b=Cs>akO+OY2BM1$ad1U^0&*#8 zl75frf3@bV2eHT7u-yoa>GgU~0zoll=j;<=HQo^5d#_E(PbW6IwGK4{W5_$r*>o-) z<3l{Be@Y|yUk2;(p*DTuhe9OuMw_ni`*wYdM(-OKQ-Uyiw#KV>UGm?MqSl7FF;Sn8 zMdi)nXV}JUu*>_!rUG56D3U$j`@GNjaN64%&s*rY2jicnGSxG-c^5SEi}0+}-X%g6 zs!cBRP@x*aSemz%Hq-<>{F{Gb8)6Bd)C3NxB{koyOeB6i$LaASL%c!8a9pR+lc06u z$4IU(7{;sb;W8H+6*r@zxWrARAP5Wf$bG>LeJT?LlP~Gj^q;Ru2~epr z!d-b@P=9_)-JZOpCVSHe^%|srCIl&58MQ@7Bw%fOZ%Ioxhr&1;8hk1~PbekA2o{u; z!WtXSUTg4)dRf8$`u*Bit>Htf1_>VATQtv%e%(CrgD|ENe?^So3Ck~%qwGJLPvUf4 z)V~u59)W%!4_{C#G4mhBNZVHk)Hb~rqe!1VJ{sJZcY+t$!Gq8285K9iHbNERYjk+X~?4ajll0XhuIDz!DYkByJX>4#7G z4H^cB39b9W8HGTW0S7jh2$UAlEqm7ldqY~|a}SViQ!M~C_NK+XMyCV>IP(!u9$BGq z=7grdiHL|E{@hFtSII==O+p}$WsiDy65!a`&9q!aRpPW2tq;Me)h#pWEEEpu+E@PqXHgH7pwdE-OKLuvQrQlk3Tm|1ANUd<(XGzf|sX z3hOfy^*IG8{w!5(9$`dg^lplNE6{v1#O}>wg{;1hEt6MBtoX=}C(i?jmO8l6y$-}8 z|Bo*~Vr-yde1A^Q_)`yW8p4LAET8TXujhOt!n)z1ZC#Z1$WbHAd9G2l_D%Htjf7am zN4R1qVm^d!o!wfP#V>%l7uh{pQp%%?6+}Ao28Df4>K+zNL`eyHW&566oa+%*tprX3^! zqa_E~Aakz0T(ZwMZ(f(&)qBi0f6{*@3&jcdNqGKYd`hoi>XiqcS0MA@_2M%_sl{z0 zyi8#kdx4eqZXvU*ct%(6nm5Peq2=#4v^n?wmk;*IFB@+vks@>7o=dLQ^PP+s+*1yN z;!IV51{o9v(?*g8mdW!Cx`%x7vry#xKK+|5{9qy%e+nRP;|Co3RRJr0Ckm8d^hO*3 zcoZAtZ3U{g{%UYa+~f%S1WqT1SHliBZ{s(<4y{o=vV0ptGZ}AQY_rVL90iLde6dNk zw-Sg?yRBn#Jreng>b7!(_G3qlv`N0cau#*2=5z!>HqInLu1o&o+$sML-3lDatj!H_ zpRk^rCK>H$6i!hhY+i5TJXeB!B^W)zaP(%H7p&KDf4 z?AjmSoZeo0&4=HD&dA8mH$8f|gZzk$3i`$ zHD1*w&3pJ!LgxO-q9(#K+5_A1rY4}^svrTYg2Si4r9_9*5!)rhTfu$k>m}~H1{1|W zz<@c!yNVJ&@NSxXntKA*iYZ*Z9tKG66~VXZEX0K=3r%0v;p5fIvB>03U{EPG`%w8? zl*UfUp)?yx=x`{sovKMLP;N5jGL3NHmg}D(wXup(;RQnItKk5TG8}Y^l0Gu=2`+To zG^qoo2~;-_157Aq!zyil%j^fH;R8P;+q+z=j#iB!wFGRtr{FI%bcH+Ip^Pz-0_=Mg z!w$Cx=u+8EJgcWBZSmp{?eV_Cmd}5X4&+9sTbI}``D8Lp8Xv+kOpaojl!*I;1D_MIP6V2fTT4mS?16#^T z*)U3Tm?FutGO#9HD()mb-RjOPy5eumq7PNtw@s|uaSbg^1;S8d85Z^ua7A=Qj3g)^Nl0bA} z1zoOCVu?Kq_US(dZwG{OnGYg?(;1P=fEKG$mT&v-2Tw2(2J{&>^r{qbr=WmJO`(V> zteeXJ4hcM}60M#Le5QhuWr?k+Q+W05clWv!opPstYx$)&uTH9vwESVK>|S2-O=m`$ zh&Qqb3c8}}(}1%63*`Gzik#18WXb+mU5c#fNQrfUHwMIq5<^bIf1(xOXc|1GCjR|f zYV$dR#lr1hNGS6)WLl7w zi>yHx>)#j7Ss$OkatI>a{%oi>N=@P{IX6*P`#CyqWhR<~OS`4AgcSatA&)zrAtMVF zN|$h%S2v!0H9t;IV6=I5A~_EbgHz>Dd4oWu9H0VQA3V_^L!&pM``z;dj1gKa)Pcr^ z^TT^C1p07&`Q>~jQ&C6`zHJ=eWRrg&Y44k<;S|O&5l-3cfbHGdF7#vY3q zJVi<@nG-xm<=&eKaO;_UKXZjqVIzt!`n$_O7@C0Qy?c($cDJ9?cI65)oMnva|2m_J z40_4!xScJ+Fh*U!1=8(I2Qtt2HNzr+6d&$Bg}@^attY!!lpNfwVaTt1H|!;qkOuB6 zUo{$*L9wKVl{GC~FNlRLxbfMcz~40mO_)*}6Lyb{yZ7fnpFYBRn=JolBX%FB%HYz` z-;dZToLtwpS}-bf6mbU?DLqJH)S!RWXrnaEry#bmH)!?vjSK72@q} zvcEr6ISn>wM)5_Nw=bGxe9J{(bAP9@4{&6;{?X8j#%)Cp10_zDlR_*(U8FsDIuEJo zW?OuA)3s>9UUt0_ojbj<~a@FA9PpZi1pE1o6Koga4#UZdbm#4v1)f&n?I@Z(%i;FGnVIfAK`_i2;%UJ zv`k0SoJJO?y&#l-%rUzU0Bw%d!cPUrf~G2;5Tc3x#371We5Els@xxesoao6OI4shi z<1UjCuON6~%C~phDYI_YduGxfu)8i&M@yg-|G0Q0%F5-ylTvQsmhZwFh~0^*DDsEW2t~Do61RCUNe+icV52|--0Q;3yZSehhEdo#e zQr=4c4+i9miQh+I?9|7v?yAGmotbSy-(6xQeiIs_3G?5guyfbCM@angf$<6={5f^p zafI-5@fc1YUr)TW|9)L)BNHMCg*E%kPBj*ytG#HiEkp*#+?~cWA)=6 zB568-O>E+N>6CxJ6Jb?HUkI*}Bs#_$_PjAye^vmUKHgX6c7Xi9A*f!_Oe1s>Rn#M* zK<>>#K{PuqF1|Cr!}Mr94P~aw=2*rA;|92f=M~Ow3Mf!vAh><)KlLu5#GI%mnNyoQ zpo`S)91BgjQWKp*tG{MSH$^a&P(osz)zlcK-tLY{0^>v3g;h@l&Y<)cdiL)YAU+yC z*4>!DdJN?3OGRk6(<1F|pML~V&;}{bizlQt-W)&QEITOb?ny>5@DZ2RdYB?gF)HbyY#WwPax zUG;UK$P2aWxg(fAs1#D~j11wnFNHi13YP7^*OiOcKF6~Ol7c+l=fUc4VgVYh+ERx$+z>{|i_-tL z3*Db65pa3%=tpUHey8)WUGq`Sy zFfv27zd8w5PrC|PkN&>`p`)L(v$H!~^wFF|Rp=34>!Y;<;*`Y{=3Ai%+(hq6XWP%H zR@#ommuFmNI6w8xa1uVjlk_`Y zmEZkEcubM(B|dn#m1W(*bP$*V{9Ux$QG)@qX(6h#{(#!)dW;Y5ypZkLUF|5E7`P6A zy?7;sNf7Df5uU*s5)#x{U1a2PKyUQE>n5uyqh&HQlgo;_d;*Ka_S7O)Qmr{z-7&~W z@p(03WwAr7t{bPr>Mtw$VpNb0dRgz3G&dO2Lx1Ak!Z6A_egw9E=R3R*c%&9twm;Sb z_p81{Z98=e#aVZ6AeY+0{W`^~(2S~dRK35lGi2Z+!np(4HbF;GA{J2LC$cMmBdaG3 z7fBWnHrR4_q(`Xd_x5PZVwD$IVq{Gmto-tJ5%*t|+Bw=lbs4I_e!Do^Btr75ac>_r zlsne}<}p_Vi8M%uhTV*b`g)+5C}GD(UUq6P=!Hd@OStQ+iwy!}Q5C6>cB9 zQscsv89vBAQ0JYtSv8jJ^&N8EH^}F@hUHwBt~Pe87%4V_C`=cyxo$OeFFr;Kl4RWA ztc?JwYlpl<5~fTpbNtq}`rE6nfji}!U;Ietbg_+vqUvXZ$)rUP-9|TQUC(HR zv(Ya!#AmE6G*U)(ve|C>HC-HJy^~PEfx-{PP5391Dc#-ENveuQj1eP$oyT>PBnB#+ z8%}bl#qepWsj-^cBtPZdrtY8S=s^P`QIozI*s`1UA~^I;hPn2+l&Q4@Ohu~W?y*fY z$6VYY4rev3(UJwFYxf}9sm<#|wo4vf(-PyG_O9-|1Fbo`Q?pm8Tp>W^fR|Az!2VZB zbJp6xQf-4aztBFS8V!EzSRg`b1AxhTh zBw>A|Q(3WUe%oV`*ggCuX{Z|`mgykkOQP^FeE3L4GXWUZ5o@bcMsK15>E9eDXm}$h zgkoM$H#(dxs(y0}{5BZsJ-glr787P{W@R;pK1;;l$LQP|)fB7$7&Mo7f#diwSmhfT zvbx`^j#b~rDONU*iA#hNZ;5aZQv4j80u50u=G=s@SNQP=r{-ky-8Rfz*Ro#0xT}0D z`r&(zw*V@)Lh)Af8xwPHsTjzJ%C}ESU{Dgf}uWqnf=4fCgzAVVIOV*21heaYxW$ z1~n8E|MW5@;{R^e;f~y`I8~zhBsTY%EzMpPc&}xQQd`*!3UkVB1dM>RmW%w{21o33 zLdA9>Gd+XViyW1P&#lzO`Y)*C8*$lH;=jVQ*GDLfVx}ABPf{_|)z~I)cbh&HXRPaE$|~Kwfu~!E!9OxxaaEF(^^n zSe-++%{L#D=JzDWIF7dB|l9F1HcT+4!MXPm@Wx{6ZkFr zQ`~A-Q3kZVdmza%$CEkD3WK-DYmg-NkvELDib&$s0VC`tJrd5{+h>S9xxCJ6If(2U z4yCq%{*SvaQLrLt^9D${c2^F{4H8YnYF7%egYk9-imjKzx@`JT6&C#W2}lbon0VEU zp|J7I8_jlROB~lhpjc}iwYus2$9zi$8Ia9^wO|ntZa3mfoddraMObGAzW*F3E{_w4PjfvfqZ6^s=X_- z^#pj-aJG$=Ar;XoGY3_<|dSYjVXwoI8q3=LPXh|!e zT+ZYR&%(V=ArttJ$M0Pe0~*Gt7GYFVguqas8jqHxp31; z@%RvtbN}5!s4vK(e63Y!u4v?9LVdd7voBj0&5w#REEmF!smVrOtp>5D?NmC$cZn7u=Q|^8``h6aUV1|ME}7}BIVaz-Cic;zxDVa5`(Fb*3TGAE;;6Q!JkFxl10xAf zuIPiX3@rx3T0oX1R`NqfpsOF<(LkQ`PNdsrJiUZ+f1=9Hp zr%?G8rW&MAtkJQvsEuO~a=9&}%cF)2Jsn(!fRrZfF5?_Z>fLySWMO2Lhb)FMBV^_F z?rAlAg1r9>6KK2J^8HSA!9EPaUB?Yufw8hflYfVGIgi4Nn8KplUnU=*&TxT?$*)Z9 zU5W^zCjpTO$qP@MhV~*D4+4V6PJ|_|Y^e#4I?$;{U5L+;jpUs;2q~BW?n+D``)Xsl zMP?x2x_x#~>%9YSvU+|QfiZmyFw83Vffjt|=giKjO^%r0f$`c9PnGe{BLn)qMb}6^HdnP}gE;SL{~T?H;ungU<|E^{r^4=>x>Ing6s#F$Ny+c#n z$R4y=Acy;^41bx(4L+pXeV1lr%#umqc#=Et+T~dGVPGvho{8`JGY<9qWz19XT6lU! z)^d{c>eKp%FHepfO&HV{f7ZfTu-7gz9JfEnieM~ry$2eN%YOuK zCdhpovl!l0Ht&(V#wJjtP+ZOgk!+COP$CUVsXzU(t+zTpxmq?lyWa-waxFMkEI-;?t?^<2ZnI@xnaUKgA)Xfv(M7l zL5xjd{*0C+?kN-ny(#LwYf2-rIw4@{|nC$2J`JTB!L7>fn*HOm>M4uAeMZZ#AL=L!&aR5rauuP~Tt5bm%K zVJQ-U_zLgqtI#SaCK#QW}kJ;&g)35MHtmepuY^eHw17fpl0FqfU*UlX` zJpJD^T9o62SZV|AWSO^uq(5&Ki~+HF@;6os<445J@6{`DMJL5ST2vgo1~r zlW3Y12t8T$wsUulS*K;!I?IZHw%sR_4|X3Wl04Z^ppC~5ZoQ&{CaS?Zulxs&Rf8AU zL&7;BvToQ$2siwtY#xgG(T$Rk)RZ zpP8<=`cpa@5!=rI+i%^)!E>iaO%IKd9~c_Jd-S*?d$1aUd@v#$pvw$~t3##+VS%Ke zcFdB>iv47T`_>AU)-jf#=E`-JBXYmJg5HoH!FLv6Ut5`c1{3s5(7r!&cf_K(($Ko>#vTDoTJC6 zI0WsRdrVxrwzvA;x^6;d=-kmiH}27kwLKL0w|GPEJ5+hXe}ewx(>-1jg_@V5G%W~F z1B#~{WgB?u!@WBU0@Cq2=H}hXXHVYK6HV%RF*Jxy(gCJ4^$;NJZYz#;h(|3R`mfpk z$y)5_QxaQKH?5}l$wD4;OD#HzgRP;CoTU-<270-&gU%^1ez(V*O{|A??Pz2;-=<{P z{q;#~8VfQ*yHt0LbMr7|{9fdCH^;*}8t?BrE@Wt5?>lBh(zh?VNUt7}hyl&g^c7`p znb-X&(?&QGKf&bv@{p(dU$A5okn<-&8PPfFl}ed_D3YAECG z@G%X5s2||^Has|Me-F*5dvr&wy+IK6#}1eK|Hsl-$3^u$?=K~+(kmb>wFpQ{NvAYO zcMH79r8}fMq(eYLx?8%tJA|dXyT8}Z@At>XJ+B+*o|rT9%yVYYj-NfgN5qu(42E^* zn7iN={g*QMT8pBln67JdCIcuJc>o@E7mTx9mO8+VNzNt(Bx+NU>mmCA@9_p;?Q%^kdU@sycb#F z_H(%q4%oLtZoius4v3Ny!uK5jL9GNsd@oP1DAU=ZVxlSoNH@@6fBJCUxezqn@zdB7 zVM;^@qgeHCrvK(^q~%4wIIW^?3V++zmL9!B#eoUNpcsVO^f&$YhhlFz=47&w0yUDB zyPQ8{+^g-go;8=rzN=0D`5AKiLXB=#G~L)Ma#Goa64&J4(U=*~SkenDO1_F|Fv5GM z6zOW$73OaqU9O3xcHBeG6Kfxrl(Ebb!#Gc%OKqg`r#1p1r>ASV#Ka3FCLVRiwOE*D zg9N0)lD51dira>R!dP5&J}!dp>MI-LWBXjT^Es&|CLfKWU~Odp=__QmZ@4^GHe55F~AXMg(+4)n)vUr5H*d zN{R3N@vDy#9l*+nD)*ivO0CDsj<|ZN+_=;p#MI%R_NZvFh0LGWn5(T+4NfA#q4vS} zZcq`xB_or)mRNM1ELTx149UPSNba`^LFoDid5A*}2aYOm@}L>XLNIw!nO#>QLZ#Or z+dB=v4M{(j4vo&(FSwHjy|~*XQm~9qiQ`YcpQ9T&2~VH@`?$7A1@_%ouMCKOlD^J# zu$Vd|lWEwL^t)-T4DbN51CSHSxIRg)U+{QwK!=>U3ac^t9+x z2=ZBh!Jx6uY(C_yxT zk2>SNEKp>ssK=H*7-@(&1PyGXe`+r#im6aLRK+kSQtPYwd_}FAlTQIE6rQTqRL#ZI zjg|9lI?(r}eP`2+uxbTc8?r)7e~6~Me0l?gmQuven4CJ!_ z#XRSeWYGn~xoJ_kGk+zqt6}(pW14cflVk2}RTU={c#>gym>s;=2AzTqXi-#{P`;73 z?kSyLJ(mX4d|1|&NZdXOo`oRD=#2Q*HhB0IRcM?Le!OOF^zRYia#=M>g0ehbjxd!B z(KIl;{CpP~smLE&AxhoGlzk*L=x)ihFpQc095cl@Vo*L(pzLK;K=DeJALtGrel3Sy zePU@Qo@A>>@1}H@yN&=kPW#s7JV#_qsFiWLy1#rssU_$R)NF|bZMOS#mM-J};QZxb z64{%_y*(V`lkm#a^v5jm1jqryCQ+c{K+e`e9-nn~&ObYV8Wj^tEZD0~j^A=2k9H4-l z4E0tl1-YVMMU@D~fAJ7})>BngHJ#dh^Ivt6kGN?-_=#+;(=_Wtma3hs{2i+*9#13Z zuj5kzG)|H@q0@9PoRXrVeg+^a?0}oz+ zj(m?hYefQ|GwzWC10mB2*BNT|Bqe}P5ykURVXJaw0Dt`?LGj3bYMKQU5xiV~gvwwa z0gFC-XSh^Lg{IBuwj|d`Jg4X4_Xr(hFMtK*?v?O3FoZFj0*HeRL3C1SW#g8s)*M+l zkc*;{a4m-B!lZ}ZHUqE5lXWOM->D_m*GKq+X%B_VpzfN68a2Fr0?^GhHeLg$Ia4N= z@p1Y>_^a`4rt%E4oqqa%MLF(dz!_ne%Ue_Q3_vyD!R9mxdlzB(Bg~21q*C<74W{>2 zvUIEyvFrc4Nx9Z1vp<6dRTn#q<2*lPRqgEV&WqOXkcRuy_ugz{uuwTTZYgyR5ezdI zf6x=C&z8m0IRY+BMWSe1@w_$3d82eZ@;zpCh2mLErh*6iT>TX#{TC%G%z#JLwR=;~ zstFX)q;yCbI;#J_lcj*>u{=%re8)lclb;tm9E+qLFfi7+)wvV#FoHMmTI-6g6Aj)^ zlf=ozVB7=`iClC7J3>!o_4~Lom{Y=G5x zW!Zijtbx<(dst=Qy+Kt!4opAH4y#yA#R)M2%qypbZoH^(ssT^4HIm)0?~Xi)8yiXm z=84{v)ErVO=>RA?$ErnWKu)W9ldiPA4$igqvJS>>tS-eto!YB?MqRn0GOwue9wpK$ zK<)qhIsRT!8hAg3vg*7|lR7+GjQPXGWi`#S-tSgvQ+sl)yYN(0?gZ4g4c(y3ZxaPG z^F){8ghmeZ1UD+Rx`N!FUe1><08IXNhNY{rWZhiF2Vv_@XD&y|aptNK z`hcC;I*64Yt5jU{?(5(cdjU65;FRRw76a8~aBthN-^p?{B*dWzPcVU{HFIWDpE zKhP?vE7e_s`;nezJo`KU`^4|gg6yk{0u3OH`o^Jkrt1Afu}Wr|XHYC7oG(sn3?uSN zFK@*eZmp#wu?d>m)y_32-)B=xQ(YyxDMiyde=MEaH7%;T`#>lF>kvB@jJ}^c5CS5X zfyU2HUbezQKMLkj>{?FCw6E9v3f&&WqXf}%@tWBhI>`3^#d-{Qm+ zE5zA8Lz(4RIR7C?Ds*nKLF19VB30Fv(>NFx(I$AsaydZ8WKM>l>K=m7Z*o{)7Lz^& zRU65*h9u0ahksnlS&~VtyG8u<5de`D9?RD%T|Z%4kZ@mT3YpM}eV4rGTW^nyZi>MV zpDljr<;YPad#xYZd8Vx!>hhAfsiw+UE56#dM>e6blpCSh|xLOP_JZb<^3!zllhR{^hcLSwJy&&Gi|v(GVe z^B#_sS$LgI&8MyZIRy>gMpXWBWxR8`-@=4kMANu-mfAH__+&8qaBk?{J@zy7;qoO4 zVn?s(em=G%a3+;GEol!{(K9s~Fwq0OC>{@l(jhCLXHEcX?2Izn@v#q521p`8Nd9%GsL+tmvr(H{pC8=5{GUqfC(dx3CCwbPaogDX2^?)oI``{z=5S0?=S z0DT#>)6~2G>pmQ41U(Il)}a4u>j8rra>)3k3^)Oc-lF!rCB9jyQ^681Eo$m51lgbv z1W*4ey=zp3fp|K~K$AOok+p9*Djopp`~pt{{0D*#gWzGeuFKNbjg+IR9w6 z>Y5d2JnSZy|_xY;uQknUrG^C9L;83Z7yZb>6+5Jyvk=D^bq!} z>+lxAcwG5R=~E(h@C~4vW2H&CTGCTIwWkD7+@lIU{geUNSU_R4hQJ7O$fy@x{O5glD&gh}-E+*kp4r;tTILE=CiATC-l#&Zk*xfk?=p0LQ7Q zlwPm5>AexU+>wM$E{ir^@n-Dt_8F9U@0teYwaIBNLl1MZ@FulJwRGLe3e}Q%I6%v} zgcm>CBXqqHWvnj1A1hzdD~OHz=F!(Y#g*KiUvg^kewvAZT;ry4#Vj9&9P#H9_lD=b zOr@0LuscKMsnaquF7Tu(y+hnL=n)Pyh!@WY{;m#q7|7NA5+^V(`33x|{MDd1Wq?1fy4y-D*Fd30hj`hc@wYSl-!tG*44)PY_$SV-U=sxJQu-K5s{KkARg}AyP0NpkD)b9*P;BY7U8t^b{7JyJDPU- z@8d(3T4-&$)mN>0^2N1rEmz}1f|+OO@;P^7qs%QokeOFTS)7R*y{o-r$U2Ahi_r1E zEKRfF%DCF`#abmYzcWW?3{eSE-xARgres7GlaYuYk*SQ^im%IEbg9aH z4{G?+#NcolsQf^Goh3pDq4&foZ=U&(RP(!sLV)(}F4a#HI*GV16}U=AR!b?Y-@>t4 zPiZdf8K)@l7L_wG?VVZR`h+iD*9}`UIYGO8>N#=b!q0Mg2F!^}A#TvyZCaI6UJ|Ad zP45tN85(Vgx)l~>UHd$*K`+0cu2FUYFH5&90gKMGrWCO zk6UUFej%#__3x!$(!yL$&hA}5z4LD{6v6}_k!+e+B_?DL)QhbjIpnaHWZ~66VrvKH z!a8hs)8vHr?~jq)Q7^rhrJEnq?#Zguq~gMb`Q#~uW&G6&SXXjAk6MYUnl5Rm_IYua zQC?IBBp5L5QjI=WuHwEfepVv?6@zMCdhe>~U%uk!Do^bh)~Qw^jA)C&aR)4@c*2(6 z9^Ld&5?vF3y7Gx6u)(}QvfB4$c%i;RyCgBCRby(Rk*3uE7Fga&X!J+Y^3~)U+1#Fw z;j0UTJ3z3gb3exKoc|dL%nstwlg_t6N&0BWmA1HFp+O$p^WPzXg{Gmi7=B z%U}0+2ZWmjmeg@~Z~T@FM-Y`?b^&u%Y53_UsG&|2H%9{7B>9WcG3KjV8=C3~bKe5| zib{Gii~u49D~xF_g3RUpH?P)@E=n~>j2aK2jXzpM@-`L~PX@SH%Sf;G(;PhJI5JnU zSY>j>Z;hR-i;`{v$$p|&j`yz6CT?9Yquu#^?~U2Yj7R;-I7zv0>AE2=F;WFV#nYW2 ztMB~UhBuO`TheNf|0T-)uA{AmoovKE*(~latr{immmQH|xy{`3a#~FKKfM1ANgkWh zO=LqJ)Q}l%)xyh5KN0ES*```^bW^NPj&miRG-1@~%bu2CzoNIku!-AQc&V$D4F*`lYYSVn_Ca($XT!d{p#G9g1tntxv-PKGRU=qZt~T+w@1+UdU(9{(PQ0M z+yG_d28}fexVcz(D5~Zkl@jlJ?{C*U=C=jG$yW~@i54)m61s8h%q5~sQazfMsj$@} zCRN2zFWfj@af*I%kJV9_c6I{IOjHu)_s-?LB+JuEEH=W9)O_qLJW7k(zz zzXWG9sOv}bVt}_lOj?q%SQ9NHA8!jf%1F@=?haB2pYbcjwR5LKIF`hMgW=+-N=Dhg z;z4E$h$1f0?g!OEpp|~a&O{{<_a(&6FL}t^^4dblo&gpf6F@M80nm0>hyFb|HTy!( zN{P@1{2LU1`$=^?@T>K@%lnp4rN=-q(>JGY@P^qc&7l;^-Y#bZiyAiB4p0hqbB=DO z-UD`U%7l=yvQAC}GnMP*TUCZ zs-c=3kq;r=1~Bx_<}{IA`b2$cqu3)Nx1gLOKg`g6-Y~tt6v!2W1%aB$KfZ5f4TnD& zAsD{cBc`u1zK0tIIs}56gPEyGl;uxNnW&M6zpV;ElF;7&JK?bkbFJrQL!O2f>Dv?J7H-?+b#Atz zPJ)hPL57U4!-0qh^U%5gf~${)WP>wP2SX7!bA+bd?gUYU zIBp;QiLm|Y&uXx`ecPPMtntFY)4Qwuqy zQhgJL(EJf}5<3%sa)AchRE@(ZTP7V*morcMa{8(WtUf};oih_q_GOx^F9Fm%rviEA zkA}BYrk)=2iQJRU1mw~q!k1O#cD=;*9{MKLioqH5i0Mnk;CV!9Bv(<8o&v_&FufmF ze$c599)*`QhGDQ+hNftN$>tm~9Age!VuY4^(E=@>ZE45BVs|d7ypW=MXXx)_ngyEf z7karr8D~Ebn(06%4jcgl+Yq>CY0!A3`1ch&UzbfvKL>;kk6lWU2}F_mH6Vc%J~q5x zTkJOZKd;gM*nDr0;kti9U|Wcd){QsgiTsYa9C~=@eF+j4a)(1o)6>}X6jCO2AmSgd zO;cRGzjJP4NTF;&N#0mTF2C3JV%8~O^bq|4G<_Jr?Vho9C9?CFJi~*QX_z1U{VAmu z80y1F%_AiBd8+6?p%=X$xr5W^WkqA#f`lF-b4kvlH5Ok2A_nq;T*`F+R>p zEH}F)no~5LUmx~T_b!bUM8RQdWz#W6u7-&M6a{q06Z%UK&>6DOx=?~7Z1{Xd2u$+# zk9pVQEEAA2kgvBn#9-E9YR|+wEJV&si!n`J8~C`Ca{j!NEe@J80ZoO-?eu6NrhA2> z@ki6ekU&U-KSH}3+Y7<};#4we$g(8ik__QP76EcSI!FO@s`n>3rZGOod&Ed&O9{~< z$J^BV`|;0trE7_LCLj$`Aw_e&icIUSU7$`Ljn6pSwS*b0CCTBl zgpbtM5<^M<*}h#1OSFj9`xDVJ!9FxkjGlLHgb{^y z0V>$FYUIRe(VgK|QB8Oeuk?gs*}n2tk$@b1@;AylozS}OQd zpgQ?<*uFDB9UlVfLk$PJeW81m&vs@4qJ5b|AN_}8a2mHPgasL$68FHlesp-Jb=Xq- zXME;&^@*#g)M*?%iHj;{sVs?thd!vmwZYt_Hj4079ux7#(1(4r<5mF74il8FztJP@ z(5=Ti?cdt14gzL4`WX)2h#K$gV5YKHH_nWkD6n0s+Y|Ztx7_kQDmOryrbmF0)CC+a zXZ+1tIj0Gb@j|wp!R_=C_}>(5(M}kjv$*0^t8gc;_nUc$!0WbIQ-$6`^9MlkQ-f|( zuMyMBXRuEL5P#++0J>#KI_hk-JyUtUmy331GsoQV2a?i#71C?Zs{RP1FJ-qjHAOlt#{E%k}u zTsJJ7#mWftJxIlV|7@*v^RN+Ws)5`WY@-)f|jdM%H~I?54F+ICv_bkmY#G>D^JC%1<01J&H$m=1Qr_rB zKJYZFo(1`Tz0PuL32EcRg%{|Gm=Au1zX#r#@)exl7`(O#MT~h&qA?k&8BHv`Sp!-v zwWd>_I#YKsAE`ibXvF!BEG_CyJ6bFuf&|b9%S&SYR)`XBx6@o(LSqOw$OV_228h+$ z)Mq9dooSrhLK7l!Q%2egE)gMx2qLBsmLfnNU;6%L_USyE#_i-9-Z6o$A+q56-aOC* z1c5pp4sbhp5JdiH%FJWG=a!hoReJY=&6I?g_0E?oKk-z@7yeU8=JvCYWTu)7_bIi= zeTi1*W*izUqJ*X?w@gzxIYwE=*F~Dqa6n4OvzE#GNUCjXvjGC#TEOjKEyA6_2$mio zA!1~$+@hvQ5q)zZ=jr(4_}d*M>aI3Grs3NXw-drU)b^#XGAwD}m1;|H%1FRvxFs0K zm79VQ(H1)O_9+7<&qy&l{G+iZg~majox)3vac#uZ??)+9q2=sbT1wbh5%db6ABnsR!-w62#x^3_W^iMk zRT$SYt5#OY@FAkNxcVQx9m__9=BQOOH3Z)Z$$EEDsj&=oGYj)`_5zApgk|MULM1>u zVb^lRCYNDmnV8S^VA&qv`ehbw4G3umZL|y!Q~XKd%8E$;cwDd3IgyS?w|D69t~Eu& zLq@y^cP-ExQTUw|5mI3rR@<)cl}=*vBmxgLx1jjzNa>g}>ip3qP+9PvX5Oo|M&8u& zR7K)-&8<}I4#HBXiD0dEyq9i>SweJ>tJ+=Vrtm2JK?Y(FA~z{tv18zs(A+@Q%=wTE zM?eWnpB-%wPgJQs+eM$ztqHLEKxrM+x2;3Ade|wl~qgZmQ!ST6OG-4 zK3^0;Cp(RA+r;MljMgD8X<*zsle7DQzVz2Uw77NQT)l|UPKx_8BmSFDLG!sabWY^O z^s3NWy^vw<3O%cjT$R@*)+z_$fKqj!P^WG=D|6xcXu{8>#|)Tkp6*q3#aBuLYoVI7 z8?RV5#UNeT$Sz}3b(Mc9OI}0jCBVmrX1Qm}(EkJ=ax9HY9EAKMM~Q?_UlHN+YBKYk zY)h%{n}|WK!Avv}5jb#?#`y8Gh#$|9=j;_S;5Z{>?yw}>`-aUO@LQW7H~vYu&y*9G znzFY+6W-E7O(=Xa`%$rz)j!c^G_=N=lbE2*?>00iU06L5r$-|GmX#i4aa*oTb8F9? zb0b6<0=kSbo)hZLf+C2x;eG%;;dD~h`*fylv@3%lx+M0Fb(rc}|5_%f2UTw&! zX8JtzqM?-%=#Sl5PM+ojT1B2xzVE54_i3;HsM8A4jm>tK4HV%!iE&W>^eiw)3{@?4 zpWskYv{@fiTN(%kWc6dQD({_QO}ChSvGe&aF29s(?}9#{lkPgBCycn?|8tUPfnlLI}#@*(-n-kn5w5K-BFjZ`t?MzdvjP|j|vs@!6u5q7XJ*O|#qqF8ye+gQ6HDnx9MEaK#zCl>FwKHz} zH$q2DW4>3QwI%ZEKd&^-PCh2?1Z7mgZ&d0Zpbo!ZSu9O$ysP$Vwb}5uUhchFoSzJ; zv4rd!ZaO#-vo9|6<){xVU!QFq)kTjTtLAO8*w0Xk6zHZY2Bh#NCIWj) z$x%J|hO8L!F`ra>f60J%UcNruPVXQDKL_1R=LPsYPF$bqoIA*qg36`@1nyLp`q*!2 z{~e*ibt{tL{0VT4y5tIns;Y01c~`Rcw+s2_(i$2}jQx3j(x!)|rEUa22WOpb3QOF| zrO9%mcUtXt-?j_Z(*G>3ymk)*=AxXbT9Z@*uaxbDM(C5DP z9cA9fL@nlJ9lZb3QnM|&(_apVFn6e!3-oGrpMG5xC>uhh_pz3 zD)ZMM^dNN1UZGB%=op-z@31-53FWH}@+H7~akzp`9FZRGD{Ei}!#+!HxbvcwsKpTq z_ydol@35%N@qbz=s6D*-T{2Ur(S@?l?F1^oJKVSAQAVl-R~3(Wf32M;U(#qw#IPCB zve|I5bRs@@=N4$Qkz?t`ZMm+so{nj;(Pw$Y>CD=k2HaDkBG`X(v3qOapZ2nqH~=mr+8J`Kgq;sT0%Q&o!82-p~X1 zF#E!2>e#gNY+rwIEv6m}dSH-#a0GXZ!Cav$j&rVyUDE~{kz4lwUdOJ9+9nuxWOb<7 zeJo8dpQ?B|1|;%5AERtvXb6cp|B+26tjQ#IAI zEbtC~f|N{3GL?W8d(Ui7_YOX*m>RkYK(%D5qVTWnafx%xMP~ z-fTnn>xCwes;%^KU#W9%2e;Wv2HZ79#qF&j9U`lGO=31F527s$|7ZOw2$EV{=R@qfzk}gHG;~g32D8Nv>^SF9)@>l)1X#HzbFmL!+a&k5rR*31OeC2a<2)~e_U4LorB}mkH+GzL}$L-t)1P!d@4~N z$p}5=AHqLxQ0%4O5GYaA^C3}&ul%asJnvj$JGpDaUM6Lh(XSQ9f0Qsz&^~gN1$0r_ zW?y(OgW_G)Wn7ix6N>YPidGOdsBC8%oP}zoZKj(g`u%{=`b|D3pvS<5P)J^1>bCz9 zx@Kr9J&bIP5&h0XVE+NO9q9Z)@g{74(d=??WrP6NQi8yrY^vq?DscH=Mc(;qtNc;+ zX_3fEwwYLxi+#K1Wzl+H22RVI6eu0A=)@YP!$IkQ9rx$mUFeGoyIy1BiaJ7m>wE7R z%Fb@5&mUTv6{T|1lxclwJE#tpo%pIUYNJ{f+vfIu=QaN}Z~c{aef*iTnU%n9DymJ= zW0g|ETaL?mL7W7^YQz13n{?A_PS3<+6-lG9&tV_=v~K(2K0JAhi^=HZA^c;b!s^{B z`i1IQfwfZ0luGGfjeyEj6V}$H&2rCTjX?Zwjt!$F;5YTJYo&7ux%AZM8zXBia%pR| zsV3&F%j3{+@NvJTee#PmiN2xHF-`7{J8y1d4-=p(>c#!OC@q0c%HUcZdq`af{G=&0 zO&a#N!1dT%?H2L$1zw1`gX*O`X_uzua89-S>R?ZAQUB`43MbP-Um>Jj-ThC!NH%Fz z@+s?3xgdgdu-+u^MR{%_o`6|FFVUy-)kk%*yUcrr|AMvqBD~6-Y#;PBZ?2o-N9a$K zN#kPg4C8U2wIGp6Pzsj?s;!mnNe%evupPEM5 zrhWS;KK3b&d5X#h%i+VndFsmi5EFT#nI+f2%+n~G}k5jZY z_I33m@9Ar$HU~Quz#RLg-e22Do`|cY07CXXOaFap{Bvbu2rWrR*q7ay@YjxAyj@NT8G5ZvmF&liIT<>*PY=#ELJIoFofh=X%;C!JwIr8RW2`yhEp{47sZ;`j&(H9Jpj zz~{s z+i?h$m*+5^T>ID(^iZ}zga{wjkl0mtPxHXkq%cvJ<^YcSlRnkG4H&D_SA`b;t6ZCY zmlu#cs>C}}r|b3MGqGLEPaU~3d=X}|`Ky)TD{Hvpjr&;{{d@nRbgj;>KE^*&Zn(=I#pXPV?0S zHsVDzsA0`lZ;}cqkT`H9rhRBkgn!T$+BF%q%|Ji{AsbXap6?-w?9_TH?_|zBb0OGI zhiTe1Q7q7eWm_ov19%DspjR||mS*U2zKu_N=lnNomZSNriBYf9zL%pD#UH>e(!24N zF*Z8FW7BDRZ*5kQBys{5;sXSn9rae|ZRh|TVwPo8?L1CA6z3Th6H=gN#vw44)c8m^ znE#}(m-9Q;f5*VdUf)>P3fc}DoRDq?B;>(DZ(MsUR#w3)7m2u|cf1r&>v;hfRd4{& z!g^bbZ7L(uG5$hKanmBy6^E{uO;^8Yjc}brPbnS4Rj}8MVgLDTdA0U~ZOl~Y=D|_Q zJqFw2Seu>#tqnG?s5{LafaIUHABd3z?I~@J>I~*hRyF5pijg|!=^gGBFW|oh;h_O3_+vSa z{Yki0vBmJW;OPK;v~rIiZtwz3ZXbuSv0fQ)q`j4UK_ke&P2=S zUCg)itc5|bC93)rVDNdlGmKUD{_S;m9JjuIdq*RCWiJnIzkn-m9@yl(bV|Dj4jV6- zyQE|nT3xBvcD@uhn>Ji=S{Jts;ypic&DY%*>-d)c&B}lNS3t~#%~qNsO;`rru`-^=O#UsLPt5nI6i=x=0rx)G^Rn(KmGTI# z{2T$*&mE?d55QT`N3*6s&MQS)g_s|ATrPP02cuosBmdYeefpf7&(2K)IzUeA-TQHC z$q^70jkn9@b+MmfqlfX%i`KI6L>@7{s|egej)a^gQ~s1mA#8v25{EqA6OJ~vB6a!? z1ep1W%zciJbDxr6i>vWR=TtRxtAZeiOi>Q}(7yL=f6jPz!>U6{D;>|wgrzVaQ_R1 zqp32$Z}s)NhgEo|nKTFa6u#3lKi_GyCzkefg~wI9@<6|Kjrd4I5^9D@8CUd_@a&9h zIsfUf$*q;Vln=1kkEpZpW^uL$kH5Ioa;e2i*Jr-lxZO`~kuSqkt0f)Rcjy1Pa-N~q zWDCn4Za|4T@;?_=l|%mVs|0N)X4}c_#jc2!>=BMD0nWL-n+YGo|6`dJjeW(C~X@gSFH* z3$c36q$UBwBKWTY?8fJnE8?zHSYk5wnztXZzNEjqxAvSJ~;6H z0xDV4WEl(zD1MGaLzJ2W{}0IDO%?MSzFj(TKls88$rn~BECTM_m327}6g6|nBq zCSFHZWw(k4)V-$JRECTv#$mGZa^H9Yqs@LDo4r0*R5sFy(-`A5E5Ri!WMNj+V1>lt z?K%Q57Gk!KipXXI2;9+NWL3$EceOzFqqMZu>(f`g?|#G3^8Fu=l7qSZc%CT`;k!jt z#CDVf??E_-&Czo>iTt^FE@1yAKn(ayPijA4kEwC-=Wdh&(TCEM*B@NYGxmtFSnG-Z z4RX7O@NMViuIq?A{|A>ywH`vOgQ%tM8Zvl1s6R()6lf0{rUoqri;b?50wSL`NyNDY zJ4Hpr1UUDtWLbMHt~hJg!C*+4mRNg08}pB{Z<(WYA8o{2G|y8bolBe&iau`{2)?6a zL$ZVWQ)FhEXWtke84A8rQnWETqymTscb18vk6+LTBLSLHZcz^qZ$N14jT`xoS@C}y zgyGeovEYB+`JFFl7E+?w>){lA>dCh^RF_T7oDyBdB3o)6cH1rn)hU7gT=ELO-ZDf5VjM;*e~N{kBt z&#PrLF5k#4MI(UF=k|r1v}7=RCyfR+IIV(!r;d{UDQ-vRm#>R?ri{hhA)%vA;JC0u zWGOii69VmSO;eFW!q*Ca0jk(1L3!V%4dMcI^Tn+&jTa#6W#}6+T34c+wOPqPX1&#b zU{b(S5K;PQAm@?NhG9tx=uym8TW)&5K|T+F(t0)}z?tqb&+BY~l5+H)z!uhFNZ8q3 zE1s*C_a{%VFEf zj#-2B-l=df*M|Cl-P9Da%L$e*t#2DQ;PXkp`Gf!?IQro>H`L5)LYCg*6cD8gLYOxN zt?2KgjS0$0lJ8S-XHfj(Fmw*PdB(b|w9_9IznV@H`XZ2%kH{}On9{B1Gs=E=rI46= z|8D{8<^ty~OWn`bj{a>VR$2Mex=GmTg)KvNM6Qy9%{s89wR!$6U#u8QnRKamWK3T&@fJKq{*7kq{>4JKe3yt=bdk3HoA@r}cyNRJL@zJGH1i{DdwI}LhUx-uaXVaa~6o`Gtc(riOZ zs^VpJ=N^kI>E088UtcArG1ru!l5r?~v*1ee86V^^wy}=5^k)Mfa7@%X@Xov0q z1Dn=%3TF&z2ADoFb%h~jan*ni!=s+A&s>nAe&$XhHgv9j!Zu={c?Tzsxqh!G9G|x8 z^pDY+)4yv4ZKtLd=V;!zG2^glZN+NDo{C+JDxGuxWI+Ig#&*m#TQk&K}=Pv_RWgQorX;S*iIVWgD(_DBh=KYdd7 zl^8#HjkyYH0&n!b)eCNNSihmeRyt@MxAEDx%;i%$yPdgN)WbCuQ|ksyt3J4SM$oH&F{`UN0`MH>%XpPIFHz{M>!N z272vQ-C6;(T!cWLcpyr(tj=71^Zj;KdSo;70_1O^3pj)O5wO7>TV=-6s^kE-8<|hiG?Dg33`Fkn zo~h%fHQE(_6%Vk-JN+dC{TQQT)G`!Uvpi04_|{B6E~pw9_4@#!0tkWbNdJfTN4(4* z_y_}b>){Lba)Q((a_9N=iH~dDSDV@m6QDm@1JWBOgs8Fs(H(dKS>~4#`5xx4_C^ix z)TBQMASjM8l66X?5AMN0c<>#3TOWPF`uR+177`);+s2-g)tw#ue6OrbZN5w?ol)Q< z?^B2HXDrFUX&1>y>)L=c%Y@bC7~j=`lWIZci6DUGwUX=$Rlq0Fl!JLn`d)C5Q#ggR z!$1xo*GfOwW-xNOG0Ivx7C7oj4SQMUZk!UJM+{=L^E#odxUFd`;d7L zInI|!U7c{gs|rBbT#P<^`tKFW)$?UJ`PsAMVxPOuXH9g0(bikzmCWaLHmgHJ7jPy2m~?!1JKRV$epmtZX1B+pL&?v~8mtm^34uKVSqgG?CTT%X@<`jqh5 z@}|O(wI6kz6l#9gRl@O(1zM7KQPSnbJHC{uHPC2)9$)%kBRkKGVx!>GNPe?xL8U3n zY*tU#L?+IpppHEEF*{-(%v-{0-I3c@@OwRRqI9$Hv4jA+p+`!FyQ;KX+8dOnv^QI^ z(Ic6K?{-DL0xpY~u`Ar@KeU234kEMr=9~fdrLsy|3!>+s9=uElpIoa3Zo#ct0T5d4tx(9FYQuLb+RqmoGa0^Z7|~&XBxZPeIFGMnY71?d z@MHEsTw_2nmz250R^eYE6~#q zwVfisY;+}e?HO`BRCtF`TcNJv929QB-kH}ipT%kXr`GNrhfv?3q41)uFymv7t_XX+ zHe=h6+X6bJ6t3&LM7>}*W8!Z{oi#8;{6!7&TCdAUH2AEOIhOn<9(KyreSngH z?k?PhVZXq2|5hH=UvFCP_^&P6iVz3Ip0+^X6uWFcVUySEoo?H^xAKob$;Eg*az@E- zbamvd+F-0A@QIJ5!W%+r=3-Y1H1<|wW|t0^!>!{-d5=bU32$+aM(fqHl9?lA`*&S? z@0pWsT8_4=2s8TjU|xmWfT>Ee3W4uxiY(u+_;Em$n|oS= zBQ1IJt{JEOmP0c~K%B{u{m^@-fFJq4WPn&wMI@Elg*KXlm4-NL#APS>0q&~^a4$EU zwVt2d^1KO0=6v~G2%hLGR05Z%r6AH_f6Yihq>%7$4DfY-vP#S zpdcVFsgU_F0BSl^0}o2}#6z*kKM7FK`Z7`f+Wgc=wx!%5;8EKIZe;!#2y(Fq8~4}? z--d}u9n!0MU!Z~c2B@caMd*^f7yX}eE>jxfI12b#30U-v({{ojCjy(!vLzJBRn zQ7|ZIl~UII(*KeGFDa%HyH-ZXY$4XYVK|YipD( z+a~+YtXU4A6Hz?e$e>Xf79@d_I)wm^*RJm`y|Dw6$E);x7nB)7mv{SNJ;p54DJQ^F z*jH@~PfLT!o&xxSbHGQBv*tS+saqk~RM( z9F~-jc7Z}stLUrf*o5KaW~on3bl=haqjQ{DBr|reRUz^$=p5KuLBC#g9zVGdqm6L_ zhbyMJ{&?w1i#} zYUe>5aN+-vbdBM8d`~;hFKlevc4OOUoW^!zH)zo0iEZ1BZQC{*oA37je#n(;cb`3b z&Ys!fJu`yczc)rtassceDIf#X>~Gma;=vm8KY6jALe&IZ!K33agY#f0$5YRhLQh|5 z=(SJ;71*}F)d#Ws%*7jhctuMS34#ddZalrmSLE zt`gQe+0P4TMaYXum07|pDy7jsyhz=@XN3O z|2FayPe%}zx0p$NwoM&e6Gk>Iv#h#V>ykh{WaE3TAZ}|;qyrr$?v+Mcu9e1iJ3Jqy zVuywrIZ6-m9b*TM&4JC5c{A_)1l9;K&-jP1kl=VdnD)H1ni;bzYEeEMDTDlXBk&#e zWbjLDg#U(`8`Dqrqq~CVa>3jzxz+Z#o(inE<6l(Tl7wWZhYN!{S!FeaP9#FxC}^tF zK+YgK%Ie&gGC0Gwl|}-dab;Gw8IiV@q=P<04~Gh>3@+fz!(1OCp@}<-NU|UK(b)IZ zMpt$knHrlF|K?nnjMbe`_}WE8?mJls^7v@DYJB?=oUgPw`=H(vlBJttN3o#>PsHre z6Xj|}d_x>Cab%2uCTloS zo8X?yREd-)))(J2bSa#6_0@qKTgJR{$(mn+I6Y*1bOYOk4+fHoi&B(Fg*etouD%hu zi^9YWu}(Fjf;!|~#j(^E7A4SgiLbbAuM)W92hu}4v{P=sXeY{iPr)-pSobksaUogv zAzyI`#tQ-Kzr8-Yr)PZ|C+>m!L9;S~l=@(0;YZ^!&TOqWqUX~`nGUX4=;P8tG~i8a zcJSB#>o5o!los=)C~60&<2)81vhmGt_GJ9d-Abciw|TMWR7c3XGyNOnNX_+Mh%m&W zg}RlQwxUU~iH*)t#oUODmRa{rU~vN4ZjEv~4j}*)lNuJs5u1=Kvq+D{jo1>Af&E`& z0-jUhzG%`G!#ds{6oa5!WDcItb3XB53#W4&=l8(S2+~(%l~KDP&=(@h5}X?Wjj;!7 zQH6RukTtqBuc{P+m}ITY6rtG_{-o33+HfhPaH(G(FW;!L1CJ2PsPM}`W3anq?UG>j zHS>{rS2u%+^rfX3ba1^?Jpyu!IkwM?<=;j%WDNuF#ciA$d;NV4{r#aCH$-jM5@mkqs0Ms{Bmp_F&7VY=(ZEZ&DLj+YXH#th{_kuyiPZ2hQ`+1Zqf-#-zk8f^w zVqdtH7amyZ5QqCXgW+K7^SAncZvbT3r0Y~eDE7b(EjI)rb_w)TbdMyZt|zA5osY#4 zlSDqmai$aFT+G3_G1h+VG#-}m{8N1@sI8(Rct%7hwn=U>?2XI?S|RhFU<(v$Xlj?L zN}uEtf35U39WFUHV0!VRU}xg(-z!kZY` zSv@?kIEKs#)=VDeg!r6F@#FJ+H`3`$q%k#^1jhmXgis1l;A!7E&J8TCSf^78IQJ|RKlmGi&FcXR zq@&ajK9D6Qu?MExbZU0 zOA7T3)1paVagSWAejxw_ihzX~q-B+5;c4o*JD!5o=nsL!W|2B86Zi~bUlfNxxM&pI zWjGYshN-OyHT=L;Lc|x5>bVcbO#QLG69O@}n5~J%<{=kE&v}n%(zT&AR#PGLgun^d zh2Zj`*(f2&M2-5!4&~Ol&c8EZ zm?hjs%S|b9M>*X_zpVc-w_GZ@;OorF)z5#)+{Po0bFUxtZnSCF*@U;b#&dKh%+=o` zL_3kG4*cGsGBBZ(A-m*J{Fan&5d_}7;T{~YS{7GeuE4S#zQ<}}(h{Bo*XGI1+u^54 zw)ypYH|N7B0l`R>Q+fLq*V*s}eEG>e`%T$eqZFRwl9}|)E` z_q=wvCH|R!wl#YFJ^H#o2vm5^g5+8qR5Y0$B3n#tE_ujPs?7kHWmL)sdi!q)+3&KUJ88|D@@qn+=tBlLcF&*m+8gR@icNWYqYs%zXjF zSN^lZQ2w&6fo7UW!riTU#BNU@3F|brtoFuu4KO^aEpV^=Y6Dn4Xaq_HzZNwMW&@bN z${<4H6O~m`O`_7WvxOyYrMR3}IXFTocpfnR>dPB_dJ!N9Y!A~xvrO9QozR1?wQ`Q~ z8m-Q>E!#q-HK*+r zis8ujuw`x)#44xcvg;bkV6sC?Ds*?SC-txWVlIth@+0c~nf=JM(n0&1L_gzxNx0fG zeeJhvIY;?)YB_)S^XRotx5&&X< zt)Eq^8$d^WYpqEbDfRcoYxS;Sm6rIYhJAA-;DiwwD)Cy|cZZ0cx&QMUC{#Jk+PcZ5 z?EqNP$l~eiX)Cunm)-0bT4UQui+YK#H3*!W`% z=k~>DoS(WtXRT3P?qD(i65s|v0^xr~9x~c2DM`S990WL{--7dZ!=^vqHAhuM1s~l) zkoQ9sShq13f=_9^E}p>RS4T_LUc&&gNH|q%DEo)a zekH-C46bJn>7R!5_U-|B;;xRq$zzZeys55GGOlSm+%zv#LiOg{j%>?^OCdzQTS^*S zjCXZ7kCK%->b5SVG34h9?5+-46=~GCh1Me-ecx*avNONM{+cd2EpJ4xe!!|s^*Ab= z+DH#I0xTDb@jq0YzQ3vl%^Y9+@}J2BW+|U^2am}*_ikMpFwJb~ zIl!9RTpm3CJN_;cw#bQ;wm8y#gsOe{7$VtQ&whHlKiC@033oYpJf3-qGW}k+9z_P3 z#ltlRc#D5a!0;=y0L9>`_+_v>5JK?QyNh6b%xDL)nRdq zcLESr?*D|9+}!!GRk@GUSFa#&ccrX`mtsoxPre>yGUle$Yle{~+ai3R2|`M+izr^xs1U~ZG_S9Xe%P78AvzSpNIc( z-F+{#JzfC*mXcRPCx`2QsK@fh7i*Ws4;bwUIu(KYR=d|Zv&%tu<*fA#E0wrt+)&Z) zJ#ie|r#TaouZ3w7B_teBb%zSkp*rl(mlF3>>xg;7mXlv70Fla21z4Nt2@m9`1>%`4xtiGds< z#0^+`Uw%9W`|$oXRk2>al%s`Lvh^Z<*k;T@B2KLE|^V1b-?Lol@ zsDGi-GiIUBr}yMb{wI3B_-12npr@DEoMHW!Kj}WTMV_4?p>=0b@AZi9vLg-+wFfx= zZdt$IdV4Qs#1`^97PS2Hw7PGH^lBeRamw---9cimP;Y$m>{&eXaomFf22|rjd8OH| zHwM7V6`dnDeOB968f2blopS$ji-DxQ49OvM_}3FAY$#+DVKlIAQi$AUOr+-^scWmB z`8qzaIFcRvsBVtaUnNKo3U}sTus&7pcao$@EDO0pUFw`;CPsM$IoTKYBXvIJOBRlG zQ3Dtp&J!#AD4&kktp+sQ&SxHr#i8AQZPD`6I_Nkh>eKw-B$<%MTU*|u=dWxYWy;$K zq~lWoyYHgJHsoJND;X;3@(i(yfB%d(P3Z**nC63N1tQ`01XI znj)|U7KiO8@0M!cR`GZj1GlpR(|+VD-)#9Ou;Uv!d!E5%I#;!^>ZZJ*?dn?#rrBJ% zGJxEkf?%d7F{}_!cZhtLg@ahZ4;y_^jeZsSwJ1%JoXENp?8s9RQhI{L>ia{*CSlkX zQu5h{X?>y&O!6-s%k`-(kG}m1Tut9)hY1@bZL{36 ze>J9pJ;Z)B;IQP)i|b(g>(kQk4d`QL3;+)|{sWLFkRP6vqzJno6tP&)ZV9Q~C{;}K zDD()4lD@G;!tdw849M4);1y0tKouC`7>d7i(hPNE=FfTe3UYXT+O<@M{i8bn>)CN6 zpJsVfvL#2_$sw+T$Wu5O(vaBQ%7;A|GVK6RKPyu}brevgX)v?k)2bKQg!y+0R`@qk z`+>wz=}0i3?Dd1~gy6TYeC~M@wl*XfLVWH4jSShwmCKKYb>{uMGcS&oW=TrUKa6d7 z?4N-QeX6#-Hiy~K1jKEY*p|FTaGr|xadH2Uz;PVMWuP?FCOVR7);eCaZufT}h;Nh? zIBumeH#XXvYxLD|8Hkw=O|pYlN?I*1gxxH&vZ7^shkuz#?5ebr>V;5Q>g!7~&|8LF zg{I_Txrf?y_|ZTGWR9Cj9tSUmRsco4Pt@i+c$9!6n1bZw)aLJ5;LY?g=vNi+PkRc( zK*4uovqW$u3|yee&bo>j*d)6kc>z(iy`UG+nBY0;$|n*0GBX=hbCP?z_wj${NP2-BKhF&Sb_2Xq$wY!ecyh!9R9hCy{0$gL5&t2lP?o zP@rXXnj?dBd@RjK0=6&?3qRm?ZtA}kwUE{es^mOD>L)CGN1_+r+@GX#2PU%F=uC#T zBm#H5xfZp7cN*E~ow~Lp9eXaKJ7|yrx9d}IzIwJ?V3!Kn=$Z_y+wVh1!F$$7-PgeM zTh|g=f25Zo8wMKEaxU7&&ju|J;2-DcJ<3C%F%~?=}kJC76&H{JGFwV(mCl+izhf6y7ssb)% zlO%iqmnilR*2Ou7WIx)UH@G#g07Sn;%nf*e{44?tY5ROBN&>&(J$RvIFnlyGRPESwMbQ*umTI`c^_( zX{DIAy_gj#Q&mO-1o~4E+FI4xl?>{Isy|BS&RXXC?)63wj#O{o2Xm|}H8fH;y!qVf z@(Bd;^$(O%f;M-EIr4v;IOQ^6RKsT&kI-s@R`b`eQw-4>>n zF1YX|8DSFQ!&b~sW(Ai0C@V>JfB6$J=EV_@)&#A&2V!-sz(~S-{RSGJwTw|~nbg^R z=M!z)5)Bd^YjOlW7~;CZHr@71@o7SnoRQH>sa%O;Tb*+&ViWz5CiYZ1S^nQSbo0HR zu}6s-3Whwi4n@p=PynTF@dDlDVZFsgmil1gZoph?A%|s4e7C}vWdUm4DyrR~S3^o^ z#6JBbl2Kj#>*I*c#J&um5SEqgw(9{by4fweoo?I;!3JX&w@a+f+5X^;_Z9${?v{1r zNah7%*%-9UuSY6fIyRq=)Y<TAbqjs}^YPwFci~rT6jFQ%4On z*FtGV>MH!UA%)O(Y zTM}VLI`ui*`zN>C<1y{?gJ0sV+}s6j|56V`GjW$$cFWLzZSt}+pW)2j*aOzJiuU)= z$<=ofKQ)J`*0_IB7E3R?@1SwXo@S$~NPSkRKc-Whv#oq`Up#`WwTB%VYt`*mk4pFw z%n7IhEd12U`l2!2Qb#|TpZRhH>{r$?kan%bcUPnT2(6@`ukK-$hcm@_*&EN)LNtq> zODNz$hya}exuGGQ5b_PaYLb}wQ$qy|f6kYQxWX*Dqt(}s8Ygyos3l@vOZZ+pVi*@l zm&0OVq=YL?AksMpF`KUt+_PI)@9gT6vXOUspkGzt0BtiMyO6O!hpUf>N> z6ac3N+Tzqs%mxW)E54#Lj22-aYjXugiv;Jzf%suqb44DNU9*GthqtEj%BE^h?hx~^ zSO*>Md%hkzu2zh96tpv?`7~Orf{{_ku}I@7+dp9~&5Xd=&|l9+Rbgpo zS(CR}p)n)89%PAOMIR9Ur8Ngz;~}C1j{8f_E&RMeN~&E5$!1RQK#|BBR@hw}mblPg zGgb?fhi(X*{sl5rUBv@5tj@v8?nYyg9$^GLo!!j}j|NWl%lh|1j|_1g$m!|5Agq~Y zlq?bhkeBKQdkue)X4XF5mwvq1!eu7|D@0Hz02c7+KmYFON-%H_8|_zC9#Tkz`t=zt z2?}kBX2cQ-&vs>56U?)Z96|R_4MVz7x4ptr6yAhuQ=4~#Fj&1QsV&!c!wIY;kkNlo z5I9gNH86@PG=3<>P^9m>Z+aee_|K=6={DJKwEj3-tkl&I<)kJ^ zHtS*R7H^`(VnbnSQGxoUWZ2InCy}#F$#MxX$L0%y9QCV_nSL|;>pZNPtA6T%BR;)r7j9H_)2yG_`%3q|p#pvXn|#WQxI z9lACwfe^+?s&)4jR`^3$tTpIE3CDc%?jR=M+h&&DOg1N&^H)X$y(S#vzELO+<{1Ra zq^wF^yQHc0j4U&f$06ywFCJbBwopb;rz33Yy-?cgWxoTk+WhvtD1(@_?&dn}rj|DN zAw3Ot%F5Q4qA$G0=`ckMRHT;;rk3;#e~AZahthy*WF=5OvVm#?WWz~VNN|z&>14d> zsZ3`kRYO=OnpuplNQZ3s6(S*{?OLR8MCG9akAt9TGt7-$d~PRV;)3gZN1;zxjg`Fk ztSNp6o+1Iy$jJ`w(EgmKP*;r9@289Mdo%)L4E|peDu^@Dstw)wxBJD&pPm|f71pd~ zkn;Cp8SyZ)2VmZi+p=2_Tq0lXKyClYV5B5IdI!LVE^;F-S1p+w`gkI+w=7pPlPx4$9lOsjBG>?+nbwlx~4HK z&utDd$W(|b!&M8>Fb$(5lO;YUtEH;M>~unEFsI_A#G>k~u)g(YDa6_8o`h|6dv(IUunwq<$QqxewHk z7MxDcl-`KeK@iZ>ITB7f5q`Yrv$hlN^0oi)t&qpkI(V--sYl*mk*6ol`?f@!g9mAZ zWi<|7?<~e@i6xN_J#IZ|nPR0f@1E>@0#OgLnzU42tdQ2J@E5FSY2wY_QI8}$IfluW z!**-5^cc*Oc1w01UiWlIG#vKnYq&XXy}iKcJW`%F<`S9hk2{PCr6%NyGM3^Ng$RpA z4t>P|lL8GAIEvfTgenn44BBu1^0dQyFu+A_^De=OBb@#1_XV@J>%yZ2cYY&d=1L$r zkLs~72)BM9{Dc71Su(sLdfoeMGW?=U@Y`UdQm6V=lvM2MOJR^swrq+*ovNS07PTSW@ipbR8R_`b zPbhh&fae(IYmP*+zCicdeEivAq~*rbWtuhH*%Zk0b!9}0gnptdfj=63kd%0~vClqU zr}2z`L5Z&*M#ejpf)8NiuooI-wMK;=Yq&m#oAR}y?euqy(vBwDlr`dRL>c}eC>AYf z7UocvbjopIF!mn-WQ~tp(2Lzyp@$J43~Nj*8}Pc#&&wqN8N$*g$UK4jp~fDj0eQ7w zcmkDkUlaqlQN9jGh_>|9fHk?_R69lYi^>RVR^Y$Vf0kL5kgifB3!I2o*{L?HpgtiTkoWTegVtcP2q~g%W+(L#qG5 zeEjCH;27tNCbQaw?B$$tQk~)-ZMl!%qqQEg5Vg14rz8@}g7~_WMWe%`;Mb?s6yHKd!`b&ee#p#3SDmRy{qYP8i8Tr-38 zP;@QmR)aUmzd8o^S!z#3D{#O|(Rp56x?QJhzlVxg)u_zl^w0)AjAb{71A+H?JNUr~ zOaWgga8)f^H58#(vLClx(AXK$DouXrL0#EAvRm$<91b564NF@X4PB+cu9onH=gmNF z?#J%IW{9iYZgWA?AHtuEqLSP%azURd=1ITXqz5%A<(0hJrU&&Y7L~kOrw6Sm5>@3n zOZX>YFRosXS^m9@Slv2kjL(Lf>=@(a{%he1l{I-0h|;qpAh)_)-1J&kPi^33#TLFVn!+%~m`@q_ZH&LgjJyx6%&Y&ok{j*IO}OfaB72MQkZc zF)%Hy8pAfJkcdi{?jtcsOQ~4;?|Wj<6D~$c)>~rG>Kt?%b%p`Dfy507xN2mV>eU%L zjjEJi;dUy!q}BC#P2t`oM#zApr)a|yTpE5v?!A1(Aj1{Z4|cr844GKhYmE11g+4|L zRf;w_UVgcwMk|jC`G_>bj$)&?9w?LjF&iIz|5@vn-~NZEGdS5uXImcT>gEP$uI>FN z&7O@pdz6YpLYit6`t9;U_H)W@lGaB{JadowVk()RvOPZGl~R5~U>=!ZrD|QO+f}*J znYW2Sx=YGAFSFGc6>*N(QrlY;!l#qf82nwKWcS@#@SWa^GU1xWH4X-qGLv*e~$DBaW@d9A7woF*v#pULV)Pe0(;YL2KyLC=yVRBzVScg z>S#M-S@5%II25?QF$t#D?Q-~A8&Qj* zR~Qs~WSBe8YzNbqVbqNOO22ulB&1aaq3VuQim_I-=%LglW;6?ib{R0~bR_O2Rc_+_ zd6C;Z6{!AChp~+I+jr>6ftjpM$$vBE90hK1H6VRsU!tL|irLAarK#;1`6u!~3w&B6;B>zBVEoq1oHGE|q?z2*p1Vhb?Nuk0 zFd;D^(n-C}i?MA>2hjdOu19Pt!ch^A7_-MZE3 z5FHaY%M4oF(FAz(aMLXD#L8t>JZVPx^6qf^vW|Lf0j|%eHFofu?GX^1-hp}f`t4gg z5+HRuwVJX_VQ{1CTV7PmnM!=Qlr=)Gp%y+mi0p84-@(`0gmPNEAKYJjiWuw{SX_Vb z3VyI}&I|aXE4pUW5;s{jpK^2j*A#D;t^4dENlCv5Q^hxub{kV&x>{tES>P8?pR;2b zVpp=&+xa@t}1P40@A!iW@015Tg=T_6ZMumCWn!^a^ML`I75N#{Q&(2i#MUW_Eeq=mSS|AbZN z)(z98{?IEJHpsz=JL&pWpk=4V@_`cTCmK-Z!I&taNkA5n!Ba7;lloD=gGRFS^nEJk zRY4s>v9MqUT(J;%w^tKq5O6$+Ou%xV`B2XcjJr$kPB>XTmQ*+%z>A$tc2%>ckh0ZU zc3duhG>EdOS10-d}{5!UGAkqhU4d+PPNO)i zO;=>TaDKw_Y37n{@hI6DZPgF^W?OagXYZxtGzF4^%*fMOK1L-rM&%Jk=5w3Te^o~q z8{@HOA!v|`E)hjZd`+Ub8%C6m z&;FP5F`UR0dPbHEH_RP>&k66tAe(@aqnF@5Z8y5Bb#f@@nW$IR_TAfd5h#nAN8mvL zqY?iLsq`vze!lX}6^F$hAvZKcr*$mKzC|e9lX>b#lM0lcy$mcP?u&kdM0Ge;$Dr=r zjskd?;U44a!6Dnf|1a!H;0Al;1Bw3s;lAKGbkqCilx(Iduam7jw7=b8C;ta3Bgfds zikROF-i2*a=8z{_x7|opmVeE}2?>)!!vwp8E?k5vw5LtRTl6$OW3t>X68ew9IPOKB zd2VbG!-chN4PYpkE*>tevp=L#1V_-A_LyUrkW}Vv^(1Pv(F6=)vDTTI<^#Z%_5H@M2rP!4 z3L*S1oyl7^8bpgO`&N1cj$<+GxidM$%@!q77jPhAzN#0TkEu1=QL0fT(nmP6m%pxL zA#bqNlVWpkQPNIt;fVWw_g17Fsf}bq#R^Ae{mR_|yje zwLDxgw!X{jbz}J#%2>u(*nR7cFzV-@$bFC*eWPi(KJ~ZY20KKLD)aVla3UT0ENsvM zmpfMXiQdLJHun6TZtHA8ro=>t@2ww#qrcO;&Y&jQNKJiI-dYrE?gb;##57SW^r^%@ zu5?I#%+m!Wz0#gWYfDV~3Ssu`Sv;z#mv2E#c6La%XOnd;fK@?&%3iS?|Gs0C2>PU= znHw^6_56~}Y?trJe{}h@y&u$o!l&p4+K?AqWokfuwr1z?{jkM7C56+#DmZP~fKnRU zPd0V?C4Na|xh|}7kEgV$HF{=wb#^0C%V>yYZ^m2ui(F54Z# zwTckcIQmiEu46PcZcH8qG(GGW=#1!bZ%Ls2re+FeFOq2l2d5ssgTR}pXRPFGDNpz% z;KWMSg9W^HEcgwUkge!a`|I4Qf)onHfa;nBlc1U*e#B0JkXnx0Ml6&JYS@IHPodx0 zCQgQ9~oUVdse-0wbV%9kB_+@Kv%Y+cbmqs1f!oHUM0ra+K z75MY^d%xKBsZf^JsxmV<4*tISAt92uqcPw&ZRI-2mQUPM29)s*v0J9dVj8e-l6?j- zDn>_Ph1}|#7917(D`IS~0?!JES4U-OeH6(Xf?W$)K1WXQ^T>?U(uY@y3%i;~E=0w`Kf;yQ{jvi(<)S&EyKUeDPUYYRBvV^y<6hmN zr8ksl+&qJ1$q!kz4>X?-z()g7UFOkMwHyo-Mf*a|P7i;pY7w`@=3VS-KvCN!w0gz& z--W(u9-o$T!L;%X`%yy-IymrorUt=sJL~J;x@Q`_!2_hp2(IzDF0JA+OcxZ5*;n#1 z7w-(?`79%YnH9%A91JVL8Gq0eRMuKdqwM>{Mme5^1&&ZU$}fS+1EDEXX0KX6-t8mH z2ceiG;ZNIz869Bdk3;}|rU_yxpJj0bw9RD45FDDcAO6_Q!F=!HG#N@|Too}pS6xX9 zN7Nch)!{o!{2}F2N>AGnLJBjMEJK&zf~A08i095KqQoSmYQQEX^| z_(%~&MDy&EnM)s1pWRij(Eae)gua6vKkVJla``gX8{Q7Bm5?xeQx4?eWFFH;B;IVTeHmG0AQ^zHW%@*@Y#9#!&YgKLydF zJj|$PPTiy9!?ibh=)VFaI?Y-Bvmc_qx8IN`c|Y94tQfFS7lq_h+W4eE9M_AA6SzoP z{8HdKZlYNvR=aA7(Kr0i*4*I*cK>c>@DZE_cOOZ$lm=Kzb_m}#Y3fVd8y%S77uW8A zDYcx#=mRKx@BaVhn$vCe=pa%=Tf5W)(&lTS*yYh!{hPIGWqSjXckQ`T^KKHblhJMC zJghxOcQK&|r2vlA--o1BLBjK@!n)7o*C4;&%;GLxWDhcg?rx$9I1N&~ik5$;h-*V& z)}4lP^REB|Y1YlyQd9=o1$APA>s3OT9sIPe;?Bc|REEU5@hPP;7y+7&Mzs9N{s4Y7 z)i?U@onvZce`uF!zIWo2@P9(X&yWA5!qGy}_E!DxYwdx9I-VXOw2C!95)#woRU=!b z;m(8_*JuKi!wtZO=dv&qvaU^AM!ND)9&ACL0pn4w$AGSAh_S2~Iltz}(PN$J$5Vaq zmmH4BTb5**q6;3(FRAd5Rg_hoLK&>$KVC>Vqd&YBn}Tshp_E3^d$byB7`74Jjt0;E z`Lol4Zzp&tV4=XP^iamL==IRW&>K(-M=ziw7SNnGYwk$lx~#vwKq(bu6UbBp z`gn*`4%qP*n{^t}m~dex0}(Jo;X_*GqiPZyuUJ4JG4za74=+T&X+kdR{0x}a=oC(g zCfRRKJb5d#stsZWb{3Be=>d!m4fm{E)7=gh0m(62By)$Ha}l>WtHdBNd7vH^MT z9h}(`NbG1{z&-x8i$eYtx{%CqCk61t$rUcfJ(ur$69o1gyfNG7(Fu;Uq!fQ&N1I14{2g)A`}Q=#28W& z$U=hQ(i}0_&S005Z;+I6W!Z~3@nBMf#9FbuBg)?`S0OC>li13!Ar8UKTZU)sjK z!l^0qU(5d!^wzG*I2z5nJ>br>GSE}3F%A$0cZ7ykC1#{vzQm+E3L_1_)qyX7r~l6< z>z-MZ^}BLHYbpdS4Tir*2#ml;4Enh1ErRTT{b6WF^M!&+*YQLyYk>*_R$wkG;Hu(( zg_l@uK;!~rqwucT;usY=Hvr}STXBxt014nz{%MlNj;GlvtI}o>fl8PQBQPsoyI2HI##| zyWZpg@We3pohve8QVB4DdC^mT@+ zlPT@#B?a(LEMIw9;&llg?r|Y~din-O%4^T{VY-HyUgGN=WFkd0#_c$$wwNv7g}Qdx z#?|D$4qy}lA9{*o)UbEtnp!$*UswE|ur2K4^ixEhd;cbqCA}VkHp6ahAjGEi1r`r9R`y zMxNVSUVz0Xzr~ZCq)M^dR@qNlKHX$vG_osFNSj}mpH^WZ?QI>Lmu`5FiF8~X&V^o_ zeN!V}FC)BfO~Y1XfPo3&w_?yMj6Ph%GpK@iSw}$E^2Ma>z-^4iYKDuZqki^&=aEo{L-7%wH zTcn-TJrO3Gzw9&eAP9jTc?E946Ln@|yT>4VJDar8+#bv$)aymBPt9ePKZs>}6+b|E zhlat%(n-j0cX%3eA38_i*FAKG;t)O<;t)}vX7k|PD+||hDwi$oSe*rNwCzbisKVnZpJd&( ze!P`rHXX3HdTGht&FD5x?p}Z5YqCxBvSV4mbfTNcrs>;`*44 zq8@Rd265!mrC`gEyTk+#&b&j9Sp88fKGd7&%s?<2|0WW)BP)oNz)9G%+!+@WHcPz= zLa(X-;-)***~;^iPnaUJcczqD*RqE`vf%1l2ocwxSf)zxfCSVKDX#cX2l54E2ss)YEx zeaF{x^5frZukxp$ikF-eiLY@b?1oBJvNkC^SNr05lpM-ZC#z2lViW406f%n4eI;Y( zH~8&$`3}EktI1rps=;A^`P0me{XKIk4!>IqZ6bHh6C~-#&x0$54Gb@ibjed5=y4p9 zk@@Ucr;)~I7+Uw!a;FNTSqv>1_E)i2{jclUpKb}Gcj~FmNA>#bBm<|nIyxcWpl6(o z`7aK=z}mf(P#!ME@_!1NJdoY4Y=VD}s|+%D0<$F+X07_hU%Kz`FMo?@t8EM)p~`VK&??<~=y?215xWmTy4P9^f!nQMIs7&$t!y(CFx{`sN#ak{il>C!X z^{eX=x9{Aal)#_=EP&T7j7Gv@R0;%!qbUol7r>6Evdfjm`WO8DU#xGL5o09J>Q}t< z7yDdkKJ)CqCb&XxH6dgtY0p_~p?#lXvFEIe#A9x{sC_^plJqHb^2wl4!hin2!?Zrd zRK8xg2AR%q7;#&0oc~FLDA6ub9_Pt4lDxXOqJepD79memCo@%uw6%P2U(YGy!{B>Km zaltiM)NtvTUI}OTmDxOS8T4Z3c_sUNX(CGhsOJcHO+*>Z45FI69r}@ohiV$AadWtO zz5pkP6vHrV2x%P;%! zB$NlgSs7>7NojeDkr%=B8C(*_d`2;D2R^O@nKJf^PmkbUH2r{eiQBH+rR{}sdvvgj z#+_)H$ejphFcbC{cl@p(S@SKJ!winZK^(0gCrw#Y8K%WBpxpikJl|4Fecqn$Cy6Hp z5hcJ~qx13>dE_|E8Ir2O&yPt5dUA8$ftT8%JnTO81>gI;9CB zg{mw9bse*}0>r`$%K`~LF2OOnXd7eaUD0=5-{is~w7px#s-pcGg63Es9^*nez1XEJ zsDnp%)TMlpDdEJe0f>mMZIux?4G9zXE1T#tGRCkwW{e%KQ-GHCu}AIcjfH3X@c>_N zuGE338y2jWutx0pKy@PUhFUb}P6sr=%RQO=6^aAqo@46E)aTo)06LLh`6+}gOlx1M z8v8<2xNJg=31KeX>q8yDYeWrK&lTK*2Y$N&cGv=D{>iG6iiu4eRV4)JXI~M0bH50x zM&~t@>0Z)Jl%?&^SlJ_icaPdWtCR(Fi9yz&>fI&91vFOE$LC$xkeX*u1{6W3 zOwCbDOj*Yr`opF?M#+q$o93e2-lg=f6RM$}^xG$&bP%>)vM=38UXJB_3A4^K+0R$r zli&6Y&tVoKyS4z1$!`t`BC-e6IZnH!^eFk!)Ml0m-@Js1LW|!8sQ?n#v(}ie;)%@J zTwv^D+Eu&R>|mv_$uOPak`0Lqn;K4_#G_g$D)d^WW^OOgl=%B(h)!YG71r{^ z4Uh^?WfF5pnNl7`neE6$odkQ3J1cV`2KQo_@B~sq?{g!I#0MjnUE%#wpKGy8+o551 z!GunN_I>X2kSFG-@B0U4McJo0{eW5{9o~;$-f>-R^+p(79G)|iba4Vy4}hSj`CCDj z%C0{pRR$P-p_v*K2!EP~cJDKRX}@zm`WFCv%k3o;e%>C9HXcw8`8rVv$Ffpyztp`} z&NP}%6iU2oDu zxZ05d(6WQKz;kdC{I8z4Ogn(1~kN_YO^CInaQw&pSU>Aa&8kmutYFORwu{Hu$^8w3UEc2d@SOdG(k{5}pH z9(x0=v16tT9(9=}0n&_{4g`GMPI^h~u&eFQ`^wa&`@)-q= z=2!~kPfL9x@Lfd(mUs$Jg}vEYxU|KT<(4`mS}2O2Zh?AjrnuwM_~yjJ;1ntl_Ii1w z=L6sbPmN~0$e_~iCn`J#_jP{e0qx>XBwLD7Nhh_kl39UoJpHL2Z%Lnd-;z?HL5GAY zs#WA#HFnshU2J!X$prGO6x9Rk3|;%X^Bb^gQLmat%NL~8baDF-`P!y}r^TjFwz3zUovnd0G6*7}1TrVQi&aKZoe4}8u`&rjOJEV@3Xn&4?mWHW_=B~hfOOo@A@}QSl#dbLMg_xRqG^pndx>(#B5Htsd)`Xhe*M| za*#{`7a(O@Sx+Scx1;V|hJOAVhE>yL8JS(s`v0+X&EavhUpuzh*tVL+Zfsi(8r!zb z#%OHY-Z*J&+iZj1yw~^rv)As-?(EE?bDwkH=RCq5Z~@=^e1iEStn2yh$N(pkwzFJH z$0JCr`MQK$yTO6`c;K-!b@d(1kpo|FRh}sJDYM5m>>*AU^5*qp&kAe?z9WwUXs?Tw zPJ~^MZ(MThgX5KW!g0ijne)UCADIf2rJJEE`lLzMTe_b*`MX7%zs%zl(=vhg*^H$HUW7l^6PoeQUvB^7I&{Bf~V>a&mnxjU_QT2ZhqQMTxl1c<1 zezo3ZnZD?Qe^Y)1$cN|NB0wxdSyRx_Q$)Tx2y714J7&JaSAq6Rj7kV4ecKAGSzKoD zy0-}84=Sc$guK#U^(9v5VYxv`XQ7JU)p-~o)utH-_L9}^hJ zx}%k4uG17!=8h1Cf__3Z5Y1xbr<(trY22ev3d)T&;vetu-HGQfj8z=#4Eb-4#|vM5oZna&F`) z1+K*&V9d)(Y|9ssm^bl!0AywPm(_RtJqQ9-07kX8xBETzNUw;$qASs` zzIZqj4FN}ZXwJFO-5Rw9kBjl2kn&sViYyR!E=8t}{+2T{X!@j_$mu{0jC*|Gor?o? z-j{XHxZpnnjy>^F#b#rMy<3vdR+@TJXnKXtc;SEd1?jE0Vg76?xak)L*1Y~8{rT+$ zGu+Z%EwKsd^}ORdb~7e3xfG5gZfPlfHTh4e#sa}=^3xqVpqE%#rjB>d>hI}}Wa=~g z>raxt1WW|B;nA%e^CjbYKEgJHMy1ODNAGZx?$jzkS8h z(2>}ryQfN?;Pbqvv@ z3(<5=xsvdvk-uqeh+R~1k!^pjN*(Uhv8SV~HFl0Dj*^S}a`~0xNqugm6gL1@>Kp@E zQVvP{3ED6D1s-z{{Q=^-LX!q&UxIWeDbigUury}!DmI_v$XSlbYLuO~$-bsK=4;LNSjlO0@uc3`JZ#>-zle$t0U#qAM z4>>2foiy4vN-%eShp`5mC4&*_h7oW#c5BAzl{&8q8%PbO7YuW%3fVJ)PGNL+oO^ zNN^7dtRH$*D(>mqUjn=^4nBlSh)IDqN2WwO82v$Cg99Aa7MI!ZR4pFbWRsBDxW{-S zdaX`qOXnH(@v(V{9s3mZGX?9BC?++nAS7{BRi6ur#jr^Rns!QVGnW+iohNfiDPVMy z5&==fPdPE@t&qJ|KA1;cqGm;ps??&NW$W`g1`KR-c7jZJWC z_s>VM1hkcfo~Za<`&&aqUP~DOkL#j(Z5*_tqt^bUJ1Cyf@%yj2V2_jgNdVAX;a3er z*=1Xb>`FD^&h#lTlnrGPka8tgeug3ByZtdEJOfAh!!9NRRD|Bzz zn^!=t{SE(l0a&wXEXvA=TGJM8;1pj&Co2I zbmqMxymqUfT@_`Wl>MUx*7~&@RJZ`+tM*9nIOl3 zCJRQ2DMI?nU zw>g?ho*4N>lR9OJaY6N3t@PFU$W}5XbamDI)%cudgKPqk`Av)2-=80V0ZjL5oWJ_w zD^Zr}KyS02cl*G9QXIp|?bb=9)%9l0Ib8a4wo6u>Zp$V4rtG}G$==petE>+L)E$lbGyqJ2Dmd$M?tH`kD9VzD>*Tj?nO_zgUE<}l(b(<&2q?Gzr67yt zy^#cF`QS4SJj_R8*0zv7)=9mP6AutTCmI;hEshdtmv$Rr#;{-t;DaE086~HKYR*xC z+e+TiJ!}<)d%E1HM~l#aT8!^i%tteE$g>>w-N@EoEHA8w+8EWXuTfnwf4=|v)~PDt z1g4nSfrH$LQ@Qd=Fa7sYY%hy2;~O~Ye+MC>)hS`A_l#AR3wH~L>60Ka4{AF-w~FBq8#;7j~PlB{OX7<(Nf!>*{DY!s7y=g0si1_d_Y*Z3t?Wes^5gac)Ong!qR zOj?=n)b1tLd7-wDb!nShWYps6C00DMa^Nq}8r@gfFMfz0`j=RrI)#N-^=?u2%<9U| zHhjYezv<6DRu$@9$`RE3w-jz8Da|V1G{CjMNgw?YY2yqk0BIm|{ulq|e0kV}Up)bP zNx%#H!*ci{60J%k@|B*HBR0H=H{b3DZ}^|&v`|)Vq{qH zH}N&zH838r-G35AFTUNx>yI4Jy7BybRNT1naMJkCMrvI(6qFGe?Qx9h%4QNfynE)H zK6jX8j?1@Xt?S03)lvM+lH`y;pm+DH!NF*FBoprIees|grR`wfCE>7Xc)1iY(>v57 zNR2WU_>Lp+^GV$j@}F3b;Qal{+8{NxPap7MQv#@Q`!Rd$0KUP;l)nK|o2q`5U`XI9 z?3&|SZ?dGB)@jn?U1pgGYKnHHUlOPka z;j-Y<#KckEjE~|QD;EmyVRpU=B~87 zWJqD>+3u%7NDf62`P(_gCnEaCej+yc+aKVC-`!I@q*lj(ZU8lEy8!OfxgBd4@}NwY zu{V|c0<^er(5ey=P6=w4`l!k=0cumXD`=rd+;}$}0P8RGEtF+NV@{#7#H@GQ_xwE* zCrv(yZG`e*7OjH9t5vtCPK~m%f4~T?G%km4z)JtsxkiVjFR^KQi6yl7`zW^(q|)t0 z>K+;nMHlxLw)YCO3x^Bc0QYGi9A5*D!g@w1mg0FJ+%~ClRq{3h`bYNixBuF~9uK8u zTQut01y)XrfnjgJLz8bfaI=Ajp@Rxj;Vez=Mc$osfS~AioWAg_Lo0$XQ9UUP!eYEd1)%+$a>L{FLZ@lQ@xon}1JnUT+=;2QVLZW6K8dI$yC zdmmikqW%V~1pXIiG@^|3am!jDYCmlm(FIL(BTJrTb_Q_}vfqlh zV5j2@LkJ+94gZZXH%B>D>Q>l~5Wqf-uR}*CVXrecuxmrEhejs-5yF@_V>}BDB0WZq zDITr=N26fL%>?{V&-FqI3PPAf7_hO?GOzvf0iiAXSrYe_VfeiN0yjm#04G4W3B5%o z@bJwBb-@>v%jNOP+re?$-`a*#%iz+an}Ew@A*<7Q>{&9LF*8lbj6GZudDzem7JT;8 z3<>I3GVlB;Gg`l~6f>sx2U7THTN-JshPO|P60PL+KqqXmpA!E53^v_=Vv8c)lBqprAkumdvt9 z_vwspC+$oKf#%d4(SueJ=vZDj?L6d0f+mv;cuSz zF!=SjZsO#rdB2z`(8x2$*wUEZ08yl8Q6}|wr4&HpY+@4ZeBk9ks3)ad%ABUK0Dxxk znE=9E#-Oz21hhDW{c8Dc`^`|&n%PCV!)itrQV6K2+Xu>fbj=Kz^xM;XZ)}N;qJT~Z z9;|$vcsMUJY7v|`G+8z9m%SI(ehns#Z5BZ298*rJ@?e)`?kl@UWk5=hdeS0@ggdfn z6}x9G@o&0*f70z+mM4IgH^J>{CUoX+Qe%KkZS`wX8zS@;wyqIZPS%_o`@UnE066eMm($- zr=t8^C+T>kOb^DW2A-T))WnodLO^KPy(>cl*s?-3K4lftwMG&~pMhTg5z26Q%wU^-o+aT9P zTTiHY^;8p(w$k!TvDSNxhEihZ^jxwhT&FQy@9W5`=@_KLRKwwC7^pRfp02)Nk;5jI zCVu}o!!H4Ph~FV4>WttY?T8Rv03pDrb3$5rbjL%KyZ@tYA^u&syC8^=kN=JZ?3|o( za3+;V0%^GtZb+%teLw_#J>JDa&dLE+tl%rz|Lo0h*)gZ1EGWBy_4SA93h4lYr_P6; z0noP`;Kd4FlKoW%>Wd>ErEAnC$wMvLCRDh|XYYUMwi0@`JrQ=9^cG(CZ{D$bFVqvy zPD@{yYHddaD7RTq=}%rNg=w2kZ5o`LnhEx*j|^0#9~<@77)p;QirCxend|5gbZKAsKozQn zz7vTE2n_)gfOtR~tj{@EO(@A54Qz4eOO*O@@*Sxhk(jb!nTu$Q%r$u$2V!W#{2xWc z#h^WA1xL;O0{k@G#gpO=BE2qYaFpXrVN+T#jim3WTB{yqVa|y3NyMfw8#AbXZqkDQ zcVropQr-gq*d#b=i*f&$M4Z5=xQmR96R&v*J&;20b>}890#Y22LUq-YHNS=JbrjO` zus!JZN18$^@Q;8-MeE~L?2ny@?~hsZ+VWi|4%$1od+(Lxgp>v=#*&;V-wIo%S7l4& zax1-MSpj(`O~PEgg>UQB#9gY|k3hWP^v6x3aW*>_ghm0XO5Fc^SV@|3GvE#-3-&}~ z*z+XmhibM~DKE07df)wdUnX?E2Jvs|*EM!KRKt+&VsQ~_mx#{deW^#^7%gB@uZi4;Lct*L*zYc^ruhd#)3Wn4LM zZHn7LpZ$H}kS%++tZ#aOIZX~&dBITrdUzuJt5E}GRtC!*b!036R~|{F56BrEpWmkv zeivQ?lDQ|d{PJPUrV7TvC#`|7HzG=nH2AOm4*fJuC&Kl|_5#*@UGJMcc|^_xu&DN$ zOJ-u1FIFcZgU?{#M#OlK{gu6|bcB5KoP9O8*^&dsU-#WVLF7Wh%2c1b5YyE~)Cum^ zQX6K(Tb1oEaL8sEeKv3|C{KOtp;n zGyU{?`fuFHuHhKEWD$iTvX2*;Y=wA!N(AQej76vh#*pM>Zz_1~2pX=yY`wr2i-&BP zAupD57Z+r$ySOh~UU#4#8GX;>D}p6^gT+83&+kZ(oatV?xe z@e7^9^Xr_DdDbc(^hGhKb_~;@LG!%KxK$)OI40lnWzsB{Pi3SYZzi2UX9H=e#%Bak ze~q|xFM#`Y$JGkIE}1937uiyi8UTONt0bF)rDPb{yfJC?RJ?PdiE!kysJ;nMcQYRo zFqgi1ub%7OZLq#P@Z{7;#=S)PgYVdHMwR6 zwRDP3Y5n0GDbHfLucX)M|Hu$>^X$F+=r2>ch!c7V$2y-1n(+rZ=mQS>ZC51>(FXdr z4sL>)5F7%tu!;Q94hq=slmiIY!9ClNFlP8X4*SZx=L}lAMLyUmU**X7&frdo(1}y^ zMQ0}CqFexMSWb7*Wg&ii8%Qyn@6?BNVRJn&JuJYyfSkbhOm?_yvXYu<{X}-#73};} zZX@R_R-crmNk^&d5>Q#Ym_Q40-AG%M@rOGe`OZ42O>l8I^G2Mz@3KzG=%tD=reg={ zAG=>$bK?08LS1IqF1zAZ4X*IH-GWp895tFJC>rXAjJ%PCs3VDYrn3qGRS9Asf}Yf#1T0bNMr~gT zLrPcfYsqjMJUjZqchNoSrQ5zJ_N57S34dk+u-BB3N69SOIMGpgA3>zZ)ALPd*IF9Y zh6d7Y3iyS)OvDW#NwEPEmoUZjk{P{C3y{3w^^@>b1$ksPw9gwXvLnf}TDLn#t$CT% z-$495i49%XfgsvB6Pa6|bu$zxNa=4q3^r(NwrUmj^@Q~gkIMEBUd?N&DU&&VVewVnmXy9-O9bM5U5)5{iR zdREi}3;IaDmv%1@6Sk?r7b4r}$1Am8_Gw81QUecxm^hXZ-bZst+vQj+lC6_f#{WL@ z2ah7a*NUFmcE(TfG2ZznetlXWJygjtb91i`x{Ur|f;_Mt2t6aZ6U00|{*?F+V#-DuegC_V|7>Ax4JpYr0s%*Q6UFqd!E-TBFU4!PE?2NYm*l z6Nx5qGHCvmA*pREu?qMzFT}cS(w{;LqO#N>kJv+;7WjtnYosUwsG682F}&@T3l93bpQ5g~LHklR5U!Gt0i_X0RgDgj42+b+WDtc`QGn z@kk>Dm36yDC!c|UE^4r-zTD2UGof<_Np($6!ME+{C$~1YX~sIWU)nHZJnEFYZEh%E zx>Usm?p>Ej>X8yI7}x7<6V=57XV%jw5aB2I9t%~C8f`%qY4&S4W2y*|ogFhb zn#4<*VW{DzKPP@{+1?fgSEd??8-V)vp>;nrnZI@U>hT11>CO#!YymOd)FTk7 zXa0^xY#(Q!H$;VNfN0vv=WbN0YeeLG9cD-yi+?sIlpNE;-T%eVu|V+9!I& zh|b(3njSfTJ;uRoipVEIef7o0j&6qcfgf^Cx=sr(QgNn+F_W1gsH-3ec&IEZv(e+s zZ9(0cC)Na2cxfymF!>Y!NR%9J4Cpr_k2tYz1j0>vmX34Q-pgnYI`+ zml;@354kqM_e*K;sW(MUu`}J%<#t+&|dramC81bV2Rdm2JaphmDeUvApI1^S>&pgyg!QH_@syV3O>`%Xz`o0N1UBBMt7B+W9lO* zxA26Ec-{RV4*xfZWw33> zTyNw^3xIZbr0I!cPQra~iQw(g2@S6kjRPvjv12-vys!t9p_FeBH_N4k)q4~M8x0Tl zMAC8w7uAQd9oDRn2cr1pVrcUiwqY1@-SFfnZ#hNG-?| zW=!#WSzO3IyQF(2nRvTiEMsFG=8sw;+HC%NU5nOp1D3IQWj&pZ1sa@r((6&+3MLC& zL$EisE3DloC;wf#QEpqeSl1KADO~0yVh=pnq|7spP<@Yvp^lu}VtB@GGnra6s1&6U z=Wdlb-ZLl8u2~y;!Q`@IoevNoIX+{u^xujfq5YJ;cW1+`e`8!=Ia8qDobW*lrtAn* z&BN(I@}o!z*0b?Si7kkqyAq7z4(6{+i1;Ptz@1wK%EfELY1K4J6TvxZlm_GR>TXBwr?W*=v252OfhpN>j z`76i_EC;&PK_v5N*K@bRe|%9T7^>`P-GF~^&#+j9-1rOC9+V``J^MHrhl4ag#Lje+ zPdF&1!mLAZDOx( zRT|5Kd`udk@+1?#-4F=hO)Q4V#+I$$90j zYck|pzjdy)81S|QR3xXgwHokR72N|FjTR#vq=O~=q%rW)x3EtB4gUL_sw!>^oG)xJ^5RG=VZYU9G>-KI!F@@Png8)cnIuUN!6m*~`*UhB2+2$SLr^n#|+le7#5 zmC=1PUyYrXcD=L#O7>etjD)xXLUPn2;(i4q<|Fbd#6oovN2Srd9jcojF*f(_ts84( zAA-YdqEw8|0L9ek7zi(^$W$%*YJw4!^-JjX*rXvDqucF}rSj~8@Z`huZlnV$$8);U za$TSOu;YER!*G^Z9gA7odiA>v%LnYoz||ngYT~hXb-oP<_$Q7whC>7@HJLz`-zrI6 zA}mGe2p4m+JoiviALKw_JWK;9rw3?)E5e7rG}1>mGMO76R{!(+4}#bz z>sa@RnF$*!Ojw2=bZmdFGjY8WcOJO&c0fDDib5P4Y|Q#@_E%3>FRLMO8OvD6XlPu7 zwR+0BEH5H+AUZ|MUWc1--k@~9VY6J3#1*>=CP8LK`odyuq|k; z*pQ0Hel)80g&}jIb9`f%V>_=eeDDt7?;y(f8&;)y_TUQ4%txCRHAZZgyyoevSy^IT z8yvi`-=;6@d)b)Yy0jOn`N=v`W(FYr;(N-~^q9uQCo}RG1 z8)bf*54dcbjnz%3Q&)4NZVV0#DI>#}O)^xThLf2VV}w}KoVb;VyS<;W!5`Z$fn2=e2i-zG57MuXg^ z23T&}+~O>znh{}~Revr_bX1KolKi09g;`k0;v6DMe;fxP?)fZ$%|wv^R`!-3Z>u{x z<9MApS_*LtRvDemS66840SBAHlX;4$btdwd42e&;A*qA zj*ZWlb@YE;0-XW*YO3yuq6dT-%>w{A3H;Z-1}dQ!Ja@vX+6iP`7@#$6LGG8Lf$cs5 zzhs_SH-9!iLX1_KN|7T@`pb*)+n+<*;B#zzP8+tFTxAQIzm_+x$dVo__dxpYX5kOP z%-e?ll+tqZubV=1ac*)ct;Nj&oREkcdQ^|oI@)T9?)0hn#gSbRLA7EF8*f)6j(Pnf zHp2~irq~CfQ_fRF1m7E7tRz}+_g?Kd5p*jyOJ(2S<(Z5@v0jx^o4`}%F|sb6>t1d6 zjG5`HlO(33{-Ykg|8Q^625FG*lkd58G?e!~cdG2rWf0)elGU#-F9#BlD~xB8>a@IT z`~5J)qte9X_cc`W=kMYRAkDdC=FO5GQN4rBW__ugxRS zbZ&P|zW&s0gzHX)x5-g~i%@M)`kT)n{xbOOca$0@Me208muspDicHk6v&6E(%utB2 zg~PtwAsJzR8id>#H*;6nwHDIPV#-|}?ffGWe2iBcA&0U1!P)o}D`uXOR9K#vQ8f7S ztsefHN(1ua8d?A+gFXt#uJ$x|3$NSR4~%8*T-jf;Ypb z?~oI{6|UM&HQoc}hftkUFzA8TTW{g)^5N0OzBJdAlqKGZNNsWl@KU&|eMa2)WOD}@ zi?9!F=Z@b0h9&*6*KwledhdhgISrQ5(;@$_>Lu%K#DrT)^wTNy0+?rTNNAA*aj8J1 zt_l;dA=?Mx%XMhQ>07?aMHudQW*S-5w|azBi6DW_wj9tdTMhX>06|}(3*W7=@S$Lc zRazs=Y?sk?e*;GYo>-9Kaap%&FBlafX=x{l=U*978E8IdrIg68UYI}19cvxuzTVV4 zt#R$D90*)CTer>M+>oGPm?;Q$F1mTY>dj5Og>Fj1+dt}rQXV+OJOdKAHa(ut7^2h* z7Z+J9eM4q^=x4&sq#&9zjM-idX%nitb@QGrUPbxZ8b)f<6nU0?_Lf=wzQ2gUJ|qgq zC1dv16AE(4*Vqo>GJ4;f><(&6N1{8HqY13V)hyInrGzR@`AE5AU5coo(sr-%Y2y&? zgr_&jcyPauwL5&_De(Sd>bGO)>&W?8QFM%ly9HDQeXeM02Kj0Za7$cyONj+R;z63g z((aykE*b1jdF9zNh!bFp1**~`_ES&-<%Q$rA_j|ow0)CO@X+3D$WT7D`Y`FNIiiL4 zab~F0Mf}HfY~nkj$YFwM@5!%udlN$n%ZCDVtdR zr^zGh<}OMAa2JZ8x0p_9!OA^@UQtYiji0Y#b1K06X1Wlp7<3o8+K{&Sd8-e}?1%3E zH=3hxI3!*rBuQ{Z4%pD|kp~%m0qjhtSQQ;AKSMQ}q;lZ*xeGCs@C=LnIDL8XYAq~KM$@x-?tjJSgk*kVmp-uLgnJJn|IB|?aS zT02(X-7~*0RvyeSnT36z{&27h=prun%VZU#X!VsYFTx51Ny;a zkMP)k7=#<>`vp`uS22!f0MGsQY^`+uW{mZ-rezvuC0Kodiw}L*u>C**`BqS`HF;JgaUeZIG(1}ATS(-uNd?1l>8^#+>K|A)wTFB*n=<+}8xO1g!fZ39 zUA|%tDcA1*<)U=z%Y)^lbm3;P+r|5x;!@V7qt3jvJ;*q>7&550@O3Dj$W{Era<`LQ zbG{);%E>o|Z8CEodh5qm+x7wo{P{`GCfm~T8T*J9&A?)QI8jJq+)0rIZh+iNL4 zhBl^_r+*WY5Y?tRQZXW?hz2?{%zCgT23bgv7+kd~dE`Ze4>7U!-mN_BrH7bg0MiB3 zsx54Q8#DI;>xK)NPyWqv2qgk0_`+-gEoY?v#AKyC+6CrF6CAd$tc|t){m<8Y)d2*9 zPQDt$bL&3nqS;E}*8%u}=c#aP zz8!wnj8%(ILZ^T`a#eOCFo zkbJbInKYkHPm7G-%9@__^Gi+kw>5d$A>A>-Xz|!#rlt6QaPj<2h%jH#3h-MPzzL1h zsh&Ra=o$wx9@M@06Vgyy>Y*A39C&>S%wr3 zyWhp@?Oe&c@vOw=rNCG!=6Uxa1pCwRhcTaIp=3rXYR<(32W9W;j$>DDEaL)RqQORVh|#dH0z&LNIzM(%CkoLrtq_dJMy_= zq=0ogqrZ89k%fpsMC$s;!for9?NiL%X_k=^lCjqJuaW*y>{ZY5cG#Lq26!|R-Eg>R z`{J0y4rdL<5?&cs5kK`qc;7nHD80b`F@v*QA<`ns_YJA(aQ}5-V6ccKXRQ_OYJl$S z%xWLd^Z0=zjU*LZOc+kceY=t&BPP#SUwj;xHx1QZ(={Ed+m;J3$|{TYo!vmhpPorW zOH^H-UdQ(XFLhCKK&OQYxA{08#Q?DB);*`MuynPc;LU^Fy<*W;y4 zRG)hpL?*8Njf}q9a%PUnj)aBSMXRGsm#Q1=ZtsgAD+zuHIg!B3%XsFjV;!u$tbJ%o z$lY;gFrjNF+JJk77+DM-%7^mQ%$moFo<3bX&Uqdll4`=e8wGqcw$>bhf|r)!v{}q@ ze=t6B0?6ung!hJ{gT&NLwLOpB@A=7$w7FBP$*PFokUZ9U5*wXuyV72W-tr(ccbK79 zrc#S|g8R@gk7;IYm}$JxcqQ*|_Ikh9Qe^6?Anb|Mp+DHv0$W4rZ=L|L*~>sXNzxM^|KqAy>o;<1NZgs1UF5RCIO zzc-Oj)1&mRq`|O_Nep^e;zJ6Xg%&d9{5H{fKyJ_fwO*EbzRHdzG~&5wX>B0g@y)`y z&_OUGY~xE}gHlavQZ!F`eI#iuT{hQTs*zb_6!D&U+QE-Hhbk!4?~P?f<^^DPSC-wB zqUOpzS-34y$5G&%VPxn^r`+udv+K51l5QH)CQuYd4Tf>HmJ0IhDBU8 zF?;S1E&?EVYLx9rALFKJ-7gN~0Usc}o&0x9PbVPHu)vw@Qs;@XBckSo)`b%;9K}jP zvv{E>CyWy{Z>O)KY=$pZleP*OvJ4_kEWLq5LJWmC-{%d8H^`iyQGLM+58R!;zr3+d z!m1hb_!4SN9U)kkI7s4_@f!RH#+ux^~Vzf(U z92EctIqFVYMm!GAGlK71rVumE_3+G#&|wF?WC(yWpVfWTG#H8yJz1&S;N*ZWgZu^P z+wRWbtp1w(kRM>hwk<2>Ec;_B7|)x@j#q3ZKHQIuQ+Zo zL^p;lToyVb;t4ZwEdA;+qb}U*3+6~;(`>iUnGND%K470m#x|)x(wpIr39gS>X|pIe z1L(eDPaNvliGTW^NY#sOp<}b5Hu3jdg*e`>W5Cn2DWer)M#~8x1+le0dW>_FF_8H&OFcwAbWb|azLRz>f zGL6dsI?yDy5qMR1*~5z!t+((TJ!u;L=Wtx-<+&jhZlI& zD@g^P{z}vsDxg|J(M9uP;zt4(0^RW<_kry)GeA2YTq5N3Ts5}4_0y6JYE>tOKyE0_ zb=A`GY-9-a#)w@=P@NT`Qk(?Y4j^y>2)$Lx?KZD)xd!@ITOYsu z^hA;Yn!yH9+b_^x0c+hJJDt6Ry2V@c)}1k#72q6LyUQpx6be_5g1KL*sZQ14k=<^e zzIRc?m%rcDtAcdr>G*VbrWxuB{*5~AhCp`Jj*yd&?UT?WmLj%n>N*LBiT6MM$>4kq zQGhRmdQRPJsU@Y*-zF_LNNZg%h`*|9I_~^kCG?STi@{kI$6)OU*ZcD`O3wbR;hp*` z5qcluqK_lx3~a2>Q$*B~epyloq+Bh%>>wZC@P~h}+^)4yx16!Ic+hn8*J|LAuy-#J zD^1~Wv?yeOh)2B^cW59<8*VEt^jU73qj-yC8L9%y_5^t#b&0b1|E8n)AD1PX3#1_fq_NsCFUa|M|L_xjK$3w|D>@GOz zC#V-K;BZ%G$6_uzTQTq)t%MGUOoB@02?Mf4Cgj)W0+6`}#Iv7Y(T@`d??gGEb%G5? z%yn%7%tU&mF?e2oh~kObeDOvBIq_Krjy8}kV>TrrCe(EqjdJ%{dC5K+XgCS~ zk`8(V&$}eF&D~$qK9bJh@twRAK_QRaN)3vJU)a}~X}T)}O;9mhhuuB$k0s4rg`T;~ z=S?|o0!+PUY(fZ)-6@0V{HD*glj;S`G$s7z)HAql5Bff}nVI2{?QKJpnT4$d+5ti; zCI5D+yMzaEjhgQ02->p)w*Seud7-^P+z%spuX<}7zW-9Rg|(!V2hgSO?)sFlC1t1o zbm#B1)zPgp(Ei);&$I&IMa*@}rKo3+qbtLV6BPp=$K)#Ln% zgBQBl;fMxe!#&{Y5WBVt@c*}P`{{pg*_QK4!!~EY`IS0nWZ9P?gSO`1QW-SFR{zGe7IH@-dtsw3TrK6u!db35f&!|k0A@#1+m1@XyXJw}`G-YXo$ z>%@dkhjiNd(?DUpLYL;T7%DIDbo$ip@k9`Zddae}4i1N~APxUUiP^JOh_|v*{OjfK zAbS{S1r=cP63bQnjM2f;Tw@6l1w3RyWkzhD1vVySz1dF&AlPWOy(Lv=**c$I7n;m zb{&L!q;Bws9{1s=EDL)=Z`^J(bD7o~>;h-RcZ|)xE(C(8ZJ6~zn4!5T^jy07P8m14 znF!|l{=D(HPL!VaEn>DI0ocxu1HO7GS)QdEjd9Egnn7jkNr|vc^Gv}p+Xd-?=Ky`X z1B%^+e8O(I7oH?nV-qMc>2mnp-W60*iUOHhum__@VKF-^gO* zRPvLlYUiroX7WSi=9G=qygEI14 zh{iiV)Q^$c+Wli|gDNjh;>!~!_#SDwzK|1zwPU_=ZwBKbe>fs&u( za4uLvDwI$0wa3qRp9UUF@*9(%bYdEIiq47Mu6*7L+NG3Axm}pjtd%Tv+=DVxU8T=# z3Ak1Oo%@jx!7gOaQ8}~UUvfzP#`@Kr@D?^^Z0&5WNjNl|ZUOwR^9&9p`0zoc-(G)3 z@P0N<0@1=fXfY`y)m3Kiw5bhPwopHx9d(;FCD6@8rfp*K8?^lYsgyj+9K(){swWbV z{JWL@Gh(O~V<0VNWD;irrI0y7%_YxKqA*MIBg;8CRyz4tR;hdruh~47uhoKhj(jFN z7kB8XoJB`&)@%+}Ou0NJjl!6G4*PHhKO6Th+-V6|yIxEq4Q9OqQOhT)Ng{Q7Ri8`z zRC;<00L|Qbg!axfYSC&u=K8k)aTLkHJ3?w`4|mt>Gs7RJVd=i7oh5B_Nx{7xe~o7y z+;w&^f`e^*_$h({mbNU>T=&Ct+?4YBH$O*K_RZ5yAW-bd`5lAVNHYl8OM7<~JH4$` z|0p#I>0s(zY5;QDHUj00U1h;K2l;Nul9p-R!lxAS03g~S;@UW5GW4?U>$n_gT(lpT zxxYCv4I)D&7=j4?*!_$k+XYLNJd@Q>j_K4a+`2arM_EWpz;q{%^xHZAQTLxpd%W$W z+(&d*5pSaIWWtq>fYrC3BjHmi3DD&kW}n6-%olWale))H0m3l8QH|+63Xkja?kdOw zmZJJx-P{}js%`G-HxakqVG5WD_0zDqH9B7Bz)kSG^}ly7K=E@%U2xZ#G9`uaJdT}C zFTSxB`}nYulT6R_ae{#DDl+()NnF=j+%h0_u}7_Lqapnm;2WeeF>V)O2yXO=4lbpb zikv$$ECk0&eo`8^-282t5IIb%O07D12_}ty%b+BrqjkIjt-tI8xnho2lin(C*J+GB zL=TJc4Bc|sqtP!+6^V$gek86S5SSlJ>eaG$=C@kE=P$c)ugd{l113LF8|#db;yVv- zUr}#9L0bIO5*BWf=^OJ7BE&_MbIuPAJOs#YS97HCv_&Gvh;FUA4H`$8s7~t6A-l$B z*8ie)5rCqjhZvb_Ak={e*5wqMn^*cV6G%aW?N9S~5;AXl|Nie?y+T5=Y3?_>AE}!A zOWX&)X+(L&KPgbPZ^GFCIsC>2^qg`kEX&_VgEWq6{xR&3p-Tfj9>!VMmtjI2)3DYQ zL-xmvZKc_(nz(yse&L_oh*!c$?pZ^1Be6zsFs9iht05RYKmbMe4CF_=vB|=>-Nmx-0m%{jv5D zW3!_}y<``SC10xS@Bg>`B%FZOQR3So+}LD$XM||n8bP!p-Gim{_L=`1pTgIjb(MGf zP5ix2UZ1<`xsh$D|boC$yyN?j{)#5wEkX9LH}5 zZ&3D)1=qX1)B3(X=_!9%sVL|#a8?i*9h*APYYmQ}hC+c^QQXxAxynBv2wq*jaf%fY zxZZPYden6T$IEdwqT3<9CCOi;bI$}2%AopQl{4bgvC~jWL~cPCI{cSbiE-iS^C_UV z;afHh803FEF=)G#W^nTt!|O#U$*^5N|Bf^D`ibnj&4wKd)3T= z6`5i3ZqwQhni_cUH6(8)nu35gS?*UZoY~^c;YUP6!z8|~+o$m-MW!nQ>kz|rLNnOa zee01&>o<26{Y-(1{cLUHP!*uw_lutN9B^W$l{H@v%#DvKTi#A?^|>WFvf^SbELWha zecy06TF?2Pm#DmD(763HO#D+uR2#+%j)08=YL3B;zS=+UjP<&mo&2dT64vFdI-l;l z0XPekEMW5m$6RWF9ChO>U3pA^cqu9r)$PT>eP>0ze!#(0Opy%xkyY&I)POJ;yD3YJa zVX>8620t--58HgTvQMRh0+ z{r5gdemYu$x)eJE)1nSz*J*mjegS)>S+8baZ3w~XyMEE4yhpGZL0J6+o-|d8=f8p( zhZR#t@8#V1WcE!aWC1oQllaH=mmyK}iYV6X9Uq3rKaZl`{`|y^W@*VAB7@F7kFO}! zc8>-GkAFx~@PF>T4HohA9eCA^D!4}>LcnEPV9z2%!xDQfVZ=YF7~K`nU3_tGacc(N zlcJwUH(YikL8tL1D;Q~_&6sL@5WA(ieD@P=Fzuq7RpP+6SKYI@6R%tOQXyKx2hx73Bef+d+6iV%1jJ&Lw z2Lzx#SOs*CpD)+*K>$DLCj-iak8jME2(h>KRlX4v%1__g$%2)3(+4oc=|avPcqtw) zk0?D*xWam`S|t-J`%fZ&yI2vAdh~!5xko*E!Iry-iNd{@R#c9dibF^&{D$Hu|&j1JV80 zcbj9uqzwo+UWYzb@Al~~jlIYMD6~eVZoWaKv|6kWH&|v?(89ER>KuuFthnGrowqBAW{gGm^ zsKb_!F7dFH?f)X$S;d*Dg$(<^=%>l+TH$%(dHOfb;R1RryN#H78>YI30)J(&opI1P zqWDl{2v|-Y9q<;%OJA2blP`R?_nyrokI0_rw8xa-ShNd?fRY%m`s~z7mg@xzf7(M{ z+-rFacng7wy_(fUV+`k+f24+eSnb*cC;RICZ7qTy#Qqfcy3NcXCcXXSIf1|3Brubp zVwh@VB?44%u>mjNeF&&EbvjHrYzP_W^|3PML-*fykHo!f1-&F{(wvJZ?WH5BL5KD>)C~Wx@gd$M z3o{3rWql+GWj<@BHuNsth(MmdPq-7T`P{quxNt`o^CtlGqH@?N!BwK#hvZS?=PnZiS7x+`gYXmCux#VxmvVV>`I%Uu< zzNLwZlMV9;ozz5oOTw8z_CutsYMFi{7Z=d5xC{T#0bUC+P&|pEnakwEz4i(bPi(z< z{xSdZxqmC*Ac5&Zny*E~4=>KkPa3w_utjnm+%?qB6y0q`;U;F_iWc=ZGu?b>@lzz< zVK*bq^QT&VtS$e{CyJiuCrHw|+6hhKJ-adznur?HjuMUmHy2^Y{pn?rRQOPhOh@v)1=|p5_y0 zvhXA0QIHUPVAw0e)f_is${CVd>iptUiG#ri4a zL%>(PA3~!99^+l&mnJJ*HKs+@?CAR=iwTJj^jL0Z%i2F?M3Ucf7Sr}~arYPm{aF3N zBm3LZK8ejNnItm)0(lCjaBfecCzB{Hh?IZDwe27$wLN}sSnT*#BBd7|`Ks9HtmwWY zmo`@Zs_TU_$o%DNUQ&8t^!~mQ+Eq?t`Dl662;DeAIgZK2P*r!=&@WQWupS90isj3z zm}}WKU-})wJ=_A;l~3>mDxcBi&)t!;TG8~OgWde_JNh3Ttp6M6hQi^ecA0L^}{IjSrnPYS;R>~-s%V{Q2XJJQ* zVLVAYPEc1@Tahix{Dx8vreyv>{3Qs(cU-KzEA8JHO;NB9+xYA4#IWEUhJ_nhC>v|k z<;T`IR)J2LhUeHI>KQ?P-Cbs4EiU|h;`ssIZ?Y`Af3tjRMWKe1hk5&REg6xhSx&t~OZv8a%o*CQn>`IlEYAFTneeu)4Y zVnV2U(sycoY=7wF#zCEr!VEUUA#0?2$7$ZY>S7MG>{G@?bjyBpEZ2mEk!5Ln@ZC`z zKD<`pslxS4zh4dCZ1M+9T<&{;__^J|ai%y|Gz2Kd=Lux-QaY!*hu8brl+^P8ex>_Y z=+vu8n^pD42H$0DHAnS zxSfs6@vh+;`%9B-={NcnOXPI=VZNNrg+pAsEJST;hB(Q6u&L17HBC8+(#bI?g}lO^F33f{PiqL zkG^nYp97}XT$R=jedV-P3x)4@Vu7FkU=~coYoQmE$VW&Bl>ujjnm^57X_4)Zfy}rX zM>CzxG;F@-u$y~Zly$Ne8Ti|dmixD$jPTv(P5ncIweh+ILFI->P`(*v3J;L;h^KFi zbr`P+#0WC){)NHQQbMsUr(QW{uouWLyzc#vMsS;5nK5AS{b!N3_z@PMEq6w3PVzQ` z>Grqr$WiHq89&awJ3pN*6(yucDBiIK{&LG;7_~KcI!JbWu|enev^H?X*oGR|uLvD+ ze^KKewtzR$pfu6H8z0Mpj(zh7Cy0s?@LJRw|4WfwHaLnMrV4vPH0C@hE0Qg=>um2= z=>4U2h9SEkGeR}!mHvlSBheFIKI@SACOp^*WuKPWr0`GIZZ9|Kr}%@6Z=1&$*TM%z zF_&qydk<0?%(wViuuYEFKM({iN7G|%LKIl2y&E%_ru$;CWwpKGg#CR?jN-Ub;?K~Q z$vSBSrC-`(Ey;5!MAMFY~q4;=KiQidLH(>(lSyErwTHj-&c881H}OHkkumDr0D zrf@wFaJsT$T6~c?WzE=;i#lIc&Fn2;u_3UEobqypNsWa0+J2dO5D6HwQF&4U%QH-q zyt%syq1`0Js$?C6e}}qAn7TFX46a*cIm|##`I_#+uIhvdv*H|;wYJudITwKvme|9e zC+fZ1o46vqjt_H1%d(KortE0d$GyS24TmMvQM%O3kPLtK4PRI?QO_pe@!RBR)dySA z+A(2Iu@TwJIF6HZw<21;Imk&5RjV?;MxYFsKrQBw(-=V2>X`4?>U^yn5~>u|pQaI5 zFt_qLD|_-y{3&>%eTIB13e!&q-+yQEadl=|iQRP(mOj&1tB?86t7L-y`1inme<@_k zSzUFB^eIwmfgS{x_{b;*O4NVJSZ$)ypqUt&#=QjO@f!@;n9OMOCNYZ%b_NUxDPQG=HZ`wH@g zb5hAwy3~~lartE#?LkHCJ(;Bh*VpOECH=KVI%HDD?yEhW#uN73wxMX&0FKtDpNG!e zeYeAw(ML4S-IK2Lfg5oAy}3$r%vF>J-^U;>y z;%?~=T7?eJH?a5eKNz@wqHa5are8D|-plZoc$TU95`8XRe5!u9*e+M7dR4N-CuZFv zX662YPD96|4=m}Lz!-Ox&vC_hTem?d!KrM+XV5g3bfE%zo92E5D{)^L(QhH)%YO3r zL+hTCSOlK#5fP1Y&QikA%#@4s2YP^F7TxunN1J-7_a%vpNLiv;8z-V-sjd-Cy(a28 zB8LXAw_7FnXmJc;uV_Fl%$EK!x^&1knI%-$1^A2HvAV0)45`M>9EAM>st7-u(~wzW z?!Bg4;XlYQ0)Mq3 zjE+3f63TReVsIRXKdg7;pQIZ_TNFv#70Eno=Y$8Z=!vrurzOoo`Hl|(ojo0Qs~i1L z7ei(;Cqj0#L=Amm#E!#USG?7SFpsRd-~FEvKB6elBDf*c1Ktxiu=$D&O@!E|EazIW zaDHz-%s^gXiwe@;tMV+U9dZiy_q6Lv>970r6e4s~HyuOdp$@IKsz<7RH=Lt|UPC9m z-aoM}MmJmSw|@w%b+)2^tM|JzT0a(8GW##V*4Un*4)wp@TCc1|f37t(m{{wfU5hr^ zf~_sT@U=ca46pIFnSWPrFdAE1A3<&1)tPaQ{yqLW-0G1J=j?CPqqP56vHi$!@U6ROD>!OebMssOo3&6YBhfdHGM#|?o{Q%>wQ0zCE|>~;O_@ZvxwGnWG<^lT3E_G z5gF5b5+t+kd{8PAfoXD9+rV!0`fv26TTVUuHJ^yNj5+;oS;_zoz&6Bd>(n;PCos%E zGDM@%xwN;+J-xR65;shBh)}v|noHE9VEIsF`aosfDFduWyr*O$l){L`5?pJZu@U`S zu-~1`+DEDhub1r(c%nZ_t%YJ7LCw3Xv(eYp!PnKf*L?wK)4MA_ou}*b#?~hPJt$oV z@z+O}N#)fWL^6ZB9M}Gsc^+>O8y@tXc7@8m*7ozNJbQmI9yl#R9P|Z2^+iTa`R|}a z4?WLsC_tDBp7en%RFWnesI?L%VgS*NZL(iQ?@YUA$|7> z##VZYR#px6qd|%>i}>_C!t4?eBm5rZ{@;&!ehvn2{PfUk=#+0?by3Ih4V3^{9~j~L zI)|qgim|W?vl&Vn$`J%&q1vJzT;?zoS=Iavd9hGvx?2`X>$uF3qRZEfVt(Ume!!O~ zRM8(f+||fH_buz#y8T5QqZLPkA^s0C3dk1&8^i{Zh8*MMNWg9EGeXKsoT5v(0}JsB zMv@sJ>Dlmot#)t1=mb`K@JWq80}v<2Yzeie0`Tf)oo(6-lmnwq( zuRqt|5HDksx!R|}c7CU!UYX(3^^4kV2|Hv2eu>CxesogG2<7mZcZ=K6;X%}0-+zm! zg)kE{pm>G!;e6o=q2y5uQA><3E(ySqoRY$j59vWd30%W1J4{Ore^L{&6KKutS5Jva zFJlB$*3)Bqa?zg;OJtZJCj@6$Ajx5!p=^1h^kYe_)Z>py{-^V&&+c}s3s4$>R4H_>Md5`V*uZX+IKHT z3-iINC8?bSMv77fKo{kSNN6E;mDEEA2*2cx@X#Zec-lR~)MU~5Bp>CYidkXI(?t)e zRMp=7Re7$){j=7|;0z-0ulv<%?_{vfJD``PH-MRbF1--N8ntjgF=0RinWtzeqEHbc znJKm2u$$`&>4m5XvFQggrvEKPAEC47Fh99VJznAd@m@NF66>73)z_DA@PUz-6we+d z)&>qU5xC5!+$ONt3?t}Lj8OFL;MBzt1fwCLzNGIO5dm}t-p)0WclIg;ui|T~Yx-kh zgO;}1cy>iVt=7zpWfM|izK9?M(CTJIiKk&veu@()kR6WSLt9;`V$t-mE7|<-KZ)XK zJBC0lP;Re|`dRfNX!W-i6~R{Ef0bnW^CXqN&VLov14f11V`w7HRN;Zp}0pzm$RnvHSFd z(##(=a@NZW@fU-DXTkXXhVFZG7{#aY6QQH~hkB@PXaW zns2(qI6#4lWADAQ!H=6v(KiGr(D`3_Rwj2*0scW%PbbDon{H1EvL$#6)#%b)A6& z-Bx!Eekzh^-TxeQqsF~2`;A8FMb8rZa@P&b`95%k^{Wm?d%3-nG#YSxsz_9(oFT$4 zgJ1t~Wt-_h@$|m$G`$rEyn&8UXQM`e-ZiZgA;it|XFuPGo;{}!bwTi)LkxtT1ninY znr&@XA!)Np^8fMg@%AJ$0oYv!XC+FO_`ZP14_oSxT*#`mL%kbgCHGpah-OIp_Bx#VPrYBsg zkp8hOE<*I=Ty9ziJoG=AczoTcxS~b_aG)Zo?9Fh!`5W)a^fDdBG2F4eGLOA8{Dl-( z0~%70sZi2kvpgNsegJnqWl-cv3@i=uB5nCrhUY7;4tl0an-AeYb19B;Ie>}0?Am_3 zxVylUMJMhqQG<}3gkg?|E9smF-qkPVYKBY#?ysfN;{u3L7zCVtpVTq6{F_Vgzpy~Q zu#^DG9DzK2xGQl2$6q&Of;`qCUBC&V}X)fvWc2it#aX$kJFlDwk z(rla*!^v_PEjoc8mXd6aRel$&vAFU!@0R!DprP`uYSt78j>8Z@OCC*AghEzz|E(7- zERnlHpXlJL3qZsj3k=!6P{AP21kiLwncCvylIaGpGZJ4aQaSMYMlukl>&w+@a!Ahi zl1(7ao(M^PKj>XPk$ZfpJKMXcHszF)SQ`18X(&B6-+!P|Jo=)gyPb(RuZ)Q8T&7ya z_8(cSpw12orolI`)|7av?7pX&?J5jb>IS$kl!DuXSo$_bf+U~$v!OQYH?v1&OINv7 z1(K|#%XhsJc6-#N7$)D&F3Yti-UW18HcAh?7R7aIL40V(DiP<&tQS|@rM9R4L!uE= zg`g!s;)@v`25Y!}ZK1v`lKW2PvA`{<%&&kpdPLM`x841VaM#@kv>u7 zV&|eY)S*YOX1b5%x)eYs)&`Te6s0q+(Vv&HQ{7{v_!I#Cv!ng3omG*@I^XJwu{&6J zb=awG>?h~>mvY?;X^?%%F4{RVkJIHJp0^~KdUj9d z$$#^2Vt}r>s_BX5kkHGF<=)7hI4`?ce|-a!aVPUU!s6cAlNIignH5thML!X4V%WmN z7<%}~AwBxW--L6kRX!8R`OOrG2TR6o9M(ST^#}Fvg=^kEwbvrTfq)U(^G>mpyodYq z;Fp3>1Q2@j{{?b3fJZvrKLDSV)961+CSrh`x{;jz)RZvjQ;eJd0&t1xO;0a{hzihg z>tg)_>%9F}w9=J$LxyhmTlxMfHHm|7(_>l?TC^F$a*rgWf2qLsN~1_t0ocNEtxZZUHOjYFe`<>=5|58))<7UFd;#!To18MclVQQ5!f3Tw(n8Eq z3{SsO3IMO2x0w-XzA=x2w2(v60@|y&K(}tIt}=Ur_AE=O*qJG@M-&UM(WuXYd@@w{D*>oF@Hv@P2=O#n57L{OGm_BEcVjzrm5ejrSm@;R1$|G@*k+Pv$ZexL0d2NKX2IS`jH4GxqvQ zW1k3M^E|B{ni%zFZTHmoIG-)%wVx{Dg-;0hm(oFcdG`nK(g!x>lIly^`LScF+dI>$ zuug`wu)&zlOG1~C;0!?6?hiWDvLVn%7ay_Nq@mk|c&2BwBrLPUj&q6F;z zcBTtdUEgR%yHD^Os9RX>bl?KE(KtMRer?flx6)fmN?CKfv@6!55iN)Xe;fV>Tyc?9 z`a?f1>y*%eysBEjM5(F;a1?8VZ$e+y3UGmJ`nO+9RkhZ>)o()K8(TJ=)A?(43EuMkXfxXCH1+gCr=C6DTyBEWN4?Up&WUIwI3bk24rf8w z?z*efVXQuqPBEY{(Qd9J!=FGI{@R?Yk zTS_fRmiiB3(DWs6Fu^;=eV;z!L$|Sb0(on>hDYHn!mPzx#e+9A_r%0*V;f% z;;krc)g`2UcmcS<_hZVt1WsMMH)K115oJI#i9lpmd4iXsG7&|Fgl1pBI9cF}MhNZP z>ai})GH#=HZd3_t@|BPt&rGBI;b_#+9Ts5T1}!g&rkXCI>U1-Wxm21;+5z)lcHhA1 zAv6=R=@t$LJkiHS5)F<5Kh0M+YwA;+OvNHy(SVH&g7jg4yw7S%uw5E5r5JH}AC515 zN;5B5>WXwfCn+QjLHY>ALc@+McfqJyx``nL%3NMKp_-1Ta*2iFMG!zUuM+5}E!NW) zfWByU#Br@0;nJmkZ;vkefH&q>`oa*Xrf{hFpGfsGSRa5Mrr}#&Z}dY?$)MpfSsFYe zs1if#SEyf}Ezmgz_~q*YVhg{7rO(#nE&&-O{`T1$JeXG~FRU7|?_db;7B0i*2Rg~# zXCJRev#QTVzauz(J0wDiZH0qyFsNaBRt+_aPIXO=37&(ORP$~J$h08%p#vDl4DN|-anFjEy&wlUSQZSSziA0Oz|C`nzX;=w}jkm4#p&L z*-5$uG(0@Gj8Xgx{E;y~Y;=n3LEg9-s5iNf{DU(Il|*hI|F~5eQ(B$3z60xXKNo76 z@UW7`Y}+NNUaHzrK)9)GcXSc!{yXX7YhIz-#Pj7_t+y`wKX9^plXBXRLg%)Js_0wSgn3 z4luw%sI|=-)d;qd>pE1lZ&l%mE=D@u@+Tb3|9FAn>cwqih;yRELG^7qnh3(3uld`9 zKnJ0Q+iI3y%?<7Hnww$MM?C~3=sx)_jfh7@b48-d9vpU=N|i?uxpzw|GH~UdTwB^? zMbC^+9H@ihoYlv?zd}#w=&c~RJ|rhN%KSu1t$yA9&Y1qQFnW5nlbyda3xEOB5G6*X zuY~d+(MG7+#cB5QvJz9WGY+rAF9pdFE|$mlYX1r1bUJ9F+FK4RbH62~D?20@@hrng zwi+B-j7qv`DImhlkFcHk)vW%Dj`$wN=|BPCgs_^I(984d4~}57D?5z%Nu9gZk{}m{ z*BUVLdu&3HE^)^xQwD!+1k+b@u=F(;9;43(lsjUj>fosza(zw&;kD;+6@}6v)p|XN z`($K6FzVl|e*<~n9wq~OOf$r?Yf$S*GX>cZqoP&hp zr@S;;a!uL4R2&u5#;gzCI>JEL8 z$;_H`N=lO918cc%VIP2D?)u@o~n#5vUk*|jdM18 zgq&;qf`I6TX0YTas$yT@Hao<(MX^6#ReQg<5#8{Hp=cA1^(GWPDfb<$t-U zoZrw>Sb%K@$saT=zXjmtfN@z74i0A+xUK!j>n?QenYXDa;eXHOP$X_O)-7j=r}jBK ztR21&eInBgeZ+V!k(h)a9q1MHlnvW@Y+QuUQ30F=w8G65vTU*JXHk4KLw|m6(_l*$ zRQweMC2$Yd&O995T0wTZ14G}O;*bkj!k-(${p`%i&8~9Oj{yX};7R@i$hS*8gxZff z2&d0J9pKx4UF+G!e2|N{IL|?6Hn$AAFFsom>XMu0-2ZVxj`WS04?Qs)4-lj0bnw;+ zp+L!|bZCx@T<75AHPq~*{>7#;9OAGVfpu4aEHi50V4hR@%mIvaUN8-fdDAd4?@t)g zqZWcgLLl=NI{Qq*3&eYBupe0gI2J$8o09XUP<5$=)+g19!d>a0T|dux@(yG$AEaIt zs#a~WkZ2L3?-r5BaP+CQCH0|f?*i}!ILvR`tjn2ZCdpMGW{?u~C*G4QPj0daa0Qz! z2k`KBI#8KQcpN0*pwGO@N-`6@nfel7>wI^c94Si7-uv)|R#qVJb_fr=4(Pu472bA0 z^t_Nhb%J#o`P30x>g%itUpv9Y*hb_5NjtC=-qjdubxSA}19IX3@+z9Oy5@h!vt(l9 z*;x=DUtK>$j~*A48rlH176zOIyl@?xy8`x5x};qJxyPiT%L~QUl^8w=j1kS zKC26ksn{XhWkMWw@J-qoIwdv)vZiRU9cGA<4^|lQ;mU|IC>|J-=Er|!m~$Moz@mYL zy4D^Vae9~qsqJrq=HuA8Vtph-INxKXc%G|1hJ&eHYq!Yzsovea?=7UX{hE5dQ5PJA z)5pWb5wmkDb!Hqkg_S8TYUT9iS-DmVtt~l`{OulrG{fb*1`-yf6&YonL_s_N3gzFa zcD7%47dt(Cyd_`+%InT~U!jj80ZBp2N`9j#NX?2xp78{)_c_Gq-1{TtPe)r&JB}-b z>&66^{S2?x|foAti7YBVh9dflsUq=hXm9%uvjq2;jOjy-~!3p`K`T^)6IF) z{T<;i_Ta&jHXi;jCiKBOvbj4KtiUau4sV!5@)?JLl^ zZMiKaQ_trYlpgwbe1j*z<@tQ(!xsqbU8ftwpbchjM*LB_twrSqX5r<3LW>b1y=l*CtDJa2qc_d%m>Vb8C2Nz+{o`V=H*oKU?0})&m~iv?TNZBmzc! zekUEU`x&F5mn)@6h3i#6ZR3xFKtvwoJA=}9yue~T+-k0Wl?p&#FDb0MZ$qLa1=tReprwWe2Koz2PJJhi?NT>MBKppTEveVLLAd;_Br5dd z<`UrFUf1opR!}`VTJYc3fn~iBf^ddb0Zz*JtmR|yx#>>`4Jo}2)Q2>GK$N;yIE;#+ zv{tbo%N0C@AN7H0haaQ?$DdQKYU#KHaW)r18S3(~=<*WR$n~AZ3Vm{p3-v(}DOtuW zh-^0(n=8y9^flmZhcC<|f{WfH9_MhY2J1K&5;Cj<(R=UeYzaJNVi>4+m4sCyYGkV6 zGxItAfUos0ZH)LI;LQZ#Z6G7%`!S@rGpG-R`f5=>eCOPjBU;jY6;f%xldOIH6HGgD&#u&z8jqbRN) z21E-z|M3uV3MpZB4{_}HVZ;xE;i;FAug3uJMSM&U&N`YI=C>#s zCT2b`rZqDN`W66Ow9E1~I%rGKsUqEfLARps3s%k( zVsbY$IIxREm4T#%kTS5q#R4+1A*^q~a-JdFeS>FBX6CYe*(V1OG4_!oQyf+~VA(qi zc)FTauBgLp}uZg1lohr75#dM&EyH zYcHn(bSdUG(vlK^?`qXQYxl!ocMQOkn+e^1+o#oK;`kW}G$4Bq%p zZ8MTrdA+!E&hT9+N}k+hLlHJ#3&9 zmv-IV1anbF_D>h@?VNbJ#Z4hQ2LA~r&tky!%mI8eWVr}8bhI{mIgFu^4&;O2p^HVa zcDdNgfNl8}t3k5daPi5M|IsQ>s@uCs!-`BZr2=F43~u<9Fh|5|i$*h9;ypcQ;Br z4GRdk+d6H3hNn&>AK%h55n~})Up*+7 zV7e@`N%pOS=npVXyfH&NhK@5wTLnv(>&+1LIh;(Spg^UW?B z3P>c3tenaS8x1-86Xm6J4O6YvSKWK{31zKpUCk+Fh4hZ5g@cO9)dYd3@R7%MeyFB8 zX)26zgG6Kc#;mwB^ERjoQph31U+7$n`*^wF0}wo~y=%K4O@ zIFic|K4s*}trk{g}ms#MA>@`Ta zH(KeD+^svP8)f^4U{293H{;3lOi77DetLy7n;ipo>ilrnkXCRGw)@vGxwU0IAW>ZR zvz%79rJhFfJzXC44<_rBFhKsL0J+0L-+ZtR(d^JiXm`U$R^FH`j`7Q4m=m{e8@pOg zu3rTWY0Qup-#4Z`YqjAS!=H48f$eNCTQJ*Lu*(6Xga*!sUw*F6IGgH z5FW9D^Pcq1gr5$>(lES910Rh?F#4L<%FQ|&+fp2pzty=keNj!Bhe`*iRW!6j@a{69 zJ|H7t+1syh*W4?_LCKc^ToU)rQ(z*B)Bw7{$vH*6r{HLuJnWN@(nAgpA?2bC5OT?b z&hsamaJD3yY(24#>+hf_wnnXL}6BEny|jGkc6+E(3Mr&v3aP-j#V?*ehfAR!4sDT~KiL zEy+Lsn^imlHt!i|uNy$n5^6&5RHUwBxJZA0hZo+ng|gurQ*FP?M?6m_GcUe5f2T|W z6o7P#Z|-)!m0fMSdTsMB?!WLVKJ@d{A<2YYEbtMl`)yV*g0&4ii%PB98#d{FpXv|} zY%x7Qj|TMK)>`7i@IOCQqp!nZ#Q*X@jRlEplcv9$HNCqCx?NTchho_T{w`mG{6q#~ zOKX6B`(c*kzJB<@wp@~C$qCh9%{Jkjr(|D9$$8Ji`MTEtH(k*NIng@lkX+j#1eYYe z0dM0z`u9XGE8i=4Es?f%>UH6~CP4NfA zLk8MAbS7to9mDfK&6`dx_WFkv4r0}I@3!CeSEKs{U~7&uTb+`3jdQ#rW85A_FlLuV zryB&m%a|$*ysi>}*oxZ8InNZf-^&7<<5OKw(+rxPI8;@7R0~ zji;iATVvWf@i@>*WCzGJ5w4Rin}#Yp(Rm+q56_0Y@=RFBC0KI)@YF>(D|KN=-g?_~ zb!v7vU5G-yZ0ci)3EK+^jn7ZvC1cNs_?mO5Iw@KM*U-xyL3J&xwqXzA@6D9F_YV2Ck4(+JT4OX|>LcC%s8K`!mF*ueO-d zKYbA2mG)q|FtR;Lhg{EhK(cx-+{OhUamjSDb9a!bMHBs#Yf>#H)DipSQyi`+;)5#U z1Ca;f!G&H1>Tx_7h)mCp)#|Nc*O#Cd5+eV5Y03FHU^!5-nc~5_iQP5KKE z3PXRrj1AU{Hx+&OTKWa2xxHjEc7<73Ba-?TpUM*SM{zx8 z*Bpz!LoQHv)GAPMm8J`U=olX|@Se+^AHec$$`V+CW6>|EMZLRi+N|%GqOvTy zrLAoFji1YulJXa|;o1|S>|Gamap)`0W&I42)(JWNPpr;oB*2w(1-9XPSqt?VgE36b zgPJIE->sM&)TTd2@Xb`Dx_V! zH*aT-n%EG@Y&-l#8vTfDY5OY2IDiA2ixxIoJgy4e_Hd^EOw6JXIffg{rF4X5s}XN^ zr8+{Vm&J+;Kt`UpiW(wqR~o7XqAOS`&q>dQF((UXs-hv)QVik2YbW}==MwVL)V4)> zz1bqo@I=}w1r<}oruk~D@%GwVx0EuJQcU+a+n9e4VvY97{?VMYleYy->^g)A{r%2# zXsf3rk23^!ZxXQLSvZpjKv)?-^WLvvNXIpY2z5W~B046YVBl84kdDsNAcdm(ZvOqaCTjWoH!m~v~aYXu=Ed|Q@Bf}9WyJP?v7Ar*OI1N~Wh|$Vj5;vzrWu$w< zTYbtF8=M&7eD8-zP|UekmSgvbVLwlFrn=Ar`NB&|oFr=y zvA{&aM?2r*+5k4#=8i-gazxwlA7;?BtqY_7hf28j|6Je1V%tQ7O2UzXKqTiOpMJ@q zMvS{`3io76!mSc$tMdfNaX|WTzTtFF$kJT$OZ_#BK1-0=AV=Qz^=At^|A@iJK2z#> z3VcFmO7H%B#ArCrRaAS%=~o49fcRhY6wO3SQB54$jUyYi24dh?T0sp0RgCUqn#!%+ z1A;%7AX(*iedb4o(cuZ9eIFnJTa3z{E*@FU<)P6b+oED+_zD#b)790C?*vMtf?o#F zg58|);tb51C&lf)&SXH4ve+)jMhOiJ5a>oS zqp&p87>r#c^zr}&Gc5b`o9Fk68rn^(|3w1^dP_R4sE674{@VVzC!8R)a4r0VoSlaSV$v+~w}h0}-o3EJU}UahOnzNXZ0gM3t?C7C`L+a6PR=%YYA(;- zZSCbPIjb)t{MRN}#JwW}NVra5LrUHfp)291RcoMD$Z*!|P9Zu5p)vDh zr1+*`Ocj$Xo-IxxE5K#^(=42$+zqL%b8n9-j(oP94Zd^ zs0yG;xM+|8bB}TQ9DB|z_AgLjtUL8~-N03E`%&nX8J{fv0+T5Fg6hEITGy4I*u7%5 zHT~UtBK3;twiME;GMi1xnnMxz)qrf}q@I**RM1M5Rt-zl#QiM;PSXHxYc>?Qg6(jl z8ObFlfKB>aNll7?R6UKw4w`0$8j}Y-Kz`RzvFh}dY(dvsta%i>KM`w$`a8% zeBXvv?h&1cc_Ga_ux9-$Utn~FapU^5?UM^5G0haWLP;@cnx^C&i<;1PHOZa1G*H%B z(KaP6CQ^fT(!q%!$o`y|nD6LfDmZ>oPmwo#$(sIf7*OKheuA;Ji*a9% zHdJ(3W8|ooH;3HEqG0G1qzlQEMz-RtiFe6`VZg~Cx>Sx#T?Ez9H?RY#BibG@z=h^^ zXy;A3lu(G>6|(^(RF)QQM^XwFU$;Lu7nPtO$0p?bk3%^=^iB}EI0WwDx@*vqwbN_#0G5sV_YLsAo%a7w$;G9G{`VkX#L=BJ@z zSF3?2;oV%-;9NsY9|L-*IW@u@p^E)E)be;;CIV-;Jl98s#0cB8$=`;0u=sO3`^I@q zq1>kOEV5WSl2iJkYS&L0WCuK6NdAN%X|mf1f@wL@abs(E>zn9G;b=5v=xP=|8A11Z zLY7O|2EDIN5gh4kR5dn#L571l|Ef#`Ga~7BjF`@ zSAP{X}Rzy$l!(Y1A4AcSwmr)!@!WfWiqhEy#LV3G+B zU%5B(EvoJ-1jjILKNW?W_edf;1T3nCLf_((ephZ$CI_{t_pLd;gH2$PH5l&R@pEL8Tq3p;nRguA(iSGYAQLIB{6|y8HgfZnrw6?n*!T*o$bkk+ zr=H2l4eCIV4)9Gj3FC8l{zAi4qT$W;LpSI7#XLOshJmTf-tAYfHd7h9N04VHhBF@g z$2P{bA=OnCS@q_dkZYQ+IDNzK0Y^)_bs@?1my$yR*86WA01|Ty-)#W(EZ;nEutC+d zX9(NUZ&pR>ODeuAUTDejUM7(%w2gQ9{C5J6Ni>yd|9zBZh(gvsm#nASP(M(OmRHVy zH8J}}?-PcrH}tf>V+DfW@UKi4^Utb?Qb*o(^++s?eNU;0w58IpQtZ{SBv^lL#Q;it zpc@cv&eio(C+R_v?Tz;{KVVLZJ~*U3pPSbvLJ&sVJ~RFK6u9d7!QmoPuArbVHqdt? zeC8zXDbh9`<$mgm@0OJbo#ba9vQ{k(2GV~hCn^7d7~0w3B>Sj6A0txL$Je<^f*#Kl z_0Uz=zItMuWD?mMgQLU4v5Dx;2?))9x1CSBEis?}ar{WG8N}mKe)Z&5hd(n1SY9DT z>*#w7(VsgHynZ+tffsYYLUw7wq$a)%zu>NJ&)Csz!rY7X4wxVUGC>wC!eLNL^bA>6Gt5}o8a<7^NN@PxX*|KwODe(|L z5!jH5p!)hux$crYvID_Xd8R)*jt&PvDq@A0{5~_~{ABdiDaT8=w{T9qn0+GVZ>0Z} zBl>|Lr-2KiVMV82g5E=As(tUh-oV7OP7^2nhD+0_;U3+t8LMb>oCUYLd_-W0*RCaZ zM;egaa%x(xeDgyuL3O4>jT(WE#LJ4KhfB4<$oMry||mIfO%ZNQ1O=cm0R=TmM?PX6~5ro)ddt zyRPjYdq_s*DEcOCxf|SRn5euYYSg7e&tT=9>Af(VhYyNlXAP&g;P|iIeic`=q1u6+ zK6f04Lv7hO-*GU1X>IEI%kIB=OcT`fBK%!44u0y|_gb|6WroqgBr&wgXK z>;E)g!zy+GM$$@X%__y$9;2j);&K1HmetdcKF z3b}iERep46w&Fme_RRQIs99NWKY>WF%v5jAnPCxX8RB(X#(Q21&DMGcQDhp)wxbVU z+VYXSi=c0cvWi;>?neG4A(uf0efGd3I1T4Wwya6o!IF=rRdj@Ww(NrI=DlsS$vbL+ z-<^+WbGf_GgR$T^xREK)x$K5H^O?U>d(f%R`Mlle(&9G+zkyRKyu*>trCtGv;G!Zr z=M{09o<^@9a{|!orY~@}c~j7qSKXkb;{ckFSq5KP>C;0Z-bU#0k#aVOldqCQSnQe9 zZDLVLk+nG6p7BbQ3?qNfhW+*I3ZTNKC>@S^CG&^7_MK09C{!i7-v9l62AxU6_&Q9} zD#MBrW=t*Vmc~881C9i~L_K%XAt8Hi1a4V=y@}Syu!H)di&LS2iDaB-j2 ze|ZVqSS$B)mciDnwP)T1ayIys8Bte+=jTV{7-9I%Nkf2Y(3AM1$dqF6@f{lBzAL~c z`*Lu!%g2x36$dmGmi5Zp3TOS}9S&j~y6i33my7y(783he_f*CKBy`L=UfqhDLi_q+ zVmY{!k3dFP4zr%&&#L*3;d0MHTp#yQ00f`UYy39&8EgFaKh!YirdZQDGS&t*RHGPm zC$5g5Jt2@Aqxq8RHJQ)m;D>*FvVkCBt4>u~)#IJpEGgLe$#pmjpR;kNYWp+uVy^V_ zZ5_Abgp7r`Bil8ZopXt6EceOGB9)C;cFQ;AtRhcngp9}7SVql)S}@5bwbzI`1e_~? z_+w?9K6zY`P~_~VafwItIoWjED_z%OMa*>jrqimI_#=Zat!0D`%0}f==0O1$!AY)P zq*niAthC?pAU|s0$}eXY^p=vz9SP;kjj55=A@(vaRwUDsrJW25 z9z>7iy*d@k?uOc2Qo)ugQ|O)EM7EHI?##@%<{=*?kHg6Wx_Y$ujIXrng}o^=z9iPC zlu;$LL6%+M7=D}2>ZoK@JKy0*r!hSd>k2@F?591F3^AtkB^-1t@jUAdCqDfxTmF}L z2@;=*vp;5AU`X22A`4u9Yv2}HThx)+J8d~8y|2{nu7>w%Y^ysLFFSj0j7JIaL>p3e zzVsoh&3?IKdGlZEUpy!j*7!r1bky^o-)<%vA-!2~7h!cGd<5O^wib=B#|ZvM*$#Co znpkyJu0kBM6y<>C;Em#zI2>MxwA1X}*n zVPs(Q64y{2cE}x{sAXYH{m$bI=zW`0P1I8sp}r$dMdtIZ*YEHa#al36EnFeZ%ehFG zGV98`{P=|G%3i6PUab^3#4AV;G{qEQFa0nD+xNE^tgiR#muMV;4+m*NVHM0q2Fw5I zMNsx%f&ljZjaqQ#q5PxFA_g%U8U}Di44gqVdQM7fyWzgKlaE@4Bvut+>RWhW_7BxK zHr%%>Pe*1Y!;H9ajb>vjkPz=o{i#pd=X`ut%81xijQ?KNUbxk8(#AF8`E3Y)>zhs6 zcbqcK+h*B1_rd_h37?dyN`Usl6j^LrG5@!{oPH393sx4`G1NHTbc^?g9`%NKL5B7|1#YyOP?Ke7h`3PA|6Npg8snT{C zSqORt4<8|cV$rMkS-H=ALip2gJ|T}e?6^%K{RQJ+FS1mB%1ti8BSIr0+&{I3McmJ{ zANVwk?uSKyrJN7#-$~?8X;bBET3b0LqdSR6_(3Hb3x(W zVq?c4k{oG8)@`#+KrI9?8+WV{nkRo3y3|X# zn>O^HO+sjUVaezcrQV0~z)+R9X&Hv2`VI+ibr3BTOey197(2CG88>%hqL83j6pKwd zc-QroqiEf?<@uHdeIskEr#dM>CKzWmPi!taFv>;cX}pA8O}bj(gclYYinrw1VR*!j ze|)m!8%E+Gga0EM2=lLJn$i&|;NDan%TQ?c*%Nf}906xLZtdmIIhd$gQW_*gwi1?k z|0ML^|H@Fy{ek_(hzd`a=m!uHOr`cb{82{>6Cvw{Bb!Egq__sf9U7WDRBIfszrvM3 zPD#~%uKur#m^QKO0G^Oz$_eFQdT+6>&#B3eK3Ow?%_J*EB|DonEg-#m!w^75c?}aY zAQM0J8R?FRrPUudB5(h7*N|oP{gv9T-)CDKr1veX_4ViH;g!^!ajl3)(4#dl;Bq1up4_1rU zevJ^pFB}=n)W13|FX`Z0C|)Sd*)ehSDV3UvQh0k*4z=s5ZOP;72OXf>^+D8aBkH(u zDBg}Q<*@ZyMC5i1dO_Wbpi?O)(hZ<6MlrUyd!4F*AM?Dma#GRb2Y^2z^xqA&k&f1Y z)A%gEE`fHN9BAh&`!nADW~tyzcQ6c~0AJ@h=&B_3sWx$B)EFC8z?00U0bE?Rc|@;i zX-M*I$q3j04R`Xv&!3z6pPBJuUnby6uS`Cc^7;J=_0HLJr_Yr6A^{g7JE2OlEtie_ zUG`t1Fsb>S{D5T)g0>sQ5oMKpQ8%LCr*agBO2WGm^WDn?Y*GV^d?(mY;$IPoc1p-5 zBsF(k1)GeaYvMCT57~jd$VveVA%#gs{cA>3O6=BpD=bOR+URs~c&$Rua2JRFAAkF| zBe{CT8!t=p!l~z&>T!TI(D!rCVys3)Ya>|2Hs@vX2J7Fg3K~ulf_3) zejNO&kys}eRma$wF@dk{VEp95QH!ZcK_CZgB+0HNjs5)_dm_Dea z-}4zf6pm<{jBjTRN~Z@Nwu`}v>AsI|#e*~Nu0J;pDW|RuKcR}~_vhIAoVchqyz4C8->DGg1O~xeZc;9ZVJWI#=HZL4DiNDrM!$=;3Fa-xm1n)19m8Gv zmk`18-~Wjo=XDJ@ih&8^PP@OkL8p?!{Fw#(yM9q~-anTU8>P0m_qwcsXF-87zhmSE zq}Q}!fukbw9z?>ujPWX($%u=HGO%fs!JUAl#L}Uubvl(Y|FeU<^xIu9rxg@1(mTr{ z0mD@UpTjtc^l9WMlhJxe3k3`!EB_M2{ZbfSnOJ76;|Apm6qIByNkhFlLQZ-}?A1ke z-YWS}#BpQ1qmG*IjG)L?&WVhk@BF7yF#C_!&~%3ritDFJ=Y51!>18@3cpu?4;D5c! z8KKJ`NO#P%sAAMJP%@_& zt^8IjZ?Z9(?((~gdz2X0aAWlHKSbc&i_-+uziV}i=G6F%G-X^s@Ytn&vdS0fW%sC*IQ<~NniaMC3 z13^I#?qbo+8J8}A$lZE_)GR+%DFvLc@3H{SNC;c^xfYn;G3%x&?szWhvS(kaI=f@$ z_PGid1Gn~KSKUW@^Wq;d;z!PIpJ|wikvWZ57HwPVm{FCULo(a(cJ9!>V9IjX@xEXOU&)o>rRt zzD(F>YTI zim0g@lJj|guW?@G;t9KIQ3#sd8(HeU<8Sk(UfW#R8$m9N8i5feUu@FwR9?NsGbXu8;c?w%N?^f8%v%rQpTx5fO_foR`!lrx*qS3LFXcez&+4C zZy>@E&q+~UZGo*Sf4=EQe<{;6YqMOByFjvkc6J<4Q!j+=`zk)7^wdX~Y}8q!_B?#S zfvIDlUg&SPsJI{z?$)g*^~ynfe>qFDf`5*c^~PPp2#A=ZPPIlK|Ek0+~h7-Qw-N)a4PpT2ByS zQ4%RtOJACnimb(KN)tGPDK*jmdD5e+r1mzA&MWo>M(c;(%-0*Tkq!O1eM%)tN0&1h z4b4(XN8yq%&wNz}Z^r&8&t(ag3xnbNV!57^9(#wt{rj!j+vPi5F~wNg8`m6-%Uy*+ zu*!p!!JBPYybg^!O&{SHgxJ9^BbX=OB|TcxY+*S-m0LGL_x)XC%GYs=Eyl&bg++b5 zW554q@bE)K8@UaX=);iLUM-g{fD4`L+m2cHK6{d16W;U;dQn9LE$ZF4`ooNg{hNOw z9gM2?`b_`n{OX9hk^XPdesxoT=m}!r&cBtpO9?#5GZvYXSt@i=tRAGe0@}b=ccVx6U=gfA1=M$qTqUsAK1n`3%j?*r*&kVXfCZPz6ufS zOw|wCFwhV8MgH}xC6f-bV=^9gn@@YjQ_nwg{&5L=f$@%s)nI4HZ|iJ}Rk8#J%z~rJ z^sa#qV(0AT99Ls=+&LS`whkk2mV6@Wix@eJ%Wa>DUDz8=c#FRr$+l{iKD$t4Iydl`M39tYwX0HRr)Q55{W2c4HtZtY>vko^N!!|{U)B+tV!JOcI#=;e( z6=YYTyrYWUJGMHw7nk5hny2u4$38z#&uhbldS&s-;ufu9y7AcSrf!TK|1!_9xqp3~36E zX$B(R=Gqt#=`-1dU8?0|Z2~2iv^2Mw@-m?GZaRH2sAXKz#AZN+Po=x=@8C~28=Dv| zq>PDHpiX};%<(+Q47{NZ`v=sXZA#a`N0O1HC-<_(kGZFTU~D29L6KfbJDgq+`ME8@ zAUc~eM8FxoH8(q2-ulOZ$zS?zFFf$(i=jFOWlwIFvZ%>+ZA?0A0ji9U12GB;_q&;Z z=N&>R_5M(pI?OXE7wj{UTrX!&^-G4FQ2ied!ZYHiCsSoJruKK1a(t(HtriC#`*&`P z*4$pEFP*W>URmz6->P4G@$-XzC?cS}j)z69nq>Z>M7L$x?^xXt`Jy#r>W z4o1wvxr-5)0i6JmV!$fiu&(C~CB1>Xo{lZFU&cXXD%5YioOQ+fa5be_($M3|>kmEA zo*1*MKzcUR+5)d+MY&LzbAK5Sqyn8kn?IZi3@%-0gGo)B0XVdTZSs=;$3;IF&3;a; zl^OaPxF?xw!uE##wWvAJcXeK=xS7}*X9I>oJS#4O$@g@?7#IecGd>c8RjxLP#YCYX z_h^{A1R1G317N%tpArE1F8|S_EpPrg1OW1*~?NiV5=0!iBtR+cx*_K*H?}n>w5fxJ^@J-|C%73Eb-?Y@m%Y z9(%sJq}sR?WYx+zBDD6T)ZkF@2^8v8nd@X=&C6^_Bs{3 zWY!#r)+jcq)-4y}T|#`}%aoJ4Zb~2Vzy4iZU9L+=Uv$ROSTU2k1Ee<^UIFep%QX;S ztr&VRZsloZQ0sg9>*1~JQ9x}n1PuVwij9bcpqKXyG>KK8@H~C-oih}&q>0n)5p19*CIrskR`-LMxOo0wv`tuG`^F3q1QgP(0t;tgH$5QsO0hI~hA`d}( z1Nl>k-dp?~=fpO!LZM5)t-cWq+=5p8rAlB`f9OluKFU|J$W=z(55?eoi6G<1x?%E9jC{l1hl5xLnwV?PP<34Kz}IJ4IS*+!1P9 znLt~t8l0JwIx9ndv3H#m2f%PVF}-^Xh$vd-+44l!PJv(UzzTw9?3hwVua#>xH~)Sf zac_@IW_)EL*c$#@Cp#?bDN*sTY=V^Y|JF-)cDsyFVe?kDM#We10`-fAMk&V#*=~$6 z>#lnN4OTBjjU}4`-slg!A1c9*E}1lAaQ7*QPS=Get%8YQwztO3mST`{@ky2A9kMhjMYcl(yVO%FEEM6XQ5P^=WMTYN<9*)hwJMZOHL z@z-u{8F0-eHmZqVzUMoenVTM2&zH)qsFRtKz(84S<5r35~Ji0TK#oRrz2Qk*s`lOy!nlkCsH$dXKL4QY={S1WrE%|;bz4|W%r z^sIUzN}@lH>64ISV;ftL?}YIMI%R@)Ur%*>1V5eVn=#;Mj$oy+(kHd5c)b{xBJD{i z_^LS=hjX%`Pb90vL6|zEH$M7DTAe|*AU=vAR~MK-g|G+a8sv^7UAG34sX|S!Ohv73 z&v#BU8I4(&`=WTMXpLipbhM9UEWfg^1R;HxsohO%hptaA?Z-^I9`FivRVJx z{|q7xR(oPcZ4L?N$Ed8Cm%7mJGr0yGDqgS;86_GxRrX(Pe<4Vi>FYg1m}y@Eu{K*Y zD$~FbE2Y}>Q7U>XuvZ4R7dx1tALUu~qd`SAW?U|H-d6kfxPCfvL93FZGJCow2nyNz zIw$o>xJf`1yPT?2#Wx4uxHeZWO*lH-zIE1x&cORykYPFb2Z3h@1;!{l5W1e zie_@_1i=R>P6DzDptQ@R$wJJMqSIC2=atb*y=J2_?R|q}vKOWz+Pv|LX~hckjhs$W zK6LhUOm!jsMmfvfnD%u0TsB0~N(bmKt9vDssuE=+8#`WpIG?Hf&?USJ=pJGnv8f%j zz-qTHP7M%it39#li;HTSEdjnA3ZN{*C}^sHved594^|0Mo&{l5TfGt>F-UG?+ArB$ z1c(0sj}6}}nSBrnn@eld!kiyHt<)|D@h4HiA z3}n}T&c;%Q;f{1CR7HK=YK!Y_@!({70SS^xME&JSK^Cy3DR+Hkm5nXFyEVSrD0`$} zN6)m_Cdm3m_Ln{uzd%H9Y@Q+3DZccf11J6jBE0JNJZu!du}D>lN}o0h2jJJge_rz* z;TUFvkguj0T;q<_YMiS?C|9McR=bl!Psin!AcNugjd_h${M#6@w^cTA6+210fUadm zbf&k$qDCyK&2c_+3;Uw~3 zOTgarHP`nrK;OcCNOGo6Bb13itkkD{ti)Hfh&Fdc{>~HszWDVTfAu*4q#M9;KRZsl z7EH0+dB~-4*uBI_Qr_g2bBtZt_mT^K-nzdFyf7GPqrgZM6U^CTsm}=ew0qfptOhh- z4>2hUrS-lOpVxUTu3)sV_V3=$LQ03L@><*f=d`(*SXePXDAF`CR<7NzjiFTrKo)Vi zUoZjI$)532exAZ!Z4C6(`VOsTj|U`=g$77rM>3@dlZyULVijU|HT|>)WOPQ9Xwo<& z3qKLKs0i0*ZaJ_bdhRT&`yJJ|8vZ2nr{>#;8o5}ve4r!^Ri7_?%{7ZWJ{;qvyXoXB zNftk>>n{_cU778D<304xuX)l0E~Inf076lDNJ6!=ktJ--9JebnszG0_97_+WVDAMJ zcxME07K)=DWFrVkc%nn)Tr6C#_9zWVqY`(`|GD-QLY9dTwmgy(l}FcOTNWC1`TtCT zj4FBkX7c*44jFyw(55rhb$yql;uhG(jtw}FhZrf07xv-N*}mW(T2$!@@UXA+3O%iK z?Yh1{4Pw2^tBbj;>gHS?>NKr>QN=U8VorLQx}_uV(&3z2!M#LdsDbCw6urY{X!9Yv z!}!w?-xr>nEB!)L$N$u}$ccPk!z-16pWA_v<~7-#UWaFgzsT(-zjfyR*HwUn&r072 z-+2v$Heb2}yu8RjqRBHZ`XK1fds3RQ7vGk4s4RvEUuzDYHjucqj*PR=-g)(hPp^Jk zJqB>E;r{PV4&qnGh@+wW&6}Sh0PLNT=z2^M^j!0joq-EcK0e|%mod3ErzWpR^cCMh z)a5OImlgQe`?uvy0@vIn=JMOcbU=&d+Pq~F!}V<4C0MZ}ReC$_Ltq-AZ7$f1trjtW z?Ac@UqvB~rXf_vXu$+&ash~2@{6w#(XV+Tt*x%?8H;d~W#gdpgoG*oLkhYt70;=x0 z64vE2n6TenZ_^cUX$)``6pCGeA#?G_k8?T&dvti85muHdhG4DD=0KjgH+AW!2tm59iDtUFLO#l0 zP^eThte^+Qacw#h9UD#ZHC;yIYP~=okNzOQM=40M4H$CS2g~=!_-l3{#{9G*=hi>3 zN2^2XyVmEeq~w;#$XCcL4hs9f4X^38%q~=dhDd;>$tGmUyjw5DEqiLJi9)`&Ul2ni zr91z$<#6$aB6W)F{pQAa!Xn&r!Ly zWriKCBbPxS!8r%n8K?*oJj=Op>rsrx$X7)DD5dX37g_-p>YtXPjhJP_*R=TI&!$unPYEq`kI zP5eiZhWEjrH}T=h0{>)mssonC(Qogmx@<$J?P`8&IN!5^rVpQR-PbvT5QY;_!V7rw z2%Sg|P3hKAGVW}pJadFRC?w;?X%&GCeu@8x?W0H)XW7vD-z$i6K_>oX>878eo0y-V2^%_<5alB>l4Iypc#56(YsR{d-wQlSfYTc zac5bo#nf?pL{=l?{T9huhL+(AVx(H?uYF=F8S4^~#Boi+<;~^U+J8qiU;Qio1T!e8 zF@5oR%F^jDvX=c=n(?X*ETSuxiZwl#Rv+W%k{9AU8r^?$pH(3N;T{>E`qNjoQJv?C zB3hZYTTqe7pNxe6*qw3I25h|b_#Hkqe>YADaH{AdRuf!|@0V_w@2xnN^Ou}-r;qX@ z>xoFLm43uS5U$Fl%|#j#Uyvmc_JsBFePDF0h8U+0%^Jd;i4DKAIkSU^f&`s)6WH;3 z`~SEz5|PSuUgr_G^u(RyGv)&Rw+6t2HAu{piTjCj{+{r|i2;>Na&v?qi#wa`Ik;>T3gb4+H2A{jGE;yW5#$y>AR><_ zX6@6v(I24FL%wRJ)VtWJoIfaG$P`{9t*7txm&Sp)+RNzVbLopw!*P>@oqZz!l1+V z^EDwRiLKh%C7GBNpIr*4p}~T3*S@)%c?vE)ywnP8HyV3_^(%UT$#pxBMN7i=^eQev z;NJ%-saMNvUHeswNR*@R>?vZ04Q3>-Q8 z9sv0G1r)RA9MMx%46rg7WCvIsVPiS)U3V2g$<0Q5pS4b(KZpOM+0F>Gzp9JdTFFcS z`PM61yXYn(bv2)jo@YNPPQ&La{*eKa(j-LxEXg2#KcdIWwQ^_a7^B&C4B#pUL=X-_ zKymL!0^fY2>8v+fdQ>ort~<+zS}7_M(n`sU8o5ODR+FfXL}#Vf4m?O&mdTOFyoI{o zb^d@X$|7mzEw1P0(?N@uS5J`J;X*rWksn_fn7rqLl%hIv`UWhYOBq~Xn`-c5diGpj zTrMDg&ca&HR_R|wxTeaUfmvzUy*c^Pr%hKfFP^QFJtCE4Wa*lpgDx#!4a9zqz1FAT zY<(3I4L0`U-wX<lR#kCfyLT-zC5YO>%#BEEFH^WKMc5{MGG060h`48%vF`<_XqglXNFB93u7SDmir6R zLSg?9Rc`D{z9u08O1O?@qT-WudY!sFZ6Fi|akT+nI_X9i((_MvT{jK#37JXCuYe1` zXs1ow3m zoHnVaC4RoG2st{-W7L=~xv81~h*!h&f(Ypu|8eT|lXYAcPjWxXQ1ZuVOlrdNi7#og z<73p790C->(diJ9PC=O1O^v95_6)UEi(uh{V-;Gu%IMJWEYgav=>#68uNN zzh|{BJ)Gl{LCP5k#M29FaVyq2(Rb^MPp7e2H2P(2o_tr z_=ua9f?$R_Wu;>&?ut+UBrrp8JlB#;*dOX8y**)qj!A(I${VY>=UaaC*Sw*Y8!qhY zJ>FvB0yp^cE9P~#YP27O;*Zp{SJw6y+$4bc0lmx>`kU9%|EPl|9LlI{d!Zh#N5M(3 zK&B#{*0PibOz&haf+))pUg}AU2FmAO>P2WL%|cl^eO_V|M|$O87abRZG)E)M%YQP+ z+m%Y4keQ0;rcFO z80v;RhGW=9u?GpaJj-F0xcs@#n06hAD}A~~Ov-_E5m@PU{gg@uOYZ$A{FmPq*M!~i zeA1bu&fc9o(080H5|U})Q#^lYe_|QyzAb=BoiXY=6T*glV>BufmVI^L*lP&l)&oXclpF=LmL^79j;{>uzpA8?e3NvV5w*nYSmuJYio(dy zO3Gf~v|8afmgqZYQXC9cJTh#G4Ub$jy9SCo&m!hVUx+T*l$@{KS+e^!?&_ zNl%z18(|S`Ha{3sHsO}z8ACqAe3ESu?S1kDS@x3Z+3N(B!w$wBw7)O12Id#DLi65A zm=I}LK;F*YA$}5{b(#TH|HsSWh^vp8+J2OvaY>}qh*Pa|HfI^urdl(Yr>y_>;h#AU1$gUCfSE+FI4by4&284t@}g&A#sR}SvCo&D2s&@(9% zX5vuw1h2N4-#>j{0C+16*ts9&*#js&?v>dQH9tYOG14~!072Ov1r@GKW$Tkq?z1J0 zWVqg$s1g14#BWaXS6p@x6VQP2f?b3w-`rs_F29Pqe$A{kru)I4H3_r!+J>DT0hyDR z;L-d4tU3Sb71W85@MWVlS|3N*Xk#RF@F`r+gv|$db4;#zoj|0i0En1VtlDNZ7&NiN z&_#BERt@e3FNm8s(6tW}tWdj9-=Z4iziGzBXb2Upqoi?K zLtHg;Qmm}hfGG8_KR`9)vv)QE9pMr!hqatN(VQuomyM!L%>}E^EDm1k#uL)NvsAck`71r~oO46`KqdO(toA<( zw_E9nutLGMI~o{ideb|0xU{?YnKJls)L*JjxhXGXgP*g7xch@uq_U#~a;`gRKzOEQ z^b!3tc<0Cc0}uhD8HENMM0WsjEcknWd#;108Mlw)B}P4D9qN8zL%+CNvt5QOy(d;j z*4()nN%aRsdR~kj?BV0XubGQ>*d=Ko>Tw4J*+6!w?AI1lewm@Po1#lDBj9`mj#6#H z7ze(~L=c+P6h&xK)HB>SAdsu&`v)4JJ_A+yaTSUyouJ-g`f&j5W}SpeiW!gpW>RuM z2qJCIde6Sc(Yh@Q6s6(-klaeu0LJ`a0Qq90{lYmbeasPkIU5+ zO#wJkgG2H|fn)H!Hp<3nHKBp;MD|pQ=^#2-0I%}?3;Nw-tM_<@7O2zW0#`IA-asX# z7oJ8TZ)0L$1=)F1biYd!UWBrgPdZkBhiX7@4Cez`@1{#ML&{_m{m+3>0o5^+^+YC> zUFT}b9bCFlk1{w&p`)N1=>XTbWt=ETnbiJ8VVaT^fpGZtAJ z0+^J7Glh&B3*$5PHE9Qb6+eFbS7Yi)>zj0NLWQcV`E8&{sRR>($ygb(4{@YU6IXGm zn)q9i-K)Q{Y~rRd-*3l?fByJ@f|ir!fC2>Q6FLf=I&F z9Vk`}PFXnUewP$7L44~GqFy^02Socfd;H`2<%KGPr@8axQ+1cVCxW#_cg?w^U zq6^QlYp=nT8~ca(OW>>e{&zgdt;d+21rAPKxgSAu0Uvvdr_%jp0w(5h5>kMr#!+7q zM)QBh1H$8wu6l{5X-u+dchA5K^$jn z(eTQ_xetLqwMxxPMef%|)Z#h!aPkDDSftV3Wj_l@CH3v4ay7AT`9^ZG#6smqU!N-( zR~rw$Y1m5+4S_zbtH;np(Mn2mGkQO|W^gtAmZMJ3K4|63CQbB-G-H$0o&dx)A50MGzryP&|rKbH&1_j&c~{@De7$atr<-Q{9RYDPY)V~*j|rvD$E!V7+V*Q6a)#T= zs-getN?aq9srP(?+!+(H#i=GNtR;8`*=A6{D0|{}{E-9sG#BJ%XTeRzTvb*w@pDk! z9{YXvB0@%huZk&T_7N-Yc+&{aI9_aegy8s<7cX9-(J;>tS0mZZ=i;gU(xNwd5B;EG zbQf_K-(cs6SzSfzcU+%Ocz>s-tbPPXtW}~7lsslk`zd$Wx!BOKlPy0()^K~~K;?IP zw?;T^CBAbAN#*ZjnQ6t^7+oV2=)jsvGgMOHumWjDK6R;d=xnKt32IHaY{n_N@=J>> zgd_{osz25ssf9KyAUJy!=8Ipbu2so?&XZl@k>unbV3AiS`|>_QRj!Ga458Wg6-z+CZ!`2t#s?4`fP zjgD?R$VI}l-t+Fu^w9H@BWaJWsR8AzcAc^}SNfJw+_k<^al3a(w&rxBfGoLB*UpwM zmRNPWj*&c1_}yd!p@dv#hB$F*6H__9FC6+etqFhVV8W zer<*`JUi3A#6*o&W%RDk5@n6@HMS1;%Fi$~KL&sgqZxli7tAgF<)%MC_#)3#-@+-ib9$8KjZc)(p&R; zaczpenDmCzJjlsN5AQ?#1gjS6ej~p>t#Ng4piX{k$|cjRwC2ZGy|LF2!O4J*y49&J1d=(Hb8rPw;~@ z#r+3K-Cb9)wf__+T<9U^(hxwUalfi3(`Kvhe+YTTg2TxCk+tNCFG`Ksktk-BcjsWcmoPk6=oDT(Cp#HDB%c6ist=|3QLf2+rxFtbee zy|cmXRArJH9Rqxy3rrF=j`9(EjXW40dd81|Z`PIlKQ6$Faas0EPZ4P{~v_XCD{^eqN&012HF3r#^jEme`>KUh=J16g_dpWaJD>@IQJqS#oH zue9r=Lw3_^;t0DCg#C6#)fW_LpYA>}BLAz2zGSmwJa!2-`RNsB4D(5K&rzuN6PB90 zK9Z;V(A?5K0v#hcKwlyLRx0_m9Y3x7*<_s`*$L{9Hs@U!w5kJ3`hxW-wgY5HZ|~9% zngfnIG>Az94V#SJKeKg^2NOkbdSBWeF^Z<##BXfde0@%YCRIN8K;*$Ft0_o+t!q3N zi4*Tr%M+$l(LS$Q)fXOtkKS-(#q2eeejWF6mKHS4@u zgR73kgM4c%9};8eePExv&NNAvxJ7d=V@Rc{YTLU%(0kj9c4VDt3PxY+7#|FDr5#Cd zOtUJVubx%@BJhj+));72+YM1Hr2afCP(bZPjl zmpyWDL|uR)8%vFhVR*C!6Xg2I-=?An6KxE(RINWM<1S_G(}fWx1{iF{h@6Ow`ZTm3 z0UYh_MpQ^;s-m*MZRSoddhInC@L0@`1UDvBsJQAeXVm60WWpw=!VkPPBWmKfwMSpZ6C>ppNhQn6O!6Bwi&Ji}N zb>WE;_=98k+ct{v*VpTOK?1_M(2JuoeNQl6ArYFS=1zjd+_&2OTpK>cF&ZU0i9YP3 zfJ~?A%@9_m;InXaaWw4=kT&MFCc=jBu%Jay>Ig4lNlW@Z4Ra)AtGbcJz83<=dyuDL zBA{!ZK-$v6aq;)y!3OLqFz&|_^NlHkwU5qrVTASg6SI#5Bga8{O$*VW*fuk|fw3f( zf#hK~nr16?NoHPx*M(uJJB-lCz!=STS4-s;&G#5tOkosKW0X{HO%?2h;ewo&=nltF z+qP@YDmb5IC}-89Gcy?B=H!#8lFDvP&r@->RK0EB7psDwW=|{vy9yK=KQ=~Y%_$HYZIxj6EaKS;|8MN&hTIyNI&b{v1VA_K96`j6Z{F|8Fh!@o9-~NUSgi z#1;@W7Tp__tni4sbi7}PK<(iAuZknS_&Lro^?yEtok0XSbp-CWn zRPL0$o@A8!cR$Dz`6DY{we=4bP@hMe7SiE!8yuL(fI48b%Bf<$~ zf~*i?TqD6ss)L*OOE}2B@NA_s3R+|!AX0t%6>VxmDbq6EM7ipJ?QTw*rm$vntOyl( zS8DNd9$j2GgGk0JcnW8Yc>IC^xp+gs4~V)pWVV47K28&0i8Zb25t<~~C5fyk;mtSi z2^k+;e_B}bY#3SK_5ey)QeHKzOby&_SuXpjmesQFhtdTecQPUJ@sG*6Z9KxNjIzc-snkUlanDGzj?*dOW z*Z&8nAqe#SR@dtn42Tsc6SSAGQ1C$WMiK*SMK^+-bYDAYcZ)h)ix!!J);cW`NavAH zREAtvnY*P&L3tJ%*pDul|9M>mE}5XalnSUkI^>Hj{t5Kyk%u8A|9 zaclv9*Q968m^2mS2|eG{*!pG}muw;Oac3oneyl0t;*2Raq;TxJPLhc~MH$R3{a71U z8iW%GKUfwx%*VrGlbqVx#X@exTPMKZjr!V5Uy);=--Lea+XNkgpDKEaGkBi_osyDG z;gsC%Zpol33MD}g>g!D;dHXObZsdN)F&czl4D17s3pEG{xN7Ovt~Ce?Il*g!2B99O zm|BwRjE(=-|GsZVKGk!Q39khoiaUt+jeB}~yQWz!`&R?>KqzA?Iuv*=*;}o}@Ml%S zFy@G@NG63;7UQ|?>Kl%zuQZRB`VH&bv82adJOy0P(ge!aJ6LRCW%!3|;KMHeOah@n zH}nI~&W>Z342q7Hnmf}14i@DEDO$C@Peu~L%Hh&W>yB4bBJj-UJ@rSo(05advrZMJ z`7wj|gXjmL6_fr3MgO(fP4a1YWeQMEGU0|ciI?&dFSDXrv)?Q?muS|BzY7Q5DYzS7 zUa5z#fih6*#+T$WIBAErd)9WlR019y0^tz}F*lXgUBM{WFH3lh%a+Vv%m-}ZtUK(x zRMOd*)Zua0-EsqfYe64I8t{zIXO-GMxp!Xro1b2 zjnzwt!ZH?W&XV~r7R|b&4}SHgv>oB#t@v|3^h999nMB|OnE2Jtca(`Cv9x5dxfiDf z4~F(MNiP!>|4ZYGb**iW+N){pehL__xWiK~QlYY6*rGjp+x-WQvUDLaJ>dTipLY-Q z&5Sn5B0RCrPdP>jKslMxkwux^h$EZ^)U4`5`3qUA`x5rIlFxSI4!j^wUtGiOKtCV7 zE38@2Hz-Zs#e!wy5<>jw-^j5F{I}aiXyQU*63r8$UxuURcdSQG&;TuQaeBOoP31Fp zP|%0!M*Q9A$yx9CAa7~A5R;aQ*YrG`y0Y-%UA@^|KKUOlRej2DNO`+hN{P+WfI6)9 zcW=e2l}oDHi9nBFlv5E+7li5?@3(J~+On4S;@PnnMQB<>A*p~547+iZ)nisaL_=N9 ze=xF;c@GgSumK+NJn?=IJrny5*gn#suTFK$OO~6)LS2UTku9 z4vi^lh$+vD0d@iJ?D7D@2M(HG)2Lj0xKDL8BR{BOev``xi(ku?a})Jb^c(KT2E!0X zjbF^5N^Y&w3fE$~PV8nWI7O!gm8*KT%N!;kKdfc+|B-YRU{QTfdkG0ymJ%cu_|e@0 zORJ=GcXvyRG>9xE-5@Qclyt|^ozlqC-5vT}|DVs}^Xz5sy?gJRb7tOoXXeavVCTAW zpr;{XDp1$Vo9o18FHU)GT0W?kyLb#% zbz+%Oo2;9h)J6`As5%Ip2_ejiiDUY}IKY0LOf0~TBiB{kYCF}P1N|@QZ-pca;lwiN zvOqq}tqLAnG?2K`tFyWB6&xI>Z?-Ah+H3703OTox*vZkZKwX7wsY_2Yh?=wqrLIj9 z{X@+)lmhSaod~n>*3f1lxc>%tF?jeC2zey{gHHXXFOd;w08{4C*$#Ae%ChUa16`L0 zNSuV{p3ox6tdfT}_XxAO8aV&$)06fe5%JG&?8knYmf8Pqn9GLZcu>Yn9)mTkHW2Do z7t`5QKs!!@J&x%@9>n*JuIeO5yHosB4M;4b?CTiM0UH0^e2715mC%QN6N`Y0WZp6N zf+E;da`#>bQ7MdJMHGzcYPZg*31mN}?(dFas;X=a1&C4dMbp$36IVQXQ>E)qOg~3N zf5F*cXa@Fju~cD;etgXwX5j&Jf22(%mI(mTOH3w@sKWeGi7`&9x6k<)C0c#}I}6eJ zKjC1IGVrv@0}F|pcl0^kI0b)oGEi@yIsJqCmhzdwzo@lIv0i*eESFXLBWcFo3<21O ziw)Rq)pQ~{)L*xIIH-VS8lZ+LUiQ5>D$fJs-Tds158zO_+%{_lwiHL$wEX}qNqS1%}>E)Qa7kQvJ7aE`}5yh%&DqI=^B08l;h5hzPG7o4bW}z09 zKXYp)zBX21A+N0Ke6~iwinkw-;Y{4msq)RBw|bb(XLy__@(OjZdA54^z{jA8=`bMa z{2S`AC%Q|vcT)GEll1eC(dItyzl-+FUo@H~a3X<*qxc_RA`Y??D+>qWcUy=C#J5OF zJ<*34yxyW-bH^98=J475CGGWy$o~5Jnhhljjj90avKsZ;fx190)ts6xsAi2P(&Rxm zUj3Z3xAFUrpFJ3Z=25^phket}yJlrG{k?=T(5BoI(t)-1Sc7&d3DxpvEHg3rUNWjS zcya5BirR_t7)a`Sb6XNw7LI>1U{#_;kPLVCg!|12!s z5;7P!IKs_G^F|G!g+3$o`n764I`++fZz|-`H8p3#!%K42)YRS-uzJ|S-%UA@<|Jf@BIKbHCn)8QFmzwD@Gt7xz9M8^ehgFj4=b)$WUl0>oRS#z zeEc9X!(W{H)c)+Qy)6YfHq9ISw^q>w;CVduf5f(B48P2xZqFe4E47~a=JYKnaH`b( zw>N+6U-qI8)EnQ=2V|@KQA}QuFz5#+M%48dpj=KaTLg*si4&a|kIphSiVNv62DE1& z#QI*wNCk^qz0Yhc!GkXmaiZMAY7{RI5XcxQF}2)r{uZU>6?p$u-ulJM%rkSc;y-!a zv$i0~S2v`l;nm|ko8tCqucV?AvNm`Y)2;IB@G!mIIieUwzeKoDR#@$>rXsGSIS^It zP`iEyvbX*lz6T7w?Ll1R3bP~%U%{rIiaft6rOD*O{B22$c7*(eoNAgA}#I z?M@hIrVn;3l6;fb{b%9jk#<+$@tY&=KkO{^sM)j~#M4E@!s!fpBLNO$=B>s49`ikz zl+THt-#>jcQ*oVn3HE+$z(81O-`=yDykg9iiF$e2TJbJZoXc4AGavqs9+GN)&OH;T za^+U6PnFhx756XUe4#I|coG$(AAyhNcm2_)$p-UzOb{L(qzUv|OM@%{W1#n>-JGS^ zMojV;L^%j@d)3KbmTh*{;q8~xT<9$|ucL1M*;l4q?p2ZHcPf+puMrs{&kq%AuhZwx zxcHxHG+HAuWo?7zRTz3qRm@@IJr{E>os+O2?LGO(Gi~#Ad?IQ?gxz3U#K@!~H(4hq zWl*^(27;`65!iVb^nMp;YPPQ2okFOHQKf=uD#?H_?-uA$Gnq!wiIorIoAY38U+%3O z%CzrGeQ?R&*52wyN;%|2NZcg4Z{;vhH7JVC#ugxogtdM518hD{I3U#m#*Y}sE;r=x z(Ala#F+uW(r{!u1xz46ym8uq>-Av2W7T>l!C`J#jyVOD^knGsVi=OYpilV8#!4<}g zUrQq1J!LV__$7LKrbk%lL0v2jxyBCIH!K*_VS`E+8 zts$4#I^Wln_&#g*PHjH88UA!0ifR)B+O2%?cWml0?Tf>KL~&24VgnqC&*&;*l0G3x z-2c6im&b_f3_2#-Ckrpmu#LiIM3dX=(U7e@LQmX_=S;Bp>&hvKQR*sG@KuGQ$1l#b z_^XOs(rzAlBFf|ENtx;oHFi51X2#27#YKDImzyq4cqjW%PMa%-^F^Dh-o;->Le*M@ z*78(K0UvU57m8;2LYX&8U7wTY!$zaX7SBEC(Oh`928fyMR~Ld``9a_E1H;mfHr9LXUi0bKn$D88w3 zbjxk2Krj_?eeV(W)KfG+8xpB&;>Vr(>*dXk8>l|i3JhoNQj<>un?lh{52~Z{zEthi zd+l3dcu-d<>ITg7hEWOVB`m|TOY@7oB>Li1>c5VcJbOwQMtLYJ1<#^cF+`S2UlU(} zzi1Multwn*>OG35yX8M*I?oiNk_)QhHm1vi}o$?!%)Mc-NTA$W32N64!O6-_@9& zN`#^zG%vU$bE71c3AFN(!z`{`qxuy=l>OHi${E;gsiwR^9SkKd>at-Z_=Hzv;xbv>`#EQqNmNhP}h7s z$q=4TP0^k2K6w_Rc?-SK{dW2$Y}wti8>LW&H%JQ`pD|R$h>Fxmh(Sb zRBzRXKq9H5wo0D%pa#h%ObkR#&vck}#m5Cs~u-1YP2 zPlYt$Eg$8a(*3R}B7x_>GsQo3=D)|5vaJRrOfqbG?h*vaI!%axcHF)xT`KbvcSqSD zn_vo*?u2CVvbsn&lTM+c8pX!6Y@87DTDwO&1cKP=&X*s!6V^ zuVXHGvY!WflyDIqkwu2N4xKGAG3p+bK8ReI$F5TM?=_&pw&GfV?UEH@Z|Ra#h{o>an#&KAQW`>+7l7ea^Qf!jq_8tUU3Q$q&5y8{E-E)^epSOQp=8cDi5A#euaz;ohTH>y|$ow#8$CqG3*ZL#QGv5>P209iQ zRJq@0%0Tiw#fkPab&iMLht8h z3Emf02z-dme<7(*;Bg-JFd(q!@JJ`;N}>DhbmrDKyseC+8SmFXP)|uuSbsFaRTefb zHJ1k+;~{w(!tX%6Rib zBa>*!SFFU+1&G@GK2rIKKM0bcM_uvNG)Qq~X6mBe8 zI2hrPv_bk#{9Tm>Ufa?$!XpMi$LQ03Rodl=Mu^)9OI~m<^pf;jYOC0UOQflaM+@&c zAug}8*H5O&?897V)hfK#h@2wcj`tOlCm5p{Vf zdAxnGmXtu!c9$h+ob3vReNx6i6=lN{_^bl_#p&pH^vChd`ZRgYi;Od{|XwlTDpo5#zsOQ{NlC zurTGGD3s{wpjYi#c}q%AyB#i@#%;!!S_v*2(ho$bD^0UWJJumD(Y#eC^)q~liWvqA zq?Et4a$%eX>nALG5T)8Ai?>Fg1w9Qhk(HHJNW43A(cf>#Y!rPt?^m#T7CMvb2bsrE zwAhtRmtv`bFcl7+11WuVuW}IlzT}7xcZSiXDSVDaFIuo8V`^_1mGt}8ju^Loc{mgs z_lS7190_vR*wStN?F~L&-2%HjOX15B%qsAmb;BrBG9Kf0fnhp|9grQjO2IL5{|Scz zHp({JGcW&d9)<&8iCeSUDZE-bqC6wlJn`e`e}{%4gZtrkB|c$j2%*ud86(!g@7R%Q z?8Qyl?#|kdN>a{%9a~fGP5Howd3a&XySYj)acTjJtG8xEJPEq*O}25RVq@ZuV5)+0 zAIj{aADi*wUqqcB9KTl~;y}B8Hca+b5J>joU7Xwk?-0Ap zs|`+gCoYTBzr!r~YMY#}3>_#2>{;4a@UhCTei=-g@DwS^bW0Fk{lx&< z7t8AOeb*8L99x~8f@iH35_`=FX4x+3X_JXWRRpgRHlsU+pq4szZ*-KF(*;r3T1W!T z)|*fvHXpIrngO`zXVi(58=6D1;=PuF3syWa%;7a?dGQ7dnE zKY}%N*|@gwL@LS0VDdeIX(d0QLG4^7`LWEPB=_cbw}=;()f+1^3+dq}gU98qR3rWm z^XJ}7Ad^U5aeo|m4Si^3v$2u&`Wgo`W(FyowHjGqyIu^3OorfY3|0^HI8hEQOqqw9q8^&2;+JD*1wr z3n)m}Se;CF#Uk~6{)`I$1hL~s1;=BAEhIIEsk7PN^ixO)TE0U=pyto^p0Q5_9g9dq zd?`pD3t*-cA2nsscvw7vYo^5bHpo{t(r@dp8f4>oj)+gJG&^YHdRS%xAi^-rq*Ptk+^{&6mi;&8E z^N&}k2<;v_QY7Y+YnXn_x^INBN3+a2IYF^6-p(3E@9Zz1}@N)_t*4Egj61Xmap&dc1SsoKRpoD0nIak+PtvOfdEg-91TFG>fp_ky zm~AAgnI3>^1#rZpdD^X?&}HkG?XlPrf%)qC@U?9Ggy|Dt+O+i@DSckh(6Xfb-BoM- z-O1emXEzn&VM1%1m(h^I!72?W1BpAEeEWtat*8V*N<;GkEYBQO?@cvIn{Y>W1wcpf zQat-9+*MR*>e9$y&;Y9+c6xmy&Xz`AY$#t#^$&$E$h75ZzGXExfdpp#%(OZpRc7pN5!68UAIQ7re_d*aBeQU5f(O<^O!r0SPs4<1QTnBMyUSa!3#>++ZVkXCD zq6AQR`HzU6+7=k}3*9EcKy2c%52B~|gDXs57667mr|+i5#25)>qKJQ{7V#F|B=j9f zeh~%yGD-?7JYWcFv`xi%hyii9q`Ku3glhIQK9^#U#EHivFyIAMmVesn;Q-~CPEbcI zl-*G$7%U#f(vOm{bQSD4{oqDIM**~s{-cc9EG&B4#i#nVRc%8tDHizn)c%@`#$Lu9 zrv4r%aW%XDIL1yyA>-a@EEq-O5%p*)W{YNM0Q4y0%P4rL&{M=s+AlrM02I1+p#_oc ze+lM7-=A^io*TXa93fGwE@$AmU^tQb^lsFEfgtgk$-|6)F|6mQ`&tnf7;Vu4dsiMB z;%X!KwGX)lRa^Di;y_i1?p3W3gT|o!qFeShXBjD)qtHoM7vmo{LAVG$N)TVZ41AC6b% zEa5)+Dc_5CNx_E_w1?PIerhJ%_-vjI?`M^UP}gRc13H%u6o~50Aq~W*FYd~NpHNQr z9Ek*9x;LVA$#-S~sBhgI;%oX$@>p)crUBGQ^22mqZN!Y4`wNZKiw2BFMiq-H-=z;V z4Rb?!$y6ISx3u3VYqb{z{_+_g_`YhOZY-WlW%Th*4!fZTc%9W@WC=wnV(&&Ozag|W zyX5nrKET0@8bjuNfAQ5u&%{3iT=e^uA#;22iAH=3Dn>GbXW9E2GX*+Cf-61G|4(h zC9R-(Z>!h_9|20&G{w$=hd?#qz*8ZxxQR;3L zLv5;39+s6Y*Yh%-jfo5EF!>u)IcM&Dgz+h7uy0!uLT?Yp`%^Mqh+1r5XytM@$s5-5 zGf2fGebs2YZbNJntz@_vtwo0d^l>Ag#qN!m`H@^fxLn+%2iTar}E<6mKpAiV#ve%+@-Ou~`kwa6Ty!H`~_P`J8aCuCzJ)c@D+TNQD2{*xGuN;Q`- zjdkv$!#ZxAB)L6&6`1!ALt4x$|DMCuE(k%1_4!jTfhjz|yec9K1Q)9cq4}#^>R2H& zxt#~{2bG;1zHnN_tqlZ)E|5o9r136|qbLj5GEAvjeToXP{8ZSo=rqyg*z{qLUa*w@ zNi#v!kZ=xgT#g}b#Ao}=vo2p~S2zEYzG{0DxzF);Di6h$Zk}e{pG&HDE=a<;Z(_Cv zMjEb}WWeKIkn@7^sV3Xb8K=ZX#m{X0F^<<)OaW@XoahQ*AllOFN5+~}8yUc=)l356?OaxF)uzyq6)!IUfG4ox$i z1`DAM_IKkCzWorC- z#=C+^%d}mj8)ZJgXwW6;cB+OxkR%8}zINZw8a61uSRGL7P8Z|Qo=~qS?>@tQIhN3T zw{Z)x?`dGt4#khxAsSJi%d9Q8ycOvFR>iEg(PS-d}3{D8L zWNQ>B4D&knPSPPJsfa@vg*)7tmFjXqr#f-u6X0gQZtg$fijcz=d(s9Ww*KSaWUs)2 zZ}sI7_+KbK(hcoBmTi5Jj16~#ZCIM#+L)x5M7w!#FwFfJ{I#|4D*->u2!Q2?lKEu6 zhGj{Q;aMxjfG9VZ{c+LGOIBLaWPn4c3;9GMl^mx{n1Z?{16pBHu~0=$*L#sk;<0|r z$?_Ug%RMrDVzWJ}+d95IGQ18fH-DYCI_3umfrl7sx2grk(>lG?)mG2qI*Fp(#!g*< zf@SD<+;>chG4NPGL;SKbW{2+(*g2en)y*LYHH{Jk8R=Stk23_LfM9uAaJ*-U7&_MJ z`Rp0t&FkNyL=y67%eu8_MX4L3@;Bj0oec3$ zW_@*pBB`d4J~mzmaM;R5(_^hae>PDd-xOYHM2FYylm^ue}#K=`VWC7R7Rx zi8ygEKTYb68G-7}+VM0k3I!p$UR2!AyNya);5{@7J)z+$D zPJYV7@Z~u#-Aj1y9tuy+D~`PS!BFE&E@!Ezez1Hccq(RDMT)k1M|&kxKxuiOuEOyk zy6j`89vL|G3Qrq7Uz@aiF>y)J(4-eRz%hlq^vTc0kFfzhBL@FW$#Um@J*p+u{9)8Lq0WAABl-ok zXAj%(muM^HwXd)}sWN0D52f+a2U`PlISrbVa3JMuDVB^@rJ{Y`u5ldyig{JZc#i*r z8pdgJcA^#S4He|Wf7dm)RGh~5oHtTKyg_qUoI;F6zv-GclRFRYPd_ngF9U(DB%f~M zHBVQb#Z})Vyf)7J5*L8h0B*4U;0w#@;;}fb_;+w}1Mp6#?E}82ZLLp7@t=HBp+tXt zg&hB;vEGzKiTDrpN{7#Y=IS)asM=Ed1y!~7TdS;a*~5JzhiR*Mckp7k9(0H00DKkE0@4lRIXmoHt{zs3IUmG=2jzlX8|d#vz{$$)*J zh0`IvBlHNnv1v|@BC@s@eBuTl2ozD)riDkYtN_X<%QL$?DXk2v2z2W3YJ3|2^Y!C3 z3+?`Kd65G|5lR6Rp!p0P9!JK*>o-ScmjSpg{bBP{i4Dp^Y>R0iBCN0I{^u{Ru>*6t&as#Z_A0OjsO*F@{BoNJ;;Rl0XzfpNN1?I-l_LXw{r@>Dp(JK(VpcmK-J}UX&b?>RyTwcUXBBOKP zWkrb>XCQ(JpF5BU)aZRkYb?(|i!ls_Ac?j09M>1@A+nwkjpbE@zIwfCL=u|A$rwH+ zWld7Qj;%d6j1AtwZ+uNMhEye_>U(A-7b&-_zBo^ki$@G!T;fV;84hvuaOm?fx`M88 zwD~NP_T|)cP_Feyt1JlN-%sqrBviINCOYE0uUSq=JwCn2RylQCRZ}-qJ;bi1{-_f$ z`KwC;!aGWd{RIW`^WrxTGLya1RGe9{#f%r;QrJic8vq3AYRU_Et&;2MD>E#H;&OXT z!89Q(AV}#;f_oL@8K;4|UwIl?%dZnWl77w7cDu_)^1YUxNa!JCRw_#%Wj6e}?vxLJXYJ)gzaAxZ5rQNz z10aej(7L9$Mu}eO%jotB;OK7|AP*R&I2`3jVN*R?M^dg`0qw-?{G^O2GYLor}PW zU(jMw)LoONH5`!Oxj_TKS* z?Oa6E8NkEvIVVXwM;Ab5QFOF%5zTx1R5v6!j&LjCqvTb|M-Ft6qvT`PL@6C$X>uzU zw@p11xeH;!tKEv-4;LR$@Xl|KrWo+1q}2N68zb^_iup$T;)eaF9jKy@GCAq(su5o} zLaf;g`dkt&Uk9{^yL+ha+4t?sp>V%V=1iWS!uDeQnlq6J=+H)k;;(B=RGV(iRq2-m zB3(;2K{wfNE~1^j;&>i_S!cxfU^5<0dc~t_D)Ni5?quh~g^RetPNwe}{9_0Y3%%}L zB4P*?QL5gQu84k`sVIV4Bu^dDP*wir$BX~-#p>%N^%H*Tw09y^${Y_F-m%z3^V6N)IOf>zf$)U-7__f|1qN1QX?S>xS_jL!ZUA4#h_ zV0KbmqIg!`wlPT)`B&0W7O3KjjZ+Of(;>1V4dg%D=Ox;(c5AetA+2O&1i-fwBb-mb zdLy;o8P7!Mkb?&eEf$Suk#oM`W7D zZglg3iUVnOKpLX{=}p+E)Jg!(=y%k#0%yLbH2?)SNDKr8amro1*lU%2!SYG&g4phq zu6i28dVJLs@xG7%1kD*4*rgaRx+q-wHy)Tdjc?Te^t6xoU;f z$PHoZ%MR8~k$Jgua6TT9sFnO7fB>qCsL}cDOyrtV@Z)KG%?-=%bu`(G+ob|%Om`5( z<{j3_Iq>q}fFz*DUQk6s?~TTi6zkstXw~OAZYZ=A&=>O06i{5mG**6Eg!YybMlKl5 zcG=UdlZ6~1rCu%4%O}cnKkGb=sqjMq_?5uMp9Nug{pISCTs*}f((V#AZ6dY-N7`|Q zG}JX~jLv#fTuCuAygoG?(ztpjTm%NqCLrE^=h-}zU0E##Mh49qp;PA63g58Mphn?W znI_a)qeY(=WqvFe>KDji$*ccZ*qm{hB_3lcH3l^M+vw(QIxIao?y+sa_nlxa4MdCA z0EH%(N7`$;>nm*@0kW1#juIpUhJSlK-dyEB!mAgly;;pxwTcX1eZ%sa6yA1%H-NP@ zZ9h}u8piXO8*#)B6+6MRd7Wt%ZuJIvfii5c*3$p>Q#=4{7WHF1?lv#1H@e;{RxR#h zPO(jx&-mGd%>G(Ai4HxDURzNe2AHcl9_xgNN(Uh**&9k_E^%&|FMLREMa4vn-t1Zv zsmSPlSXOV>>z?PaH&Xr^9FOK%V*+ZYq;NjnS0sN0Motu?0~HM!Z{bKWXLF=5+2j+qMjO|DtXR?TBgQPz0_@qHj_A`jNFhY7~AZqm=TiG>?JN9 zyKx}Rko58GR+!_pb(b#QdJn|tXGPoTh}sFn3%FM~(YWyG3JaKOc}Pk8Eh7w45aD9|N<~G@I4;d}9;OH@vKI zeW=|l-Oy+b1pfC$5$_r|gC&UHu6LHR@X6pM%QbqBRc`Y61pGPLJF0Z;uunUV89>R| z_yVKfd-MGbkCpUiqBd-|t3CDoLjUtd-0K0_{P7kh>r-X>BgPa?tk7cD(wvYt zj9w!*-+zmS*64+a1t9Oqhd(S&;vyyYJK2ib3dNLH0C`=6?hv6*uEayTfn*F>L`4C_>l z{=x=<6U;Z?u9hnJ7icjEy#5V%ofagr@iVge0R_$RW(8s#B3^peGR@g}{67#v0=l82 zA&{tf>)a2aEh>=#Ovaw&%zbNW}N5&UGN#5$G;t@oo&Oe*N_z-oq$(q zxz3DYAEk1?;<8SY6Xjd?t`DbR&v?l;QPh7U=NGaR(pXT}!Wmg%SB zy~t?O@`akdo=+;S0s2mg-ENAE>gxhCgM=gf%~>Yy(+3yk6x00=^cmhIgqUTqf8)Gw2Z(m3$}c*}cX$ z<07TY+a-!Tk1^=Rr=*)!{!+lm>_l9h5q`8-FROaqL}4+e&8N+)Q2ekmv)R3VvJE(a zJ~N(a{C7r%-8?nQSH+v}d8+(M{t+G5bCaR+RBcRr@v+?ZbW%0%>B2=)L{) z@vIkeOy=+fWWm>P*KLB;1Wgu+WcQ?oM+cUV!y(_Y>_v0Dx68& zMjnbm`;s|$g(Qz_AyOaT!dE+kcu`4+b@bq?U0HT3#JXMYGl_=FSkn2)86+r zdiBo<&gS;-@X*fwp>}e%cn{ zJSdVUL$ZC?;Wt4w|msQSmoya3U` z)}9OU8nz}NJXPod8g zJP16&4;>`jwF%wNpe`%*L1q`MkW?EK$#Z+i(zFI?hFqU@h#1PD67Vy{+}_&mo#I|7 zl2dIyBBfp^h?rSu#b+E+P6I^z^(AW9GQYV}>B=X0F=MuE&b*)`u9a<^Jpq&Op&y0_ zBs)t*Pii;QuL|U@4@))P^PanVwXQ$CDdYezGz78=XInFG9u)3F{fr zqx$rF)k5V=?RB50+&^yS+DHWw>Mb`4T*s71vFm=PB24a(Fc?P0go>i9G5x!R*soIN zvqa{e5l`rGntIayt}w)=$@adO@(Gf*J2ikDXwxaa@)NR=NIrS(Kj}UJaXhu+!?GJ$6T4) zBMeUdwh+sk|K{^3v!|spiir5L*?vI`fa#!|6udzIX>2#?IgMq6%=?tvkiPj=LQBR1 zvKLxwwi82yGeQ;=i9eb{mkgEpRTp|t9!jpji6^s_S%<$bhcXqNzVSfsasH&wzh1u zI~mB_!vPs#&W_xJhZsU>{Nh$uRb4bUU(`cmQujNI+`-3_n3rM!ea;Jr;;F=MVgB+G z`;Z%PdI9~ZRzd8P`|gp7Pv+^*^+#p8j+f|9m6@e*xYMp2At(O}+glb8~^Q1w<+;`t)Ke^t-^Vn$FS+^aOGQy)9rcu4#$T0Jjk?YxvZA&#Kj*a4(d3`DcT%ol+|q{Fwa8}xcUQ+L@|tgqEMTH1_$AcC zy&^I)+1$;L8pOa)TFFV@(To+~S(E+;1`pSQ=E}N9+}(aECbcsESgf%3xse+nB88ql zp#B1W^-$R4)!P#mW-FdIL%&FF2vd8S{I{e#8^xU%t=k8XoY%gz1g6VFB8opg#v>@J z*iXc?VOY^3U!C%|dT+mLk7b*^5=AbqyAroo5f4{bg)IJA!s)ai-+D;Wqfly8Or1qFq(;F36FGLydiLq+g_I z^uN)E2u6jwO+v#$eGBiLG}n!RsxGt_-Vquu2Qr%q*w?5N`NALVxLg~L4SM2k)Zqbd zUx}Ip@%KHC#UcS%Fc9pc#dRSbx9~PkEh{ecWnlqSKIgBJY-4=K5A4>Bm&SGtGq8FEpbEs5M{;~6 zvOIeL7u^@-wgsc}`pg|%9|3^jm-vUza^V<_0Rb^)x6Y7xuI0`+VLgGmK--|%Zv6b^8bn-p8XE-(P7#1vaKR1jL-FZ5bpDyd z2rDf8DHm%SbkKkc*7AiJMks+rZd@9h1$aFCzo1=ug!=DWfvI()1)wXMgkV$fCqzXPiQ#jb;R=&sTZPN8x1KqXSCw z*hkCwrZ#h)w`9T=>aATjyrW`}`C;`%#nua9xCrQwn53?)3klXu{=^>pl4*g0pV4hK zZpZP#_pPl3Q2S!t-i5?cnnr>*jIL$AMDV|N=@c)B$aBt!F$S#yfvjxCuoTkL&vL~t z_IfBN&22EB3Xs@nmIQKF(Sv8ww~{1Cyp$2>7vUwS)(`z=m@PXP%g8`+rvF z;gcG3Z&D}_NErsAR0U}naVbvgS8dQS7tl1})K4Yo?_p%8$Jv#S>O|t|CeUJh+Vc{% z)4WbcE)Bi<=BSM^tmxeo-*wz^+l;#o6HuD%n~1nNVGN6S?^am-1+1{T8RT>i4wFpE z<>$;Rm8ANo$MPXB8U4amgh~F6_+;=&7-=@!CNK}E)2bg+% z(aoWP_KGiBdyysS6$r9+!taE@OPrk>Kp~>cv=jPW0jo>Zf`8npleFb#wW3NHNB&~9 zWVOWSIscqFV4k(&`X~dfP@^F8=@><_E)J+(3&58@EXoo76c+!vdT;vRrQyl`C(yN^ ziob8?rXQ@%r)AA*Sc@b-44PrkQQ z*jti5K~jee5?7IbzrShIrYDCezsB84cxANB$l>!=|1z}7_DKY&pn!Y85Vw-LS0eEr z?_|R4hg#(^4e{Pv?$*Q(uPw{jJE?VjJQsgH=6mBx7P%DuO$=r;l9YD6=4V+3!37l! zW}M(>b^Mm?x_kV<0{eSm#K~3|M_-4zL*A|Gl0q@V`CqjTppi`TSIsJ|1pg%;&gW`( zg!YDug*Uwn!UQ_a-!p(mlj?e2%>hJql2_&r$@W@-eIp+`r@au6h8XwNLxso?R25tS@wc*>Cx=TLMs;2N_Y>og^2${H52-w z@;`cEHDET*i>aN4T%EKs{4d7Qj!T$-FyWz!hjqHQsYGi1=zpn048RSCDV>%w8V#Jn2*>>U=aPdI&f6_ge2`DQI7wc~ufRxIF@D%cX3!MiquK$3@tWJ)u z@Ui433ScN;sioz1mi$fpqpOC)6QTx-H!9|d1{{c~n-V?BmsU9vU-Ggq?IIJ?^DpiG zU3x(D*DR9a*$XL-*pB};v3pq2Y6`IyqO&(MS_r)p0D@?JAI%FU$nfuSr^~K?Of3xs=^yW$#1aeo{4b_l zARTUeev6`>Yewd<0NR3Q6r^P=1#D!vv44ExfDK7Ly<*MqiR*891H=jN(OzpIKjSHM z{an9s8>K|OKF{W7OrhS4Gk{&60}N(sKpevEuH3EK?9d3{1ZkhpVlHi~fS_e(tluIY zP_i@m&K8YuR1N#E+lUInsLl&IZc8Pu~#_6+>Gx3_U026+hnsE)Gv^}HVx;5m_m z*bu~=0$?UnVl&A9Li$92=_nyS&TXFJsHEjeD8t+7xxg6q4%ms*Me1$#>tJFI=4*7?YJFRO zDaNF_NmJY7G=@pjP0RF>zjBIH_vPnU6Q+Ji4(qeAu+3JJPm{na3R1f^mMTw}!UDM` zukdBZ9}r{{S%aLAz{}7GyLjDKW4{m4RRsO_fv1!#+D~IcQ z%l#_P3Uc7hl1TG@z=zXy$XrS`JpU*`1vqzeyKem+=u7C=-3Y_c0VhEKk1xBVA;@qc zU<0Bm1yfYGkgZ#DI=CZba?|6;Oh4N}c;tVs>l5OCu4{9^Nc{DPPgr!U-LWmJ&^iEWa?}i@^`@IHq4K3z+vdW5*^^1)>x%5ZU-6W-I{I~xk~^8-O7Gs@ z7oU03yDr*5o$aGK!t3XE`05goFV!5n#$n6znV<1i?HoxQI|~$qna}M27QF~T*7^RQ4D4hz+i+}djS2^&XwKl14E>=eSnz^v9?CIV z#kwuabnkmCxH~)J!aw17(U0jAMLc!r_yIV|G^`v*JU-`wLDLEldSU7HK$^FGyXrBw zLDl=)kiQ))bg=WCU6-)a&`zq`kOGJQBk3xjqUyTnAdN%kPy!N4!%%{Vba!`mE1d&K zD=A$f-5^LKLnAFAohs5uqtt)-{{^UWO2%nm$6WxYXH3A1<`e>h9bf@YGJ}HU+19Wv&zEFbb z!8|VMuc5(KQ&PhnWp++h2+}A$kj{UJJl?Q06dHf?!!eGc11twk@CKX+LsH3s=}7dW z42n9-NmaBnA@v@@-QtgRgiIHj;(I5!k#Nele%FGe@7}FZg=7;+4k=1~A)T}BT;E!7 z&b@9uFP?lBc&XBWnEkRY7mxKYz*aHCGIXZ#k~+O&Aoflj>s8>Q`ZadQS-|kO^#a-} zx?UxipM(voa_e+;ODv-39NfdhPHmdXA`8p&->a_*WhDVZ)ai3)^5cUmFN}#NUf;NT!th!HWU_SkD)y=#}^yx-FpVj~u=x!3TOMOV}z^xMIxp?Y>q>TVJBPaBaNbH+lGveU8#2#ap6wDsth<`%> zANVF0VCUB!J=-e~;NcsaQh)dXfYkAwE&kjMu9q+O{@IGBKF zIK@t0g3BDiK+wCnzqjKG5t47-k*8*1H7l^e{BpPEK8`ymxX*guVfO{G*$lodDO9tc z_^R}p95s1&>}@xR|hef;Xv1* zNySa5BXw4HFWO+`yd<4L&>(g8*n$(B@^L^O&z6tk?9w&*-}M*&=YV6t&AoMGiAM!M zOOho{Z>gHeKWLstfp@4zhclC2~6IxdbQm@P)PO2Qc{dR z@dj}2cqur0RM`R0CdRavP=k~ut{xOeD{sRA8RA`&TWI)+67}Ek9vCPLyJ-l0D=P8H zw!C3|?%n%zqXnS7+P<(_k;-y#1z7^%jaDvE8+tj;$J`BGo?&h#`fS^ee@Q^rMUzw{ zfRCRZTx0x)^s-Zme*lW<2efe}z`W=RE^1%I9%V?`olUnL$P)?{F<+A-mRyY9aBFLY zl}W2fcD@oyBHM8@(EbR2N~!dYK;%Lf&$f(ZkF=Qu&1I@)sNxm50*erRJ5CBTKYWry z1xIPzFQPSE*a795q^Cix+zXl;HSi&c{s(r(j$k4{oZv`XkKZ@RNB)u{`H6=Rhpz zeWBk7))@o@DdXodM#-KL8Vk9JwU4#UxrErX%{A}BViY2ny9EZ+(;g~sj#}B#E9>l> zmjBKR`cXTY*Uz0u?IO@s-@c=-%-HwQ=Gd~v?>0~6;6nQ2e|jwxql}d{86>PUfgtwc z#1LS@yP1~Sbfq3U#ty?=`_T)`bm^Sxo-~S2T*C=hKcR|5RgE5=3(!H!yT9+cbwNDY zbxq;y7hDF?pWvPDLXtvBLIAzO7EIo@ie6^)==q(fPx9?KOnSvzqZ-++cPh~p*CP5IGh{-IOcbhq}3#$xc% z^__C$^`n%Z(NY0SA%>z~O1ac{YsF?#%ZtAM;>FZAEU|XZQK9}<7JV!xw3JWaChR`K zNSt-M=7t%Xg52)yrDx`&XmDQh*w{XYPbFd5(rta_&U=*SY{3T=GDzKW^WzAf4om9| zqa|%9C)HfIkbyy93<()+nMOEDN?{J{alwFfWCu9XRx6 zfKai`g5k((sA4p8u6F-ng*Hz%aR;DETI))7*H|JPwL~R#M=!;kpZAmhSurBS@`<_D z8R;Erm|-jAo$P(&K57gN=#30=V333tMvD=#=`v-CGv7u5Qp?eMn-9Nl)}eNf?y+h2 zFN0quOS!kb+S`%oXym)Ob(4uEMS9g?YS+*(?XLL;1vEw%WYWjAtz#uGJeQUX3m64xhq*E;g!7CRhG7_ZWJFyC5LyhR*9=*N zB9&G1j$|#_OCHo#au;(%g~!7l@>UeX@qb<`9vh&om*P15v^vK#-dqX-r)+V#L+l9%|c(J}p?)WQSb2oL^~*W-5Tm{U+vRHQBn zc8t-yQ?l6fvpFbt><i-7Y3ZitegA#~OO4zZ|N)t>4OH@b*?; zoW``M?I@Ie@+f*50SvyF0=VdPB|6{jj$hN1;qX31kozm0uEG%^3n zkq&#-wYGzKJ{gi)5-gst-{$9KUJ7*~+Ux)_4hpjT>|ERfSidtSh~ACG!CuMqD&N0M|H`nR5DPa&BVbfOPUBKtw)(e~NpgJ2GH7LT_R6fzpXc z@QJqZbNeB68eMnPYJFMHw?8ogn-z73c>iI4e~>=@^2>|_5gFTRrnnP7n#kYp;u5Cf zsTJt8Z&0dtH+huSF!qv*;fx$9O}za9yEH0aQrh^&nu7Ai+>)q1lz2-hinM6O9NqO4 z4T-LQG7MYiWiukcjj+%*s5fAJQsEVTT1fiQ;m(@k!-aq@MbnbY24@dqvBED&&m1fx z>dq9$+1~GC3}kD`kPe=Q(;7V=c2Rbs1ES10AnrwaI=GsL>eNgIf*RFiNMWX(l=M=z zsBBemuwTlL+3qKI9j{et+@Df0R;9cupP!^ z(|jsHZ(1RC)lY_tBxSekrLv>rD|^X;X1A|v3&M{Pq=uwF8k%JKWW+ghpv!PQaqpQ zIt7OVHGNrYYZ}s&&;5K8^^99bk|L~c-{t=Lf{d!IDeT1=aEtp6TELaOGMo4@;Qlz< zb|cCjnb@Wj3D>aK&qw(pr^O^fPw|#h#)+?1Df5PkFuT_d!ObF7^0zaM%|+!k0V$78 zVW#JiwEt3ZOKix1GqBNb9kDyu&pCA-{2Y-mnfp}xk}krNhf&3ZpaV%Z1}EIHK!RdY zIQ!vf>VQay&u=V`rJva38Qum7iA)Q(FArK+1ube zqSMQxFoM6fk%Sku-^UvPDRq}RqCxfH{O=?*Yo6zeuw?Oc#l8;y`aJ77Rh?&Yq$Us7 zHqelt|LJ24=YJs$fB%QmoqR4>FzCIJI84~SgM@=BsKXe{lCyI#OVZcXFlw42Pb>r< ze8bm2wGRE%1DNdxWt8IGtAu*>6)3jZ7xF8U)fm~|{u{g>AB-sk@%Z`l?89pw>Y%mH zF%_OZ8$iH~2un|ukeKJ-=ZTE*{QS@mF?7>)7ypVJb9gxLo1XikFv(Q|`?>uU*w!uu z$DuTFF_>7=55*79$q2wn$K%Z!Zw%ypd5tH9s>Z$*DiB>u7d>3WL<2`h{; zZTLGY&*S(VJEmN#B6)YEIMHD#L#i)fTaaM0;cxnxtzJ7O!gJnp2h|Iz` zkJoS6d{$QG@hPmB+5Z%ClsK&KKp?;@S7f3$<~6R+4yA_>s*n@dbsP<}U}WnEz3tgd z5zM@FoYX&tdEM0JhehJj5)K!+Nd}}j`;jZlyxZOorYel|i}+~%{0XPxH%H0s{M;Zm z1ZLZyNVh^x7w-rW`K(c%6%vN5yqBwa&kO@Gy;<68%*^x@tKKsA@41BoyEJ=ehVC?a zMLOo1?S86W-$1~VY#b5fun~Hq73Kda_W9l9Bv7b1^{*>b1cNy98@ADoq2q=9I|D1* zR*k8sIw7S&ss4)5NxnlR~cgZH)CwA8Mi zoVY0;-3my!DjM}ui(7`llMC?AMUh>{@#}Lgd4hcQo9dXfNp$1)+3$)6d>SZT{W!Jh zujcMOieovX=(i?HYW8Z^*_Z($ij-!vY)6kKF?}<9T=DNGv@2`u^H`$2=c|aeB~A3b z!&l%TbBzhE*=aHf)5W-L=aouD_Kt^&!KU|K=?)RmM5Wjr$N=bA2UwMS>e}>%V$UTm!Bd0k2e%zn(iHoewGw>HW#$;v*yxkYY^Ou3H z7iD9kvDx5@mzkZS>Zk>d@kpVraoe~sYpS>m?Mz)3v_UM+R%C0Kmt!8{6xqaW zRHvWx`fFSU#6VkCo)Eqfb%Nqydc&@n^Hh4*+l#hLiJtHV4UQ5pFTeieTRFB(`L3A_ z&CIt1C$)K70$f?z=pkk9@xVNw1N^u!t_>Mxz*< zuAy^R5dDcnl6L(GW3C1`Wru%oz^VO>mXxOiq}I4G!hA=k?2m=TFj}pI$ZpQ!o$_x5 z)r@emB*Fz|Yx$h4!Z8r>$r6tjQn>xBo=m*og3tA}<40#m>L)Z-HHd_oF(clU)3IRt z#+dnw_nOD;Xbbah|9vF<)7<}5JVHyOcw8WZofzqY>n3_Z*Ms>qqWy_*PN^tXF{;ni ztJdXfr5F^yv694BzS^jJ%2N~uy4!Wqv3D*XqgFpj@GSCm(!rAi{A3rlXv_=5yy0ur z&=}k`pGaJ4dkZT;R2BM{d&QSB?2m($2GvLg&^Eebp@moNsRMcB=OnU$T@W&6D7F2A zu?;n8=tYB`^FvdsD8mQ4#45H~KGzJWafLI&*%lR;Dz#w4+-PJ4F}`q_%|{WEoPhN` zwn(YnXF&b5v6(baMm(a$MN5-8RBM){R1>vN%AymkqE4A`sRS{ip%$Kso^x?HB9J(9 z(5JCbp8x)uP4ZDvQl~NV2ndW(jU*d+ueU8wtFxMTtxTMdp0hd;i<|ySLHUt0uHd#fmnKV5PI}KOVMc02i90zp$r%h0c$c$Kf*Z{B&TxoW9!Z><)T1Fc7JU%u~5s|)PP|Sg8Qse@f1cR#LT&1UR~Qm zoqv|jRuH>;6LqGo%@3Jq5j{PB+w_1*r}D$!(IjKCOZpbQbF~fGNM$P{3uI!eOl0!r zpN>*_lG!#Ri@`v42CwO;zLSiPTGoazyn}>dC5EpVkj-s`<5!)C&uJe2bi$uArKYdC zpS|5K_81D3S4e2(P@Z0*H?!Y3%~NWB9gX7sQt3OYVz^GDB5w2J|CDZCJ|Af3OKi#* zY?(&*D{&h+p(ys1uZ$?plseg4sH9>S4h-pX5%@V*KMsC}XIqCq&K$RBy-}oy>wC9s z=1Q8YJVI^1F<2xMK#Uz87-A=0XM2ssLs+ggz{&45idM^^{<@;Qnhm9q382roIpJ$M z%wJYCEy78eu6T>u$mf{f*EEkH0?+HA{Ei-059Z3e_sFEb+RdQBi-^j1t;E{H^D`z7 zCd;_^!_sYuN6@$*m6sINJ``4Os|nIk!e96eVr0XD$HYhz8aYFFviX@chSNz258wX# zuU^E@hs$ql7@m^-YPU81EEYSwL{ckd4=~m>a!-_lH44EvJ70&8|AB|WewN%(kw zz_iM|a~iDp!Qk_D^^pH)I1d*YBIBNN$Z&9y*(@|eKvM^#R-kiC&cg4FfT_j{ulaei z_WaS3jK~lN+)37vs1ob~iR{2Lort$G`W=8?b+)4u@wW`a%yoW9O^(q$ek9%y)>usG zma{VSN3tBnzgr-pRfeVmMUQf=)rm^-pD7f1e&Gzwk`J*7sluI^1I<+MJ9Lcn8iu$&db zafUC#@z!B*EmKviujqQ}?3^#+TQEOlPO*unfp1909@N$D1R~^v`PVYPyvx6>i7=9h zN-CW}vqk;b`P(6@`_GQ4eajE3{I!Bbibl*E%US9OYX3tC$=5 z*Ta8;sJxqnM5e-EEwV2+z`TA}eui^@!5M>NK~zR(k|R>05wr>8XJ3_=_EqjbnEZ}q zzrPyG^P=<4ptFY2%-52T%|4!l?(r;hbxQ?8*=XeSdKA${J=Y7D&1~K}bTCoZFu&XN z!l+CeOB)9y=tbDSn`Jr;j6@fm!Zyo735IuSgO;3&e^u zGKGtz+l!r4M@*`Rw8xh>T^oQ3BY-p#w`+J?^c<^e?`*uN< zdCc7ly3%<9Ok3s|Zu2mZI`)-*_D5v=E3bPE(zks2@OL)rhhe@3JPEPv7t=AC);*KI zB+z%>ffIC!sN8hcVRc^LSFI;B2@UVx>yKJhR~3qJeo!}OjZFNPjb}@`2?MF$Dcg@aMC9)o87fn;#8x?^{))eP`!~TE z@8W^(d&jDhnTg`teIltkYsphbvFh-{Zdx41rf~#zlS!6p>U;j#Gjh zpg|fRfic`KT3nS|SAvKVL(*>0Blwz7=1xhW%TWPO>ueuvr9hhhRhkXH_TDPKi?r^) zd|>iZbEv;*qi6JFl6U;!@a58ePt@;l)lsjCp!JhR_cjajpT360*>q)CvZ3ZqpO|i( zEOHhR^}RS|B^-e3@uG=d>5VZs4j4zOXqy{JTX?C9D6UXuR2T=0{rJcUqo ztV4cblc$;No<)4K0N_fV>JlIycl!`P-GE}I4OkQ0lpn19`~495+MiNx*e}FfQx(UE5snE1Ce>Sew z?u1-(NUd^kVwWP$%>81>isHuqWzbDB0%g{bix-U-3iDBjR<1L}STiQ|aezZ1jbU88 z)5NBzN45_rQXx40i`ct#zj#qdm?6~>`%qJ?R$^-GDVm(<-UqRo9#WqEgQkK{eIW;(yx$W zz?tjDNuuU#QKkbqq2Q3?SJ4suo=t4|4&MOlnZ$GfS_+GTnD$(9PHDGl@ZU)A5I3bG zf(nCf7xx3cp&`#MXrSb#_Q>-ZntdbGjb?%9Q~?lj=esIu_72azf4NJnuY3DwlbX1Z zeL7)nlPn{oVY9P{|BjW&1I5VSkWo|yBO+t1~r2A0Z+NCb|rm6xOgC7%63SZnI zrwD3R;QJ`PNWp8s*da(NM2sv%qvSA|Sp2ZFE%`GaoWE34ZtLM%PTQA4H85i$8iqy1 zC8;(3zCf7ytav%&tiw{WJV1f_J|6grjo3|ghSr=5K(79Bar0?n<%Zma7lL{)35IV)4PIPfKp z5OMTm*C%&&^(Ymr!V@?jGBj8^9v8`pW!cUy5t`-R09Wz$t_0=&awINEiJo6rSG$8X z{_fn?2gn)#hG^WqjnkoMRgw{X=0^F%#}a)*(uG$ve;b^_Y$094g)hz08}n^4Ur5o~ zJ$0e;=4&s@U7=0=^b40XY|*Kg|9s*foq0JBZ@i8gZ8eh8G~aa1_<3<7=fNrd>wH6>(kd@sQW3TD|nzzm%@gdPwrq*q<<)U+Hhpx}p z$L;tqo;d03nHms2Nq#H>8%WvCypY$Qe7vJPO7j$BNBM@Fco+VI!Mh{l*<^1}$R}1z z1C$Rd03CPqy8?GEZ@x=SE_`(B@;K=_q4y~rL*7u+!SZGGvdmC$!QfqM#g8x4RMNMp zFV%0U`W7AD=~C4mu6C(OruaJlzLxxQTW3u;&ulUOeJ_6emRJ+yz4Fq>OqJUGKZ6_; zL3z}Jy!3m%^j`;_hIbL6UtU6e-5&v?BRxm&z)4w_J$q>_yb}_{KpPwe-z#e`W1uXL z+JMvNm&T*ms#$y?NZ$^G&h3vvN3{xhq7l1EHW7i~jT$=}yT!`bFvc`gH){d-_0j+! zFlDT7e8DiInjWdmz?oMPh&x)H8A+JY^;p;&g_apwai&Bkbe}YB?T^flLUYqcJb3jm z#QQMj`uX5LiTnr>fnkEWF|C75`ob)ofLLMyFx9u(PQzD}G`p(L9V@C&6TE4E%l6c@ zR`{#pd?ORXS@TqWEsL1_9D1nSzA}ptL2IuDSQ8=evaN@>-p3eV^*45cVQ#4gv|KBb zE|-11`**x+?Bx_;feVwaO4GN)TXP?#6O9*S)GVY=3f9wUM={?kim|F>IvilR836_? zS~brE9BsduxnECIxNqGHi=TS@Rf1*qP+fJ~WXPSm9J}PVUEC^%Ce2s9~e@SXJ$Rg>Ndf;Lcv&0S5 z_offt`Zp)~dk{wJW+&IMiNeG)lvs55FfSy_lBUPO!k#fzc3Z~%KfW-~uh!Maw1pjM z;!1x(usj#XtCV@e!KM?@7^V@!cg$=&_BEQlq8{2DxWa0dd=E&=XO}eUV-H?VaQGssPV!qMqf>9{D!42>))n*vIg9;3d@-{eHc30qVy{9PL2XbxyGZZZmM@&Nkj z9fu-2sY5d+#}jkyot~a;iB#{b^jTmAO*?}SwFk(vm1L;kFG@t< zUNW?0(ZdSz2W+JSlIXJ?A&mo|vtGbU+p-r41~!l<4<-Tw;izV-3nOZ>Ur`}Od4lkf zVg7`3V|Y)r5$gTHcJQ{=37y8De5wEWH11!&;YTkc(JF+X4!>ul6|cVZxLxKV>hpq}lP}Tv zvy^VK*GTw6D=Kp+c-`O>D@xm7q&O^4cW!_hH@z>M9klB6aJP@M#=DyTr8kc0A41V{ zMeq|?Cvv)3YCtF<`i}mWaM&0$GRl>q3kumq8RYz@)jh_PjXmUGA_B_RzO|tP(DJi8on{CrbSfNP^qT0d#!4v zqH#s(`%UrP?KgAcRbyLZ;!!A`?S~JOIMQ_r4L>^11nqDS=FCBc5)MYz=!0joZF3cI ztU=WF?UWV|mBYQ*L(!w%3CQW=bQHQ@!Sjm8AosC<|IS{K2MkjE-Og4VPEV@-3#&y{ zD?gsV5Cidoa-Z0l-s(9|qpB7mKB4B)3w8Av%{PZKWTO!7wcvTe$7Jp#d7+Sh_6Zdn zx=$FzKQBxky|gHt{3Ib6)@QBL+;hTJt^qeFBGGTb^cda8#M{a@Rf6ugB56?YwgBVv z{h6-#3F3AtM9*{=5it9q13d~FhQh}D?Be8-`#Poi>%>*c<-aaKqgKBG3JUS3uBOzt z(gdd4u5_XsvRPja5OeR>plFfkJ*hsdm+uEJV^A=t`MI{-WZVq4p7|nBFiqZ~$B3N* zogqB|B!n8qwIdh5Mt?qqLhR@K1+EtnIS01jVtCw;xf)=~ryt{>5PICL7aQ^zh0A{# zd%|a_KCP1`^(kj`sVFE-B@z(pr_oCh!7q+K*6mYHyoTe z{z!Yln_lI_CV8r9KQsy+#k5^R!Oz=WTx9AkQICto?zz6mq7<$i)frJw|1Rzvpr7y2 z(_evaog1h<#y?QihYv}J*P_ckuIDF=vAe9ZbQLgQW zt43I5{qUrum=2u=VWX9v`itoRsiEW*%EceL0IK-ecTyj(-t*%t#T+L3_JL|nI1k%6 z;<0^X+$okp*?}ae*BVGK*Nnm;vIls;1q>2Dse2&Q4+skF$+iiqpm%nPM{|K{_Q>Nb z6~;$-;%a~2?9N$4ybr;6CX1VRL9n+*eMc$R-{JTH1)0hpW=@ha>t84;o)vLn^PZ_ zC0bdwW#FAd6sS)dPZNLsqt;z1qSXFOZx3pp>iRvV4_+w`SjgW5<`D2VpRoZ%@RqMv z?J%TTamyPiwMl>)H=!t;t%LNRO6MVDi(&5aTO>do(@zJoJq;mDGqhI%E zjJA!WaC_sm<0dmKIhU>mG_F3=W31V&lz~1n!~cCTg#{$;t?@>AeD+5Qq}!s0@-e8ZYIfZI)iUw`q$IHTld1|JaL@=)(k`nxKp%k zdeXokW8Y8=XMLfMza&)qvvi#o5HlDF5Z|#W*ql-AuWPjT`~2XR%&E6ygn^g^BBWaK zn(Rl!w`Z|S9s4ZS#>!K$6$+W(>|dyCkhh?L%EU_ZYqCyNTcJZ4R78gjo+J%ZJWa-a zpyl4+9=hq!+ejjk{p_ii7la+7^i{aA&#`Ru<;)o6%gAa0J3_glX3KnniNmkPl}XWwt{EhJi1bAYjeXv$T#e zxp`nU$G7xyK~n_wg4$*9im^tBRl10H55p`{-0wzU3F0I+`-!4O*0%9AttEv=J;)4v zH;U+!s$oe-F{|Y4FB5_7$VqnMHLt9ERr9K+UoBozx*i2|2Rl?_zw7JKAyI>sq=Tcd zSMm5R#jo~?-}qy(UJ!7pnW&oqY+;@m&nrdS#->~|EHaAjJiG%dA?df+ri%Sg$S>iw zZqA4S9H>XrzD2^JUmm@AOcM*jkr*<2E)&s%j?sEZ=Ff{Kz-#t~o<@i1f%U|?@nHj@ z2Jw*+oTu=9IV^3(7j}JvGAGMnfn5A_PQHEW_sR7Q{iE+$qTLDOkt&SXGiWInZ3|@F zmBjiB;HbeZc89zq?i7tNx>82S`G_$z{JmQXUbD+`-=8TgRD173i@}b*mkV!qriadlb zi41xSlO-5|)QXcIwsYFp74p)4L(%QAi1?U@Ve~E*R{V~yw0`$ar??Uf@ER43+vw`h z1n*=*#|m-iU7ayda+;+WxU0fz&h+A8Ty;Qx4kVXcHN>4W$s4Q9oFnlUgv9dU?0T;_ zAP($5(EEum(_=j^qK)fe+A!_A9AG% zNCt+C@=mPRyUEaCDr-n%nl}$rm@{^h<;jajP&b;zJ_5?3H@}nLh$~z+sw;GebS6I~ z2SYufSvKGb-=dsnW^iQ&8-O%*kufqSu0souvz-2|N1fHIxjn}j5$OWoy1lZ?V$=m@ zSu0h7$$Ih79`Ngxn2z5HH44wf1+}~j*xgtp?cB%;6u8ZDWihR6UWV+6?OT*G_l%L4 zMy5(DRgPIhu==^3t%O4e1$S(&>547@GbD5;xlZQE2{6qUVsgJ;|CsBKejAiMobWGh z2wygCe5oqCZZC3soUYH-hG9#*( zLORL^iIS-T{AKYH+1-`IWg>UK27BS2U2nCT%}bi;3VUCcgVQY_u$y%7_ROKSW-9+% z#R1>Th|xKg&w)?Qqn}HaHxP|{2%|n8Hk7-bWrN4HYX+_+s|=#05rG-0g=uzo&J;nZ zAf$H4S0OIhTT6-)QP6}r92=m+C@}Z+PI@RQtT(=h&}#Qy_9btVF`clC_}{%Q#1E<;<(x){^aF{vv$-hK*w{N(Esg-r3L^yq`Af{70@rpnl{892~)Z;tx7tKMK^ zji|O!B&{T;`|Dxao*JygY}knxS%?3NfdW&WtB~ zYj3p-^0xpXh%1!I!qK^S;Di0K@R9$ge;gUPWP{eUk{x+ZU1j}b+8@>p5L0=LlM7Pc zbPOgWa;8=Cni{)lDOb5-be+rDD&`H;W=+VKFzPFXaO0T7ldJ#1>0l{P-Q%r7mF6R= z@UPJv`S z3=Hz~@vTo^?RgsarB)=l!(6eKetXm)Vdc8GcnPN&5Tb2jWhl_Pf6eX%U7CKlti0=$l8@oEBU0bNR{}L4v6My4Y5ny&@}vVJn_e}VG;u0; z0PRAjCgc=kwql@oOGI^UO9}A7y4{@TAr^H^&qEL2r1zMF6`z(QeFX(s&>+2_;*kvj zZ!SgFq;79ZFNs(Ym&+@r064haJe~y9J^H<%P#7eR2hzB|2*V>fm!m#w#FNXrF4kDg>l9UB7ei*zlj8`lVl zn+#=)Jexp5R?3x?l8Sid`p_p)k#E!(oBbP*%2Bt3xnaikKTz!DMCfv$j`7^a$d&z) z&hZjn>^)@FeO|@k)7xv>f8C^1b0QV1X!&gOu6UET9wmV8;YrAokx3rb-}nvXIK zJ@}b(JMan5i9?Ne=1|`F-}lE}cG*r)73E)eT20|3ixx%a9|QtXC8uwQ1{7uJSRKaR znIeTj^yDpr{iOJOmX9>5(IJ<4vtyo@`bM9&b&F6@W6NnM6|Viw)bIwC481j7nOUM>W-!TeHSr>VYd zM@xk$)qvriH4Ocm>gx# z;44%3I*~5Nc=IQ!GW+qzS1M^Rx5A(gn&H%>q`b(x&dU_0#<{2N95lVR^nJJVy{VTe zsyFmx9cEmsg9&#baZZq#a=!|(1ev$mhe~4Fu5k5*il%qm`!ylsMb}i=UZpcOVlz9x zgUYo{R6b|^%YQ$8yXN%5T+6!AKOmYkC0r-G%A6N&Ka5fQwRj3i_T1vZ7(=DmLt377 zR>8H>TQylfwDEf2o=+EyWcy_S2)VrvklV6}xz|ds5~{u-K{1OOGQMArtv57a4ZnD}p9Bw>x2o@h?t!iW9`u zaXQe1!3kC|q$aKPuclmraZu_Lt6|0_=L3WJP+6rtD8(l{4Se~u8?Bix@;iDDrSR29 z$)pNV@nNfS8LPFxd}`5g=LGj`23ayz9T2-=%g{UGJvumLu9}5>oq~}gW*y7>*&Kq< zb@p!g`#B|8&R+gBHcy-Ehp>(M4z^F2WqV(ciG(3*yZoqJP#XHBdT6U*u6R_kQcind;|-X-&b0Q7o>|}#G`ANVWkwb12~&-qH>JVOiKc=q#xVZa z8mC+ln8y>2U?h}lHrO!%3UAutEjYjce|r#PLQ|K;176zPf>w`msxj$zuX|ba*^tMH z6tiaqgvT$V<_w*AGa8$z5Pz{V{R5tIi*;pKTjs(3N@ru?rs6(So!@ zE>hVNLqAtdsluV{)wRpU!ZW~=#fyE2MvGse<0Vw**MKeb`11a5G>19rxyeJ=EBs;W zo_Npyq<8XbLmH^ac&`Zs61*-XB06QD_tHB;7Rl~MPr6(n0_D2h)$tS%CrfhP!ep6_ z{rv#hX<_RqUL)4j!@l+rwT)qxIpxu}u6f;Rl-p*AIWO67UAop>9)s^EG2ksAk7#qe z=0#l3fI;mU=?NOeu7R7`drN_+TC6I4zIH49MFxE*pNV~5spo|?NgcB-j7)b^J!- zISNhIl~2lWOT2o{<_nB6tG--43@}efHm>D}-BtKX8Q%#J;b;^&4W}BOc7_r&9CIE)Mz#M8KSQ78|a3BDz%z zgH6T}4fu~N2dnt(UbV!fW0pTnTgGE%!NP7Fr-~9OGK>o5Lv78=?4C{+`>efjXp7jL ze+KPK!I=C$YOZH!KjAToZd|mb0Ypxq=6ti)Domr#rauqOhs_zC_-g+L<2$YX=$n=L zT_qX6NvDtb(I5MgmQ8;~=PR#>x2m2VsN6=SH`BvV{x>ZtDAgAxHa?$*5W9bdp`+Ru zMy4Gje|%HKm&+%fX&kbGYrN-1dfBl`o>I?Old7Y;w+@sfPBsvMAdIbav=0C0RLNZO6QLA^@_j^LXvmR&1@nD`vH`qM+~g2U{#hDNVB@=7V>YnrEJE z1D7@K64dI^=+WQB~#eI_QBijZM4Zf((y2Rv)3RWP3kIo}?sOIqPn!8t?p=TB@{ zIy+?#M1m(kR)%NKg!KBCYoYATFM6eK@rI|NG63-0UP`#cwd6=Ay2AzXSXEz3I2I37 z<1f`6D@DvgXJ|WCVS~tmP~Z7pz3e%rVsU(BKCnP2$+mL2DfSW_IVOH%k{uZ-PV?`! zPHnP%LfLO2K_;vyn(n%{WVvB_0aIfKVA;M1s2QBr%`d=bsTruFuU~0V4*~3skHpd| z?!ybp@Pb^tcTEmMNuNCKy6_{g%;vK8nbrc-i`EuPx(!wj6EFR=Dl%OSw4iO zn!j@gd!3d0BJS_n$MpwWIEBL=iB(Ogs{ zG~EKJevuL-@*3Tyiv+bHYnz002MWCRnBs?JrNv^3UI9eIBPlRMR(pWOnkYyoF4uii+&ysT0Nh?DVVOzF3sMq78=$&Ac2(So^v*b&J~#_f?U* zH3Sy*Y#*72?^g>dz0F}&{xsPLg#98*DBV^p!^2W9gjIXH9RRi?y1xt~JGYkfPt@-( zvslCJRFZi2EdcGv=JHA?6AI#VSnmi!KPKlwn#X+K<_|Q~UxnJS_TYfEOl`hPo6Jrn zQKOLQHX#-0sB9G5m-AfHmjlsZtmJ*rn>zi4GW3_j9;gPi!$%R1FG|5gf$xK5B|F;& za^LZfNQ0tRi@|zInP&UeiN0ra>Mr&ZsBu9?-?MwP0LJH%`7CfAc>ch7#B7)QF(C1d zXis;x%a!+Q4_kVAe@}@tp3$7AfK~&S;;5pJC%mF0K1@+qyl;*}7ug4y-3T!|Fp#{1y7pD)he`gYFtj>2(;BxF5>Vvia-_TERwWPl9uv+^Dod(ZeeSkK6?jM&y` ziAt=SM)@GJJF}pKwI0VN1q({IN2*_b-dfX=Vy_hF@hzVFWOVWwC~i;ukWGe-!QH#q zQH^Vw)5TG_5g*`6H5CQo z)(})xp;)p)yzqS#q|leG|Awr+5E_P1|6Sd3cq6E|gmZVOKjf)eJZPjsxQDT({Ht|# zL;$jAUBk`jkxbwBy(-7q^ugNB1x}A$*EuLNxhzuv(Gqv3L*@y@4-E;{kN?iUm2~1K zViJI}JJ2X$r$EcEG5Fv9Y-hLH%{!p__d)?O+27I4ZQmHu;BRVP8o%w8Aa%c9tqr5y zFJwLR8b*X7+o?f`N>lebiE&bsRhak9)&zMr%9xLxz=~&-E%z%^K~DOu;$nTSIZq;0 zl(JNp6r>TQLLb`JK|BMrZhIU6=$;HA0-4+7aAI*OexC-hL;PW@d$lNWDGBzbTZwXP z*EKOaGEAWDj5l*!Rg<6RF;$nB&%>~N3wfP=;9@JKT8*^`x#+xgz2hhMKW>2Dd5WSU z_l-K zcJUD`4tp~_rG|e(xzdyqfhB_uuBejRJv*N+XL_gQxD}o2!Ky5~+!N6*X+GN%(dr|- zZCG~A@$uDgBkx|xHFcUC;WA_?1*>_})%x<-d;!ZLxR(yQg)v`E&TX0-+WZC>0*^|l zU?MH)EQxx9j*$)kbH567ii5I=Ro! zbJ1|gq&XezNq;gspi5~XBYrmEIwvO-s=ddIB|($6Yr$f0P$$ru{)oWRj{Si6Kq4-U zUKtgGV}MRVczW^gU@Vt;=J&~!V^YTaJotC@i(ATOem&?fPXxKmx80O1`Dy!5058B5 zKJ;}LW zT~yVs7V}&`TjU(aF)^~{fLPJk^E_@ApSZOyrNqLp_}HUM6WGV3AwIt@mRjx`gBZ|| z^c23pm@m#&Ae>}d(r9*Z=Ry+E~zX1)?X4%Ms1pw zRP6te3S4o=IeNwK*=&*Cq!&x+?dp0l3O0q-d+CVX&aky3V zWB!>}Ch1<0h7)5to|!%GD9%cjB_{Q20iK_aQp7(!hiz#!MT?L9a=_v!-!Yv^-*P$7 z2fz<;4Eb5SQ43vW)Pv|)*qB`1Lkh|#H#=5{&gKOAyvrN38Z;zdUFtJiV$`4{hk%q) zneVC^N}-gRtCn+07L7?l-|oPvC99TO!m}z_$^Oyp@n*t^2rC2j&M6DU;e?+jfO>Gr zlkt7pR^N#xIsm=P12RCe*!FrKVR`vKlCCl!s;&uxv@9S9xWv-kDGk!y-QBgMbW69i zba$t;bax{uNQX#CeV6z9vv+TwJ2PkEIWy|VIatD`8RX{yPj?uf$v2^2#A+gT9|Y3R z@O`+a6i$uF6V{Zoq>-S!=?;Og!UbpP2-wZd4DkKES{q+^7Xxt(M0dJ8QYCTZ-6 z)p(XQFNKg=iJ5L_Vb}0d-@7pwk~nlPJlh4^x{}}yP?h+6B~w!Zre0b;86R1^e15|R zW4Sx^5sX>mCVfGjFfxPS9?{uU$uXsCC2`r%Q^ME?7u#NeHw*YhSzkq_5)C?)I&r@z zN4hZsd^w~I;8UAmu_Ns?;1#~W$e5ZYSH*YnwP1gdrwv%+$}z4>Hg)(4+SXNzb);8D z`cj%c#VR*$HVq>e_kMwNz>7^k`V+7K-b-&oniV}ta}v9ips1;2`chu(1V3q!`=8wx zq5%ZVxx&2(5G@2S@SI@S6^>k&^%)2dfo>=02)OD241 z);87g;;%@JcA?qJ-rb`@f8uhEU_h$0vh!1JZALojRSw?B5!InlFXvkt$Q|?n64H?- zBI{a(t30(1XER3@%wo;pE$dHSSKB>E$Y1-lF~O3 z(-#WB7DUzg^O3c`KL4A@?kxy7a&`A)_|LyieY1l*Z?v}fYZB>N5to^E*9@IniRmdB zAHVWe%xlvL^?_xy(UemlIaX)ILXOFRSY%V5l{t{rM}_b7n%$(G=Dd};c)2{ zTGj8*8|$z8cFWI8Ah=8GS~L<=kZv#e)=e{epqzL#9|UiGLWlTbaui0SBlk3o8dXO8 z&xrL}R6gp|nQ}z>#~d=%U(w%!*4Lt}`HB=Y-{@Q)*UDB}Y zZmQrjFBN{*hKOyBgf`tDt}sF+pA3e|y%MWU14}RU7TqeBLL6dKH%v=OFgS`}&VHV= z`ur(`oH1{hT3shW(ha+Zrhn7&5neBVuGI*csbJ3>%kkdk)RSLXarUVyt}N_75RG~e z144IBOD~A)bJ=Olae_8_S%Fg}kD|=?n?XKWGLXkoJ$iQAXB9tkl7}AXr^$*H*8`;@ zXnw0qLvr$km;NUxrp3{wSP&r#nNoF=Jmz;XWsdkdyyp6tHEaJGIO6Vju@`d|rYZ_f ztnvBbj=$7jE3Untu*W4tmY9$l$4c9eaCHBy8}#}0n%!HA-u9_-a8ZGMjDUh^%_cG0 zx2}Me{=~1|<{cfky0+OY7k;+nx*B&{shny4V7~Pxy)R-ZTOQo=pkB-;# zIgOJ*Kh%xU7d!|!t)iDWykMy7qd|v%x@)|Kbh<_xnuICi51uVb%0rl$>-yd)LQZV$ zh01onQM!XIJW24QOmc=}g-la*uRPW0+D{ufbFQMx@o|U%W9JGOJHa~D1u)}se@is~ zYM?|8xM-r9%xze86CQ@@IvrXx!ZqG` zaRR*ET(9<3xsrzbu8+Vaj{PPRWYKx=N%G zjZ|MLTyO5~5eX+OG)*C5vB`$xBu_?F70$;@09trthxcT3L1Ic&aSzTc!m-(URXMP`m8DcyX$yJhGFMz4FVdynppUxoPk;{-1H| z2%a0%0|#R!pHgT}cn`HGfvz;h!K##DtD8$pItEx}`*= z$7r|C+f=6}D*3CBKu&9k=GZ*ukZUSH!?VQK1A(YH@dhV()i4vTdty9&g@@$FrVIZ@@9L@ zptlXx@h}42Yx{$GLn}`eK+ySQHi}JoKAWS14i#~wv?K9XtNqjChlWG6RHXQqxYbb{ zb#Ee8M#?nwT%?ln&iMF9u;!a@zgd3e#52yyXC4K%%_=l?9fdGtuBmOy8A^Y-YBv87 zTT%Ge7f>+ky`-kyf$@>0Nk}oIQqL?3rs2W#)}WbvO1|_I1@RNIH1sV6a~(cF^EOyd zJmuLXWSB}0$Vq6XYYa{b;_*GqM%zI=nOBU(>V!@+^?CD|XOQ+RR4k%UA`2w>w_6=? z0KlML6DI}C!|o%kqw{s4$_|MAw-7#e+S1q zHh?28^==(c^^okK`rI14>$Nd=46Pg#4&A&lQP2kye+vbn8iMhFcPPPYj|M)x3o zRH$^0X*qbqKy+Z*j}b?7MhBmSziAPjTcV>+NwzE#9iPNbPZll&y=D$(dvM7*z^Kb1 z^+rA6#}zUa=v{GlH6n6k2TLrYLqGr#)+s=cEe528wpVvSFRLPBY+B5w#a(Ib;`Dg_ z<9ee)8&|5>FHAWkXg2w_m>ThGso+{j3eRq#>&!j6O?uR#^4MeJux+neXu5!zG80wc z&aY^=t%?#hH6Xq3o4xf}T)u^!6$$tDU}AiYR?|c|qM1JZm(h&c6T)(ou}Ri?H=p`R zbn?i(-{bsc1q%euCf7SWfJO1$sFiixOF$snt9sb1CBI5;1J!ip1+mI4R0RQE`50Cw z4tb)9^&#U-;v{)-5zrS~lc;fl$y>h(km}6R&0aYpsh7oV)(-KNO@A(FS?)08}~rR(_LEI#zPzD>%J!DEv|0q3*V``GQ1a+{OQGaHwa8(1}p^y6AN@_ z7DL6_Czb?kS=lvlQWq6+ePI|>SGMW0c=(rzPi^?LOXNxNO+0K_ji(J)oQl|YCy$qc zkfFsfdgh!gN3-MM4Wlq>{MIRWK|UdBUCC!ezD#*)dzO5J<-P43==O+P893AS=7Z=S0=weTu;(1`G-R&bAV`Vp_`BABsvp5K zG#2_SCyJ2vO|>DhqY-m7fKwDDRQ>xv)oDt~9y#LIyE&>+3d-b^?bUAa;E^9KC*`1; z60p*{0DS?g65 zQ7LgX+=QvCkrc-y#<&joW*>%M%xR<0a4|w^y28aCN@G&Gbi<#>BQ-E@&vzMM? zNuYm?9yyh#z`&|+-ACGrUPP*1UB!R-O%K~*;q3wYv(>6#Q1yx&O<%oBhy#S-!ZKe7 zWM%JLTQoRF#i+il@mGY(Pq-1e)94gPitUCeIoMc)1P`m{z*%?@}UiCjP26+>nv zr7l>Z!&Y*iOBeihqk+7^8nrL_RxK58 z(tH|5?Hv$MWo9V3nKEjr3G2vjk1~SV{72SB>28zHmCyJ#3)Wp)l+L;sWqy};7f!xc zE4S8_`u)2le$u`radJiXH0i^0Gb!X#kxX)TvWonQOj&G&+6M>KUNu+pV8q-^Kx`#d z%eHB(h1HD30$Y=YD*(o(70y<_PRT6Q9z6U2$PIFZ4*_yn_=NQ?TnoQMg12Zt$jk9< zn2)%|LGg70mKm~;f8L^vqvMKf_L+P^9hM_U=ql>%Q`xT0c5F;Ch&)_JMDGyBK#Jkc z=e64*Fb~$d^*06s@4g=G@Dich>HfxLkmeTk`3IyI(9_FoWwgDGEzI*~>OQ(!Ca0S7 zQQhP%E9S~L%K6R!i#Md@!Q@FmKcuO`T5ZNRDW{~NA}vQV0N_cr>BwC}nE9IRMj2a)|5X`SNzR9u`Ua$(u9nAok6=st6Io zYYv)2C;pg(81|_pxMaXeegy5(L%M5+9Z8SgChd^Pi_IO;+Xk(k8gkz-2z2q$K6tzD z%}4jIv1{(j+v9J7F?-*S4=*Zri}GXoeCF)i=wic1|GM=34Y*?FFu&$=si=75I`$Cm z%z>-ID3W{6r7c7hA?+^n2@c;kdhsbROE3!mj9PUNnW}aVwb_jTtnt2$Db_wkB1hej zgv~~4N=X(kLQ~gIf9hfz=`Zc|FN{;DUUOhxf-7du;?znH%b6%2jN~k0C`U|Q1@Gm$ zA6(yO;#Jt^e!@@|9HUDAhBvZJFA#5wX}<6M*qWLTb75r#R{8ySaJvP@@8o9p<7br`#*Da)JXq3>vOm#Yd3afN8{&TPo;2(|jM2a=P3c~ef7 zxF*l%iNI8)?5&2mv6|OO0dfS?2Z|b_B03U{G+~HK8##f|vDQXu0`LtezUX`E^7l8( zB~9F@gg3YuTuDhGK4+8W#@$>NI%gH#>Qn_Xls`Q}UK#W?%iTl5yMPKR#(y_gPI|^Y zfC)JF1&YCduSo+&#eO5XTxP)gmf++fTvqw*6*O31-^m)Q?Afli?*hj&_)9UdB6ZeL z(e9DHJ6M_6&)Agf5ZpY5-lz6L^b_#wL`+#mFZmv}i6AY0W?`(b)GHXb2Of{)d|P(2 zV7;08SrtdKpw<`NgvPDL4(!TWN{e?m(gF{&oH`-}WQSETyhnodePBauI@U|2SzQ7* z{-!l_%P%p#$iVs^4ufSs-C-tm2!f-qKBEtjX-VE5TN2{ROCW@NbN(7?BBnuf6l zvw{WrvpE0}(!2!%)CzF0a!^KLwy&Gr{W7|x1Xi#z7F`D|I0}B;DjN?I^@|5n*%}LE zklJ0ib3m6VPLN6Q=%bwE$$P%&#CHbooIm;ju{3tBf0$rhpY}J3XfJ7_?>;tR>|E)+ z$jNug-~RRq@NV4Aqm%1sL~8bL`sS<}-$lNmd=AI!ANvvBEz}fc(Dy2pI&VcaVY;pU z=A9&XpZ*=$_bD$Hhkw7kf36;*z$9(-(Z<#N1c;h#1mGUVnc#eRrPHLRZ30#ujaqNm zXJDS1zT^cZ9h$+dLz>y5pT^N|_jK{xeJ#Qs2CG1iE_~};j^+o~Z4f9&rDcFV9Z8q^ z#j#gti6AwC;PX0@ZnGYr?D*e0=93-e-D{9>e%3tAebxibeWkDaMIjnUoJ+P-7MUvC z>vIledA3-SdNp^In0{xD*q%z!sVIx^eB_gRfMIi>F?_<6ZvCE}k(K`^yA@qsHk6o< zmO_eO1Se>?8Kout@-4EY^?A!_g`Pip1`DmJUB`Khvf5YElD<}%t_8NbXkvX~UI+JzrZ{*m`rgu_9&)kvM`%MHA5aSc5_}-lr*G?4VVG!J0=B+8)X$5_Fvgq@@Qt86oO2V$1faNncLI zzsl4KI{X9koQ`k9to6Yba0WgiqJ6^eg>McvT!ZbpWwc0G!}QjK@wE?lSk?vEqp!dY zZM1-M$D$cjHc0spq;L})G-2y+-yujHJJKxbQ9Qm4LV=w@OQSuY7Y2{~k2*q@bSR zE9O99RR{1u>nclsFHMqXqrmyZHBIlgfLu{-<5^y1xMN+Hkey;01Lb^o(5GqtC@#W} zPdiZ$(#s0 z=ciVj;b!Wf;*mw}gazh&LBHoteLb}&asC;%eedIAa6bUES09<*zRbj8!w31zzjHYg zU`v?y)2IhbN<(5v)^x(9s9rEDJrCeYWC_tc?fHL4Wu;G#zI-6R}s%>6Bugkh$-J*n93BnHCRj+y27dX*E|XF#9S5uZBy@f23N26PiXeD%Ir zxZIC(2Y0~;%HaW`BQJTvGH7He(_+k<0;%f@&)5jBu?pzUjMx2^@WcC0LOyZa@^+;( zPL^kZ(pF`GJ2$-!YpdMK*C?kxj1lLMM91hG3HisYb^El~4{@u;?@|{wiLq74gjS5B zM?}8f-TqW$^m?iJ+Kx8Ix?{-~ZM7vx>9{mC@#jMH51^&sznwrsb=iyl!T9s|N#if*>BXyMLGl0%4Bqu(G(vjhTppMIfP`SeIjs&6t3Duf!yt8UmPp5bd_uU8zR$n$y%AYJ1 zlukEYkb)77n1w4yt-Aw_e>wiA6Y>txSEPxl{}V}%E3V_?Kh?&Gey@^&aHmWFUVW){ zMgM9dnmpOoO)qP^BTdlEdgs>y=dR~;z;R;``p8r^ZXKi#>uO8_=R%uzhddZ$ z4~p@pp-10jd{0PfRcEg~)uT{`g)t<%TpP1puX^*c5)_dTzu>AKos?+){>CK|5L2NN zIles8p0ZY|6U)o>v^COdgG$;Wv3DC8T|YxUXNqjNR^nJG-t7^UIFJ{jNJcx{%BQOc2v&BKzLcybi$uX9(ZwO%rIaPh8;_rYfSC;RUoj4W z)3Q7V%-*4)d(TSzq>-4f$K30=^6nEBx$E<&?q5CEjJ-K8ErhM3{>;zzVGYGG;3$Wt zxSxgOsCu4Igf_ERSH%Wz>)8yhj{!=j&}e?}c1s?y72?R&fvV6@+m}=yVf029BSsaE z=FcH_a|<{|UKGDXYBWEZVb&#RzBZe*y9$(htCrMQ=fp!d+Teu8;3wdA zz5j?F;17u19gTMLy_1i~$%-3jbCrAD{s{b?CD{$l`Z{)$w}<8!f6%;8BfeB72u1s4 zxU%v%qANL<^5%p$)ImDw`WHpA8@c&Y=;*%~3iR8uYmmHjk{fvhuNVvIvCCH;E8GOv znnD*qsyeFQHtMpKXoryT?Jh5tCDO_72kb7{gS0;k(7Mk&fMmb&5JEOBhr7eK@nH%$ zdju|gLm5Sownyk>n&i{3MA_0^q~E5hj(tf2mV!v(;UNIasBjnd-D0*Ss!pLyg9&Adjo++)ap8R^uc1O{)@*Jrh-tJ?2AY{HwDHO~T&=Q@X{Sz(n1XTJvh9oXkb$Xl|>C5`2 zRchS|-y6Uh^AEJyRNX|R9GFgiE1AXGbA@txKdW5)b%(O*I$)y>xg&jOFu$KFb^*`8 zbOE!+_VI=pm;0X|5KczBFS_2^J~Y4QMJ#siN#BeXWSIV{%9DwADvs(VX4aoYI7t_X z*|1j-bnZtT)>@`LG(ByAD_>xfknQXoc~$jm2Qdi6F11O;se1TfXSqwoNw6MAvtchv zo6I_!Bq9Mn0lnhF>ND<_q4)+Ge)O*w~1$ydMOL%cWLB*q*JC&E_JTKW=${( zDy7$TiPu1*I4Z?bpUw~ySjiC6XVr-uCQBnZlCxFV9eNfc5}P&|1H5;(n2LK(38eI0 z#pwOtj>S$qaKs9&;VYx ze6+>irR<3jAAtQauAf-mHSlXW0$5k$fIZA#Aau#yY<$nFkU6v+ zkv;>SJ_m-M+J3um6R?4!u|Ov)nqlWYfX|Cf6K-q-sK1ZdQ`_UMA-ycYby7XiJNtmU zO~{+m2aeGNaBDqJ*f7jqdjM+u$pTm&wwIBV&1w)f|r3~6=`gXpL75Ec;u9P*DSs9g>dqpY(H6#UZAIl z5tBI-L4HnXm4LIe6cZzNwfq4!Gk!ICoHMBSka&x^dxn6M)e!l9R|Ne_O5F0qlGn|` z3{%!c=?uRggy%4S6arAjBM@}sh5*7R(c>TvSgXq-twNKucsK?1e$=bZ0p@695T5?$ z=|;emI^plow^x79W6!hIYRo69AsPA+Mg(Sk-#yfJ)wy-Z!7^l9q2;?SiH@jypWAo6)p85^oS`WcqxVW?Y!s=v-bwq%KZ@h%Pu-}wqOQ7dKd=5!y3WBBZ|M?9MqtQ=}J>Ci7_|WxZFf~QJd=GCn@%4N32d5ExqRMGq0@6Es2$1Kx+ITW8Q zPltb>$#S5g(53RLocrV0_;e9rys(xqo|Z88ZxtJ%45lKIN^0DSCvL8EA1dzix#jTGmI)D#rxkeNJOSMi?GzgnA9-NYYnjo zkzaJ4eFH0*qfa5TR8|n$R4Ir*)Q7$dI7W)7Z}0h)cqh-88O>l zkpF-yO2EpdL>^SBLMw)Df5b8I9^t5wSn+_{TFW$;_jS}yyn4Skupi`p*-EbDw(9oH zZ5-<4nvFdYMCEB!jDz#^_(5da;luS+i^teZ?jDf!;zqAV5}p-goA#}b=1(lUBMSUw zAOKXDMt%8{vMbu_=1z?+sSgol9JohIe@bv^ATm6jL#rzG~L23TQ!h{X!V#>!|O z@e`a?s0ITTI>7nkl+z7`go`tqP`4zg%UDRBO{gWWQ@N{g%lPFxl4G6Dc60qP<`k?) z_-|2){hy+zap2cr?hxa}g%W@{Fv(7Nfr8d$#GV#9djSBZ6<>vjZOF2ao)Wzd&#ZP;SEiDR1MyuJ`~nldst)nz2d2ccxAl&q`h zwOM!prrYSD>k16jWslvqIcZv@I+{634+_JppG6)nLt;DVE6WB@F2D4KRfpHuQj6(( zZ@*PvQV1V~(R|lEqVxN0Z1y|$f;)YzXk-N&Kr>@hZ=v9ac7CyNtf?7RTZ5G;dCZ+X zwSjq=;TPNz8lZOL(8p}Cxyk`l@^7zsJLSispK|x@3)?Dq*bwP#%ugl2iJ$y0Z2l2T zzchZSCN{>)(WxJndHQ^s+WE?R_NSkb5%7B+fh2~`)jR;Ig6fZK zSDsSr&wX|yDBj(m=h*@oGNk}U#}DGB>FlL>_x6uEZf^zbIy&%wjDBHM`E(DYSs^Lr zuRjG9#;p=wPZYO(M@c~{F|FeR1VMRhvJ71SBQi_hSd$kT#=qwHk1qjpr?k5#S%4UgM-|94?CO%6fLBLE~}&6eNMEygWMRDSm;+ zq`n#O{u4BvfR#Oje#3IQ-Q0I{k-f(d`*&2U{u{pwhOV*hn`>ovWZz!YzmDCDPh!4F z!(m7kLWSh_Ht3d}VZGqsG9AE-|8w69U@u?~-oAbyFI{x5cZ2_4{*)X!3Gg9}W}SvC zge9)RBx@yEqioW($RvwfLq}Vfg;a#CdV6R21PLThVZ#cuu?rWfBU2l@#R-$2abO1E zFQvrvVY@SI{c ze;qESE59xRB*H)pa6BcB!P}n8KS&^LZIvmM9gc?GFbwdY2unPe&&L>e?ykGg&v)_L zmd2t{8P298xHy~1@g-+!dsgAnF^vODFs)iw(TGe2pLK?Ke)0e--R}U-n%-Pi-}^$L zzIGR|DO4Mv@!9$0cIBuEOXN%&fIBL>{SN56CKdHfS%>+K9nd}%2J-&y(u(9eeBpij zQkLVF zyrA5?UBK#!OoZ?~zPk^gA#Z3K`$EOFwUoH7 zqybG;yGeQ*AvEUgeA)Tt5@`?|@(NJXGr1z&*=O%6~>Y2_t6em{s7 z8U9H_n?o)>a>Po2VeD6J^J7SC-ii~SeVF)~kl?qzIiJEeVNC!r7)JO1%G5k6!qNPj zv$=!^Qm1T2Wr)-tgzt_f?9jQ-?&3-1G@f931kOZ52kp>r3o-Dtm}AGaiP`iPqsU!) z!$9O-Po}?;tTy6R9HmF9Qk2~N*zGecIauai-;3lm5QAtL8O1X7SBAs6xC)S$ z^BWb3(HAp{C)V*?;<&eieVyFVxjcU1d&QFWKSK|tCbprA29)`(DLw1)ecN*F8NFag zkDYE|4Z1(N<{FhEa(0+AH-JmkMKqI!!9hFPgY$N54y!>ih#ADcrayh%oBecEuZM4i zKD>t=i}Nd727oLNN|m_<;~(NIC}%2yI}${$G{(NE-^!BCR@6w>bXn;7i43u~Iptkt zTpYExMF3ltb7(dG>hQ}i^?#xSQWXfcM`)Romm@D+>(jGSSm)h=ecIkl7gzWR&NFC) zlf@O{wzZ46hZVc>q^ResfY8l&1RsbXEwNJkWR{mDpR0z221_g?|14c!4j%SJHh?qA zHEBN?^mj8Qb{v<56Iv;ty*19qCi{8!W{$t82h|Qhh2b2M(Eg%U0u-a<8f6lF_P&uo z@A@Sg%Bzx}4QM6}n*i_MVW6DNVSxFfp$*>DYU#N=&x34+b$AW+HFfh=sJY5>{B8F%lnCjaDh!K7}nGqpn--(7(Djs~d!aR*y6^l3rIKxryf< zt$dQE0~*=ZFELXOX?7v8)>SXlGvDLh#+&Xm{A0+Ct$q?) zx5K49I~g+ekd+Ct@C2>d$r~P|EyVSuuO;^)Kh%m98ZN}aO+qyhO*w4r0SeWX5F=%_ zO31k$hg5bw@${q$PQ?wK2f@D8yDppW%xfSi&=QVm5xE0CILu>b^KQ zZnmk_5$NJ4bnX|s0%WQ&-H-i<*4S>32~9WGG|{(>%>W3jA5+OVQb+F*-n6wb!;V1a&dSb=w=2KcTw zgLOaiGIJd3PRX6gdz)cGtpnQqIQxRWwf!<=z8mnS>i?W+qzluhZVaI+Bpbw83@QUH zDW=e&+FWBr3nZERj!8(l`*Z&%i|fH{mR2k>2V0 z=*%9r{cVe$)oC?lMK;X#U0A_{LMXoTi5MDmv;OP$zA#~WZx*N**xa6)l@j&uS+dO$ z0omA%Z=nmPzcm(UB?grNzrHlE z=9kIHcaQINiQ4@W{p+|r*l5u6YBO%m@Uhy;*QC+?C`oDUebW8t2{`e+Y6KQvOB$?mLD!ZbFDVupcm6`z3 zbUDmOI2q~y8njYtSoA;exW`4e)cK59z!A+;IfVzIcH9Q?W`|jERrFWFr9o3NCS9yCSvYE=wW(k(LEB#M@z) zC1^&A^^RhCXuK72-D-tgx85LmD4aoW4aLrCDx zHve_WowkOtJ*%S`m?V`#rZkfp%Wk`=GsJ-cU_5nsy$MSy^WF)-IGGEb+g?5O*4=)j z`bNfp&QV)x-FGh&w#w(+F0RtUns%|knCzJ8_90u@-}MuU33B`?8WuiU&)nE8BXq@n z0(KmepTM6+?ste5QMv=oq=ea*;;@F8EPN4h(+NT$eKerm%fhn(UIXwC041xVIV>&P zZ6T$z`apdR1Ph^gdR-FhV(5;xa6K;@BP=c%4C`N zTtZ21U+>+fMTT>e2EruEv#pB|U#=7!7&qxXb6zHbVu>3z*l3asxuX@$p=e`5i3l$I zV_n?8Xa~V9iGF7lrh6>tmg*RYi~8r8hfoj49M$ z#$~c=g@-1$ZL}>kod0}+Y)O`bM`*4Z^p-~DGNGj#u?ydix;n7gQC5PgITr|^vbG8TGab0dezKM_o!PVxfK zL>lefSiG(YUWXXiXG)(?V?dA0&cOXc82c_SA~_-J(6)Kt<2@6)r50(}oe1W8+eDz6 zCDVl~43qw?7^QR7Cj%EQq^;H(89`Yt29Pgh``W49Qht~@rtJy#XgqkxjKv+#MvOV4n>^@vrIx95CDwFdBXvh*L zcUUCCSeYqrnIVP|{%PN4|6xE5Z=HE4A|_0L3@t3cEWSZ> z#mcHU&>qvREzMrQR|b;!rk$EyO*PpHsvfoC35UJ|`BN{8RVgV0P@0r@p3@VVS-rqV%{;b%^HDHnJN)66wk1}SZot6SrApuxj#EhMxz}jcOgD$k_ zRwd@AGxL9pCO+FkVN_;dGp@Dr`S*n^uU?D9O6AJ?cTCD6C(7zlu}$_5=!e{oP2P2} z8u$E6OwT3UvQitF9>&MXwbvqA8iHZeCj|N$FqMjo%yY_VQ`_n9SY#i2{>{&a$FBOs zYUoNA&A|_RC>_mTj?Y+;9r}Dv2(>V;NP)VPvx z267qkppM#uEE{9nrH13v@e^BbE*!A71nbkb&6$z5E>287F;fjyjs$qmGle>;mHXsp zX33SU#_S*c-1W-$O_aNa4qKsL{LlyKR}?jjRutLT!}?@^S`C*6SR6PcOBUL}Jr8o` z2batp_KDU<_jgvY3hX6pFk6o2CTY@oQMBs1FgcWPS`Y89o znNZyYZ`Rq2{Es+WOy!Y;s%*lJtQGBJo_`!O{kx3)@|gN&m@akL%PM5#mKq+CE*#i| z^WDYWGYno}EWU1F$Xr-M#cJZ!DZo>Y|9w|R;^LBlnkcB-o`gk6wu~FVh;WdkKY&$S z3dmc-^lYm|msx6tX5%csF|iVe;62JJC=VIy74Frsh!*G(lE{9hZ}yuASGl+t|95 z{8isR%W}%Pw|fJ_G{e7xjKDN9vN)qO?PH}(5{pxsH&02_&5!3+HdM14Bto~FoaQPutR>-7u%GgTLkQuT2FL@{f z)?%^|yBmPrY$xr7bKAtyECE?&e^8F&3O0Jy)(?%zkK6wZQiT~qKOp3`j^UGtf7p3zADy+5SZ&Pl|E%TGHwVqOk=kL z8Z%y-yrOdHg{gTSFkTCQq<8Die?YoZT_)DN*rLgIzQy5v;a`6I%80k83dbeX8f4S%cag*>!n z2#WV3(iX{yzWpbhkjb4rsKm;iW*n18?|@kWSn>-vF_&m|{mq^J{Zb_3D4 zrd#VHAKJ$_!=bSOLJ1fodq5Vf==NEBNF5{auG41(^Dc#b?D-aChoTcben5-~u_m>& zf9xIJHv+i`aNs;)qKq2K{=Iyo4`)UfUoFJdu$;n7i2sEfBjjlgCHR_@J>%fr5d10=s!aXD`;aqsy}kQrCV+A= zb1A!lr3F^AYYQ;S7L)RK)M7Sl0ZIWJZ<&mbSf606I`l+m}HS#%)a0vW)M!<>!}-ybB_?u7lYsYR99?ws@`W zBuBOOKew<#c4Z%UJ54bY-551qQa9xSRX64 zgce!`950G^oz2xLXC6SW#Gra z5|jEby^^asx^yWLJek*AtZglrSBNqfjf+DGk&Mdd+Hpwf!VF6QG+Q{py~W)TmRHQ& zCk3Mj2Q}gsg(E#n{jzpr8rtZWD7l`~ab_A?VM>_g~{nzbRQj+Yd z&U4dHW7cXLbF`V1D15Fx(@?}61Js_U@gdNA6T-7pK?^Or!<3mEV~T(nnHGK#sh=Ke zadlG<5w!=MQjeD#mj>qvi;I{erLFLB){Cm2)J14>b(`BsCNLUa#>?3mS z+%HPd0f#Ays=XU|k)RxuBA}qW%77zw^@vNoI4oSgj=FInhD_COj~XNyjxiq;4L=Rv zBXIN{@niPbh}#^Nw15I|4?*~C^@Y#`xmy10+#%q9lSj7Df*u5YMT@ReKv{YND1mDG36a*?+ zs=4{NJ$7>tv}!wRt6z+JRICh>;m@fVVpBzn7Gx-khPP(Se4+`H;4JXxaT{YFSy6}A zRSO>oF_3{4@=`aNVTd~M3^=0!2%OOhmhL7>yxT`2g4l-X(r8i7sZh~M;ysha&iHTH{no{06?s`YJD6qH$G*^yeKzr!3xpg7BzgdJPvY z9opT$Zw4<)j=5%^rX5q-`H+IT@-{w2BvYqIv$CCQ%Uxl^HfRNsi?@A#= z=YuVxa;D^Sy(@!LfIJ8)EJ75cW<*zBo-cvCIdnVPQUKS0xl-0sO5I4n;cjO(*2xyu zpIHO+KQiV`Du!>Eq@YK5nmT)xq!D0YO~^0uD;qid0fssW(@7MYrf>*^s?K*=20dk2 z6zxv_cE*t#bTMN`Bj&TRgO44(`b14OwB~=V924l`hNo#zT~7^IeiRVDN_sP=n(0ON z?49#x^KX*0U)_=kA}beVLuxGJtrPb#5-WI{#i9^fZt=3umr!B-hmqJsod@^pd5zns zz_VIPP}m41Uefje%->dbT|zDL)oXZWMCiwYpI6(rb7!6y`E*Q8gUqqt*O{HMn|P0L zL!)3b=@&V6_ZMD{(!#Y(yb7p}q`f@a#>H`evK^+G(<%tyDEp%^(El zzoCmXyQ!$e5UlbGV_EQx;7~5ClrGcuK;v#MZxv9O#g@Wu1*4aAIRL}U-t)Ah7D`X; ze6gU4$J@N6vg>y{Sq2KGcJ7xfsQAjPXMxjEQ`uMv-~x+E%&FR|)c;r0Rk zlI;C>Krr@p9x9Au##l6s`+GDhxgb#Y{6R~y3YzHAb?{nE(f&fvJxy;ma^)@~vU+uy zm_5faq?*IRvHl~zVnccP0;SLKMV>o)ouM=en1f%XD(u&r-uv+))BJ5?UM)eaKr8^M>W8w=S4mAR841CMF`3KQSPVUh{ z0}9TYF-3%bvf%k2Nmm&VRo8U~K@b^`l9G^?ZX6m!y1To30O^n%x;v!1JCq(eq)Qqe zQlvY-%lG~u?wvcg&N=(+v-etSpSCG?8@W@OPei<3;?r^QR_!(lY7gE4kh1i)fbfO< zrx~VIOE!92w~MJb!8G_M5|U7{(-7B3THdM*#vRS+EW^Q(1dK;SzxzU30&%$=XthUx z(U~d6^$smTviuHoRI5udX#h&S;^$Va(^YdKf&m%EXPd#<*8v^T;XxXg3%JBpAk4AWWHK|xys8b7S;6@e5GLAaiVOGyZ*3a;bW;)^*0g|ec z{|3Fy-^1;ah##7*Vc)Prn4WImMBL}-_eR|$wZG-0pP|U$ z+vkRq0!%wc6i|#!I_)6}>3qk83R|Z#@fpJ#qc}||O^qR=M3Yt^tUG|8r2Bh-!QNs| zI0buKP=m>+7p#{luOpFE8EuFH8b@r1X-TUoMs-zW!4ZHYZB$G1_IM7dW-ZKce!$~0 z+2rh!iwiYVvSe!@yJ$EN(l1x6) zP>BXp6DZ>s-M+G0oqEc#KhntgJMHqs1zL1dqfvC$om< zG{E3~&mpw&b76!NM7w~{^*)_@3q>KT%Y>D+Bs%wYNqdEs*Xhf7yCCs__Hq%t4XEKiQ_K+PjWc@ykNhx~^L}$m zzgWKe2v7~Bf4wOavdL}i`G`~TsodW6CWs-JxBFhfkv zX~C_kWu4Z3zfN&r>eD>zOWwn=Tt6u5w~E1{Mdj*|?jd0~*$V9=P@l?g!(Z9+5kc8N z(EfXh(ek%w`L*_uUZVeY6bP*8s&VM62h{Xk=&M=O^yQuhZMgbQ90O227R`INx$enf zk>uTz7{Mgj+zV=^a8|+0e`(#%Oqjh>F)XUuM4?(nv7ORIDI1DE3c^%SXQhCrdJqhRs}Nuy z&b|a`o8FbzRpS{1_+fQt765aCsnBS5y`b58dBK7RRTH8gnw@ZQcQ$+a3M347yl%>z zX{fJ}8MiZ-oUmJZ))V`qn!YSO3m*Nh(C9{(Seu{<@qIo{uL|kTx*n-bL7+f>?V(v5Vk$cd{F-v;_K$h9smw;rx7bVc$s!=yA zVJ0SLsB%~9!2t1dcRil|0w44DOj#NSCUWep(=v}d!=U>NOza#GNt3J-}JOKHSMrP=Hd((S>DyTpxf z2_9kv-{Dwp)iZ1EuJ#QT*b?cs6LS_{VlJZJVxB2`h@zjZ?AgbD)X;eh(-d4LvxYRv_U zmuiJK$4A+cG>>jVxzXQ;kgv)EdL~#|eH)|gfk0?eDf=NfD}2}7aq`}_!qn1Tu76Bl zxe(D$jr-uu6{a$l&Nrm}0#{_fhO9O#NlZio@T_Glh1Y zVp)+H@rN8l7!L-CflE=IH+Klu*K45J`FS#cWH(A67TQ)>_$BXwh4Wx^?kNUL2c%0K zFiCW;_}6rQ@&fj@N(Z!D>G5D5=JpEe2E^D6bflO6WgGpVY}KJNMK)1NT%M+XZ&wb9 z)Fj9+YLpg}e;*>_I-c;r@vY{dl3ar^-0Oo*VSrjS8e!eJ&-wz0L_q_X=8G({yiCRCC!Y$5Qp&$^!bVwJ}2(f-ai&*yK6kJ`bF@WNuC{wBE>q4X}ai_M8ebPFKC z%&5cx)g)zJ_BgVLKIz4CzW2KiYX|G>K#6*({^0aS>j^cl|KRko2Fbu2Lz5{XrjA(0|zrp<# zXLgz_!B!Duh!fi9xG}G_$v)&z+EjhB&|Xt7{ggSf(Ypc`$HWI3Wh<@~wSCy#q1L0E z5G_PnnlY~NgX$Xr8UsuQQnZI%;9VWZ?v30vN%xUC1CbTwi}wS_dzL~m0}|#ljF)#5 zMF5Ku+xc(eeGorlR*lrr*no;73e4?~V80c9fTv4%~Gn2tN77GFNLQ z7*hXakE{W1jjB}MuLviM-1rH6uj2<0y^nii&(AF!vc)E!!gMw?K@pImGw#x%IW!@; z0C$}ETX8bh60+gMdqLZC9X{ahE&O#%`51U)Exe|RvF|c(b%$#E6TIgvcf%Y!{HTm_A1wGKs2WP+@uzl+!#zj2Wrtlhl`a>FS*) zmcE1PDI;eX=XwqzafzYpWWjFyfl)n4ropO;2RBx#wwpE5C}D)rB4t

kjRIM4SU5c^i_07TdE8Y=ZsQR_Vo@;KS+YblxJyb*P6)?VFA{V+&xM%=52@_qTOy z0z@txi6Ht4&kaNh>vv%fb1du7;5>8ick2j=1H)OhcPEHmgw}L$Pxdn>&>8|rs3v9O zjgi8D(syjiDBz=?_CQecf*c6mLwlrurPpMj>SJ^jAvl`p5=E!x&8zRswNZMQ#X2-e z)qh?BZX+JQ|5t@-fy#p%>b~nDXMw4L1s<x*yG9?Z?bX@HM`iN~OPz>uB4v5qU z$j|F`#==!Fkw~%TjgR#PH^M#H5`3u9S_?-@S`zY*itM8C+k&jJKs7-?`n%ScJcI%F za+8pH`2D5v>wD>-Lumfshl`X{EJicH*Y40IFc8SY$y=2)n!(P#xA*QkG)o`&KzD)Q zwFsC3+Zbo}wzwY0E`8U73e|^QM7GUlQACoojabo5DGyf^HY6u4zxmd%qyaWsF@ z%KQBmAFL210&)3kV-jb4M~J;oYVIZ}EE?qbsz8$3!<$Y-%%$_35dKFD_0hEci-uNs z&|1QN!52iX7{V|RqR#d7hWD2;s0{FRz3g>M3^wxpenqVbvVU{4@k;e#Nxl-GUtCrz z_LJDlw@4wh#(3iXE9uQH^yUKHMv3pvlh;)$EeuGG1-p%8EuX&Mp<=-C&oXXQKTK#0 z%tr7;TIR4?-kp}ZmZe0q0h?zClilXzM#+pjtTeqQSIj%C{Tn9#09#X;{U58Wcj;rD z?0}lW6FkRKDd(fPmVf2xTt%G~Q_G{jBSNQD?KX8yC)W7UXSC5!7F=QrabrA#qbB#K zY1#9edcSGg8%+{Ig;Kb)#X>L^iJM>{#<-k3k)Zm(VKD?OM4teQnXTQX!?1W10K+=b z%u(;w6db#1uQ_0mSnP(%Ks% zJK8hXkn{7>2b^2X0|;W7Xg+a<{8|x&v1IS8M=5YHQu!twQGn+EfUdt=6WDSQA2HYv zR8?X*OOzYo3ZhAT5%eHa_9&<6w&9XWA9y!Ig-%v(Vj9(E-2Rm@Qg!A8Vzr^z5~F1( zUU6~Dx4G>tWHE)z)WpC0vA{60PPAx^6iv6BDe>Vm)bd}UWGow?wL6ID{B>cc zSKFE{kqJQZUEc!Jrj#&5v{G$gx%A!VS?mpOu3JFl`u{e`VDY_iMPgk<{`N<2$kMJU z3s`B$4b8r7GXYd|h=$9j(jyZ-=pkho6j@zO8@dV&TLE*Kmw=W8Ag77Wpw-TdJD$K~2j?ZFkrhIASZSF9{ zQr(fX%vX_rN{C?rmqea#`R(g48nH4|%EN0rdkcs`%6A;7lXO_{Oq87>mb&xBn?=G0 zh8%umhohyO-PA;l8*J(^ zTRSy>9NBE56h7yn3_;UOtlNE1T_|fM#$=YZTB+_!TJ;iht~^R$U?cps+4m#Xz?na8 zimw9R6e-%ULJP1UT^=k5SGIZMj7|UUb;_zYtSSG*|NBY5f1~#kGG#c*zg#rs(?fQ7 z8zxF3K#TVliSJcv_g-4rb+Tg%iYmLe!>I=5ck1qF5UKjZ@7>Vn;azOqRa=7zMnDX% z%C`Jg@@;(8_x>t?LC$ftYD5y4ty14$aaf9F({vIEX+g+mjkNgpvW)SKhNtmKw=Dsp zV`}$+=G~!3H2lpviI;p6hEJ=ztw&)U_@JB6sdL7m?SP!lpy zN{^?(s-1Ku!5X(ELD>EX&fVeHzjxwog+*p+{q|}4+HR8CZiB0Q6Ebh1S#;v_I`bTjsf;{{OME~jtp9cOVh z#m4QQh#z4{tuQvpcI*KVt+4ABG*GV)$DJXt;{*eu!#C?wR3DwE1d;!}jvj5jC*bYq zio2Z=g!!^SO*?90j7HIjp%p6wv0l}-Us)7hEqh(D@!!3Y*m?2+Hv)(F{)#cWMk7ue zxMFMYihIElmaL5BAZW_fQ2KS+;jZwoIDw)8$64)KI;l#M;?EvF&${NXm|TBJJ=G2s zg92}jHp$zkJBn?u6=`M-Ry{9MEnNT!zNW;$0~*LFCagOn2w&6#n#o_pcaHoWS7>cxy5mPA%T6>xR<4 zs);`<@3?_B=UoLd!U_x?y7I4AQvtce)!5h(Hw=Jh(&5~2RJ?VV0*PeB;PVV|N$lv| zNPT7%6-@KsM;-LuH-Z(iIJV}t1bnTeOhqw#<0sD|Z`P3B77vVU7sDT}@@B@IYs)cV zMFK3wSC{>5)IOuHIO2EFk-d|9HWUg!?Pm!Qr_+KTHugy70IM9W9zs{n5IX*8z@R6d zOn>wA_G`f!%}3ct!t4Y zX!i!m)q*pj-;cw;uR8A78F74~zllx#Y;GLp3(OrHUlL>7?>l>pg6eC&N;3NfkEE96 zrXD1M{od*HOxRa*3VnBQX4*@!C0Vt(%Ko&YsYJ!OT315RT_;wWPK(Sa-R=_hqd93sF{PNZgH zLN*EUb7$KNlLfi%sX7^F)|9yx@gHfv`6&_fA5-KLHtOEB27t9BfSxszxFZ@5NFp9| z#EKt>ZaEfFMV|x3Q?#Sc(?>?g-g*JH3OG-dWukH6Z-yW2m>Rsl@c%Ao%80^}eggqU zTATg5<_E8BdJLf0)nvYmtYP8#`XldK^-_DI!gIj7Lgm6uT>xc}!5s2b;lxxC(~E-Q zf9=%N?kgU^tEB~2MASQwdZcQ;7eD=!9z!&#;6I+$aQI>@O9!3iC%m@?u1!F1%G2Ok zhjJdy=?bxMM zmrX9~^s^XrH2er&tafZEzv7Vfih{RW3c=5-9ZdzBvyBF9h|{VMEpD`^44SiZCr2i* zggbG8MZGVw2^Wg{oG%Q9ICUBFj&r_>xNxatwqWT2_=yI7#=rCc5YNDlL^=t~!#9Rd z=`WP25>$Otby&C|-`+d2vAH3!a`u(&Zng|7=T*`G15S?)^*r+ZS7k<~ErmfX30WOf zS0t$0+cDJx0B$4w#ryECO+;ym`7;9V9)M z($9(dB(IUGW?oyK-%1d0?MM}+J>M&AYm**#SSpoN^k!?|F%e;Z0s}oId%Nqdy5MXo zZd%7GtA~}fT@7&TM&_p)j6BPMzH(f>eUkWfW-Z@l*3ZkcT%{em=#&2*dcJ6!roMv= zKSsZW%98YXkdJU>tk>~h;vckPbvd(5xc?m_;=e&23;pG+|IrfF>OmXzFU6|RWspBJ zV)pFm`d{KK=qJp`G_0JF318k-_a7r$HO+v+vV6zyjnPXsEF3*xWmly;FiC%%GsEs0 zYi|_-D@C6$u+&^MLN?tpgO2;eGb;Y2|f-%Y}Pjf-9jfjQLxX zmZe+F$1p{jDa*o@g3p#BMnfN%8qgBzM}l0X%gY>87hMoA0i?}GTo28GozFmQ$+uSK z!#^PEpB?t9u*KJ$kp-`|V8;6c%fC)zv4>7dW?8YdOM38=jcJ6PnXIQxXLOe*20T*k z&6d9&53hL@Fs0rTMs5mE#L#IQv5-_(?1B_{QA()IG`_=g5PIlTKrI~O2!h(<2pxxn zFp`2Xj{-S-&@`y!vj7}wEFiISWkE3Y849WL&dePeUq`43ML1fG;m~dNr##;oAQZP- zA8fmJgbjUw0D|0Oc^@PLzj->1zC^lY;)`RY&eZ)hU9 z>wAv^6}m7KAecy5^YWKdr}N0$oVR4+5X{83SIDOU>TJ>jD=zGL zbK!E?+b*ZHo%0b%D=dFoVzD_XKO-9}wH5yBV13{886dgS1dcGi`)Z=(od+l%1*$y@ zN;Tzr(BS;mN7KFy?*JleDffi*vRW>^0?Mv_8?~PSVz4W@C{v;KyDp#kFR<#h|Day@ z?56EvAwT(ifz((_fT0D5FMdz)I<^_IPEa39Ug^h`P=?Pw)7H1)>rD=yY=*F>Fq+Y4ustt?mEY|DYTiD-lrU-_pW51tnPq_ebP1e+5X*O=87Ks22Ry`FF|3@*2R58t?fY0T+5;Yt#0f}L zn_LthlmTklB{sZi%7VA=fdWk^C3ZMa2&xta<8Fr$U`yOiruL97%*DZtl2Wrlro^;n z{E$8y!X1bIpvNUx<=D9g?9_^z0deCrqk zSBPiR1$v-1G|)pcBA7O;amy&J0L_mH#H)8jjp&}jLMZ=?CKHeRjR@G}-Tpr0H#(65 zPHBT9oP-&$gDD)hL(Kj#Uto30k1*AGd=0nor=I)qOf8!2){?0Ei3$yeXmH%C*Zi*B zfIUZ&=(2VpHS>lV-Ue6Rs!SBa2cZCfkMBb#Cw#hp8e;)0z~_Ndl)f zQfD@R`_d9q4nYJhr}zv(yJ;{a0HAa8mtP=BWhYPj%~NKg+9A)cjVO(zK5twRP6R+5 zp7ij`Al0v2tOZ$l;kcLvr|$O5aKsEt%=4dvUD`5G7y2kzyNKIvs1_z$zF6LC92-IP zzrkc?>UHmz45xuSao~#{?)c|09{V45*TJQb`Y?DbS(VoSkXE5I;Rvbkkn}z_D!*BU z7mNW(IHdo6kve*Cy+M`XE_bD2>6&=mbxE{tjzVx{zXK8i9v91L0FXujEteo1C5pp@ zK0BXqI}=7HoSo{X5v?Dwr)+Gx@$g<|G9+UWyJ-NtbJs8OCFvV5U}sddIjH3v6!?q+ zXe6O_GlR}JttlRko&2u(yA)3YXRKb=x*@P?=I?Cgx|O!NZ|Gs@pT7~MuI;PWksHuB zc8Xol-dqx`LG#O%w!QNrwm%2KU5?`xW_$6*?ZZeeNfq`QD?o3Md_4SfAPPp}6^t|_T>bHCTCv6S&AYeGm!|{5nl|hNkg#Md~SNU=>^^kjdZ?Vu&B?T zaU8+J7*IH7<3utQAjm~HiU5?OmwPrkY|-GqnTUT>t@ikh>gy0FH#wQEwgz{1CQTDl zi6dx90XL?k-IFE76NejNeKeaD*5X_fo2rg^`0ArU{@bS17lq+&K$&`~U-A)+vr7O_ z8x+;yVK25ba<^gle_?6^yX`^Ux?pmv4=4ug!A2}Y|6d59k_0+0XT;j%IA|0?K^AV} zwSw_r(|(z8+E*0La7~-0inlbbUi)bK@^~{%EynkYFI?s`ZZ4;1E&e^*TBVl(T7Z+3X?y3haQWI15DXg(REKF@sM z#$#twd5;jIYv8c+Rim4KKGCDat45afKXg-l6OXt7jo6c9r;W>{B((QDFUo?=|MDK! zG>2FpODc-d!j@lmJ%(X%CIAKX%#e5v$_a^v5OMk*y&P2n;z=kLUUz-xvTnG3(Qh>= zYcmohO86b60Gh80a1$@2Ea+ z|M7p&xkUC`kM$3EI01s*j7O^N4G9cB)jjrX0gwG(E;#}cH)oXa*8{M9{KFe3~*razIq9uvgwi*&<@{(2 ztB5sSW#pZ^>jU2gEh2XLn6klFkuf0p6{aN=I}XA2Eb8nh1_km~z}ZeR#Ox#%qJjUQ z*q|G)dV;z)UOvQ^??6AU#<5X~>Wcve)2-;1`%{CH#sZe(%ydueTom}S;GZaHxe6G+ zA0X_%IN6sQB4p<0lzUu|^gvAdZe&R+KM)dy4wQ=UQrdmyq4Wmo1t`iZ@&wMan1?>1vHeE55A_Z* z40v~UyrWDK8TD=sLKa#kHG4xpf`~p)$hsf)*)APe12F3Vj@kQPTb~_!r!nR=AGl~| zh`Q`R7z><~c;Oy06PA2H0R86*e-+!?uMVN|Z|-33Xrpb49|`KQcb~9WOo&@=kwFYB&6spAB@@ve*lF&kaqg(%_m zBRkUnYm4EDoMI)#UMnNGWDCK%NKU_rZ9FPAIU6AUT~RB0Xw?A+s5?X1(5|@YK}^yS z=m$S*bm%(=Q>agmSxXjwH-KfilS|&S12NB*oPDNBj$N4j`Ze5BB42MTLnv2oY@N2D zTKw-`nC8J<<*#BNGiw*wJz@`leD){>C33(;-Zfn4dVM6aFxwA>sb(?Qs9z&+zMpvlNPuYW5h0k$e{s_Q|^KfMZ2qaj7JyM=D1`4wsYZcwRfT-C! z@BZ#)!QYA^Z0ffmxXyuhL}%RtgiSvER$`vKaroG62whOBNMs9asoI9akv>Z(HQOu} zuyZ9R>sNAY_>F^r+pS?ew1zIr45)G|2Nh9uU7ZBjIMK0V+khAP?LO0%ROI0n$pNHT zWm|QVIdH!;Tk2h-m1-e=w%1cW%=oO3rg`TRUgR;160zl@(vY!Ku(>$iO8oj?p)3YY zo4=s%huv16mxYSJZb`NIU?}@?j`~VRsrk)=bM$EbEZ9PD_dh-S{h7dZbWl-XznBJ) z0(?$!3%O|%`47i=)+$X>n@1;MgG=Wxz{l7^0|4X>{H!{^e5#{)44@^^#!cM+S&-Ot zth0)5p}w#+S6LvsB8+$u=FlB60GpVaul86FsHPzRddf~AOn#ypX%PG!)CyWgG%&w8 zN5i;|O(B%NcJ$lr9G&>;J)m@`D*odvj%3IJ5gCJ#tQ=>f_!akbfjyd|^$Rd@z?_-Ps^++T#U{fDrJ z@Ta)b84&ha-0IE#>hU-t_&9{eSa$L>FX#hss3K|N@tXDCP!w(^8Not6WHW3^Ko~cIXz8D>b^l;^#YMQ&w)Sm&8 z;oD?I+IB`8H94JrciNhLE+`X$diNA8%nx(*~;>68$h^|8u*1^e|#2%=bCOS^h7{Stv zS$~jL*~d6AJ^^rSiMy1xLiX3x_fe?(ZcrB7`GQ(vZe-*h01rq!Wn)zZs&?4^2@T^7@B2I0#%ichKzIv)9OU9@}DpN?smVm6@Yzo zy=vuvY?E74tUBJCentd2)PSr+bwN78$cK9Di^w7&+UiQAlL|)ih(%jAyq{dbTqj{S2OTN{@0)t5R7fT34g12A;=_EWN8J=5fnp4t-Xc5*tw6kfS= zq=1fi_RcgljF~X2_1!4qtSR9MvQOaNJmDWNELjdY zF+09T0#RUwcTUE9a;6K^qbe~6hgPPRH48tnTT#0CU+O5K%KZ6Cp@BJ?Pi+!sl~K*p zc&%kt*ZwTic)e(#Lg}80okexS619#62pE6o43NCdkJGY8*Ew>@zJD+JG*A4nC=S!@ zc}L+%y7Gio$i4mddy|cszab-W#79}wgI4-Ieozv3?W{H(UVYYmI{eg@QdE#Iy#mSM z9>051lM0iu;lDzj&29OVk(FsXAQ1#P<4P%?--sXO{N|bpeIE}4$ z96MBSz+r~RVfXpngyRx9#*+l4DD^2LRVuB$`>P}8PGk2&OhQdDtHnjv@k?D&yEL@UjiM&7c2UZEXuSMESWuo@{jFM4|A4PLF z_txt^>f_5q26g~6{S>yAaJ~=|tiyR_XCR9YPtfiAAv5~%$_D65hO>NP)e7!>?qEuXBTy;zrqKML}Y&c{A{WaEl;P zd9=Z&QFoxhp^tqYf(#EC+l+f$S#!!!vn!{v1RcB~+P;}l-;nK_T>}zBF1(_T5FR6M z9KWr<`(OeVtVMiK+IIyDf-4e~YOheESmwfQtZxV{>#saxO?upj*YChEte=rn50EA_ z7SOU52Layqfy&uz0ybHyPwIFezvlaJBL*V{Y+MId5Y)n_@8rsjI8C6_cn~s*uzJq` z+bE4^$X0r2+zGX!hrno>5G-wX`GS-;DOkUVxj5$Q5&Hu;ld24dLZT*Kl$=v zwj7g3PUMs8Vm8i3!?rhFHXzH38!6t-WlngUBvW0uGb?6y{o8s91`M8%Ux=-YpF!Z;036O+T$sw<9pZesVr2-0xm;&$1ZDL z>W_vZ*@6AzR{m}!(aV!aaf?vihnyp37k)leB2Y>I=xNF_ctgCq2?$Vx*PFc_R67J2 z%4mL2WE2Q3Gz%JpI}{Av9$+NiB9dtRp*quMP0GC@rpw97k?}V1n?qIy6s>2WlpS@G zI3-ir!!fP+gF#c-5%HV~xSEMCS8f&>Oq-M0RMwh{(QR={YLVdnPXfTE_LpyxF2aSJ zARNP$UZytjbBX)zyApS-G>-}bJsaQ@4g#YJ9AeQJD9C%B9i~k`@3I@eh48Ho;V5B* zpr34G{q`M~b0rNkNtY-QhAodWkkfZBi>D<+-X1s82eJQCD{|KCAKAt+1J=ED}(DjkZZrn3I3 zhE_^ulnIxuZ~I>lV+02SdEc&7x>Be(mIkGc`9h{{rYCdl)DG<+B)#Aiz#cfEX1EzS zuOs!{&(C?&@Css{zeh*EjCRi#JL4^iPfB7|k&>ZLC}g02NkY;`I}sGp6w$b`%$*)8 zVGN8`6P%Si6fJ_>mIA>B#M@9e{=t)ZB@BtbT;TUO|IMmmS$WtH{Cw=)Ankx{RAob! z^XFM*AEYXH^*my8H@;}qUiWLA)S#cGJqZAe{FV>ZC|B&nG-p!A&IqYiDlBM_p`Wh6 z`z*up*XM8u!Cm7O9l+z=M> zvY;6MN3)$+Ws=3ze}N0^Az@lX`7y zhn!_1)SnAGXb@E4Xb+4*5+76eFh}6^%_81Wn!ix$N{pLXT1(RIMi~) zplX3Z#Yt{dB0r)4X3&70@XlNy7&w|;h-a{-Fbpv|5QUKF$Rrk#x9jm*1lE}WS&ptI z{Q2Co1#g;&yhOVln=}jl>_JJ5!&vUL)YmLKUN}*ixclFasox0{dN~3qPGu>n@~;Ps zf(15OO~?PO!?~AJ!RvQwA8fZ)y)w;n^e__o@tG z4k$po97S^HFyq*!eD9wS7F_%=Fc&zN<6P9`|aD#qD(+rJ{^Zx9D;o&cAEJJ0454) zA(3AqiUHR~jTWM9_DwS0%>k82gt3|S-OMQ*)lS$R zR$62+s1o8SEZdBC)dt71%; z&4i0d$I-IZ=Kq6hhSo7Ld z>oRY2K}QyTeEXR2^);R@9WrB0ssDaLn&`m5IP9%CbHjj+lf&BoCFCG109Cy(5!YKz zF-4EQYK^C`0#qVQ`0q6yVzCf{9vnhl5VOoHsv;OGjGw6%FvT~0%I?^~Ftje^$ne>HE=9tQN@eYnth)# z_^s{__X3ybR41m3-J%qRzFVjfWcG+6fZ1a**8J%0hkFfc9wP=+ZL5ro-KlQ#naD^E zl#5#2w+0lgg~n@tO3j|sRrg!EwShBg6TJ<03sX(+AH7k3Ow~J2g!!9X0TWauEg-5T z1eKM%yQd1V@urKWeLjixmMSx=SG|aV(XRnI5iKo@YyaLci&jL>tcU<(SRr{LZ2qO{ z3T3Y=i7~_}3{0_G7{B=1j~d}98-s265=CO?IE0|=X?^|AXK)K=oE`w=LT({@fEkUD z5kJ&&fu)#Qm|sCl(V^cPU>ns!Et&!)9zjODVdYUHkC{}wF5k!KZ5J@3AbCLh z<-n`hU6)f_w)%TOU$#+iG2ig^`pu^oc*4C(*tgsTrD%SM^1d;**&KQff8N2j-VFU5}z0_0H)f}F~q|6?`Asvhr^>bR#Q`TjVx z?ceV0WXBo?+h{Fr@3HE2ds3UuTQ>mo3r9ci`+1WWYm0r8{4Q75=KMv(Bn)}K> zNyXcCeLx8OdL&FAIvI)oFGc4~*}3)R=oa;N$5zb)Dr+KKLJ<;4(148AEnPy@VqbZAgH( zdGjBOd<1M>C36RGh*N(g)>x*>0KztS=zNddQCuvf=fFd$j=r&ZvJR^9Lf*b&qcNMY8%C)+h8jyrkybFrTx z4yZNoIDoq0^WE7!VCM!hQ`QN9%m6~Tc>Yb7BaqI9e|NrZzs#)yUi6D)J_JA>@8r!S zgGGIz>*9bU@Sy`i8L1%@;f4lvQ1=-fjs*EHcp-_(ilJKu3* z-91O&^G`i}#s)*{v#&<_3{FJhP!czG=ukX%@z9XGGNQa#N{*DjbZSy8EAyt$swJZ; z0sdQhB%-R=Gt*BG!nr4bZ-R?$qjwZ1&<#tN5{Z~-gzCJ^7N47u!XR_l!U`;#H0*OO1eR@C_6>uKBYIJ0WQ(th_ zYid5F^Ju5*NU~LfN5|q@rA5i+3Ul8@NU$r%Z-RX^#}5lB`RINthJ{n}Y`&{xnE}{d z?rcK{7JmZ4;-H92VBHN?aP3Ot6I=eQP0so^o&=PMuCn)VgF<2E6pjcrSDnf|8-G1T z9jo^CHcEJvF&6#pZJ;o+3b9}QxGF5Nv~FUFT7{%s-my!-nI1leixLId^@s-$Hj)#s zbA0OVu%+KiLBk~YfOxUx$ES8+hI&e<_#H_`afk(&S@AmFcUd!9#?wH<>KaL@FI+&% zXbJtcVjKvF29uW(5Zvw^2%qrG0RXU{6&RT8(5Qc?fkSv@sF(B>84t2dyME~PK}+?h zNArT3HCz9~p)uHYN>~v&P>Zif1Fj`2bIaRfPqX)ml}3vsS?J3`0J5h||fs?zGIzB1Q; z$_qeN@Oo2teGhW6=;BF5&4zSHoyZeVfnuWMR_j((rhK`)pg1I6HE@;3gY6Q)l?)SO zD0hauUMX`AY^lzu_{rn+2FTSr^d)d7zoh7^ z*wbc?*ot=u-|_D-^5(!R`FbJV!RIBVltn6z8nMh(xYqjyGbEgzm9$gabetb=6x{}~ ztewgzl~T+lF8|um`P*#LwwG_}HcGb)CzSzzeujIcu+PM!^8Fm1F^2zro=1H2)L9J1 zsq+!NTSo_ywWSy*r80!wP14C zNNzk6sKCrtlY|KH<;fhHtydHV;FZKsZh_w3IV+d)fFWK%{t*O=xo^mns*yaEFIoN( zEez1_hyD0t)NVI@8$L%B(vj`6Q$(Ue=1Hkcdo5DVfpU`K5ab# zL!_vPim_T3ScgnGd5EpjWRUZ%SkYNGDSsKF2S%!_0>UywG23$bPVD)3trdocH;t@q zxSm#_xo|Y$8vBe2^Z8e1ATQMNbHr2+SatB*E8SzdVgj!}9k;PsMG7F1_8pkLt!$E| z1vK3%o7$e3L~#~>@xF#0KP4OKrw6j@iO^}_d_!>O68j;tKPhT_4{Y492LI0aWK2d; z#_{Q>napBgRo5CGrvG)~wV~VF2`e{h#G8)inA*;mh@aBW1E;&t9H734Sf7_H*hW9l zSd%C{+%~N=O<8-<{8uFFG9zmwhp4iavA^*?av`~xRN+oC(e{}2A}qshPCE`bh{-0s zB_a?CznZ!PinznHj;QD! z$mhY{1u-e{2%$lK?R6+i8C`?>%(Skxf9lSzj@ID2PY}&+Vr#A?{gsP8SF*!-jp4Gb z_<7LOS!tTiI9_CRK5R}}go`>jz76(4w8`4Cy8@^yZ0-vuWrpeCL(tFV)>J1ivGQ{&6llX2U0b=eE0U zz-ai%gSq7I&pJPm3s$cR-nV8~nqdf9l#6NZOz68)p3vUTdkXj$RQ6)h*G{%+rcE4C z`ANBD?Tgbx#^YCp4#ofR`!{<*34%MU&SX&5T&xwagjIPqnj?$ujz@f!gZt&J?I62l zsj$4b*h&-CH}9v--cKjV4|%*o@q{kq;g?@~8|)MBzb9BecN=AvWN$1eM2ZobcWpuv zJEZ@8nc??S2nn(C$X04bs%QSkk_uAMm8!`u>^Bp$|3Mb9(xgceM--*?wR>BY1e=hj z!xt*w{UL#AbtpvQ`aKPS8T#MY=)Mzv>K z$jT%rYDej3l!(~4X(B{1UoXMxLEkPx^$`ev2I4Wp}QZ>mW<|Q8;5xf6m zLuH7qxn-Ru6I)TJqXF7FPGs?B$Ov|B+L`n)0b>1Kb|3HGOCqkCHPpdffQgQ66)K;< zn4+4*R)F>C2hevB=ar4*Xp8WWm51MvnRj7tgF1E5dYj42-L*Z_w6gaOmHvEfUfXuz zJ0GJ@@-3b!x4t;FbkW>(zu0(w>pc+x*I(}r+rvxg8qz0rjX|lL)H;71xk{{**33Yy zWB;yL;>ljz>)V{S|HUeC=pXTi2EGPjv|pxU`0hoYQEW?P2oAF{PL)%DaU9joWBXoa zhJQPW`5)aYfqN*ZNxa7{wq@xKN@Vr*IjI|@Xjxc#O6dc+gtQ3g>XFe}gHAL{2efF6 zmSocCqEQ1pME_ z`AMZAAgB5p{R>)o*jJ)F90KKWW4f|#;H>xG*tcE=wJ9<$?d|KKR|QxNE&*@zWQ8Wh zd~%+GIDOp>qI(%XL-S+`G(L8+Xh@*Se+x^cIx#nBe*$(!M9k&=c9HsxbE9B@p|fJJ z9l_*GvwQdOY5&hA_8!rQk&I_nchs!`Nn+Tcp4NVN4f9K#Up5MAcS^GrU6s#=C zlx3I9+cJ)(1uOsPukvLN?kJK+^h9`UW2zLB_9LrgnQAk=%Y573E(xnfi;HsjqJ(i4 znDmeAd(w-=jSflV-A{sclYM`lpJ2iqKjyZIb5ARc5JaNVlSn0EAPUoBba^`Cz*#rt z_dYiM*6(HwNY!@#;HTzCBpQ<{3`ffIXKS!dY{vXftAr@bU(8z@m8yN?^?TE`l^so% zEUZH(Sh3?wMni^zM5LcZ4;b8}d&TL?40V3V7h9|k`WCSAuE3;~8FSz0P19e?nu~Ji zi&N+Z_OAZZDIv~!Hl$c@$}_FT-R>S*rWysr3?+mxevJp>|B51^gtlb!(CRMQjoTwQ zl4wZyn9#z?Ey%-&KxdFWO?7(5VjM0IuCu^kRlbwXSZUY6o2FpPiI2YyS>aa3?=lKX zGEJR78a*1}?d2TX7!$Bbk>%W<{*>+&`Xi5RmUL_1Rn&jFKz)(FXdIH-CZ)Ae>^7Zg;PLxZ$c_gv*1$6D(bj$Kwwh!T8bdKf|;Ycu+?{&oA? z1LpR+m(JkPpcyYk*oqisttmFQN!g=^P~M>SN%0Ro9@~tZy7XuHqA(P{`b_4rAMrH` z*+xY--!Kn}QLujtQ7#46!NDyOM#@8ih{CC?0<^K?X{%op{L>=mO5aw+pEnakw08x% zurVUJr97pU}nauSdWNYLL? z{9G0G`L8(d>(8{^7<36~PO%jBG}a(@%{|wSq?QfUNNxJ1+i8-ZpFiB%>H>_M_(NQ@ zTtKgtb3b^uVrzXuSE8i*fM5)CA@;9>HG=71iKc4j>(!Ik2#|7~0tLb_WT>2B!~S){wWySrmSy1ToP?))y_5AWl{ z?%v(|-g#%voH;WWg!qtz(*-tpqf+qL6~a4jpBPJhuY)PBQZ(AEiLu;x=kGew>oeM1 zpa0H-s9cRp;H2y?SK~1U1OA^OUmw59661zTAOR~zpwL)E z>#*iKiz}K#jTD4P9$@cV(;uG9Krv4b7;gI8wcC9q$Qc|L2CDY}NF9xX>4;q30R7gR zxd|$RJZuJpD^6lED|C`!nYuwax`L6|zY$Ajht{}?YreTMM%@t}`J-r3$peVrb>P<> z09QNmW?&HS=Wmj9!z;mrYFOJ#zOD$K2vYsE52CJHB+`Tmja?sN#Pq!l=3L4p)hpUa zVQoWh@u3^OnNPo2SfaTRQ&~qnC2Q?{-ttYE^}glP(1JZd-KxOuQ`i;izjgYIfX371 zgRSD%N7`@e<;R{PaLO%=(a(d&llUW9khObm3ZL^=KECyA3arb!d2Shh`JY~M(5QrM zc>bdg`((=aAWF`gJ)JlEZUg)4#X1%OK7hT>#U8D}kbn2Lzk3uV+EnxKUJkG=gZc%bR zO)c2uBLa_JB;>1@9P%d9UoL}EwWZ7emm@&D5<0pzg-m!?Ah{W);dXZnIXc$mW~Ub=IMyNGd3kLs5U6kX6F0EsJ;Pmm4+=e%N5;_s-1kxQv`Z zPmL`40 zP*m9T(Ntn>VLASTp%a?JMe=JGTTRQ2$CfPL5;8v(#r*qchByM7KdYJg zrtkX6bQFL;!>C~*N*rO=mU16lD1Awp+8Ie1dSlZI6A>^tkKPh#9nAwlo$n9ynErI_ zP6vRuHG%}}qf*G%OVTBKm`oCD+kynwv>YpYnERNw#^?xaL@^V=O=p~Z;vBahjj4o9 z06c`8`Iag1)iHfGv{;f<5Lqbj-RDZcOQ81S>Ifjx7cWvw7-9eX97c*vw6OB)KteP(~^TZScDx4Q-Gg3F1vEU2s{j)ZAO$QMS$F%IXiZ!K{%Po?OozJ zK87NXeai7rR|#$S{sD@&B2)3e**6BMtX?>eaT<%Z4k=;IBL{me>zJ#s1TtH~*awLQz|F+c;0#DqV!uSVGbYJ3jvE*k|uJ z)8`VtA(OqLiSG6SJ}j--x5pX)AWe(Jd5a;PPHBB=-|dz;QQRVbax!E?s#Uk&B%!=@ zL-5_ioL!7x0!g2zK0pGZ8y4DVzmM4R`4A$@r?_o+41jt=Vv&oZIQtUa`LZ?wNr6x} z1z(VF2#>)LSOBvo0bG1UEb```jzZiOAyG?{c8D8vdOn9i1X<>RT0wZt+=5ts9$X~9fwAOJ}Wl`im-tz z!5_r2rz*gLXGOSoOm80}Rr|nCyem<(*D(<^lYN`x^k0p z-piC`>iKh_vwd2}C`YmW=x8h8X5%y)c(L3XoPq49*=F6`15fNdJVvYq4Le?Xlg+wM z?XEs#oJFG)Wb*MRFRtx zs2s!icI`aI@~yHuoS{SHr{NDr^K`cQI0!HQ-U(y4?(R`_Fs)HR`_>6O#uOlz@wo6X zw-d0Oc|=ADTv};~+_f>8zl1_Vv-~ggV|>O%{IEtsjgS+&%SbCdM5%*jDt1xw*^chx zr@z!JZO=FOtZ%Ms5iasDrp#1m>Y^^Jay9#qY^avWI^x#b^X-JW=R!qCmld%JT)#IS z4?P4eS?`v3#3$Z3^$f79z&GEkLk!*Z=E(;^!oQF@s*1zi!dFi`j|5H9Xok0NMlzCn z&t3blf28_-`JkF;uw}f{%zMM>>3VNm6~hpmdc#6^Mtiz8$PYl?n^FRZKz+w{E8Yvn zI?WF5^CK);8lr_AV#UC@D@pDscvN88cYGmod@6GMcIpHtas5*7dkMFs?u)yRNBrU& zOIJzH;2b#shD_Jn&++-+-Q6@lHQsd($vi*R7;*BsP^+fSt)6e4vwv`s!+UMQBW@@?lZ-s z+>^IWD}VK+-2MA!E=|(`zNfU_Ztg%wzlnllFo}Ra2(F^GEh~3Y-cqn^TV_laY;Cy4w`h z-BzU_GLS>mp=0Lj!D`G{vzP-;^_j7*Ni?X~(i5X@N)4CL^4WcL=v&oXT9rxD`IGEp ztIeW_Z@j3(+<~r9g^ByAukyv9=|#h(nCHzA)*cT8uA-+kPkvQ=>Z1Yo+*N4JVJ#Ck ze%n4ilZ4&_4r=qWgDrBv^1q}Dy-beq)7d=Rjvd#~&SUx^$IL>T!5_ZAKcQ+uEe47V znA_YHhlH2tCW@*)8BM=`y(*d?z*V8<+Tv7Keo-~*Y@^h_K-Uv&2d*loa-g!T+ZZ50 ze$WOCD;3lG)QHc78*o{M)*@e9qRDns>>}b6D()jHYP^u?NqH_i29ZBqA7P#5+JovA zW@D@59*l;u=b{IwAL_4_=G(PQUS_-iMiuhn3r*V}aOQ_N-+zYmcGu zzC&QyMqw`cvpC%o%aK@gL~oPyecL-uL#y5)NfgzQ+5}%zxefa9+XWJx^cVdxMm-ZY z=(~9Pv2n7vlSdJlSE6y7Ij8{GZDb>8zqSX$9(E`oKceXWeU6P@YV4lsijXM7iu*{V zmzv}jU_#v%THsNo^tZV+h6K_8=a(}o;x9es1^@_dRH<8GFVtlpX^5}s9L=PCperL zxy=uHcCG-);^EwwB{EX?LJ)h5%SI+%>HN_CLrM-4vL72LcCzr51vBFaW|&$FTL5Mi?b<7Gnrh!4+hm9habiUTTHikEm1l(WUzYnp$gclaa^LVGoQXB6M6E1~!r0Hgd))zN!XDGu z7~NRvQ$z%R01P6R0}kl0(tk)K2Z5wsQY}SwL|%3xS8zgG!DqAI9zwp!*%=q@Laxww zTdwbfaUE`e%p*bYfcdm}nTxH!L8nSqZgSw(ezdWg>@@H=Icp zIFHT;8*_pi4ITio>c_2Mr@Y*+PscMf_O)Q|bIf-FU1zE=9N4$TtihYgwsrvjiA;9M z_?|qSeeaDrM;sFlV8Iy#1z-d5{ED=Uiu%2Z#Mi%67zN-;O0@Xt!TThpn*Lbv^!O~X zD24m;gNrvhXZgov4%5$hSmrjFv0sPz#Tgr$rX?uXdF@Ky1`UvMa3jWZzw?Va1y)Sr zt)$k6Pd~jVizG?^I>e4CN5!GDfpQ>FEf;n95&3(bq@gbtA!y*L;CAMtFES5)tZnmw z*2`=_7Q@3D5=v$b0OAm*IltGR1Uc(tf?RwmUsq)$oEa}o)E{;U``tENB|}qan6QQ# z@V4Xf^XY)B&t|G5#5;WVfVyRK^NPIUM^`NHl_e)R<-Nyb$2wW(WX-hQQIZhPPqUq$ z_v>W8c0nXB%-SfTQUT86w%{Y*FvmH4mC25F%7Wo1uofp^tODHoq9yS==I`|ae)hfQ zX}3!>U{JFI@i|qv*+tQrYL!;-hKR zqrYR#O25A?VrxptOdAXRGypm^qWt{4V-Md;R%ZN>N4zPzKnuNH_9wl>DhsR9M3e{2 z*=*__MzsTm8YO5{NiXz$WA|e}*~Ji_D$R}Q*l{LY$mc73|Nxp&OXTlqC-Q`ZcnI+%=77yPidTC2O^x%}i3c02MZg$H@?HztEj%_&cA_bDW z2=>IoNN@0K#cQ;5Use*SHell(lVjaV~nYlon z$+~c+m3|13w8ChYH_eRTZ+I<0=|)ss3r$ zpgnb{u)mZt-E3T@>~FqO11i6g*pU>Fb5Uj&NN@=xdgR3pEL)g(5*}Ij~AFM}c)OB*B zE9i<7n*#AR7%ffMqml}?=hU__7cu6QUjcV^PQ)MiUrHts0LGaNqa zyyp(stanbxxk_A9fiY2R15%niI|uZm66;4| zanjXAamCR0XRWi7F5-oEkM#Lqc5N*Qxx%%gxwOWx6(ZN2rauy}!)65b+53ryUM8={ zDbeUz0JULZ!V2^5z!q;O9)6)f)cd2;J414$lke_k?K>F!cD6SEoy+ldg*z`*D?N~V z0|T$;4rclWrGm@wxpY3C@B=_;73XNe3wMfR+Fdu&J*arj8#^r)QX@IFhzuFjR`%(c zP30}TF0%|hDR76zD!wF`5!69yL#{uo4#c$ahC<6;JXk}a$4*U^ieT%Mzxu(Ny#P>L zdpeA|cr)jS>V8_c`+(uP>4@49Cp(8`R3;N6{d5a;qMjNA;~vZu z#&yl${sD%xoIX0D9{P|YV}7!w9#;W{!P(}}>brPzi*?1 z=U}OUFLVl77_!y*%W2Ibym0UHZmBvk^GgCLc4jE0atbN%Jz3n7Nq?|VNi%gm!j!Nj z<5KWuwzx6}qJXry;ntQp7^jr9&Qf8-HsB#`HxAvv<5Ew1AGqiqHnid4I)+ot=5P8R z%;udZpK6ZWx4ks32~R=)!CCY17-4ngASu9x}A7OAe_JtVo#sY*pFVzP)oB| zSoHAbYELgPlvk5MEKk=553N%eKE(v&q8<*~GafLz$YqnUs`(RaD*1=0xXK>x#c+Qg3;A{1y&Z&=lPH?n%tcUmnr(RW>g^O-L4UfO4Erzb`aT!DQ|J z-I1s&VusAQ4n%bdx)B{oA4=N2#y~+86 zurvK6rZR?LB&hZr35DF?966j8TjFy(kJIi>-6U{3=MUaJ2q<#BT#Lz?{F8haJ)JnR zp#8#_THAb~kNOI{mfa5wwbx3tY3#O!i^3Y&m{?YwW(k$vPY!8Gx^v&=T<;&6R@iCe z`S2InYt*$>8GK(50QSm9G>5rme}{@1?`|@fp{<(ed$*Uk9#|t5t`cZH<55nQDH%9D z>kygj(Fh4{qg4~9Ev;X_hXA7edtPi#5=1Q0Cu-wP?dQ~1RX_XKF)|UHDvXtFMK%$! zdNqgpW&lXyU20kMmev0mz)iSrLj0!$qwG-Q=^xFaWk&=JR9YX9gM z;b>u!v~0F6h;cBVy1CB``4Db<@qPNMWGj98;K}4Jx8r+!A;qTb_SZ61{u7W-5qXKM zfEiD?J;vJs51w6`^E$Se+Q53n2Ubi(7Msp!hN=MJrWdCtCxSPh}+WMPOi{j z+5R%3;X6ybUh$CHcz2uY4Nw*~;aX00G|PP>3@L2*n06x+S64psob$S=ECtE4XS72} zt`J^JPT(H;Pd>$?1u2`bV0Qy~SHc}7YV%@ra^i`Qkrt3$qCIzCx&HEd0uoBor;h={ z7yN#Fi+;kdzc%kN5v~q$gL^dZ!bHy{x3($Z&;da~{>f34lLzO$Q*%5ojXN!=T=vcp zo?teP7QxOx)zt-l? zf7^>f$S+_^vdqha)mjOiuT-a;H3_pa0tm;wZ^~iiS!Vb)CDBU3tPy%pfOUU2{>ak^aExWCRH84jB& z6_N+inW|uuMLo4b!Znw;VWzvUAMgNBlAn>}w~vV?pgla4jwTO6VH!JwUtjjHWK6z< zN%6EC;wVb+(!ZM_)gWd{{JPW+;DK3@$z&I8S8 zDNFJ>zF2Bh0D>UBcv54i!AM=BOtChq8y@6ribzih?o&?H~G@2hrqpzmPis+CW4s=onB>j;(^FWH)YRK#NC8U&6CSHS8|8uz|qJwZnwmH(X zVS0ItkWuJS5C1YlSfk8i>c-BTaD|hHvgDOswDj<18`RBIr|s!*8&&bgp1dd#`R-agygUSRPy{$%e%moW9s|MFt6q1gdTmV)f}DW zM~{w(ZP@r~PRpz0DIPc7zM;UuoeH4TF>2*S4qb^H-tOsDlEURpj?HhuM^Vp?V=D1r zC%^((1j367sT$x4PdF3}?Ep%mqd)Kj^$Z5;k;9$440;8N1UQ)e@iEWwGA2h*hs#q_ zhq2SWBUpHM)YQuK7=yIR@Mre`J4N59f2PLbPt8@2)qu|U!59)mfa;Zz*m>a`o5zvm z`$h^WTkV5n|CW6gY=<6FL`2P>{<^N2u8NciHL1_8KS}UxkYt$C7#EQtW18|z!*oJ=SgiT0q)nDW@;<8J(W8?mFAG(?o%V{UUyuER%?|{ zCZ}52KjoIbh?;Ny%pC7^`nO3O9H08HVCCBOkL@rA(6_G<`u?Gb*T0C-i)Hmb{(ggs zY%2GGGx~w&;!m;1{AMQuT-6Q|@-tF^V0;TI%Aa_5BB$lB+g>uDd;E)k6a4w{-kMPT4Z z&;-c#3!W|SRF|y-5kd(r9Wpst*}Gq^A@01_SH2s2Jj$k1UcUpIX>9Ey`u@OR(Xn(2Z!;B$K zrQl&~$6QH<49RKnD2^%}yY}mFJTIqs5ull>6eBkjeeX=7)a6egHI5hkG zeD{8+tReV3Xk z@Da2KneuvS?69nz5Y{N~nJu2NIJ*MmBB!UtP-ASa*2JT5YlMV$Gbju<6!|StSyW9N?VOM!*yoTAR9>zx{vn!YU9Xu^4}_%I4lpcMbMTau?GIg`}TK;>OfX<)1D;GP2@n* zVKWFdJ8~VL!BchgAX~B_J%m@BH3uW_z5s(giWSEw?tp+8A*K#-%a-L2Wa{q~{{i`A zAFUF!Tv2%JD|hp0rIwo4PCAk_c9>=!D_D(Rtjt5UiTOsCO*Jlk8l{94qLQ}=lz$rd zE!w^ot+qJ0=``5`qbkxh2IPexm=^gpbh&4+<336QHkdgW?gR>4Qb$6Y{;giJ!an_E zX@XOrQ)O&C*pz5S16)7vLP>K^^rL-xR@pRF5l{DJu>m+(N`6D{XX_8Ha+_j=EhfOk zXTI^5y$XnnX#dvSEwS|Qq2t@bD=HO6G>M`2><0=5f1RUpoBu$RD+Kt=RV$vz1c1x^ zHS8S&ZL-n_O^X*qysuL@B2u#Xc;f_iS*lIthtV#=?C+ip_dVG^zwIjgt< zc8U!D%vUJl7o??wL-CUk2qF{oKAYD@$g?Av{nBtoHC&)(3)Il&XXXHNF8*Wr!T2F2 z3)hKWaKrb(!yMWMuZAFpCkf-MO&!IVf`v2tmLfuiUdmm>qeQ4*HQnU)g*y^4i(ifk zf=zyDUPiIeShd4zfxQKDbpu13R#l8`rrTr~yAK!zeU8L(u9a92oG)e-lLKK z#m|4Gg*E=>y7!U(=ui70jBnBp)Mf_gejD^~VCZUd@)pRRuX+g9PHGvaJWB{pQ|W!O z0oM`#1GRS^3(^*DcQt3xBQ-FSDnbL}F$hu@@Pz0y*jcH-n8Cpj?569ByM`PZ;C$41 z4-k2VS?7axO*7oYn~tplaZ^KN<{Cn*f317Fo) zL2?a+P}YSGeq3%UW3!oaWeOc^(1kk}1oQ7^(@#bo6sw?b2j_3l1*RddDL>9J!J_ew zMDAVewTJVKL~;&h=dy)605S>F=#iVVO@f)zO=PwlTRH$hEwknDyJ*t`>d`B{ok823 z-DHZInF92I7!G)_(h3ge&yWrntDyVE2Sny?PcrU8iRU{V0CMt|bKKJd)ZWF{RR=rs zd_<4#dH|Oap1ziGy))JUxPe=(vb=;!hDrQf02(?w=hAPcHSW;hkjavR!+9Lv5*VPe zxa=IrP@^^a71Pw}4F498VI6bpmnqcf5}1wEC_&p%te?~p0=jz9v%w?jka zm>v5orlsf?7{UDnKG+G!+d>;E%i(`Mub$vBtAtPh$c{}VrS(^0SLd6!^rmCU?|J_4 zh;TE5qlRdt*QQzL+FfO=>gqRSo|fisB-p??!shbdsM4RvmZY=nrCMl)-%P$1O%nAo zpzlX|5oPOnr_M51X2UVwFP$bSX4#+n;nN11e?uT%sxYblx)^7y zVKaAxvbQj>;Qn&^Y4$gNcZXVp06NYfCZ!o)g97wCVNNR-h@FR;Zd$BQcC^qF;%v zzdF@3?LFT3ZgV&`Dg1l3CsMl-&W3!DoJDh$sdgfo#Uzj2`Up6Byk>=OxGF-JMg*^` zn)O)t`*1l7_xB(PSPdO`DNzDod1FFr8v;A!Hr#&Uf>52Z^XGTtBPe45wI}8|Yx5%* z*;gZQU=e@WQ6xVwS<;_QEyPKL#!2L}8KZg1&-qcwhBo5tHfg0Zx#?<;S-P4P1T8B` z{iJ=JS{v~4z_9H6bjC#tACM=SBE}zI)VwOtIv!sb9C+{o=ouH3-hg+LQ%}qu(w1R+ zcOBFp2uunx$q327Xu8gRMOn2#roIRg(HuHUJFq>ZPRwr}UkMQ9P}=(%U_t1aLUQaB zy9QWDt7==XH_LapWv#isU&3646&g6vy`gc3t`R%a}%y&<`#n|}`Ia2k~#gP130x*{$i1N$FkL#FcCa^6$6#UA!&V7Ulb56ggpu>#TBX!6lG!x9#iy@ zYt6DH3uPt?-V5!shbC3w{U`@WT9}>);m5)lf*)SgPS3S(CQs3K)xQs11v&Ap|0tZm z1C=n<{CN6Kt@bd*!{hwm=RJ3z5d`KFdpH@!7^}p??`&*->Co8 zLLIb{DY7$h)jrTL6a;Wmoi;_5#Dsh)A$t22r8L9M0>@Y#%Jenu+I03dQXOj=~)KD+o;0WgfFWZ+` zVHs@~9(9wC`<7AM*;w{u#+(-y+AEf5V`M7fNQ`{AU!#F{`ceX~xTUP{s!@z>0dU>L zn?!7bz@$vqTc^GM>`K~~6zM8MurND?i^QonR(HB(bgv;e)tKQlqh}oG+xcD=_c@FQ zfc1~+Wo;^#$**U$4(2@KZ=clN64n;-2e!nuM+T zm+xqMJMP~i7bX79_ci8TAAp6Ie_^#`Bh(-_2knh7AJG}|q+J#&rj4f(!Hu}at&r)Q z(IVXTt}@1W6wQ3!Xof??Zqo@|M^+u@9Zyvsf_5bY z=gm{JWhR5bI>~IGsVU zm9UAQ%2BmFwl~mwC7!TZl5PKSPEhlH8arCzpx+@WrUb%tnLq=J79d@mHK{`zxA0p` zGeC^XfUK(v0jc#(u+uPq+-aRI2x87Ht$j|?IrCfF@5^*hppqCf+3NP+yEj)wI?FA^ zUE9q|rsQWyu0QK3p#f4DUQZaP(CBq&&u`Vjx*uiBp_7P!5kEKlhFbq!7o5+ie}a{x zU$1cf11d#C@$y}W0CA>|tzqL_tD(A=0cRLQ?D+=!&wE?&N$6)>exJ>b%)$K{uLiF; zUuLU|JP=`?MjgnE-Fc+&IUVYVkD3Qts--q|sKxnUTy=1}n_(cacP zI8C>2>=xG#M(>+*$Jw(GByun6A)8lSZH< zmcvn*UT4k6X;BEms>uCx6GPe7aW%&fumyb8fXz)rr7k~^?rqM66T1b#q|=bjIwN3w znPvX1A}b$77S&QrUQ%V9hS&HzTB--ASxq_R{xPOB~7-jW2maaEKO_e`7sutRKQ#YkP2D0HMK--RQJ2lnp# zk*}0Rc^olu&cCRwD9UyIL`Nxvy=gO5^;HEAhC5=Ow)YkO?DotQA+}J6rIsWe-_^M6 z4Ax4G9Q9V~*(Jeih$V8tWj)FO%z`5odp^NHo=v68%p?9?n6P z*$__Y{B1P-82#X4Tg;@@y`2-lUy4(L!-q|qDe0y$+kB%OC1(47YETO|zhlbE>wYQW&HHfoxTzUMB@hPV2hAnYJctwNX<5_~ z?yD8r8BA7VAD`9N&H%;s{zXB z>_kDnjVcURyL>}%jDmavJWh>hxuc>XiPUQa9wJx7wUNHqacaSaaC?pd$eqE>lxr?F zaB$v<&`Kvb=eVOwSai8j(Xs!xa1Z=?yzAevW!}8iN)i}6KY^5hHk~pg%?b7Ej}_P z{Mkj_@z6t^fxk~8!gy-4G+IP&m)w43#yRq4Zqj-C`<3&IjD1}gc3B-i+pr*K+I$)a z;W&m1lABy3*^t02uRVJM{exE60;p|tjuAOWQuY26j(_Y{#IPX+JI}jKykTmDAn-)@ zY9_2Z-Psd6C+1EzD7{r;b9j)66RCgwGhE&36uZJ&IGbBU?NeUK9cv%AgA#B}19+(J z*2Zl#!vW6G030|fU$1cAhq+}Xo{>1VD2LeQH)ti^=(T=w@+^g(a~5mym&0XekqYzm z)9>nui5A5VPe&h;l!)HFcYkNGI$Z)O{?1cwJT0ZV#*0cah)`yO#`Ym3kI|RhHKfHp&r7z|aAxD2?K!A3Y{R zFWy>fb;4*)%pzZFu?{A*X#tH0j~f37>iS^&T~gsH$l0iNFcQmqbvWX~z|nxPZtoI4 zptQ2H1&c}7KEJIKW=^p^Qeld$R_4>~EIvV9lMT)h5t@$7KoZ00mgLo^dk)~lQxfX` zBvCaFt>3!KeQQ!&p1vmo`j2f7!9by#=&E!Q_9$ZLQH20xY3HueVPn*>t7bQc#5)&1 zwSmD|2}mCug;L`GlofLw`Ma9R0d27^hP6Qj9;U%k8HQ{KmZk2AmQgeTuNpxIwtT0^ z2Ajl^AL%zagyBh6;1@Lv6b)>qI3`wWr5@IVASoi4BZ&vh7meX*u=+y1U@$JwU54xu z+*ZJNOt(-@b;n+jw$2HNUmxgDdt=`skGAz(Er=5CGtIKkP|x$^B8RRP{mjqIC)%Z> zNHzyjq31~!!xS|^phLqvB|sIjcY=cq3UGrB<1a-;n>=h{%x#ARhmc5(2ivy}K?dS`ZV?%Sa2w_9A0hn007ClfZ|kAyYmFKCuuJ;62a$JAeZD|O5v^sLL-~V>l ze^yt%`>7~WXx@oxQ~P}4(YarWqrF(0`xxOZJ8Oe3p>L|w8?SuXawdYM%pstYw9RfQ zSgR=zSTI|&L!cAGEWOAh0jST}S}?d-Tj34TezaDJb@&$yHB}oPWKM>_U zepc))p{_v#RSYsULbudn=-|$e&4eUqP=T~iv(Xx-f1)3tHFCA-cG_<9-Bo(Nwq9@> zE#&B2BIdxHIQXR77!}+KV$Msof_gimk?&3%x+zl)=N|b3uIi$ZE%1b;)8c+qDBN$-E-DY;;`wL%QcGnZPK%V?h#h{(c~R`!Aw zv@m67Q;vWLn4_d}9AHtT3K?U>&IY-UOB~!`uwTAo=?V7JV{serrB;)i12~A-H<};c zxC>f5NOyIAf#i+GG_X-QW0_TlTTdC!M$eC$S7)>D{}G*BV~8zy+)E0h((Qr}>F04$ zzEdq5_VQBdL!V4!YNnb!JWqfdTo_gP%+{gBrz``fI%s|WBtr=C_H`IJL0+!bTw9dU zVw)(9`Qz+p@H5a7k@AWVkHv4!E6bixiNkoAL&*T^#vtP=HuU%@xe!I_p;8!MwPoHC zDoGVH4{7~kq*@SR@nfvQSfp2we#NBRLzFQMv>0pD%#kpuip@sqgaJ$+CmSn(GfU~r2X9h7r7U%+U^3*3&;hbR&RH6=9W7^3AUXt(!0+E~v?;?V zw;);9k@3H$ZD_R0@-d)M3m$Yb)Z_y|bZx6JR{Sd*b962$zZ#s>lX=4}r_A3zo6KEl z{90!Ih-8@N!ALu~J;XX(W+k5)bH}h`$yC+)?I2lR(}svkM`y9hJ$OmNuBW*$4adCOI<8fwK;vfSKE1&0MK#Is-kKh$eD|tEe`|D>9Uq8EJ5kk)^>;?k3Mh} zZ0I>ELdISlFczLD!VB?5uE}>s8S#y69O4>6O8|PWv$g?wEDFLu4(Wj!BsPi%aI)GJ z8(v$O`dfwDXbFVBpp1XdZ>O~+bo-r|@RjXN+-!y0WI)KS#O5F>OG(ZiDtu>^dvZX9 zp+SVC=+1TC-!&9mt+s||r&nJEfPGHkQo>~z``B7QOUZ&5Bc})CgDWJfO0qzS_pvOE z?acz9fju=XNUMF-b4+iN2+#m}4jdwl_g)xg;$nO-9M}J|ipgz@r={-;JY2@BoiA5MzwTY8N9${3KJDG0q0UJ@_v+nj z4$ze?!`{63L1*p-p3sjU^%H})lKOc0qE$)Q~K7x$4c!6S}d0qEP?-_ybd|hI`}+wCtSDB*!ruhZI)+C@fV~U zT|`sdViYbgRRmai9UIS*hJ=P-z=N`1iS`N4o_|`=f;G)JHvKq4ujlJWP{mXD*_2M< z&gipt)oc0NcOudO3Uo;URbUTbtQo`W*nsjK20c#kjmbCB53TL-aTLJk6R|wQ%wEco zcO~$zsVZRBs#oqoS6??!Nx|(TIg_TZ+TR>Ig22~KbdQf378DV{PLXt~r{ilp21Tc} ztGS&6?N_;_ zI%e7zgaGK=!0Ecc<;9ra4LBtLAYe>w+>#!r1oq6%KL9Gph~3PO{5w8PKXkc#pK;h38id#i~$%sw!ZWz06U) z*X|$s#y)}WA7!6{ra@V1cUu=oxT5G(p#$y@t(zCsvu68WFvHQKNMk$N+#nW3hWcO=7Q8hOOr=#yHZPWo_lf?`5ETiG# zq@=`O=O8@L{S_kh#Uwz5$GWQELPt)Ny^fG39P&qIwO_STZT5{6j^bCptM5UmvmYS8 zy(hTk#|6v?P49ri9@N|3v)EUNZwUdkssoIraeMSENSAof>EVeks7qNm^7t`I4(>Hr zFh&EcMz8wdNxTJkLH8;&skuHohT%RoGnRHVA`bWu$*~%RMZfO-p5~YA{_?-T~$ z#50lfL2q|2ebE)=o7A4hXS47-=9Ig;JYmrnvA4=$-?_Agi)jLY^49HL`T_$@Kzj^& zq3%v8!AhD?vR*L+sFLBNzX|)-#>dP5t>XdlwRvk{9q2W+O1D*?E&nkmt~zsqG{n4e zENmmIRqZF+n5zJursl8!dTDjuS1?fNSrOl#x-6g)Md`$LX*pjzx~}Mp|AdU{?n$sj zYv4z1$w4$RJUb|%x{`l>+aRdnqmdgzO+3+CT*Wtse5{l3@)ISauMucgi(^h==WoV= zp4jx&ePXQcB2-#$%2gnJ~G->4Je)&TwZCNkX)^w>rL zKdQf-8R}_jU6+D9C#Ebb^h0lj_x&w(tJlWRC^3xT9jHJE z^KVv66Bz@NSJT)L_j1+&USYWfq-A;~V7PbZ!k~36nH%rd`BEV0Jf_w!iek5gQ={QhhSO@LYYn&0O5>mq-&uO6SuJH`e9qkO^m`}so2 zy|83tQDU)8EtzrCqTsKL^z0{J>6Nh>L3C5qY`; z=#PeEkQ~Cd)6kHNV+YhZbLuHM=Bcz%pfyRRsQLbT*I&=h4{RYAY94=vl%;s*P2(E5 zZ;1hYI3aoD}oqU3AwzmlVM0*{()(_T{3YFSi`RWLp+E-6nkI3uKP7 zLcsmut;$ZOO`fVc!uYFUvn*-`7+6fP9}=d>5A@6~eNfT2K0so7pZuWvmWHxOO#ips z;h*x)T67Ab@!55l%*5021m3_+?_kWb_ibmOGsGqQE!g@B3kfiGKMsLT^V@1_UPc)> zzbVN2H>MPL>?(>?CICL=&lhtPH-q_WWv(T{uhfcc<(u-# z7nG}gH((@B*z)E6JWT@ilAIn~N4cljT>7OA-nGRPzmPxY*u~3^TZ31`Rw>|$#qJ@} zzmtKE_a+3U{Env?rWA_e9|g2q-T4d=wh!F!WYXHbK5urp^8(T&eoFx?xhcwUs6GH3 z!Wv1i6{Et6k{l%CyBy!g%CgG8_q7(Lb6;jy2Cv2C5t9=t2*%RHg;vb51hweU5{(0? z|80BYzQ$-MP%CKA#}3dg4WNsSNNnb`+!wn7PvDbI9VmrK-qAB#3Me!}2=O-%P+q@? zI{tY|JVQ0>yz)ez58*Y2U-c1`WD|r0e=r!s*MzR?)`I`S3P|GwBHWz>Us&d3Te-wh$zF82|gZt`1D`TYj zb6oi+sYE?GO5%X1w;B5*3YiU1S8pJ}s<5Utn3Ga4)0Zy;rgms$F|waKz`7b5*q-k~cJP9-JxZr&;c;x;=oJjm47tQM1l6bc5I0j&+h~XYtTgItu zGw9m?N77Y5#nCj|T?hnOg1dWgcXtWy?k)*#A?U~AF2UX1T^6?l4-geE>o#L8cNAYv`LU=}w4>m^`utXOw$byGracu7-bD`9^P}!bOMe?V zF*x*q_LMqgB*lH;>!Po&5nmC-DXE+C;Z3tfBfLKC;~s$pI#5l5qQM&=1>FltD1E31 za7dts^$I}s^6LQ)=ZS`uGQAswPt5t5`5fn7UGDP05~WPhc^WBN7}{+s4KM)xW%G5Z z2iTu8M^h8CQnSnvtB{Zbl0x!Q`m_2L;6GlAjfFSba!0;(V>n?Vh}q*LW(;nAIn)q*=aDOeRFS(vj`y|?S~}I{km(3C7$nB)tu^IWCXXu z!(v3OT>dUS@OohV;b2qTc;$IZn5NPg-)ugtVRNH-iAtPH)t5o9K(Frw_~G1DBFjSOq5e*z;wqa}VV9tNI-B|NcdnjuKOH$w&S*^{R`SBhbjMO}xgSY(e zw79yv^B zNw)EU{<7_qHvVVdSK+<39+H1tWa%@NjRo0_5@fPRa(OMiFNU=r1ZR%N7-_Q_j9LWh z+}WRtH45C^s;0(kIO)%xboO@^H?y@QGm=+nUL!vVR0Bz1zvT_FfJGts0|Ki{7VRMm zke`5apQs`}&44SO;rgG$9cIOI%cnoT4-;2`?V`-yU3m|HRs@!~3T%s?KE(~@hK3dW z)_mjEo6Pm7E86~epE^~k4$SAJ z{;GefiBhxa*&jd04Uyz4(pmqxC5a4pK0DiR#IGazkxK>YI#f!F&*b38dcDsbOplE% zTCk0~`QFfVF;Nas6>RkGN33`<0?^U@$Q5^Wrjn(z?Vy@1{!kHo&wmX$T^qGu>*;3s zhb@hmpl^E!i`j4#6tB%3E#c*=cGheNb(1t{KbC_}jV<01o=pgzz_a*BO~kF12p{h< zM<4~zF0_!N30DK718kF0O<|0|R^XXXz(#>bLtNY9TFc_PaVU3rG?AaUoc#I+X7JLD zg4i16U$;lmcU|OpaZv!Avps$giv2Gi*=u6%nCTkBEz^zL-| z-zbHbXsjm{f3Wt9N9$9DCPU5g?476OmoGgbj>xTiNUcreo6Gfa=GW*(*OPg#Frhuw z(j_3C%Qft-gP@x+uaYs(%2js%HjXmG#J2X)L~liImPhrodB7eHu)f5X>p8MY5$BF`=Cta3xXpIbf&KX--}+ zr<{y%TxaMn_1pHfI-%LEUw`qH6T_wV>K*^alW^-*(dyR$NgOwW@kR_z6p@67N!@lXZ~ZGLkG^9t{W!gzDSeyZvK(Cp?fyPd1Kg*hqNY96 z_8WJaO2z+{LxW-oAQ9IG;e{w-|O~&U(W(=CO{QyR+CUq+rqi* zeqIW>3(w;}4yYy}&7(@V#}5A$tF6&^PXEqOfvISo^HY4l2L1W0DoN{z4&vwFw~lgc z?Qd$IGY0XzlN9Ln>2qkdY(0}{PiO!=dz2k5Lt6XG6<#C#`+V>KFp}w~Z@XHbpBbSx z6ES}!e6xK>H}9Nq2M_Z)i0Bq`tPVY-_&4op&F_pxhWbP%X5<^km%wqFa)gEmP1G8y3i+jFT;=hG*Ioha!N%^0YFd#mPip0U(6N#ob%8onr`}zO7Srpqptzm_y;<5h_o;gAb z9AsJbWLHf)i|)^Tv*nFYNi5(rTSjoK-(iv$=$|MAzY*IKkBRZR&2H1th|t-Kt$zHyG5BNUuYGU7=Q}4SV4+9(x?Ml*W{vA-yex2YyeZ%PA_go3 z84y3S_L39lQMnv}-z_Jt5I|H-ZW8>z68FVud$+ZIRO|X7#2E zNbCGc1`wHT!ItIgV72fhUaBU%0fejftijlCzY&XhI#(WeU%xdYHJF%jk-%M9M`aX) zfHtn*k_5iDc6lDyO4pk>|HYPl{uL?Q3rJ{w5S3$Ws578x?n+xB>L9p`lGhHap`>e=R6$rrVkVY7f- z@PaH)6`-#qzk^ziX}E^DLd={&BuuKDMxsODqt0Xq7hCus90eDWmyXW8Cq3Z6zqg4*PQ1DZW;hVlEZDKL7-{+P8Hl2C{hQ zk92dwr^9AJGtmH!-v)*GL3?)#>;BV89V7Zz1sT)ViT_oyLD*@>Cs?!3ZP{I&CF~cv z`@hOY(5+fT;LS{i#&ysW%91P+Ru1=sn5pAU%!JcA{ZfGHVWC4pWDLdU%!f#on}gO# zAP$!yoE~v}OJ|&ar?AN=2g`-m@-JPamg(zIg+0@$6F&x7O6dXnn)L6E!a~r@F_YiS z0lYo#oF)GI#Bdwjt~3u%zA$M0Z>nIvI2VEpl|J`~(X-)-`mVP!RMniLV;&DVQk>aj z*(gBX1u@`!P>q78ZB^zb+9tvx=Bxy~Whj;~k3`Qjn_Z>wo<^||5RJc490zT_a<{aKr z!4`cofe-xs_W>(z_hk`6esW#_o*7~T1nj2D^)Ulb4LLP8KYhRa?+-~zJuMf47mxdL z^x9=umQ9$({94VIZ z5d+X@Y#G5+s|)`}q2Yut+0-vnnvgt_{mt~j8O7yPgXyqs5=9(ul?r`YN18qMJN-Az zpr}YZP&rqLd!(UcGYIzC;KWqL1(x~DD}})Dlkknf>jfavr6^=XAxd}xU!q;GK(MM-QHGk@m z-_Lycg;jzIvtL}2;Gcp^*}1bdeNEBJQaH10TiRfgI#=Qfaa;X@(1t_o7r#6^ZP^vXMPNw2?bjGz6G>-q{3OO!5roO8z(fJ zf7%cv7tad~b|#5y=Y@8y+`azL*~fn{vPqsJsI|~godYNuYN>Aq*|GhVLgAKwbj%5N!BY5Cwjt}@=V{RGsQ z*?zm8C%0^(OJ{Mhlb4m8V@R+S7z1*7e@TX3{RfzK{URL952#aY`*uh%F>_FnCh_1; z-rC06Tl)|IeP?2 zf3Aeg?_*BZ}c@5-wxG)S|b3Eoej;8Qc+WFO6fPf`y&r>8yBo@s-*8PP2of``oE zzw)9zFE@^xNLt%bW8nOmaC>DE&UX6PrreepS=pD}FM4)1vpWmig8Rp=?so^>S(H2} z$;QWB{ALEUyc1ak?pfQ$GYVGj2fqoKY%aQ!+$iOdvp4}Jjh?fu#ik=$-fbcUXeSwJ zdD0@LH#H#Mjl+-K*Cb_!p2!zzI-Ei;6dKc2P23ja<*^^Wtn|)#+ zg9H3#=t97El6-?DyV%DxODE;~f_g;b9jIM3RM(dY$)!hvnJ~pz~w|7bQo_ zhz^|2^+ONay-xRMI~o_q6cnopeS}Tf=q>jSPL8|MA$bZ1TI5^omVJu@AOm^*1IY~p z(jz7VkTl)94a*>Q5hnvuUv`TeOxI2cbM;om397lE3hg1-?%77@G)>Dn2DlhMNHVm@ zFm|E@ky1vNP$WV&x!I^pv$*`)_prsoOIMj$R$$PaIGbXn zI^la~_)Lq~<*!Na4oq@c0oxG|iUU9AD{Uf)kTEk98_s}5m!#4}``NR-crEv^DFON>Q|1N#nwf=NciX*8phKwg#$d0}F$0Ml1gz;^wkQLWN~;na5wy+`73w6BE6 z9m^jH1x)g{`0gR&*pP~^ggW3mt=1iz|4hDaJT3##>cI9RbnLS9L>}p**b@tu!e#RGQ;v&;$*IrLF#X2Y}s9 zax`q9ZHRveDaz0%6$uL!hyX{#B(Rwp*c!j%%*QHM86=<~lkh+Z@;Si_{fAiJ$CQ=y zGB0)1QNNM)hFXqEdyk|@-tv3y&3?;Is#T1iDA&gOV8L5I(a6SuWhw>BJ(_|!Og>6c z&5lx;RdoT??%GrGur-Ud-cOMK)_@d54k$y{06PNA0p!1n0&QkG#Pca*hh03QK(Fz@ zK|(5AS{OdDh)bsGaxmp{J}jp%m)ug^goH~x3D|CNcf0n`c|7pwZ5g2-6j_g0mwm`X z+kXDM7xWPoo`i3KQwbT{Wld|6T}TO3PiAK+Pt{WtsRBM11szS`LI#1T0ETn6T-Yft0NntB_N3o`n8K;O#CXpz76D4sJ|c$4t0QX}iz+S2m9ravWM7ng+}~ zw{Y$AN$KFVpSy;P0Te>44oMC{{Z{G zvm2lpx4bE>ZNNOTebbpI8rw&<|&LeT?R>8f^jvm0>%sohL`dzb0Sw~-V z`cwin`7`bk(sCi@J8Gt-)I5Qq?c3k{2wCRBhu_%T6tqzXQ!BOpL5=yR7G%dSeQ%6} zu|)wFlCcUDHsRgTz-}ZGs>?ae`eU2_$p5Q2Ijh;Uy9hLFE9VSLkM_-Ryx`wxqoHLS z2D2)F+p~k8!FE2>8LqyCaS>rWlTlwG&1LzQ9wG2T@eF0y>7`!-=hGeooTC$5eTm_K zc_5DCKpinrWFSDPcg^^1bqny#2MXTgY3$N^UNN4X^F^yJ!viA8si%eQVCA;6TfJh>n%j@N+00d=_ z$Yf~IrL9Q{(j_rsE)Y@la*yrbHv8~h5TuTGlsCn0L}h-3hFL$O;YDwMy=_b2pxmNH zRNXQ29PL(qDnw6jtB^PQYzw{yi*(?I`2O<;&zKk3y*6SOd@+pC&3eg3PU-g~3WLp= z$vYD$8H7oWz{2n_jsVKRlUca93RFU)S;`+%`;7Uv+0aa{McVf{6YKcQY0|bfrT9Mm zoM*Pd-bDylf8Co zlUU&*O}@_S9w3_3`-^C9KC;4jk*_y9F=7$SXv0ob2N*v9u?Iq91ONrwZ3poAFE41r zI&UCSy&`aUAmS6udVqC1pD1X%i3{@Bi86F1I_UC+4}AV?OEAa4rUNJ6?g0hIoi{l;QmJvBzwkYU5IWh&A+He`oRQCFSt;J{N>mU_=U}BT zVTuGEu4P>z`uA`QdiPWUPJzW5gu;CGNNJ;E+`HVYM0)86EpZh{k~yS1Scx6%h%@(( z0aZIrvoBzDMjrU}h+Y09gsu?;-~F;B;2lCLA4Ors{K$Sk<_9ta^Y8Udog2rnD^~*K zYKm&KJXAE5v}%was{yDTwI(2UHDFq7Z>^Xs8;wa=&JjU49=^Mi*F;(aFc4C z{4>(>9QA;?x6L=!iR;d%4g^+ieE|BRb%PP%K!O8C4O;HUJS5R66+^~n2F3v18;p9} zhuQyuS-zkLm(Ty#iZBCgvl=x5Je785l;M*8uY|zqv}aJY+mj{DnNB-ua4$UQ=tTpX z5t=gPQFsJ?LVAw-Z*T97!tG=|(1-Qu1E)wyWDqwV-@!bq$A9u*0v(M|n8PE(?@lb` znn!fW($cRC2UwbyG7wpGN=E5D zqy-)IazaZYC*oLkj*h@i89WH5fb$~PD2prP@+8o8>(o$0qvj_hk zOk-bLG=vG7Axo(w4eVnZ%W&z*O<+Og{7{Fc^#;`D4F3ZT#&(+YsEC;-)ZtUI*C1?* z`4eL}63|JD_2~vr-owVmFWA~?eHt!J6i%uUC3-ERp4l=h>J9r4fcZ$XX0}LLIVhXKR>jleRD;|7ot(05s)P6t2}TH4;dUsudOVe$q-GmR^GQ`3dI`aum@Od*BBO zY*NGSP6YbZE~Mshf*|UX`n`#iN6&g=hYffzQk1G48Fh;1Qvm=rQ1-IE{|<2^t<@@z z5pu9uQ_pZUeng?cgO{_OgWlrSf1ddU=-syiCbK{Yi<4#|4Eqbhag&SDi*L=R13UiB zW5$<9wA=c(}l6HBNbinh$!UmMy{($?0I}TT(n^)#{+@ktWFecqvKY4^St_ zr8w8xhe-z}$bpoqP|gT42J;))5(WUnboFTyBwC?2$*yH2HP8BBJ-*pqi>06v(Nn&R9a=_=6G%!-M|%E~n7 zH`;rR0c}U4Zvs%Z7T(xO3N75A+?Cez7r3C74FM<%%_j=r-L!d@1V8eeRwd_*{}rBF z=~gs66oAfKWjPlErPs)(Ii8dq=if5{mA_hSuQxH8%wQ) ztBgld+XT`4UEIgQKboMrqKK?p!6ZJR_Y zt5vzE6|)jWyjsP600f3T>k2tSKcLE3C}Wuo|{{D6<5dIA+Bu< ztFmjQKzUoC>GNw)qcV_4T8RSlTxoTz#RpaYn&$dO(~$?<|LT!z{_VQhnNC4Oy2_61 z)FsFIoXMGbnv0pRjjGdIEgOE!P$n49G@SsT&A9k(5cGNW2 zRUEzZXN48%W|V}ZHyVZp-3d#_(_GT=8g8M0WPfDa>Jg~6+AoMpYJ=NN93R8yS`UQ> zchnh6GX4qX;V;A%XuTr67Ou0C{3;?k4yZaW&-OjNFAMPf(@kG!Ot6)qfP!O$4w#_4 zrKh^NCEIpc;_?|N%zuOc{R9+VkpuLK&kns|odTrSWn>1kE2+Vsb%-VQ4>mtWvm%x! zl4?eQ#Tu*@DXyNQLW&etJ^l%O1p(@5kR@A!Ss8UxZQV<%wL;bjQ&YM`0d8i$!bxoq zkMqVFD3vpc=klbjoOY=@_Zpck%U=RY!1M7Q0V)F&KB3XV1%)r_)HU}61Q(<_HN~j| za#{5X-pU5VHh`>+Kq2vU0HX_J_Iw35XqFUD4d@e(iJ8k!g;lepQmh&{c6rAt^_4gy zvoT6vWT45c-8ts*IZpHC9sgCrvFokULBKGgA5-;7JF7^5w#W(%l0)WNlZp)^bpFuN zE$Kroq*`~RRtbs5TmSy+(D4(<84;jwIdp(NQLeO_raIrYaSfHezh^J}L9}mgd$3R8 zOq449ugmOLONHKmjx0|gT=J)sK+OPb%6WFEQf1$RAgXF`iSZZsg7m$3vYVc3f z_q?E}K&xy1>1u(2p+*SMuJ)XQ;2q_EpC(@+Y{VXGMNA^2F_59>E_SYCaDKZ&=wz8H zoHi2s1N0Gb^R6amYxTdlqLZ~_NMOST$I!N?Z?=hU=6p_;d7OZzX6ieh8>Pf9XNE7~ zG6THw6tiEm(24=*=NgB6`D7{sfH&3;eRG@(Q6d$R-TWZ|=au)?8`v&6CZ&Nnt`HX1 zp~>-lmnF?wC7ePlv`S0(8663=T1n`K3;N-gSODE=`L7C*oh)d3BpOoN4;M#?Pw0S% z>IRB6B>b=MgAi;q6v6iw5mp_o0oo?niKi{?af26>C1rdy#LUh8eAo**Bn{R}W&_wy zFZwB#xj}J{Y@AkfDEwp{W9N#6pgf;6%Ig&uEwKFTaHo(uXj31bP&maB9nK}i*lJVi z4ao;q&f<3kn=Ls0)no#;5KK@to3T~BhQf*l{GUuPtl@%ca1wZIm6g+<8b1923BQIV{Lro$o#Zj2qczdgNkjm9BLcDO}&v&o;`BM-XnUHM$zVbi!t*#tqefhCV zK>#Yu`FBithah$dT4eC)!^e-d?>iz%EJ# z){3Jww%tO`o0=_`lbS7el9#2LGrdqqa=oBgG|cx@0PV^?V!xYbi|D<9*_a%6vCi%^UndAYF0 zjmgQxKPt$&958efD}uXlU?EeCr3|Xa2-*&hh6EBZvY!Xy69T+Pp?s!R<@M0XUPnxj z+yX6>M+yP<*2uz+V)ieH#FCXGn}`u3aGw@B%NNd{3S^2UAGv18@~zb>sf`5U+BB&2 z45_KCm9)KuWI2GbP*^!AdJnJ$^Q5kA@Kh$ht7x+AWhicsRBS5Vdz+^XIia5$>jA)! zc|KGco4e>|n728ggBDBQ;nb7Q)F}T(uAu%s&#S+|0eeLU0bJYLw*?TB|k{6QZ#{zw8 z1jV6G5*`mCIHNCWva1Qufn4;z$-Rf0q$8`F)ZV<4%Avezwu0Y2B!-Bv2bYwtO?S!T67(9s9!+b~}SU zZ0u&&rYq-u{%I;kn7gq~@r|DKFX67~UES{21^^h>M~ABSsSh}!ki0-NU5*-%M zy*45~ZBIgKv}T;~C|<^_q3xI? zkfigwhy6-43ug$UmC+ z02|*On37*KZ+gxFRA^ozT;$K*HK*NFAGU61ADUBAh6DA5+kqd?Sb5}u=xp6QSi95+ z$D-)#U&r;CUhltkK>?o0n5^ynjXp(K$YwIzBJO zP(33T4ZUtWbrV(;m#5-XLY^gT570TK&IoB2@V^8i0UyuzNC|RE4otXzEJ%46*?m|j zvK1S966R41V(S^0Q6#&OC)o74MG3X^7*&^vo6pHOyUdjJIsNhB8X1Hqoxp)g1;AbA z-d}h{sJ2ClNTh$0jOBWaGM=iCoom9zZpk zGQhR+8v?T9U!pT~D0Pd1RWoG4*)0=I7&-!&gcMbBX0G-VUJC6!v88@Go zn5>^J0-S51t+zw}CtA_Lu_X*R`H&f4{khuR>1?j0eet*v z4vL!kh!cXJ5qZZ!<`r;3EFzVmoz5D5Qk6j>@Z`ooW%3!db*9j3*_CpupPWXlN?5_L zQS+edC5kN%EY_vb4_c~xUzc$KEjor2-E^}u&h(EXDi%#5lP-wsi?t8br`)yBsDjQ* zTCEs393v3*FZ*$!JwqR9T;YPG1aS@8^ZpC2_XkGKk@q|_{5XjGz)+p7fa`E2c!CbM zxr)a*!=ro5=ZjD*r_`aQ2Sw+zMi}aWb<^M6Rj?NxpP#RHzBP&c{g$0Eo}J;x=vp4sX5JUISO8fcd1mxO zw>)3(G?kfUhaPv`R+STsB=orUMIj6lZ1(P_N8w=|XfY&_{)&sXTGjhACK|$!h(kSE zeVT(cG_*qHM33kQliwavEx!Zx8-Y}Q9QMYmRq(0|7=Z{YJ-KB~8NbupneS#C{Nj0( zhQNA!`=TCB=Y(qE*4u8Xe7*n(%a}<8=>#)YP$`_t?wM{wk|Mc$f2THu_fP=t7|UuM z+&aUfwiU$oT<2JKi*yRKH1dbB6)S!}L}ffs8+@iauN^};mGJoN@tNRfas(9P8^XDF zi@OiId4t1tl%|~u9#(5W;Yx}1sHKdWLAe*r^MAvP1`z?8C|`OLc+DH4PP96i5DY2m z^PVez3k{Gd^!HNtt~}h8M_Fp29CEvXk3IEHbc^Op-nfIi9a}cyPDfizqXm=8HJeUz zEg2g*OHA8@DE7s7Ge#8%>a% zj%rqp0=u3R#bwdz6hQc#8*vC!=q7c%T|dW}HOO7-Lt}X7x>867Xi9C^>t0o>i~GoX zdGSZ3@ye}_)4tjJ9lqzpVgl5kY-4xQ3aq9nbv856m)aNaBGGKm5rTBNR7A73Pq&(9 zZXHH~7@^ODe@I^(MwSo<6R;e)X=cxxZ5(Eb?x>2&gDCX}@<-thFjS{g*bi{;M7QH! zNW@aueK=KT^20BrWYxh^>%Nenqb5`Bo%k}DsEfIEBT%w7?C42(IO%V7M`Bp6{0!Y{ zfYR{aeU1!%YkH5;+}mG8jB&Z6J3>Rh$)%oj5F-&5xfC-F=0rs+3&W1>XeBwWwe7<^ z9ToYor6of&@4_;sUw`a1Vi?G%EeufqNvT5EyoGLcVDz^jPe;2_Z4Qq|y} zw3GVd-U6TKNAEIiS3-f+o6st=hNv2?KV3+Ba6Xy{G&i`6zdo?z!wh-7$WzHE(or{^ zvvjGSGXS|AH#LYc&h=7VZ!~gM?rsE6p9^63zc>TGr zvfZ5~S)@cJRYq%({eL~wpZG^8G-+$XmE&*7!JB#Va!KljW)o)p68IBVxBOqJ#$z*q zII%ga#xe+yA4PV@Yo`w@W_o;4B~~)FPRxnc$(nKlVtR#v7>(=X!<(oev35YPMWc3z zOK(4Gdn5=@0K#Z$-hM{Tg74UxLclp)jp{dMpW5FFF|x&RSc_{_gtMPT)7< zN4Fyc$fKO0dqvio9O`h~^@^E2PFs643c=Oi6Up*GF&katl2#(PZi# zoknkb366#z2VpjpZP;^_rQ6+=36GoOS#BY7Rdl6yF`e~8S=`_ zR9L7$YDy}v?T5_&Y-Cv)GpzAByS+uFROZ-S-x_}DxMLmpb;5^By72kRwNzi1G!FV5 znd;j5L9daRO}S>9KD|(Pv?1e*Gy9X9XlO2XL)h?xd$tI)|2f`N+v<8I0X2UN*(&~7 zdw7R~yC9nfN;zDFlVkZj&Sqg$=cv^I+0Cojz2^r_TX9n41=7-TQ|$KJh{>1fWE&mJP>1X6uOe}E?-vSev8yP zv-Gio`+`aST|XX3Q^Rh^mF~Y)#d-vB43H5ms#dcGL+$a93c^m(QJtmGSECPj6ZFL1c$tor%C7hEAOzb><)#-(u-D0@-FH_|q=_%j_!zBVCurJA7zWz_2y zB{uBx{dgD9V2qq&Y|_#6#@oFHc?{d82laME6j+gjPRGc^yw68x zv~D*i31v%((Dud?al!?6n!wKY_^aYPd&Ef!@dw3wg0@mn39iJMMT=I-WmVL{gU0ym z2R7dVWC=sdj@gLZEaqdS-(ywDoX$#eB)IXG>lw3#E*PEu2e;`53I+MN6KNT#j~ukO z_wJ~?>pucRz@%(#1u^|Xl@h~kApw)07+I+Wxx&`Ju2<-cmJ(xAZ3S_#@~)A$!Rz29 zkZ`)3RdBkURdhuYbmMd0StL@N=T_pg)38~cN0#@{_x^gA4%5+0@Da?{r%L3bcP)L+ zmy0#)Ijs{+Z;GDC;$8>N zN{@-^fIjudGWL>BZ{~OuMFn6J7zOs}4~wEm2=!Yp+O%?g)KM1-mPoSJk@sK=nY1(g znHTP4)*h1T$dMPoP(iaY8KBTR`Tb!_lj|LTR>a0^h zOvt6fRp(SpCN=-9tJHIu{PrKTh#HX(S%SY)FZi$LhDvdHFJRskuiJ&<#K6Q(KnS(}~7xtg>NAVd8-fb`L(R z4YW3?TQMf4j%{dohDCnddHYgY_#|ENK+hEN@*(id9Y&t+Kog_JkJa$YIhPSvzD<`O z#}uTumEIY&_3}aJm&sPT*4X)TNlcP?tYubS!2zf2+n{RPS3F&#kxhGHb*;Ockl+22 z1i$*0W$|nnt`sIXQ258-jxd~HEw_BQB4rauS5(dT;;nE#eb34=tJV;g8om6&^chQy zF^@1&VTJ-p)Svg}^7}_BR`4=(7I(=|(xkomowNd9HRzti=mG*HobBja#9JA=7e9f} zT*x%{c?94N6g;`ja+Bey>-h?Vz7715KMk`iEIx5VY|nF6OMKPUcemAd1y}q)BE$cx z#CWPOgStt=#A;ky|C=*u1{>KA4AB8Cl_D^Xs1<}gZMb%DVsJbm3z5Xm(=?qDY#l@Yxg{s&q#W8ZuzxJ$gp8$^C&0z4%?$#NoajyY)%-J5s*Kqc++DM zqxh50kRW|MZ;Wg)3av0ndBmOv;CCk~hyTXYS2j!fhNvcV4?BwhyykS~*jZhJJB zRolyq@4_)}B~{SqnHp4&_w;n8Hpic`5Wfiax&V)~!4~6hL?t}E;PP2{EtNnw3l{VQOZA~3!jd;Wgp$QRGNDzg0fPf;IflqH zi^DT61eJ;4O1}D1Nufcb+cdAjEU2vKD`IEwrMc%cF+>;!x}EN;7<=e)`pbk1TZJbI z0n4V&H%%ZTh?@ci(#BxFe|;qwH&jV=)XH^hFQk={81(~Xle9r<7yuGPAuzI5xk-XC zC25SPqQ% z$vGK?Wel|BIH~1BmDFonoZKq|-hA=Oi1NGKHAisqG_Eb=OT4D#CxFd^K)O?IxDt#X zDFJg-0Cx|jRn3G#PJL0eo1ct7^qn?|j%^0m7ew9kIsP65KXy)cg+PM3E^Kgtd?MC1 zxO?Agm0)Z%AjxuJDLx+`CR}B{3+PU>Lu~IGHc^GrAs!uSGRZ62H=2wVXP+2+_vFW`koY=R-JXm?j}e^~nm&539`%7+cnaQu~vC z8h&st@s4hy3&2>YT}rEXU+~dhshKN1Z{-jESxrCcCKuE5M1&J(|MuJ`THHWMz=Tkl zo?pmHuN+Um7(E!{0)HIkBn5~uYc()`vmz74Z2gPz%Fl|vk=&k5ueI|kMf9ZmHnuGQ zdESS~ktnuJn8V(XuD|(W@!TE~r5^AmglALbRDi@~0Vco<&e zyfBB8a~Y9vKlp#+(^6%#Zq?cnR(x1dX`=kf2{#u*$;3_PP{mymIFS1tGv+G5B*$^b zSPK6k`|N5zU1xan@7uERu%EP3)XxHGIvjVBFs%I+Z?0x7j-77`JJHle0d5ymh;s8< z>R23wcjG+eDgCqD`gQN*w)GB~8O@drhlg52`9Heg;j%v&(R$0J2duqEQHf+fn9X$H zjv6h%L{!~lAi84LiAXa0uU|7T3b6;SO^6OxaZ`!NP_c6w|VSbZ`y+>)mYMYw){SqM2%F@1Q1HFJ^$Dj zsn-~m`T=pto6Rpg&Lipuow|V53(y$7P#4;dv=*=(LgD-B3e*NnotJ-Tm{O;X9r~_R z+|iJ!3fYoa+|?TRb1Pq8G?&K@ybnE9)uMAHhg;z~L7aX1S34^zSqoN}v18B1wh7dj3x1{2?hmhI+I9e?0LOy!iegycRkqxn@^ z5Pcj&3iv*QV>x44fbsDgzi^bfW{gDLIXxP;4Gu1QH@4->wqBaL7AyhRc4phgVi__o z|C?8xS9mI47g6!4l)TOQoC>Oz-9MjQB7tt{39J+cTU-%Ar^y8cEFTcv+u+Y{!l8V> zA?sLn?>nL>Ka+54nG7e05E9jPMS*Kk?9wwmB*E-i`AeC?Q^C-;brv)vWfPf#cF3Q) zqW(kwkl;csF@R6cTbl5!-4`EXhj4HAxADhHz8xQ&Ch+>9MJwM(Ss9b~W7k zfh;a+GUVqxUu8Src!CIUTQ>>v^8;@s|E$%RNsIdMJzWvbcX~`)>?^pta76|pp4WU+ z4C1UBtI15(pH_1<(`rKi8ge+WUD?I~yJpL4Rbf=HmJiDnk2{h<*m(J-GDTv3>n+HbebVObGKP>{(?0mf62)Kfahx&vemq?)wNq z^x=GTp!yy@ti*hxp#^g}RO%QF)cZDsW*mh=plHJh(_GVaV>`RlLzCK7LTvZ0)16(` zm9^|eX`jTeusf;>o@FO-IWeiTkgBP!z^i0n3;M&j$!NL|=^vE9(EUiHvx#_T#R-a;c(gWR16l%Bf-CEQ_n_kEb+f%ZmG3(BKmtKE!gK*INVQD zR&G!Y6^KO0BEiVx101f{6i!cP4lG#DAF8L(=$`M?YL!enPikz%x;ASqjytH(MBuMp z#7mfK5Ayb4U^GLTvKVVHiC6XN@CSvjG@E}^L3`(A{{)qAUg43eQy`L9V>%$u9L|>; z&f{6_1kB5yH@g4&e2KA{P{kLU6c|{;wP26eON=TR-#4GP9C4*=x!S#qiV8O%_AUuy zS;uIYLbd9cWpii@%e=VfWF4|HF1+xYCJ?mmIHPjf6t^a`Q{+&nOcUW|01DBHO7eZP zAwqXo!PcLjke_+tQeUeG8-?;IU3jE!)a~>XH3SV z_>s!@TCg@m_j{@-Lgc#x-Ue;+BO^o+JY>2-F0{2nRz|bCkF{%%001j_pgWyUuN;_P z**KDiw70FSPEu)mZgoiHl#>-UwdV)T_MteeIgBiNg>{hEy#8K!oK|8Hr zBp?_6)}jC-*9{k!{kYtAhL$kb&6B)8K}40rzT9yJz#ediv}>k+aUqjZQJzEk%?ixG z^(&^~LTiA9{MzS&rLGkg#u*$R|KwCN0e#_yb$LWbaRJwj7itUjzXEX&(Aka`Zt@;i zJDEWp)n5m}+sI7>(8K%YKum!ga>+=?slz?42H`o=*@Qf5>-9pghR(P!gCiB7B^gAU zAB}4Yh0EMS%M)6p#;}M*XDJAU-wb1wBKpW3>&|WyA%6N9fV*!rxS7*vI=tgpofu#l zr&J}07WDa>0d9=|FbhRVE4&2Yl4>OtNqof1@r=doSx+(1f71hUYi{Pbwd2RCj6_sZ zp>d^3HQtH-Skfd`6GN*UH~_h$PE=c<`(~7$IZ)SyYieCxNcX1uw3ZOout$VwYA1N! z`FYn3YFlSMBcyOhAFI zaO^A}O!_KI48`TB>nJckB2UjAy26EeviX0g*=R2lqXeBx*dq?O8L=~)ZSqpn(f0*{On^T6C-FeK~E@ar@hOwY#+)Z~LB@JIb zFEymwtSsi{P2+R=9G2uSAx!&56Lfy0>-35?L2|}^!^dhdaE1#+b+TEj%u|x%Mx4Zq zo5Bg2h3BKKtN_>Rz02IC(!Vtj!z9-jvP))8Jc$|EzDjKaQ=`b| zGuY_(jZqd}IlrVLvsKwM1B(E=unuV*M=Wxwm^rj4wUHCBsIGTH@~zdAB}TK!fQ#nv zMo8h)cBBS0Cz@c+MWGrm!ZMn`X%o1}h0g^H?vV(otG;$*gT=!T7t@#6sNVsc z=kff1u68?znSZQjuNCX#D&AG0eaaP67jS~w(>S9})-^HLAh6GwY!L`-V+=M$*YrQi zUnKpB>38KEeb_E4EKQ7fpl%%+DbZQdLES|8e6kZo7)~In|1Du(RV(g#w7}@%NEUHN z`I>%|xF7;EfgIaJjRS20R}PhMC{H14NYQ_F0)kU2Yu0gfcuo zYiF8-D#4!2i#&gXV`@wo}veiHfaO`G1(3MB~LaR9Aq(Ad&sGEZ7oTq}g!&+`V z##r>39feka^?jG7R(xr9V?@&|-q#CUt4(aoDp7B=`KWtb*#X`?vhRbHX9n%+6*<-n_Z*-nX;vkEdZbW0PCH+3Q#Ot#&RL z-N}czb|u}ij4U1kG5RHc5~5wyIn)NuZmy9szh?=r+T8&9ZZf+3LfuIRwC#4GW&Hzh!ugC~FQHpVq7A zPO<8EU9&>_yv>X9(Pe6OkK|F+hoU_%c`?~&4F|MpqP>))WC zANtJ3Fg!NmQGD(`EVUx)WV9~ol(+`uL9#a3*5t8mwYH_LYW%LIVXdOEzCJLJ)b}Od z_REL4ckDX%Q>8H;DQlu_WyDNj+@ndY5!=J#5hF`=@#_@0V`M5HH$IqH-p7*(OV%cY zzp5zA0nWR__VCb>b&^2_p{dqWdxNd7yjsn<#F=&gM+xGaLZ{s2d$W63$ralYm#ogY#{ zS}PJdK2INWxydOXtliSnVDb*+!1QLIeKGntYPM3oVmhYJDgrSmCGNIn!~srFCIE7x2QNpnw zDwBhBNY_Sn-%Z6ej1`4htf=(U>}MLhU4S(qYd-J`Xi%k%C#HuR819~or_j}PDKVqG zbFVDaRrOP+Ci5H|fV!ELqo*c;q7rCtMXNFM6u6IpvnHp<>k&53r6t(=l``6yW>0Mm zx`2Go;6>`e09&AVd}tx_o@wXL3w3Tw?6>0l=MLX_t~CsCNxsS>p)H3~8zlz<3DF0> zlX)wa$ckf_{Sc1_&W8Z|Rlv7U$ptn@)XIZg8i~P>^koZ2@%R&B9AIM^m5a@w;Xv(Q zcrStM1|AIsknz28(;Jefx@y9-Sz93bz#?C-Qec5v(Bet$PyfyWwZywQfsh`-Fias` z8OAWo?u7!b(OZ$FR+h^J&gWJzDA2Tl(WM5Ax7HrfnYJ}?wqh1|g~rc&8x)Ri*k4?7+YUfb%pgHlg_kzlntO5Q8_Zq z**9tVMkN4!Kcd|&*M$|C%4AW`xYLmTZ-y9!=>WC=;v?>w=I}-u3iqZ>q!D|4BJc}$ zP=oeB*A$sfNK}T&QzO~R8?ycPzj2J%m~jQtN&m+BB1XICLj1$mnMX0&rPC=}n+*@Bt>O6sR zs0;>N1MBt9{~_)72CF##onfsMI=`AG-tjz^k{)%T>$Y>+a0tBEnj<=dP@V()%2e#|SJ;NKvzblFN^gta5=Kimauf z^aw1az-Z8LOJa>NRm%8%j65^C*@(6`>jIICXL8UKc@^HUa+D+N?mfi0qFBS?W}au< zW0h?ox7us*#P|OiHH(K}f$ctUQ>H%=A^6U^)HqWAP8T0CFKv}{J)K4~{d*ysQ-t}+ zlLyuMa}Q*WxntTR5st^Fe@5&Vl5&OdUUT@}@`nRiZo<1=^(W~MFV}|v?6j=9slCK= zkS!OenL8qNEW?f$J|{@z6u)VnFM(SQ%cKUcpw)AB=yv$a{zq^uY{Y%47O>}9MRKFT z_=!jMFT|3AZGAMG{FzWc9JN=#QiihI`_yQUGY~^1^opSZ8wqO{_; z=uVjb5mkNq0_lT;TMbSP!7ZYu(qZ@X=gzFG1_IoFeEFpV|ES;=+HlwUcKX}1?6K+z z{rkQHYctZG)QQd~;-49g=SZeRy@e6kdK+47I`4RB$WmXCG&w;GE%L=50>Ywv>%-YW zU8t~JZ<9uJW!eFi>Wq zjCxuLWdVHwxfnN;-tD*58tKgRK2L6(4XKy{Xc5VA?ZDEv-k~d(j-0zq;0czK)NO9< zv*52bBLqE!H_jXU{qgo3weUE00s>0FqOidza@+(qlV1jxvTQ_cF$QUztXm`rhZkus zF^MFhoh9qPd_y^fEk4aVQ29fqN7CEVQC)r1He;YwO35jkqqq(fLxXy z%_q7SXz(r$KQZR$)=ZooLjWIfe!*O2^-k9B5C3#LKM_<(eQI3yjP9!>Q$l zFkHv1M=N3kc%)r=Dg!Qi0cP8(N$bCsaqY^@sR&cdv^Z*5%&Rmn>rB&`6o`Lk0Dkes zqdf6Vfc&{4yf1k=!D_e7v@o1D4F>0-#0G-x#)$rxa+EWKDpv%zE>XR(yH;o7<3Ecu zU;j2RxP-z77jf@^0h?nq{K`P1fQ}q~sr;p$AKx_4Q##O-9w}|6Yoq1?-Q$#-J2a=F zm+9Eu_!f1}(`i_A=qE4;?gsg97gwEH`14sOeb`R9Cx=xYz7RyGSHo~;<^b^J7OpbV zKbLN$dzZj)VTw?4rn$AzGtZBZc^bV@Zy&69h_1z;iW8kkWf1O0+jI^g?~nRnU#bny zu^gy|uiIiyPKpc!zzFgo-I$-44ZII07*2HqkF>#fb37x_$8xMKw+xV*kdnX=5u6RY z8l_&tJXX;qOIi8(686KGT9Od>?Q;FZn)@ixulrZdni$$2?ka`>Kvm-^SORf_>s;~S zI%~o zOor$C=?!m{oQ94Kt5}-tY9+<(Be^-wUuU|b!IQ~Q&=2b(5pTfV_YG@QE~!0oWH99< zYQuIOm{Vrc&h}S7FtI*7boJw0v43^U;0uL5_v3I|!m{km+R~t972K|mWWzuC7QAS=f!u@9tw3NynRn1+hxSlo(5wFLV~t~7DE!y>ruzHNF^xm=m!IGoC85P8JSo_X z8u0_Mu5Yr{&t#aig3L?RPHi&Ie`JNYP_?rsNy$?nEVhy-GKaBo*V0p@0Wk4>#H3T(0{6#O2J?oA~`=27CGbAH8~tM#wOIbl)iYuG12+ z-&-Y!B1r1$hrf%}zU0pd-vYxcpn>U502+)M0TXcoaAwxl%&z+*1n{|c{!0am^a>EJ zY>v?x+?kfn$|gmh#k`k>{Uh)@viWxU$Yr?i;gBpoA$YVgQS&&Br1YpZGwFth{wVFN z)^OzVq+3sm=JeMJH1Sz7{UHsXNG`Hq&_O!yS|bttlTP8^A|D_eAO}E5l1FHAge__*)`mv-Q)6Y=j7mka3T)SZZjL`mG_Z^C++t$EfH7k?QB?X@BSAN3j9O3M z$znX__I))a&$LHYDn2ERG{_;>m$Hq0q66^CY$j`v+FU>;I?uNZ20Z;6X(v%2!KBtqu`fAbSVN5k+O3-H(LN0o-Xz#aLam2izL**5G> zOm}7i9r*-4`Xf@*t-ZuojeNR-qt&3HPf>b}UgU9}Kh<*r`(f^2I-c7~V1zPAwHgYb zIT=W6=q$)0PSrCfeB^8##CQx5c^qX0xkP#{m+$1CCx8BCGJP0L&9gK;j7#iY1W74- zV6tLjqQbI2Z>b`^dih2!ae4xPb2v7RN0q2dUjIHo2`bgrITMOl8jH20XV|NIp@Pi; za8ZKxj_fqXX#z?{q5=YAfPQoLNC(H04%SAG03aO-PM{MOdb8&rj=St5v6yI9dN+7g zr=zv=2$wnEHw#YNoYGaLXidvV6~$m3Bxueh{f!7f>z_R_m#H!jLr3&c{-E|qu?IR7YH|U z=FnY{@KjjlF$DMduq!nrL-$UFzqj&m(Z38`56_5NWq?g-fdUu~g2_ z(cXgmoU4oGFKbcRy7#(^>r!@k1k+qK77xJbbl$Qvo(aB-uq8N&tw4YopaM|OYL`2P zSmK7Hh@P=4OHf&TOGe%>8^-*|krtg%5&WPo(R=v82sYV#wddg?3~B8nR&r8GM z>WBLsmWG!8gHy#dv{%f3wS4rry z!1rj7c}5awb-5IU&)uf&ug3q{4@lt}>pgM=mZ|EliBl~=Y%l{acONm?T6&_NkFlw~ zdWCdmG)Vmy%4&N!;e;7YdaqCo$ul#??;kBj=q6~HvQ7=5?v0Jukzp>DQ?iC*P?|&! z46zLoVFY`I5RO}?BIq3PK-j^Obo>)?`X4YS3Xm z0;ha%qM{@3b&bW|vBOEF#7ufE-u%&ZmKIq4n_E&@9fw#a-|*`%QQtmk2?69NIU+n*sqv@leNDDWj)4Im9)Gg8G%Od~lt+A+2akV9uMW!KV<+(%)MCcVLyfTpWW-$sZjbOIG-zhIvtm(_y zCiyc5rP;P&k(`xWA%0oDZZT_hnhV~o)d4u2FFv@DLYBG_rUK5K7>jbwYQ8r@5o$Vx z`bvcT?b?QCy+r(nu3e=_8JICh%6;fnKkE2Y4aF@b<6fE}gK2oB|7l4ly)V|JkSuY3aLMMcYjjZjbUI}uU40(vZj zK3`%Kt)A%fRB)6?xCxkjbFV#!@Rs$yGnQgQ2x&_zZkjcg*q(#WT8fBZ2z4mWxBrU< zBQX#lvana59ZE7aH!1kl5hui@BPrL>dJj0QO4+cwVl$!jKEC7jjF?V@d zfm?(s6IN=$Iu;RDOjm=&uh|auuD_2KmevSUeDiNZ zP^X;FLMw%V$cveKwUG(0VfK4r@oV%}Qg6bo%MzbcxUTS`yAkea^!{D51lZuUAgMTh=R+*hJh(woS}sfz%)ucWf92w_ox zxuFn|uZ+socH>V;SY&qs_J1g^T1xCGEF-ByHWNnl;^;M^@_G1SwcWp`66L8bD{D2% znT%9mox}c4CRYE~fiN}s6)?#f^=X8ai0nDWRiY&=*)c5WtT4=pASnv8xhWRt`$dkt zmRb3DGGu04ws%k&b{%tb@oBf%SmpoHXR@vaFpbj{6uxazCS6EBWFRufB8hYt(3ZN2 zl#FqW2W&L6Yj9iw7G-3e!W*T;m9Rh>JTEdbo+gS|am>XViMz#ZNYYPwmkiiRWcm+m}o4`8;qL3P3Nw7K9wXxL9%e4#w zd;qq=De`?930q9zb{^AWod;^_2%Qw}i@XtnqH4<#Z+<)K(kwWcyf^HVV(KFf-2yQk zN!j~QU^|I*QWZ{H;vEaq9J2X9j+?pGz0rIPhpF%M)1M681Fu5{v{uembZ7MmRwL?E zQC4bi&U!G>+-rR=xhYW~{dA zDtrfL&?d95Vd70XT;H$DdC=-qb%% zwz5h=EBdU+JGF?6qA)GftjOf8y&DzQa+4}$IiGwgSvww0;zFAnaQ=7fXAuPJpuPbI zq}*DN6L6H-C{A?>+fkZVZWFyM1_ZTmFr?JS>f24Op`M_YY^u%UXTJwY{BCCJ!OV;Q z9HnTxZ><^cy$_hCrX_&uCt(h^qEug54!3$)$GNLQNc(OG&%Q&u;(@i&;rRic|l8< z9e)e?g_4|;HGD3?B8IdbuI<(`F^?z!Ss=%h;tQ2>;>&N)ng|QB{(25;tDBvyJm|I! z4wDwLGwE4a`}ZfC#3? z8A{y85|Ix;Tve_|_P-%5xQ^$Tf}G^C0NAsaT+_Y3NrM_EA_>YnxZ}R{=(#S_ z1vv+Ww|k5DXpQTF?dWB-bNRnTVG6Fg-L_%SU?3Fj_7gnoD%XD}F3v5kvsF6mEZt5y zWwdpM74sNb2xasCW|)p#k~)>SW`o}yvhJD$o}2=pzAzE^qneQXTAYYP`MlE{4W2U!?x=IQKg~-#Zv@%D@bjS5>gGpV3~p$5LS^U)d&0B2K}P4S{dI)2s%A6_TlO-&iU2Y z#|b)Bl|t^nVRi{(XMMVa4Lm}XLWX`yo|%xk@WRl3sFbhThJ|b7T`SX@K4d!m)V5~2 zF^;#vV;C0Nz^8Ne&qDTm8Xn2V-A^9!&lT?h)Hng-f-Z&J&1W!>xj*yg3UVk_rk7ic ziH*vWZ_0j=ijkF)Yn15EnN`VaFm=j)zL+u2aUA~e37fG1@edclxUFdEGHByLbb2D{ z>|SslzGGHto^f$bR$`Cw{UfNzS%$#Tm@97R=iAU45+t~`0@4aJNWO+6>YFf_Gz|5z z<>4$&a&IVjke&J1OVL99iAaPaXWDql_cLq~!?ik-g4(cPXJott*mjiu=U~&gH}i3ZkTdO$CaUX&%!OGk4+-k^BL8OQMM}xzuLlE z$~9l=!!=@Yuv(bK%{H`_GmB?Bg4X_~<2iYZY!@!2A*B7Rn|-i1JG32`Nvsx_o)Ers z$~}bLaE0IS1a@IZ`f&3#$W&`juvDX*t}gUdYD9915;kT|uBWT9Qb;OgEWC$&@qN=T z-Jp48afR)p#4B|9J#AaiVq`v5;!9Ac7Uh#Iaw+DmdG&FCa=n=DwQh zykw5u%*y9)^F85`dTVzT$Sn?L*@Kx#?+vY@4qePw9-#m z%q49h0d3(rYMBxR04Y|^vjQ_Ukh6=PteF?&Rj20My?Z6{Z1GkX${azEgsn`ASp(V& z7jWzBGh@ZmfbA@std?Uc`}Wk2D8QHx$Sh3xahy63yKn@gNs_SwnBIsR{CBHg2=_;s zpB3TMLJFU02dU*RE09uBoee$Y`*pxNXQb#bhpyK!aJL+FR71kUf}A4%wd~YU-GFrl zGSsMzV6G*p4n)lNV6)p1T~4j#&bwg(S47e*{IFsfe*DsGv#APo(gPR0Ym%nLy84J+ zI>4PHqDnJwIakzVT%_ksG!Kt3%w-a2o0ZN~D8zA>MYzCr% zjc4L;(sMYIen}1~^22AnNl4AAVTXS;6h|00sTuKy)eCbC!yOJh5&}gewHXg`m-|J% zu}fxztRF%NAGhcgJgzYzHx1fFdrr|}j4AqDe@z&Ns5k~hA&fZ&+Q%i(}|Q$J3luwFAQyRr5^2?`u*bsznxyS>ngvQRe6A9es$XN z%~o_jTZ2>At(!;}FGz`CenoBY__6$-6Y#{8!~9=VOqBF)s1oK@`P$4Kt$MzpC>JAM z1lME_G=7wl5@itv5pj3~N~V@1Ppom0gi^_stXwWc9XlkHq70TXdH3e-F?qgc!@w%| z=jZe9POYgl>}0d|B}d!iZrarY_0LY&iyzibE&yNQQd>P@f+s2R{ombY&c1Ks5tRJ4z%QvI3m+j@ zO&498p>8x(WDvB+pmEDqw0B!E@>GKWEZ;Fy|FFXpXVCpMPR#%UTEx#bw8~*2DdaS< zt{V)5^%55FbDsYinL1$J3_ppeM?nhm8XEI44dsgEJ^lk!xS<2?vE3vKLA;F7usI&N z#(2m9bPx1#nnoPDTA&S2hpJG`*E+4@zoH6XI%`oUsTE8J<>fTX9Ka;p6n}fDqJu98 z9EL+ui!uU7A4&Wr`Z4Kxjmdm5D}ce;_E0%XUTMQ2!hCiAofKcWkvFrKVMpD(fL?4n ztuCg8ThreH8aG&G=VwaWa;{GOo?k%ZLqP;@plr z(1OC86%gD8*rayQQZ`04lElKMO8U==RM-teAyiU;OXG1Iwbrx7eZLN!FtPEFoT;#@ z6&F^$Ue*j9e_#I>a5%Uh$`vn{g+^av)!zOY;~Nc}lT%&#c}+*%?wJ=9yL~uq2AmFw znzMi5jlQ=U7vonk7h{e`&cMB|*aC_xJY}e768oQNe86_v&saZG*-12&r5eQb$%3GTB>2Is@jX+ zGmQhqIgxvK!CE8C2v!t)v)Z{F$Y2mLiu?y*NP zn;b&x3~&ooO`1xBbW>~aKcvYwmTG_WDgnk`sr7}wKjG>hX*Z$0+zN`xOMk5Djp|{F zhi19)`V1q|Lrf<&++3JF8vSDof0o(ZR%2RuTIbnC6jEmWIo=if_iFxpq#$ntpF`Th zzz_nleN?|(YDYEG3I6r_TEe&bfW zrVP3&o(rb@yA;$an_#(mQZSOl3c;#jBp)sP`j7&b+4=!6QBllp1VOc_g{+(>;&)!a z2v<3(6(&rQEfxbB>`R7^b7cW^I?Gh3F#V4_f|@@4q5`o(Dphx;PA_2DSZ2qLu#)Jd zk(9rLK;@rhxh4#=#I;nDN}D!6f=XR0S&>?!828Amb^&K3G;(sCTm24*I_~!;KdINo zYU*Ba^1!oY`E2)j~>9D6t~9m|EYlP zDPdAagczRZ{WQ^GuE0lE4+D2}-mL5e%V;nChLkh-@N;29c2m3%#ur55STG)PB-_)V z3X5q_!<{(g4^0u|GCqe zhShR_!+SzBJ6YvC0fSJpX;{cV;ct)aK41w|$i0kwx*dnHseZNrT9iKl8-gHD){Z(y zbMor&V6u1Y%CNfSQ^Q_Ct!Cw+-_BF}bv1{T9f`Ky%a2*U-1bu$$)BSMNWW(ggw;5l zD=Febab@zcLRlQAyBF>KsrNwg>z)PqEc2=gk)FN9lTV2e4qR~(RjeXufOS6z8gl@x z4Mr6Q`*y3JCx@nWOs85%RlGG;PUrrMNrx!FFfQQ#D_=$xT&URlNY|V6e$9DRVdNag zCACb=I{{i5JTO_vRyn6_xNwATs;AV5sg0%rJ>iMp`qpT%LLE|&0^Ci5TK9{^ukN}^ z{$8^#H3cPV?CuwF469b*@93*ee&{gV*{a06Z=Pqw#W+5qpq^OwP2Nj(JhlCm?f&G} z$r^+s6@#ulxHLq+ls#k&uS!d-5qkNaI`@B5mFdUMr3Wnp^IFFh_sLD77gy zP>lLjRQwXn^j@lNPTY!2Zi5%MVL9jIju2{{cPd}3Ov5U-h+gWDmL&9#og(WpUO+%5{C z2RVo6^Feu;ArSGB^hsPiw<7LqN&A-B{LNflruv9%mS#CT&8A)CKv}A{`saYhYbOjr zIf3#4dtW|$SH~WT8k_jTzjKkx7WbzH;X7;*oTkcs&d|B>O$5u+`A4b(Tp0PjIi||{ zFO;IG9P+6g_JAzYdzO9gupkAXo?)AUdF_S4$xVNQb&LC;snI!|5VQxcY11hh(3)Ui z;4vP&hCLI@7fmPb#Rnv0K67up1*vW!7h3lk6fwrBlP2KhzNW)IZMw|UP~-zeBgcI} zG_@jMK+0ZYsvR7BrEwtE3sH%{jl@Hj@Xr2OP>|ooGaCK{v)5SI=Su>QHN%me-QD*0 z`7gcm;+jnCd!+)ZHo9;@U&Y@?yvIwphHzL7Z`d>#nCxZGn7`lfWQKGz45;9 zo(8j`hkIeuOvus1ded+MFkQiBOFwN@s;NuKVN|jy+VFII?dAvrVKv!3&VTU!`BB6> z-3t}(JKpWr1hPrd}ZZj&C1uVZwINenFC)m5P66Xg|SF7ZFdj4 z9e_LN!-vNI#(;)ehj+_+RKf8m#TE4sy$Nr0`e2j~foCN>DdTB9X}=MsKrQeck1x+u zbjIARmnXoJElBiZ_5(dJT6SC(KgmTRbUDsp}_&0Yra;O2G8R#F!+!}2nuD!q;KUY7KonmoP;ps1P?Dz3m2&y+} zg?)?Kkj;O)fC0Ia#FgniL)e{wB=0ufSOs!_5>cMNW#M?qgtLzkOiAfz*mQ5`{fg2U ztFA!9MKeiVTu%;jhwQL8^z2vWj*a}~Lo4eq2@Us*b)jzauaQT&ba*d^P#^b0BFt-S z^W^tBMFPuZ?oM?wv;jkyY*|jHxj7lZy~yJnnk-0rL;2gdnqn7boxDcnp(BH_&sv>y zW9fylX8)bR0r*V$Vb)yT-N{nP!b4UbbG2WV5~eotS*;t;L*sw#o=yyIi`%*COAITt za79Wv0gtf73hc(tIr<@4Smwy?Rls6Mb3LLPJ*$lWQ{NC8v?yd=@V>$deC8mLm?RPw zl`FMpr8ulN)JpoE9L7X(4<%jJuk0P3ns@ZP=jprh!Tw6QB$l`1={11Ag_;v|^?(RP)R498$-`3aL4n>pZ> zMmp>=?K=S(qzKs&I)1>rvT?_~roas1&Kh=GdfxMiTNU4u0~pDU zB11~c@9?YovD`Y!n9qFy9RS15dlczM3}iQMpQu_u39v|Rv#0Bk2e6w}+~2{k{BAZG zXb~*9+IA4{?I`FXD5Cn3S$k~u%sSgkF`30#&fEL}ru=C!13@Ut)Lv~{d$f~nN?C0R=cR1agc`E3N&(T`TYUdR=a@gM=9guKvfrDd z?G9~dMqD6k^)$rY5N_7Sb3t}96iEfLWy+DYf{B$LV!h@D+6^=Lub=n1pF^8{1IpoBQ_6mPc zxO%T^)?X4JQTo3wn{vPj-Zd(@IXFsO*Y5(IU;BD{kq|E5xyB#k?E+~6d|S)(EbPD1 z8U){Lp0Q{b@JB&~-j0*I*}5E5PGplC>$TehEZp^%F_=d3Q~61^{4zgGl;#$lv-PHy zmW_*cdskQfXW;$CMn${*<`7L%UCq+wlBunyuC1#SQH6I_4~(-THgfL{9vRFXfLK-@ z=ITC)f!7Q*S-9=cf^Ki<@YXm(h#z0*@T#T$4Xn)wb=Ssmtc*KOPHZNvNCTj0kR}Ta zPfGWr5H_-Q)=12=J~lF}yM4#?kq74ePdE$^W$$^v@=-P>SaMzQ6{5Qo_Q=q3R@_Ppqh=IiD{%)+=h_qC<1m*;TP z40VZhNW}FK?koP-{h=Wy&c}WjDh?+8?pxX8nwoS||M0gmeN|)u9?gL_J>|hh>7aY@ z1|r37h8JQ(L#XX0rPZ@x5_-r_Y$erOr&s>(W{vw7ou1%%ocx+MgKAdbD<^yc6Zm*E zhnxxxz}oXN@0PexL zmPX<6Ib=ow*fIB6Pf=Y)@FR!{=4u^Z2W31i?4Lw>h^Dt*Yu}M&u$IfR$&RU`T6fjbH>Y8-o{${fT|pn^~K#b{Zo z1$c@K<=KW-kukzmx)mq=%w21eg?4+GR})U!> z-e2{)c_xH5r~jnQ!t*4ja5?(A>793kqz(xpSDe2cXYZDogN?W`g2y(Txd>XJ1` zs=RFZPdV3ALrAK+$W*HnY;-}x5qj5wiFVZ5#^P1oo(0FQ!`gECo`1psV~*m)arn90 z4~(L1XIAFa!tI5?PVs%va|FGl(y3dV z;!0zQ#b7q{MyVLKfVttvAs~S1-aH@9FAAGoi0ZU`Q>31-w2w9R08n`A7lah*oJfj8Qj0amtbS$Ie$MvL@kd}oj6HB|s*xqj2H z`nQ1HdVt73!?>dh24rOzYRbs62gRdtpnZwZ^;bqw!3GfJ{!%RzX%T?3dL}{?=-XQX z$wxA(z=;t;rg45-dt!!rqn%>R)4R?M=n7#ql9~YhkBV*cY(P@j?ydChnStbNc0YP! zr(`WB+F`|h6Nbo@pEqiJTjThni*ay6jHCjeyAz3`NT0K zZGPL?`jgvSY!_y$yd*Xp|u9v(ZiTDZaD4o8MdP#96E+7*RzvngM^ICs?PDFt7G|0M2 zy!(Wiz2&zCUK^J`?1>m1atf-LeJ-2}b|cHvu>{H~G99vW)*w`KXKLb=Ci2LU4mqZ# z%&UQ$h&0P6>-(}O=_}e7Sa>d$?c3;^#Lwx1%eQ%!<$~+$)t0NO2Fo9f&u1zGTdo3y zVTGr{Ny*5bV15IRK=t3a3v~Iv32YjnvGyhRuOrP%1-5q-gd_D zKj#^%NxzF#oc@FVRin6TvzKGj)4{I{7+p4CR(xG7AZk}rlBk1A3HCl6&o89KI2e5| zk7gSy4&h-GW*K;oHgyxX= zsdyiG%yOn~=H^}I@0+ClJZ(0z#W|PsFK?KN+e|<0hqG@aepHN?#bQx!t@WY{Y5O)Ne~0?=|Qi5BkUR+a6Z!IW+y`q>r4Ef;33K@*QEl)Xi}iN%6$^Xz4BN`^bW zyY5C4^ID;Bl-%$K%o&`|;J2W65LdNKCAC)xN!BNRV%^8dIT5B|3!a~r2Sx6{mMbv_ z%po>yJx6j0n8kSpj@PfIn8M){6}on3GwjNh*FmE)H2m%~T!D6b3AUUsx7fBCj$;h& z+m|&1ffu^q=J-JKH&GvTkgZFoeunn%N_~QHJsg&FSWUKPW>`cY*!S0=siC34z9R2O z4ZAruila;iLhh);gKHlUZkA1@RB5 zM%6>7d8uG_zXQwe483}g1_|#|Ge|taMm`epW8bDGSLXQ7y9wn zVfeSRzy+1NGm290xN)1h3Z<%)l?5pqG@n;?z#UdA-TaWyEILgB(&i$(m8&I{JB`G? z)&E9$_%C{axEUC-_ph<_Qc^KC0|+iz?#jKsvS7;0(5eMM5w$Bib@4|rY2{*k>$aKd zVkc4b-KitK*T?R>Nev0hGu3&@T{{}w(HQh#MdhIV<0sSk;JpCOfp9dmBKSX*<^W@A z*aXGpA`b5g#Cxg+XupAvjex!Hi37F)E_|@v~&(PXa^iWO8(-{K83 z#-ZY@pZFXikaipIJnq>*XOQ{-x;d=a*YVh%Caz5gVYx@eIKm#pxZB;^Si@q+`^R=2 zu;td%k?x&ofss;6_w7iJN>kVd4KznuZVLYtGjKMP%(E)KfKum58s~77Xcfw>e3)qU zG0^_W9x3TkqipYH)h1F`zj35yum=<9*B_O1KYr%IQ|Wi>%T57CYPv#)}Z z#V4EcUbuAEc7`W9c3W`f4T)q2y*gj~mY*%y zrqbSgfQdE!9gcOY#*hRuF$m*j{XO1^r4{nEpgjWUbk_qv7Hz8ak4&x%Nhj)VC zAF~={>S72MsgE*cXNe?s|293b^$w+xYXy(VoMe6nYn}u9^ZfS5;KM-R5Bkx?tgfJ! zF||w##|d;e{fhk#WCY6z~-m4G1ZQxI$BgZ{yu^(6=98=B(FloaQPO4^lJ>VB~urfQc}bNhW^ zh#(@KqF8>xkq;415Sdf;!+Xu3vZ=#pRQvF>{7Wfwz&M8DOG0M@(@0Y^r1Gnx-{{ZW zcxdFurjd{fJmh@PcQx3^zSQ*{LF!2h*p1cGxwElf;HIpaYdFBQA49>~3H{ ze@qGG2-_goDlaP`pK$`MNfhL`a3_VJ;Yjb-*>LC2w{B6kYE>;R2YUwfdJX8EGWsrz zr~EjIBmewZhJfX6RBo_tT2%=g8CN^XQaREji@jM10o#o0;SHIw#!uZEtZ}6TR-toL z6X@V=qE8>hegA_}ir{)#@YqYxQlJ^vdq20_h|$3dui4r%&ZvjkJ&MlZajt^4unVYl z&+Y_K)*W=Rh-HV)P6Sb;JEsJBG>5&aZ8<5&%f{^9K z9xZ4kc9rmEPlF|-`%*Tdwe9!JSOnI0 z{@uf5i@eV1ghCXh+MksX8k^~qp}Acn%uLxbzar5C@eT0YG6>!MyeJnaL3RXJK$thN zAJFN<3)wOG@S=RXjp$cUm*PcD`0N4GLAq}@_V!In`WCo0gSfu_C03J@P4iq4Pgchb zNQAW;S2m{GymxH}#BQ^&+0c`1U-rR~1ul{MmGL!&xIA>9?Onvs0dYR$MOm3loJe?v z3O9xLHe&{bc1tEr%`6`yO~lfyVwCYYVNi;!&eX8nsz)H%7C=Pf!`L0pNsq!cotZQo zP=l-`h+pbzHAwpW%%ASWEarn=ncZ_wRf%5J~^G z6mD!_f;B(MnC}V2y8*uG-+0tgoM!EmIleF}JD0^ggqH)Co8|kIHyFsM88>G8gknZkALP|hDxhAa zw>C7cf_piDC2GO&&u)b4dW?r#fJj7%TQQt4R(YS=;FSlP!iDR{&zieCzcqqcL7qgQ z741sRAYBfh56x)Y^tnZg&-SNHnx@3+*G;H>>oVu>K=2^*W)=E~@lERAKJvSXasV8+-9JDi}c*PHtP3}3mHp^ob*`6&Gv4&(7Ob+mXJT7)^ph2r8 zQt$P*o7`cqiddN3t;I`h2Pc4&ri=_;Xsn(ah)}PIRQhYUhoI&w90}7RL&^SqStSPiq_RwpB3&WG0&zWroU9{NC-y&u1bE#z^2n` zsGzYA?FkC>*n`G_giyXc6D_QkHjnv4uf}j!o8KqQhgF-FA(a0LP6-V;_*U{y38SNS z*xRO#WnS!qfuHsWjO^Hj=)aD^R2{e3>ByQBMfxHHegZi=9aWM0H>Rm^lxKxoG91F| zVt5)~1f5){5CoWV0`HybC2$ItB?AI0%2TC$C7uCpK zoTDleZbTcJ43a!8hQ-{{@a7Q>MIPkc= z*6tZ+BOi;Wo1B-9j9L5(8vk!gVqs%)FYSOCekC4THvjAkoyBLslD3vM)k)CT7f%)T zXQ)*Vgb|-{^7VipH3D3Y=%!_ieSuxRn4k&U&cw&OLrsm#>$+%=421wuYD6zM_mZFR znvNzuuS=CL4(8P6O4Iz$?72`N1W1bSmFoz_QF?6p;+(Is8TC)vfSoJ#%PGp)fE7t+ zSe;y6$@qBtS%oJ1&uExa;`twRG(qH`pVC#TP%UjD#Ra(|{T`YY38gLd(UcySW(*sZ zo(lcl3`%*Donp~T2p`bNZ0V0kHcK_L^$-DGGbS~FtZ1-5INShJw_h#3A~92goRb*O zMImYdheMs!ID@$M7uHu@Ao#Qn?d6@#%a$8AlH&8-BxB=L9dWj8)HL86RNnZg#IdDJ z^~A~6_8Bpx(5B4LA;X`GZkyIwp$a!Eh~4K^AEmy`YowfVHYzlUOJR9ufNQ#+R_O(4 zL#iJ_K3Hpub|(oBw$7j6fg0*~354N-5Q?v0BYr^th8g(g-T=s_`ZCfY+u9G5!GbML zZUEGd74>dHW~EZR=)J{_JE(;5gNXCvAvS-wB)_lf#x)RHQrb4APs^vXk(IpBzHer; zZ1)c_m7s-j@b%~3{v^DHg#*~`got(nkCSO|h@v^afvm|}as(9LsAg${Ps$n@ny__= zy8nVMMPoK}Z*pJ&gq>q$be%WqGE_EY>(4S;O)wdv@No5C5FF^d%1=!)ec_c;pj(0| zUdyzKlqPIwLjk)x)BRB*eg!|Gq|*>P;5$|9kErr%Xt;n_nE#1r6HPP&!GYX;d@HQX z8k0(f-<5ja$?pjr%E$G)B=oECRHyU<(E<)@e_x&hP{_B=ro}O!rl|2uiB2{lPyxk~ zZ#TopK%bv3ecw9P(esZ~eag`JW~;$vzjVrjRZ{0&BlK5fyU_v=XRtT3VAN&Y^Zhu` zJgPyo=ntOMy4cMECy0D(QG|tu@g%&@F%XB*o(;tw@KOzs>_b?hAc~OZv00UmrWo^- zwVf#6Ua0hSU^5@!S1U%b>gQis2D%Y=lzWXqZK8NBM(>-a(5aTho!Q3T_uW-wtn;&e zgR)XC7^MKHc%`*&#v-Q!>+t||lwFq%b9ZFI>_05k58d6M&N>{_?^CA1AyB>!^m-2T zgkm}|BWhGGmipQH>EHLq(=qP>8ky59O<(Z-(3)pG(!M76<3LGsxiyu^7?pJ#Fl%iC41_R|sT?Tv%d;8|J)eY-`kWCL3#ce)Rp&|JuWk+H$vLh*v& zd@mGqYQ9fxTBX*MaZbh7A2gxbNvqW^bc10Wm5amCkoIg2NqraN7I|oKn=7pq>-P-n z_6!GedGS|dzecSy{^q9y>g@x)l|Ih0dJvnk8EM(0Lb0R1S8^$-k*z;qlS+9MxN{U) zFDaSKobP(y-zD+xd@i7PODzTF6q$pYtGK|H zlY7P7rR&+z1J!~4(<|pYT7~wOx0756NEL^>v1b0%&UpC#V6_&H{~>>lZ3}=0^fXBJ zNf$*wrb_rRNch>0eEL9^ygx(e?<=Cj+=m6elXmdBm@K7vk#Pxl?;>x@=ZnLsK*^s! z7n#+SU<&ET4;N1ugh>4GsSN-62gck485lE16~)`xf1u{uR=H0o`lZ!|ET4ZZ@#wMy z+v#QpbiOBZbx&eoHu`?*6$13ub3tkezYePKuW}@1JCFl|(R8#gqU1`%Zj>@S;fA&> zoF--SJAHY-+FGt<9|wnNCfnB7;ipzGRe=RCEp%R9M~XCZdYt4nFYxIlA3LHos<0S* z=3Z=82g7MmfG*XO8#8rAf7B>l%086R-M8jvIpetd4<1U)W2F*xSj(}#_-|Z7P(Dm0_u{=`%4L}RR zl=+bK-noI_23ZB%B7x9%&>DFrp)V)j#!{nPm{s;?+LX^Ia5a;*P!^mogE3d_))P$? zAuUB=%86mh2*`Nj8vzXB?eRqWLq1K;07YOq!Us*$cV~ORmd?HL# zRoFLX#p9~Yki`aA8`W9NFC8O10YON+wm$Flm_C?_j%;mboDx17D#j#GRuzWGJ z-x??OD$lA+mS(dBV&M@S2-2IjnyzhG<_q^Nq5A)iJ37wPiS zIS)+0_6)ryh_Y>Hu4yymOWce`PWbQe+GU{0`E8{c7N;a#oz*8m*MKWB9JD}?CX4Jn!) z=LaeFE-J+7smB>_!AkC)d2F!#YMEO_R(P^E3tj?q8CHRu{ITxMEh!^MB_2t0ac6Pv z=*@QXkmK<}|RNaG&aKv3{KZ8%83-lx;vp*Y21+*qd7e?B z7g}a(0N0ri`9Rs!KF9SlOZL=~{O-!@6UiC_UlYP)@4jmb+IpcW8G9NA7{xddW=Pl~ z1j+o>E+l&IVUA~$U4kof!x$tEzUREF6isr|h_^6bG#_ROIj11_SHO1r@G!&piw-DE z*?vI%yd+x`;|ULgzx^!;4PXl>M*ZAsFwH;lz$qvn`#m#qtOlhK#XgT>S5EvcIo~HN z-|AEErj0(`YooU^zRxrF+`1MGK|?Zdx^zB}_OUI_D9z}nnnW9iqkOv)ZAoPI1S&>* z@;4b3#k8=@(1xt3-|raQje2*>x7zHcmNn)I{%D8YGwwN|&ZK$+deXs%ilw1)%<5BL zr#9eh< zKTI>40>!KHtQ0ebAcN4yc{xlMRxyUe((Ax#wgZ`O=TBC9OJ-Lo(1ObMl}25)i*&Fw zM6Mr;2S+mY2NTvlZ`2saK9GvP_kxN5(hEsIdchMy9zlYRQjWMe(@Gc~g3K?(9K&@W z`(S&V{w8pgbmJzzXR4^c@fg(UsPi+j(~(X;`w_GDxOraly%9qpd-#ScNDivYPcAE3 z3QH5IOMjtw%PoI*R{^y$hFeH_bbM``liRl~vUfSDl-!Cv;!dYHJiH$l0*^WVUQmaV zyS+6da@H>De#DM>Sa;sm6RpcW#2<%~&Rx z3y!eD;J(VO{fPOi)RTWOU$%~6gQp=o_`LzJsm-q`)?nimJjl$Ed-%k9OP#Q2_t7fW;GRJdkhk&S_F}K705T=auvK zgN`~e9;R$OFLaaeO}9qdsrGv#E?lm_e_t-J`RdYK?rnqq^?#VRk>~eqVs0@iEjOWS z@3v(~M&Qp6{k0^s*FOeJqGbqNi}hFAw_**6)=r5nUrnr=wJX=be7S~u zs8suggdX|Td37jXp59Z3KqQLtGi5}{wjRLrSWOQAY}eY7dQ;qT;Dp)U5aDhB;ljc4 zP^H7%*!=K>JA{i-#aojx2| zmRf$`%grDCU)Ci)<LbR~hmqRk=FVeYRju`ee#@BCF7g z!wWILGa*b{mB9UA0_m`F{enHuB0tZHJFm-|QguGo*SKRDQ=Zvk*wDhWra(0Dp|M5D zPzo29rT(Rk8wLp8XE1%yx{g6_OSw&>v|D90K)om<1Ay61y*;QU0Bn-XVSenToR6Az z7IiyS6Wfc2P8D>Q3Jm0uG+l>VVT-5l+Z>mEyJ1lPgWC2dMrxQBzBO%tmd0m)C-O|* zqCl_60pPL1|CdS%?{clXmKlDAe38zyf8M}4`AvHe3+@BPp}spZ{HH(ITqhKG-UK

vSQ4Au2rJ2-rrxV7AR_9heIms4H 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 #}_miM1x9 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%0DF&&f~gt64c3pUd6NFu&`@ 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ΠlW96r_p>e4D+;gFI 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 Date: Mon, 7 Sep 2026 06:56:44 -0400 Subject: [PATCH 6/9] tables: re-anchor the two message sabotages this branch moved (#525) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `message-clamp-drops-surplus` and `message-surplus-lands-on-zero` both anchor on the array element loop of the message decoder, which gained the `mine` flag that says whether an element is this build's: a surplus element is decoded into a scratch where a file's reader steps over it by its length, so retention has to be off for it (§6.6). The anchors take the new line and the blades cut what they always cut. The tool caught it, by design: `edit 0 matched 0 times, want exactly 1. The emitter moved away from the anchor, so this negative control no longer breaks what it names.` Both go red on their own rows again, and `make tables-message-form-negative-control` is green end to end. Co-Authored-By: Claude Opus 5 --- tools/sabotage/message.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/sabotage/message.go b/tools/sabotage/message.go index 7f21e34e4..add17185a 100644 --- a/tools/sabotage/message.go +++ b/tools/sabotage/message.go @@ -111,8 +111,8 @@ var messageSabotages = map[string][]edit{ // AN OVER-LONG ARRAY CLAMPS BY WALKING THE SURPLUS: stop at the bound // instead and the next field lands on the wrong bit. "message-clamp-drops-surplus": {{ - old: "\tfor i := uint64(0); i < walk; i++ {\n\t\tvar sink tabletext.Cell\n\t\tcell := &sink\n\t\tif f.Array == ir.ArrayList {\n", - new: "\tfor i := uint64(0); i < kept; i++ { // SABOTAGED: the surplus is not walked\n\t\tvar sink tabletext.Cell\n\t\tcell := &sink\n\t\tif f.Array == ir.ArrayList {\n", + old: "\tfor i := uint64(0); i < walk; i++ {\n\t\tvar sink tabletext.Cell\n\t\tcell := &sink\n\t\tmine := true\n", + new: "\tfor i := uint64(0); i < kept; i++ { // SABOTAGED: the surplus is not walked\n\t\tvar sink tabletext.Cell\n\t\tcell := &sink\n\t\tmine := true\n", }}, // A SKIPPED STRING ALIGNS BEFORE ITS BYTES exactly as a read one does. @@ -273,8 +273,8 @@ var messageRoundTwoSabotages = map[string][]edit{ // A DISCARDED SURPLUS ELEMENT NEVER ACQUIRES A LIVE DESTINATION (M1): land // it on element zero instead. "message-surplus-lands-on-zero": {{ - old: "\t\tvar sink tabletext.Cell\n\t\tcell := &sink\n\t\tif f.Array == ir.ArrayList {\n", - new: "\t\tcell := &fv.Elems[0] // SABOTAGED: a surplus element overwrites element zero\n\t\tif f.Array == ir.ArrayList {\n", + old: "\t\tvar sink tabletext.Cell\n\t\tcell := &sink\n\t\tmine := true\n\t\tif f.Array == ir.ArrayList {\n", + new: "\t\tcell := &fv.Elems[0] // SABOTAGED: a surplus element overwrites element zero\n\t\tmine := true\n\t\tif f.Array == ir.ArrayList {\n", }}, // A RANGED 128-BIT VALUE READS AT ITS ANNOUNCED WIDTH (M2): read the raw From cb7f7c1d4d723775a6c54e78d9fa8c3bf7aff503 Mon Sep 17 00:00:00 2001 From: Rowan Date: Mon, 7 Sep 2026 06:59:24 -0400 Subject: [PATCH 7/9] tables: size the driver's retain arrays from the batch, and repin after the merge (#525) The message retain codec declared one root, one retention buffer and one id list for the FORM's 256 bound rather than for the batch's own body count, which is a megabyte a body a driver never uses. The batch is opened for its count first, and the arrays are that long. The merge brought three new maps units, Crews, Pairs and Trails, and every one gained the retaining message family, as every unit with a variable-length table does. GateTable, AssetsTable and DocsTable gained a forward declaration each. Every one of the six only GAINED lines. Co-Authored-By: Claude Opus 5 --- test/conformance/cpp/main.cpp | 14 +- testdata/golden/tables/arms/GateTable.h | 1 + testdata/golden/tables/blobs/AssetsTable.h | 2 + testdata/golden/tables/maps/CrewsTable.h | 1049 ++++++++++++++++++-- testdata/golden/tables/maps/DocsTable.h | 1 + testdata/golden/tables/maps/PairsTable.h | 1048 +++++++++++++++++-- testdata/golden/tables/maps/TrailsTable.h | 1043 +++++++++++++++++-- 7 files changed, 2911 insertions(+), 247 deletions(-) diff --git a/test/conformance/cpp/main.cpp b/test/conformance/cpp/main.cpp index 0987775c2..73c95a82e 100644 --- a/test/conformance/cpp/main.cpp +++ b/test/conformance/cpp/main.cpp @@ -544,10 +544,16 @@ static const int64_t kRetainBatchCap = 256; if ( !ns::AnnounceRead( vocabulary, a, an, &open ) ) return false; \ int64_t need = ns::type##LoadMeasure( vocabulary, wire, n ); \ if ( need < 0 ) return false; \ - std::vector roots( (size_t) kRetainBatchCap, NULL ); \ - std::vector > stores( (size_t) kRetainBatchCap ); \ - std::vector > lists( (size_t) kRetainBatchCap ); \ - std::vector retains( (size_t) kRetainBatchCap ); \ + /* THE BATCH'S OWN COUNT sizes the caller's storage: one root, one */ \ + /* retention buffer and one id list a BODY (docs/SPEC-TABLES.md §3.3) */ \ + ns::TableMessageBatchReader br; \ + ns::TableReport counting; \ + const int64_t bodies = ns::TableMessageBatchOpen( br, vocabulary, wire, n, &counting ); \ + if ( bodies < 0 || bodies > kRetainBatchCap ) return false; \ + std::vector roots( (size_t) bodies, NULL ); \ + std::vector > stores( (size_t) bodies ); \ + std::vector > lists( (size_t) bodies ); \ + std::vector retains( (size_t) bodies ); \ for ( size_t i = 0; i < retains.size(); i++ ) \ { \ stores[i].assign( (size_t) kRetainRoomy, 0 ); \ diff --git a/testdata/golden/tables/arms/GateTable.h b/testdata/golden/tables/arms/GateTable.h index 3a3fced93..0a2f7f701 100644 --- a/testdata/golden/tables/arms/GateTable.h +++ b/testdata/golden/tables/arms/GateTable.h @@ -8945,6 +8945,7 @@ inline bool GateLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabu { uint64_t length = 0; if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( type_id == kTableStringTypeId && !TableUtf8Valid( r.buffer + r.offset / 8, length ) ) { out->malformed = true; return false; } if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } r.offset += (int64_t) length * 8; continue; diff --git a/testdata/golden/tables/blobs/AssetsTable.h b/testdata/golden/tables/blobs/AssetsTable.h index 92bddbf75..0fe943c5e 100644 --- a/testdata/golden/tables/blobs/AssetsTable.h +++ b/testdata/golden/tables/blobs/AssetsTable.h @@ -9421,6 +9421,7 @@ inline bool AssetLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocab { uint64_t length = 0; if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( type_id == kTableStringTypeId && !TableUtf8Valid( r.buffer + r.offset / 8, length ) ) { out->malformed = true; return false; } if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } r.offset += (int64_t) length * 8; continue; @@ -9869,6 +9870,7 @@ inline bool CatalogLoadMessageBodyIntoRetain( TableBitReader & r, const TableVoc { uint64_t length = 0; if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( type_id == kTableStringTypeId && !TableUtf8Valid( r.buffer + r.offset / 8, length ) ) { out->malformed = true; return false; } if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } r.offset += (int64_t) length * 8; continue; diff --git a/testdata/golden/tables/maps/CrewsTable.h b/testdata/golden/tables/maps/CrewsTable.h index 0acb2ac69..67b4e681e 100644 --- a/testdata/golden/tables/maps/CrewsTable.h +++ b/testdata/golden/tables/maps/CrewsTable.h @@ -4400,6 +4400,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells, and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace mapdemo #endif // MAPDEMO_SCHEMA_TABLE_RETAIN @@ -6240,10 +6672,12 @@ template inline int64_t CrewsMembersEntryMeasureBodyRetain( const template inline bool CrewsMembersEntrySaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const CrewsMembersEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline bool CrewsMembersEntrySaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const CrewsMembersEntry & value, TableRetain * retain, const TableRetainPath & path ); inline bool CrewsMembersEntryLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, CrewsMembersEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool CrewsMembersEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, CrewsMembersEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t CrewsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Crews & value, TableRetain * retain, const TableRetainPath & path ); template inline bool CrewsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Crews & value, TableRetain * retain, const TableRetainPath & path ); template inline bool CrewsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Crews & value, TableRetain * retain, const TableRetainPath & path ); inline bool CrewsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Crews & value, TableRetain * retain, const TableRetainPath & path ); +inline bool CrewsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Crews & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t CrewsMembersEntryMeasureBody( const Ctx & ctx, const TableNumbering & numbering, TableIds & ids, const CrewsMembersEntry & value ) @@ -8577,92 +9011,211 @@ inline bool CrewsMembersEntryLoadBodyRetain( TableReader & r, const TableNodeMap } } -template -inline int64_t CrewsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Crews & value, TableRetain * retain, const TableRetainPath & path ) -{ - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - { - // members: a kind 14 array of kind 13 elements, ASCENDING (§2.8) - TableMapCursor order_members = TableMapOrder( ctx, value.members ); - if ( !order_members.ok ) { return -1; } // the sort could not run - if ( order_members.count > 0 ) - { - const uint64_t ref_members = ids.ref( 0x79d594675e391090ull ); - int64_t body_members = 1 + TableLebBytes( (uint64_t) order_members.count ); // the element kind byte and the count - for ( int32_t i = 0; i < order_members.count; i++ ) - { - const int64_t elem_members = CrewsMembersEntryMeasureBodyRetain( ctx, numbering, ids, *order_members[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_members < 0 ) { TableMapRelease( order_members ); return -1; } - body_members += TableLebBytes( (uint64_t) ( elem_members ) ) + ( elem_members ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key - } - bytes += TableLebBytes( ref_members ) + 1 + TableLebBytes( (uint64_t) ( body_members ) ) + ( body_members ); - } - TableMapRelease( order_members ); - } - if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -template -inline bool CrewsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Crews & value, TableRetain * retain, const TableRetainPath & path ) -{ - { - TableMapCursor order_members = TableMapOrder( ctx, value.members ); // members - if ( !order_members.ok ) { return false; } - if ( order_members.count > 0 ) // an EMPTY map elides, the by-value rule (§3) - { - const uint64_t ref_members = ids.ref( 0x79d594675e391090ull ); - int64_t body_members = 1 + TableLebBytes( (uint64_t) order_members.count ); - for ( int32_t i = 0; i < order_members.count; i++ ) - { - const int64_t elem_members = CrewsMembersEntryMeasureBodyRetain( ctx, numbering, ids, *order_members[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_members < 0 ) { TableMapRelease( order_members ); return false; } - body_members += TableLebBytes( (uint64_t) ( elem_members ) ) + ( elem_members ); - } - w.putleb( ref_members ); w.put8( 14 ); w.putleb( (uint64_t) body_members ); - w.put8( 13 ); w.putleb( (uint64_t) order_members.count ); - for ( int32_t i = 0; i < order_members.count; i++ ) - { - const int64_t elem_len_members = CrewsMembersEntryMeasureBodyRetain( ctx, numbering, ids, *order_members[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_len_members < 0 ) { TableMapRelease( order_members ); return false; } - w.putleb( (uint64_t) elem_len_members ); - if ( !CrewsMembersEntrySaveBodyRetain( ctx, numbering, w, ids, *order_members[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { TableMapRelease( order_members ); return false; } - } - } - TableMapRelease( order_members ); - } - if ( value.after != 0 ) - { - w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after - w.put32( uint32_t( value.after ) ); - } - if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } - return !w.overflow; -} - -template -inline bool CrewsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Crews & value, TableRetain * retain, const TableRetainPath & path ) -{ - if ( !CrewsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } - w.put8( 0 ); // the ZERO REFERENCE that ends the body - return !w.overflow; -} - -inline bool CrewsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Crews & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool CrewsMembersEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, CrewsMembersEntry & value, TableRetain * retain, const TableRetainPath & path ) { - CrewsReset( value ); // prefill declared defaults in place, then overlay + (void) nodes; (void) index_bits; + CrewsMembersEntryReset( value ); // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT - // (docs/SPEC-TABLES.md §6.6): this body is being established, so - // whatever an earlier occurrence of it left is discarded before the - // winning one is read. The discard moves neither counter. + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. TableRetainDiscardBody( retain, path ); for ( ;; ) { - uint64_t field_ref = 0; - if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } - if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE - if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 8 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 8 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.key = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 17 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) + { + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 2 ) { kept = 2; report->clamped++; } else { kept = (int32_t) n; } + const uint64_t walk = n; + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + TableRef scratch; + { + uint64_t node_index_2 = 0; + if ( !r.get( node_index_2, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, ( in_bounds ? value.value[i] : scratch ), node_index_2, 0x52cfa1d198476806ull, report ); // *Item + } + } + value.value_count = kept; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t CrewsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Crews & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { + // members: a kind 14 array of kind 13 elements, ASCENDING (§2.8) + TableMapCursor order_members = TableMapOrder( ctx, value.members ); + if ( !order_members.ok ) { return -1; } // the sort could not run + if ( order_members.count > 0 ) + { + const uint64_t ref_members = ids.ref( 0x79d594675e391090ull ); + int64_t body_members = 1 + TableLebBytes( (uint64_t) order_members.count ); // the element kind byte and the count + for ( int32_t i = 0; i < order_members.count; i++ ) + { + const int64_t elem_members = CrewsMembersEntryMeasureBodyRetain( ctx, numbering, ids, *order_members[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_members < 0 ) { TableMapRelease( order_members ); return -1; } + body_members += TableLebBytes( (uint64_t) ( elem_members ) ) + ( elem_members ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key + } + bytes += TableLebBytes( ref_members ) + 1 + TableLebBytes( (uint64_t) ( body_members ) ) + ( body_members ); + } + TableMapRelease( order_members ); + } + if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +template +inline bool CrewsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Crews & value, TableRetain * retain, const TableRetainPath & path ) +{ + { + TableMapCursor order_members = TableMapOrder( ctx, value.members ); // members + if ( !order_members.ok ) { return false; } + if ( order_members.count > 0 ) // an EMPTY map elides, the by-value rule (§3) + { + const uint64_t ref_members = ids.ref( 0x79d594675e391090ull ); + int64_t body_members = 1 + TableLebBytes( (uint64_t) order_members.count ); + for ( int32_t i = 0; i < order_members.count; i++ ) + { + const int64_t elem_members = CrewsMembersEntryMeasureBodyRetain( ctx, numbering, ids, *order_members[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_members < 0 ) { TableMapRelease( order_members ); return false; } + body_members += TableLebBytes( (uint64_t) ( elem_members ) ) + ( elem_members ); + } + w.putleb( ref_members ); w.put8( 14 ); w.putleb( (uint64_t) body_members ); + w.put8( 13 ); w.putleb( (uint64_t) order_members.count ); + for ( int32_t i = 0; i < order_members.count; i++ ) + { + const int64_t elem_len_members = CrewsMembersEntryMeasureBodyRetain( ctx, numbering, ids, *order_members[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_len_members < 0 ) { TableMapRelease( order_members ); return false; } + w.putleb( (uint64_t) elem_len_members ); + if ( !CrewsMembersEntrySaveBodyRetain( ctx, numbering, w, ids, *order_members[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { TableMapRelease( order_members ); return false; } + } + } + TableMapRelease( order_members ); + } + if ( value.after != 0 ) + { + w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after + w.put32( uint32_t( value.after ) ); + } + if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } + return !w.overflow; +} + +template +inline bool CrewsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Crews & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( !CrewsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } + w.put8( 0 ); // the ZERO REFERENCE that ends the body + return !w.overflow; +} + +inline bool CrewsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Crews & value, TableRetain * retain, const TableRetainPath & path ) +{ + CrewsReset( value ); // prefill declared defaults in place, then overlay + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so + // whatever an earlier occurrence of it left is discarded before the + // winning one is read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t field_ref = 0; + if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } + if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE + if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count const uint64_t field_id = r.ids->at( field_ref ); if ( !r.has( 1 ) ) { r.report->malformed = true; return false; } uint8_t kind = r.get8(); @@ -8810,6 +9363,164 @@ inline bool CrewsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Cr } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool CrewsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Crews & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + CrewsReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x79d594675e391090ull: // members + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.members, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + uint32_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const CrewsMembersEntryMessageKeyRead read = CrewsMembersEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (uint64_t) last_key, (uint64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + CrewsMembersEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !CrewsMembersEntryLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + // CrewsNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it // already owns. // EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the @@ -8983,6 +9694,182 @@ inline const Crews * CrewsLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// CrewsNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool CrewsNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + CrewsNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !CrewsNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + bool ok = false; + switch ( type_id ) + { + case 0x52cfa1d198476806ull: ok = ItemLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(Item *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Item + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// CrewsLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool CrewsLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Crews * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !CrewsMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = CrewsNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + CrewsNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !CrewsMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Crews ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xc85b940060088651ull; + Crews * root = new ( region + used ) Crews; // lifetime only: LoadMessageBody's first act is CrewsReset + CrewsReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Crews ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !CrewsNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return CrewsLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// CrewsLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool CrewsLoadRetainMessages( const Crews ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !CrewsLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // CrewsMeasureRetain and CrewsSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/maps/DocsTable.h b/testdata/golden/tables/maps/DocsTable.h index 56a7837a6..e3e144b53 100644 --- a/testdata/golden/tables/maps/DocsTable.h +++ b/testdata/golden/tables/maps/DocsTable.h @@ -9661,6 +9661,7 @@ inline bool DocsLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabu { uint64_t length = 0; if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( type_id == kTableStringTypeId && !TableUtf8Valid( r.buffer + r.offset / 8, length ) ) { out->malformed = true; return false; } if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } r.offset += (int64_t) length * 8; continue; diff --git a/testdata/golden/tables/maps/PairsTable.h b/testdata/golden/tables/maps/PairsTable.h index b9b102c4d..5afff9b5d 100644 --- a/testdata/golden/tables/maps/PairsTable.h +++ b/testdata/golden/tables/maps/PairsTable.h @@ -4400,6 +4400,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells, and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace mapdemo #endif // MAPDEMO_SCHEMA_TABLE_RETAIN @@ -6237,10 +6669,12 @@ template inline int64_t PairsSlotsEntryMeasureBodyRetain( const C template inline bool PairsSlotsEntrySaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const PairsSlotsEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline bool PairsSlotsEntrySaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const PairsSlotsEntry & value, TableRetain * retain, const TableRetainPath & path ); inline bool PairsSlotsEntryLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, PairsSlotsEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool PairsSlotsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, PairsSlotsEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t PairsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Pairs & value, TableRetain * retain, const TableRetainPath & path ); template inline bool PairsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Pairs & value, TableRetain * retain, const TableRetainPath & path ); template inline bool PairsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Pairs & value, TableRetain * retain, const TableRetainPath & path ); inline bool PairsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Pairs & value, TableRetain * retain, const TableRetainPath & path ); +inline bool PairsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Pairs & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t PairsSlotsEntryMeasureBody( const Ctx & ctx, const TableNumbering & numbering, TableIds & ids, const PairsSlotsEntry & value ) @@ -8583,92 +9017,210 @@ inline bool PairsSlotsEntryLoadBodyRetain( TableReader & r, const TableNodeMap & } } -template -inline int64_t PairsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Pairs & value, TableRetain * retain, const TableRetainPath & path ) -{ - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - { - // slots: a kind 14 array of kind 13 elements, ASCENDING (§2.8) - TableMapCursor order_slots = TableMapOrder( ctx, value.slots ); - if ( !order_slots.ok ) { return -1; } // the sort could not run - if ( order_slots.count > 0 ) - { - const uint64_t ref_slots = ids.ref( 0xe68c2e6bb1ee5646ull ); - int64_t body_slots = 1 + TableLebBytes( (uint64_t) order_slots.count ); // the element kind byte and the count - for ( int32_t i = 0; i < order_slots.count; i++ ) - { - const int64_t elem_slots = PairsSlotsEntryMeasureBodyRetain( ctx, numbering, ids, *order_slots[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_slots < 0 ) { TableMapRelease( order_slots ); return -1; } - body_slots += TableLebBytes( (uint64_t) ( elem_slots ) ) + ( elem_slots ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key - } - bytes += TableLebBytes( ref_slots ) + 1 + TableLebBytes( (uint64_t) ( body_slots ) ) + ( body_slots ); - } - TableMapRelease( order_slots ); - } - if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -template -inline bool PairsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Pairs & value, TableRetain * retain, const TableRetainPath & path ) -{ - { - TableMapCursor order_slots = TableMapOrder( ctx, value.slots ); // slots - if ( !order_slots.ok ) { return false; } - if ( order_slots.count > 0 ) // an EMPTY map elides, the by-value rule (§3) - { - const uint64_t ref_slots = ids.ref( 0xe68c2e6bb1ee5646ull ); - int64_t body_slots = 1 + TableLebBytes( (uint64_t) order_slots.count ); - for ( int32_t i = 0; i < order_slots.count; i++ ) - { - const int64_t elem_slots = PairsSlotsEntryMeasureBodyRetain( ctx, numbering, ids, *order_slots[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_slots < 0 ) { TableMapRelease( order_slots ); return false; } - body_slots += TableLebBytes( (uint64_t) ( elem_slots ) ) + ( elem_slots ); - } - w.putleb( ref_slots ); w.put8( 14 ); w.putleb( (uint64_t) body_slots ); - w.put8( 13 ); w.putleb( (uint64_t) order_slots.count ); - for ( int32_t i = 0; i < order_slots.count; i++ ) - { - const int64_t elem_len_slots = PairsSlotsEntryMeasureBodyRetain( ctx, numbering, ids, *order_slots[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_len_slots < 0 ) { TableMapRelease( order_slots ); return false; } - w.putleb( (uint64_t) elem_len_slots ); - if ( !PairsSlotsEntrySaveBodyRetain( ctx, numbering, w, ids, *order_slots[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { TableMapRelease( order_slots ); return false; } - } - } - TableMapRelease( order_slots ); - } - if ( value.after != 0 ) - { - w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after - w.put32( uint32_t( value.after ) ); - } - if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } - return !w.overflow; -} - -template -inline bool PairsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Pairs & value, TableRetain * retain, const TableRetainPath & path ) -{ - if ( !PairsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } - w.put8( 0 ); // the ZERO REFERENCE that ends the body - return !w.overflow; -} - -inline bool PairsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Pairs & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool PairsSlotsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, PairsSlotsEntry & value, TableRetain * retain, const TableRetainPath & path ) { - PairsReset( value ); // prefill declared defaults in place, then overlay + (void) nodes; (void) index_bits; + PairsSlotsEntryReset( value ); // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT - // (docs/SPEC-TABLES.md §6.6): this body is being established, so - // whatever an earlier occurrence of it left is discarded before the - // winning one is read. The discard moves neither counter. + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. TableRetainDiscardBody( retain, path ); for ( ;; ) { - uint64_t field_ref = 0; - if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } - if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE - if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 8 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 8 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.key = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 17 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = (uint64_t) entry.min; + const int64_t count_bits = TableBitsRequired( entry.min, entry.max ); + if ( count_bits > 0 ) + { + uint64_t raw = 0; + if ( !r.get( raw, count_bits ) ) { report->malformed = true; return false; } + n = raw + (uint64_t) entry.min; + } + if ( entry.elem_kind == 6 && !r.align() ) { report->malformed = true; return false; } + int32_t kept = 0; + if ( n > (uint64_t) 2 ) { kept = 2; report->clamped++; } else { kept = (int32_t) n; } + const uint64_t walk = n; + for ( uint64_t i = 0; i < walk; i++ ) + { + const bool in_bounds = (int32_t) i < kept; + TableRef scratch; + { + uint64_t node_index_2 = 0; + if ( !r.get( node_index_2, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, ( in_bounds ? value.value[i] : scratch ), node_index_2, 0x52cfa1d198476806ull, report ); // *Item + } + } + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t PairsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Pairs & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { + // slots: a kind 14 array of kind 13 elements, ASCENDING (§2.8) + TableMapCursor order_slots = TableMapOrder( ctx, value.slots ); + if ( !order_slots.ok ) { return -1; } // the sort could not run + if ( order_slots.count > 0 ) + { + const uint64_t ref_slots = ids.ref( 0xe68c2e6bb1ee5646ull ); + int64_t body_slots = 1 + TableLebBytes( (uint64_t) order_slots.count ); // the element kind byte and the count + for ( int32_t i = 0; i < order_slots.count; i++ ) + { + const int64_t elem_slots = PairsSlotsEntryMeasureBodyRetain( ctx, numbering, ids, *order_slots[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_slots < 0 ) { TableMapRelease( order_slots ); return -1; } + body_slots += TableLebBytes( (uint64_t) ( elem_slots ) ) + ( elem_slots ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key + } + bytes += TableLebBytes( ref_slots ) + 1 + TableLebBytes( (uint64_t) ( body_slots ) ) + ( body_slots ); + } + TableMapRelease( order_slots ); + } + if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +template +inline bool PairsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Pairs & value, TableRetain * retain, const TableRetainPath & path ) +{ + { + TableMapCursor order_slots = TableMapOrder( ctx, value.slots ); // slots + if ( !order_slots.ok ) { return false; } + if ( order_slots.count > 0 ) // an EMPTY map elides, the by-value rule (§3) + { + const uint64_t ref_slots = ids.ref( 0xe68c2e6bb1ee5646ull ); + int64_t body_slots = 1 + TableLebBytes( (uint64_t) order_slots.count ); + for ( int32_t i = 0; i < order_slots.count; i++ ) + { + const int64_t elem_slots = PairsSlotsEntryMeasureBodyRetain( ctx, numbering, ids, *order_slots[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_slots < 0 ) { TableMapRelease( order_slots ); return false; } + body_slots += TableLebBytes( (uint64_t) ( elem_slots ) ) + ( elem_slots ); + } + w.putleb( ref_slots ); w.put8( 14 ); w.putleb( (uint64_t) body_slots ); + w.put8( 13 ); w.putleb( (uint64_t) order_slots.count ); + for ( int32_t i = 0; i < order_slots.count; i++ ) + { + const int64_t elem_len_slots = PairsSlotsEntryMeasureBodyRetain( ctx, numbering, ids, *order_slots[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_len_slots < 0 ) { TableMapRelease( order_slots ); return false; } + w.putleb( (uint64_t) elem_len_slots ); + if ( !PairsSlotsEntrySaveBodyRetain( ctx, numbering, w, ids, *order_slots[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { TableMapRelease( order_slots ); return false; } + } + } + TableMapRelease( order_slots ); + } + if ( value.after != 0 ) + { + w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after + w.put32( uint32_t( value.after ) ); + } + if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } + return !w.overflow; +} + +template +inline bool PairsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Pairs & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( !PairsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } + w.put8( 0 ); // the ZERO REFERENCE that ends the body + return !w.overflow; +} + +inline bool PairsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Pairs & value, TableRetain * retain, const TableRetainPath & path ) +{ + PairsReset( value ); // prefill declared defaults in place, then overlay + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so + // whatever an earlier occurrence of it left is discarded before the + // winning one is read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t field_ref = 0; + if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } + if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE + if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count const uint64_t field_id = r.ids->at( field_ref ); if ( !r.has( 1 ) ) { r.report->malformed = true; return false; } uint8_t kind = r.get8(); @@ -8816,6 +9368,164 @@ inline bool PairsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Pa } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool PairsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Pairs & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + PairsReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0xe68c2e6bb1ee5646ull: // slots + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.slots, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + uint32_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const PairsSlotsEntryMessageKeyRead read = PairsSlotsEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (uint64_t) last_key, (uint64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + PairsSlotsEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !PairsSlotsEntryLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + // PairsNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it // already owns. // EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the @@ -8989,6 +9699,182 @@ inline const Pairs * PairsLoadRetain( uint8_t * region, int64_t region_bytes, co return root; } +// PairsNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool PairsNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + PairsNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !PairsNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + bool ok = false; + switch ( type_id ) + { + case 0x52cfa1d198476806ull: ok = ItemLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(Item *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Item + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// PairsLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool PairsLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Pairs * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !PairsMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = PairsNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + PairsNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !PairsMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Pairs ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0x1404200dab337086ull; + Pairs * root = new ( region + used ) Pairs; // lifetime only: LoadMessageBody's first act is PairsReset + PairsReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Pairs ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !PairsNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return PairsLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// PairsLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool PairsLoadRetainMessages( const Pairs ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !PairsLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // PairsMeasureRetain and PairsSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save diff --git a/testdata/golden/tables/maps/TrailsTable.h b/testdata/golden/tables/maps/TrailsTable.h index 6ad9b9906..c7a315d5b 100644 --- a/testdata/golden/tables/maps/TrailsTable.h +++ b/testdata/golden/tables/maps/TrailsTable.h @@ -4400,6 +4400,438 @@ inline bool TableNodeTableSaveRetain( const Ctx & ctx, TableWriter & w, TableRet } return true; } + +// ---- RETENTION ON THE MESSAGE FORM (docs/SPEC-TABLES.md §3.3) ---- +// +// LoadRetain reads a form 2 body as it reads a file's, the resolving walk +// replacing every reference with the id it names AGAINST THE CONNECTION'S +// VOCABULARY instead of a trailer, and SaveRetain writing form 2 refuses by +// name. So retention crosses the forms in ONE DIRECTION, and the record a +// message body produces is the FILE FORM'S OWN, to the byte: a retained record +// carries the field's bytes with every reference resolved so that re-emitting +// it into any id table is correct, and the table it is re-emitted into is a +// file's. The capture below is therefore a TRANSCODE as well as a resolve, a +// bitpacked value is read at the width its announced shape states and written +// at the width the file form spells, and from there it is the same record, +// laid down in the same slots and read back by the same emit walk. +// +// THE SKIP RUNS FIRST AND THE CAPTURE SECOND, over the same bits. The plain +// read's verdict on an unknown entry is the SKIP's, whether or not this build +// retains, and running the skip first is what keeps that verdict exactly what +// it was with retention off. The capture re-reads the bits the skip delimited, +// and a capture that lands anywhere but the skip's own end drops the record. It +// is two flat passes over one record's bits and never a walk that doubles at +// every level, which is what the cost rule forbids. + +struct TableMessageRetainIn +{ + TableRetainIn out; // its in/size/at/ids are unused: the input is BITS + TableBitReader * r; + const TableVocabulary * vocabulary; + int64_t index_bits; +}; + +// THE ELEMENT'S OWN ENTRY, which a resolved entry carries flattened beside its +// own: an array's and a keyed body's elements are read through it. +inline TableMessageEntry TableMessageRetainElement( const TableMessageEntry & entry ) +{ + TableMessageEntry e; + e.kind = entry.elem_kind; + e.packing = entry.elem_packing; + e.value_bits = entry.elem_value_bits; + e.max = entry.elem_max; + e.base_lo = entry.elem_base_lo; + e.base_hi = entry.elem_base_hi; + e.qmin = entry.elem_qmin; + e.qdelta = entry.elem_qdelta; + e.qcount = entry.elem_qcount; + return e; +} + +// the kinds whose file bytes are TWO'S COMPLEMENT, which is what decides +// whether a narrow raw value sign-extends into its storage width +inline bool TableMessageRetainSigned( uint8_t kind ) +{ + switch ( kind ) + { + case 2: case 3: case 4: case 5: case 18: + case 20: case 21: case 22: case 23: case 24: return true; + default: return false; + } +} + +inline int64_t TableMessageRetainWidth( uint8_t kind ) +{ + switch ( kind ) + { + case 1: case 2: case 6: case 20: case 25: return 1; + case 3: case 7: case 21: case 26: return 2; + case 4: case 8: case 10: case 22: case 27: return 4; + case 5: case 9: case 11: case 23: case 28: return 8; + case 18: case 19: case 24: case 29: return 16; + default: return -1; + } +} + +// one integer at the FILE's own width for its kind, little endian +inline void TableMessageRetainWord( TableMessageRetainIn & s, uint64_t value, int64_t width ) +{ + uint8_t b[8]; + for ( int64_t i = 0; i < width; i++ ) { b[i] = uint8_t( value >> ( 8 * i ) ); } + TableRetainInRaw( s.out, b, width ); +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ); + +// ONE REFERENCE resolved against the announced vocabulary. It is the file +// walk's own verdict read against an announcement instead of a trailer: a +// reference of zero where an entry is required, one above the entry count, and +// one naming a RESERVED id, which would be re-emitted into a nested body where +// it is malformed, all DROP THE RECORD. +inline bool TableMessageRetainId( TableMessageRetainIn & s, uint64_t ref, uint64_t & id ) +{ + if ( ref == 0 || ref > (uint64_t) s.vocabulary->count ) { return false; } + const TableMessageEntry & named = TableVocabularyEntryAt( *s.vocabulary, ref ); + if ( named.id == 0 || TableRetainReservedId( named.id ) ) { return false; } + id = named.id; + return true; +} + +inline bool TableMessageRetainRef( TableMessageRetainIn & s, uint64_t & id ) +{ + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return false; } + return TableMessageRetainId( s, ref, id ); +} + +// ONE OPAQUE PAYLOAD's bytes: a string or a byte buffer is a length at its own +// width, the ALIGN that buys a memcpy and the bytes; a wide string is a length +// and then SIXTEEN bits a code unit, which is two file bytes each; and the +// ESCAPE aligns, reads a thirty-two bit L and takes L bytes. On the file each +// is the same bytes behind a canonical LEB128 length, so the framed flag says which of +// the two spellings this position takes. +inline bool TableMessageRetainOpaque( TableMessageRetainIn & s, const TableMessageEntry & entry, bool framed ) +{ + uint64_t n = 0; + if ( entry.kind == 12 || entry.kind == 33 ) + { + if ( !s.r->get( n, TableBitsRequired( 0, entry.max ) ) ) { return false; } + if ( entry.kind == 33 ) { n *= 2; } + else if ( !s.r->align() ) { return false; } + } + else + { + if ( !s.r->align() || !s.r->get( n, 32 ) ) { return false; } + } + if ( n > (uint64_t) INT32_MAX || !s.r->has( (int64_t) n * 8 ) ) { return false; } + if ( framed ) { TableRetainInLeb( s.out, n ); } + for ( uint64_t i = 0; i < n; i++ ) + { + uint64_t by = 0; + if ( !s.r->get( by, 8 ) ) { return false; } + const uint8_t one = uint8_t( by ); + TableRetainInRaw( s.out, &one, 1 ); + } + return true; +} + +// ONE ANNOUNCED VALUE, transcoded. NO CLAMP FIRES AND NO RANGE IS APPLIED: the +// value is the SENDER's, under an id this reader cannot name, so there is no +// declaration to bound it by, and the walk takes no branch on a payload byte +// (§6.6, THE SECURITY BOUND). +inline bool TableMessageRetainScalar( TableMessageRetainIn & s, const TableMessageEntry & entry ) +{ + const int64_t width = TableMessageRetainWidth( entry.kind ); + if ( width < 0 ) { return false; } + if ( entry.kind == 1 ) + { + uint64_t v = 0; + if ( !s.r->get( v, 1 ) ) { return false; } + TableMessageRetainWord( s, v, 1 ); + return true; + } + if ( entry.kind == 10 ) + { + if ( entry.packing == 2 ) + { + // THE PACKET WIRE'S RULE, IN FLOAT32: the float an index names is + // the float a packet's reader names for it, and an index above + // the announced count is rejected rather than reconstructed (SPEC.md §4.3) + uint64_t index = 0; + if ( !s.r->get( index, entry.value_bits ) ) { return false; } + if ( index > (uint64_t) entry.qcount ) { return false; } + const float v = TableMessageDequantize( (uint32_t) index, entry.qmin, entry.qdelta, entry.qcount ); + TableMessageRetainWord( s, table_float_to_bits( v ), 4 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, 32 ) ) { return false; } + TableMessageRetainWord( s, raw, 4 ); + return true; + } + if ( entry.kind == 11 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, 64 ) ) { return false; } + TableMessageRetainWord( s, raw, 8 ); + return true; + } + const int64_t bits = entry.value_bits; + if ( bits < 0 ) { return false; } + if ( width == 16 ) + { + // a 128-bit kind reads in TWO LIMBS, and a ranged one adds the base the + // announcement carries in halves + uint64_t lo = 0, hi = 0; + if ( bits <= 64 ) + { + if ( !s.r->get( lo, bits ) ) { return false; } + } + else if ( !s.r->get( lo, 64 ) || !s.r->get( hi, bits - 64 ) ) { return false; } + if ( entry.packing == 1 ) + { + const uint64_t sum = lo + (uint64_t) entry.base_lo; + hi += (uint64_t) entry.base_hi + ( sum < lo ? 1u : 0u ); + lo = sum; + } + TableMessageRetainWord( s, lo, 8 ); + TableMessageRetainWord( s, hi, 8 ); + return true; + } + uint64_t raw = 0; + if ( !s.r->get( raw, bits ) ) { return false; } + uint64_t value = raw; + if ( entry.packing == 1 ) + { + value = raw + (uint64_t) entry.base_lo; // the domain, whole: the sum wraps into the bits below + } + else if ( TableMessageRetainSigned( entry.kind ) && bits > 0 && bits < 64 ) + { + const int64_t shift = 64 - bits; + value = (uint64_t) ( ( (int64_t) ( raw << shift ) ) >> shift ); + } + TableMessageRetainWord( s, value, width ); + return true; +} + +// one framed CONTENT: the slot, the content, and the slot filled in behind it, +// exactly as the file capture's own framed content is. +inline int64_t TableMessageRetainFramed( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t slot = TableRetainInSlot( s.out ); + const int64_t resolved = TableMessageRetainContent( s, entry, depth ); + if ( resolved < 0 || resolved > 0xFFFFFFFFll ) { return -1; } + TableRetainInPatch( s.out, slot, resolved ); + return resolved; +} + +// one nested BODY: its fields, each an entry reference and the payload that +// entry's shape frames, ending at the body's own ZERO REFERENCE. +inline int64_t TableMessageRetainBody( TableMessageRetainIn & s, int32_t depth ) +{ + for ( ;; ) + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // THE TERMINATOR IS A REFERENCE, and a reference in the resolved + // form is a fixed eight-byte id + TableRetainInId( s.out, 0 ); + return 0; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + const TableMessageEntry & field = TableVocabularyEntryAt( *s.vocabulary, ref ); + TableRetainInId( s.out, id ); + TableRetainInRaw( s.out, &field.kind, 1 ); + if ( TableMessageRetainPayload( s, field, depth ) < 0 ) { return -1; } + } +} + +// one array's or one keyed body's content: the element kind, the count, and the +// elements. A KEYED SLOT IS A TRIPLE, the key reference, the element's own +// length, and the element, and its keys resolve at EVERY element kind. +inline int64_t TableMessageRetainElements( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( entry.elem_kind == 17 ) + { + // AN ARRAY WHOSE ELEMENT KIND IS 17 (§6.6): the excluded class, caught + // here for a keyed body exactly as for a positional one + return -1; + } + uint64_t n = (uint64_t) entry.min; + const int64_t width = entry.kind == 16 ? TableBitsRequired( 0, entry.max ) : TableBitsRequired( entry.min, entry.max ); + if ( entry.kind == 16 ) { n = 0; } + if ( width > 0 ) + { + uint64_t raw = 0; + if ( !s.r->get( raw, width ) ) { return -1; } + n = entry.kind == 16 ? raw : raw + (uint64_t) entry.min; + } + if ( entry.kind == 14 && entry.elem_kind == 6 && !s.r->align() ) { return -1; } + const TableMessageEntry element = TableMessageRetainElement( entry ); + TableRetainInRaw( s.out, &entry.elem_kind, 1 ); + TableRetainInLeb( s.out, n ); // the count rides as the file capture spells it, and the emit reads it back + for ( uint64_t i = 0; i < n; i++ ) + { + if ( entry.kind == 16 ) + { + uint64_t key = 0; + if ( !TableMessageRetainRef( s, key ) ) { return -1; } + TableRetainInId( s.out, key ); + if ( TableMessageRetainFramed( s, element, depth ) < 0 ) { return -1; } + continue; + } + if ( TableMessageRetainPayload( s, element, depth ) < 0 ) { return -1; } + } + return 0; +} + +inline int64_t TableMessageRetainContent( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + if ( depth > kTableRetainWalkDepthMax ) { return -1; } + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // A NODE INDEX ANYWHERE DROPS THE WHOLE RECORD (§6.6) + case 13: if ( TableMessageRetainBody( s, depth ) < 0 ) { return -1; } break; + case 14: case 16: if ( TableMessageRetainElements( s, entry, depth ) < 0 ) { return -1; } break; + case 15: case 30: if ( TableMessageRetainPayload( s, entry, depth ) < 0 ) { return -1; } break; + case 32: break; // nothing rides, and the outer length is what says so + case 12: case 31: case 33: + // a content copied whole carries no inner length: the outer one + // frames it, which is what a keyed slot's element takes + if ( !TableMessageRetainOpaque( s, entry, false ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +inline int64_t TableMessageRetainPayload( TableMessageRetainIn & s, const TableMessageEntry & entry, int32_t depth ) +{ + const int64_t began = s.out.out_at; + switch ( entry.kind ) + { + case 17: return -1; // THE NODE-INDEX CLASS, met inside a payload (§6.6) + case 0: return -1; // a KIND-0 ENTRY names no payload the file form has a kind for + case 32: TableRetainInLeb( s.out, 0 ); break; + case 30: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) + { + // A VARIANT REFERENCE OF ZERO IS THE ENUM'S None (§3): a value, + // not a reference, and it rides back as one + TableRetainInId( s.out, 0 ); + break; + } + uint64_t id = 0; + if ( !TableMessageRetainId( s, ref, id ) ) { return -1; } + TableRetainInId( s.out, id ); + break; + } + case 15: + { + uint64_t ref = 0; + if ( !s.r->get( ref, s.vocabulary->ref_bits ) ) { return -1; } + if ( ref == 0 ) { TableRetainInId( s.out, 0 ); break; } + TableMessageEntry arm; + if ( !TableMessageArmEntry( *s.vocabulary, ref, arm ) || TableRetainReservedId( arm.id ) ) { return -1; } + TableRetainInId( s.out, arm.id ); + TableRetainInRaw( s.out, &arm.kind, 1 ); + if ( TableMessageRetainFramed( s, arm, depth ) < 0 ) { return -1; } + break; + } + case 13: case 14: case 16: + if ( TableMessageRetainFramed( s, entry, depth ) < 0 ) { return -1; } + break; + case 12: case 31: case 33: + if ( !TableMessageRetainOpaque( s, entry, true ) ) { return -1; } + break; + default: + if ( !TableMessageRetainScalar( s, entry ) ) { return -1; } + break; + } + return s.out.out_at - began; +} + +// CAPTURE, the message form's load side. The entry has already been SKIPPED and +// counted unknown exactly as it always was, and the start offset is where its payload +// began: this re-reads those bits, and a record it cannot make changes nothing +// else about the read. +inline void TableMessageRetainCapture( TableRetain * retain, TableBitReader & r, const TableVocabulary & vocabulary, + int64_t index_bits, const TableMessageEntry & entry, + const TableRetainPath & path, TableReport * report, int64_t start ) +{ + if ( retain == NULL ) { return; } + if ( entry.kind == 17 ) + { + // A FIELD WHOSE PAYLOAD CARRIES A NODE INDEX: kind 17 itself, the + // excluded class at the outer kind (§6.6) + report->retain_lost++; + return; + } + const int64_t end = r.offset; + TableBitReader walk = r; + walk.offset = start; + + TableMessageRetainIn probe; + probe.out.in = NULL; + probe.out.size = 0; + probe.out.at = 0; + probe.out.ids = NULL; + probe.out.out = NULL; + probe.out.out_at = 0; + probe.r = &walk; + probe.vocabulary = &vocabulary; + probe.index_bits = index_bits; + const int64_t payload = TableMessageRetainPayload( probe, entry, 0 ); + if ( payload < 0 || walk.offset != end ) + { + // THE WALK CAN MEET WHAT THE SKIP STEPPED OVER, and its verdict changes + // nothing else: the record is dropped, one retain_lost counts, and + // malformed DOES NOT MOVE (§6.6). + report->retain_lost++; + return; + } + + const int64_t need = kTableRetainRecordHeader + 8 * (int64_t) path.depth + payload; + if ( need > 0xFFFFFFFFll || retain->used + need > retain->capacity ) + { + // REFUSAL IS PER RECORD AND NEVER PARTIAL (§6.6) + report->retain_lost++; + return; + } + uint8_t * record = retain->bytes + retain->used; + TableRetainWrite32( record, (uint32_t) need ); + TableRetainWrite32( record + 4, path.node ); + TableRetainWrite32( record + 8, (uint32_t) path.depth ); + TableRetainWrite32( record + 12, (uint32_t) payload ); + TableRetainWrite64( record + 16, entry.id ); + record[24] = entry.kind; + record[25] = 0; + for ( int32_t i = 0; i < path.depth; i++ ) + { + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i, path.steps[i].ordinal ); + TableRetainWrite32( record + kTableRetainRecordHeader + 8 * i + 4, path.steps[i].index ); + } + TableBitReader again = r; + again.offset = start; + TableMessageRetainIn write = probe; + write.r = &again; + write.out.out = record + kTableRetainRecordHeader + 8 * (int64_t) path.depth; + write.out.out_at = 0; + if ( TableMessageRetainPayload( write, entry, 0 ) < 0 ) { report->retain_lost++; return; } + retain->used += need; + retain->count++; + report->retained++; +} } // namespace mapdemo #endif // MAPDEMO_SCHEMA_TABLE_RETAIN @@ -6239,10 +6671,12 @@ template inline int64_t TrailsStepsEntryMeasureBodyRetain( const template inline bool TrailsStepsEntrySaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const TrailsStepsEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline bool TrailsStepsEntrySaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const TrailsStepsEntry & value, TableRetain * retain, const TableRetainPath & path ); inline bool TrailsStepsEntryLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, TrailsStepsEntry & value, TableRetain * retain, const TableRetainPath & path ); +inline bool TrailsStepsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, TrailsStepsEntry & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t TrailsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Trails & value, TableRetain * retain, const TableRetainPath & path ); template inline bool TrailsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Trails & value, TableRetain * retain, const TableRetainPath & path ); template inline bool TrailsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Trails & value, TableRetain * retain, const TableRetainPath & path ); inline bool TrailsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Trails & value, TableRetain * retain, const TableRetainPath & path ); +inline bool TrailsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Trails & value, TableRetain * retain, const TableRetainPath & path ); template inline int64_t TrailsStepsEntryMeasureBody( const Ctx & ctx, const TableNumbering & numbering, TableIds & ids, const TrailsStepsEntry & value ) @@ -8717,92 +9151,205 @@ inline bool TrailsStepsEntryLoadBodyRetain( TableReader & r, const TableNodeMap } } -template -inline int64_t TrailsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Trails & value, TableRetain * retain, const TableRetainPath & path ) -{ - int64_t bytes = 1; // the ZERO REFERENCE that ends the body - { - // steps: a kind 14 array of kind 13 elements, ASCENDING (§2.8) - TableMapCursor order_steps = TableMapOrder( ctx, value.steps ); - if ( !order_steps.ok ) { return -1; } // the sort could not run - if ( order_steps.count > 0 ) - { - const uint64_t ref_steps = ids.ref( 0x124250ad5a5b6d14ull ); - int64_t body_steps = 1 + TableLebBytes( (uint64_t) order_steps.count ); // the element kind byte and the count - for ( int32_t i = 0; i < order_steps.count; i++ ) - { - const int64_t elem_steps = TrailsStepsEntryMeasureBodyRetain( ctx, numbering, ids, *order_steps[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_steps < 0 ) { TableMapRelease( order_steps ); return -1; } - body_steps += TableLebBytes( (uint64_t) ( elem_steps ) ) + ( elem_steps ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key - } - bytes += TableLebBytes( ref_steps ) + 1 + TableLebBytes( (uint64_t) ( body_steps ) ) + ( body_steps ); - } - TableMapRelease( order_steps ); - } - if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after - bytes += TableRetainTailMeasure( retain, ids, path ); - return bytes; -} - -template -inline bool TrailsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Trails & value, TableRetain * retain, const TableRetainPath & path ) -{ - { - TableMapCursor order_steps = TableMapOrder( ctx, value.steps ); // steps - if ( !order_steps.ok ) { return false; } - if ( order_steps.count > 0 ) // an EMPTY map elides, the by-value rule (§3) - { - const uint64_t ref_steps = ids.ref( 0x124250ad5a5b6d14ull ); - int64_t body_steps = 1 + TableLebBytes( (uint64_t) order_steps.count ); - for ( int32_t i = 0; i < order_steps.count; i++ ) - { - const int64_t elem_steps = TrailsStepsEntryMeasureBodyRetain( ctx, numbering, ids, *order_steps[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_steps < 0 ) { TableMapRelease( order_steps ); return false; } - body_steps += TableLebBytes( (uint64_t) ( elem_steps ) ) + ( elem_steps ); - } - w.putleb( ref_steps ); w.put8( 14 ); w.putleb( (uint64_t) body_steps ); - w.put8( 13 ); w.putleb( (uint64_t) order_steps.count ); - for ( int32_t i = 0; i < order_steps.count; i++ ) - { - const int64_t elem_len_steps = TrailsStepsEntryMeasureBodyRetain( ctx, numbering, ids, *order_steps[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); - if ( elem_len_steps < 0 ) { TableMapRelease( order_steps ); return false; } - w.putleb( (uint64_t) elem_len_steps ); - if ( !TrailsStepsEntrySaveBodyRetain( ctx, numbering, w, ids, *order_steps[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { TableMapRelease( order_steps ); return false; } - } - } - TableMapRelease( order_steps ); - } - if ( value.after != 0 ) - { - w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after - w.put32( uint32_t( value.after ) ); - } - if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } - return !w.overflow; -} - -template -inline bool TrailsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Trails & value, TableRetain * retain, const TableRetainPath & path ) -{ - if ( !TrailsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } - w.put8( 0 ); // the ZERO REFERENCE that ends the body - return !w.overflow; -} - -inline bool TrailsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Trails & value, TableRetain * retain, const TableRetainPath & path ) +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool TrailsStepsEntryLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, TrailsStepsEntry & value, TableRetain * retain, const TableRetainPath & path ) { - TrailsReset( value ); // prefill declared defaults in place, then overlay + (void) nodes; (void) index_bits; + TrailsStepsEntryReset( value ); // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT - // (docs/SPEC-TABLES.md §6.6): this body is being established, so - // whatever an earlier occurrence of it left is discarded before the - // winning one is read. The discard moves neither counter. + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. TableRetainDiscardBody( retain, path ); for ( ;; ) { - uint64_t field_ref = 0; - if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } - if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE - if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x3dc94a19365b10ecull: // key + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 8 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 8 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.key = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + if ( (uint64_t) decoded_wide > 4294967295ull ) { decoded_wide = (int64_t) 4294967295ull; report->clamped++; } + uint32_t decoded_v = (uint32_t) decoded_wide; + value.key = decoded_v; + } + break; + } + case 0x7ce4fd9430e80ceaull: // value + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 17 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t n = 0; + if ( !r.get( n, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + n += (uint64_t) entry.min; + TableListFill fill = TableListFillBegin( nodes, value.value, n ); + if ( fill.refused ) { nodes.refused = true; return false; } + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + for ( uint64_t i = 0; i < n; i++ ) + { + TableRef * slot = TableListFillNext( fill ); + if ( slot == NULL ) { report->malformed = true; return false; } // the arena could not carve + { + uint64_t node_index_2 = 0; + if ( !r.get( node_index_2, index_bits ) ) { report->malformed = true; return false; } + TableNodeResolve( nodes, ( *slot ), node_index_2, 0x52cfa1d198476806ull, report ); // *Item + } + } + TableListFillEnd( fill ); + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + +template +inline int64_t TrailsMeasureBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableRetainIds & ids, const Trails & value, TableRetain * retain, const TableRetainPath & path ) +{ + int64_t bytes = 1; // the ZERO REFERENCE that ends the body + { + // steps: a kind 14 array of kind 13 elements, ASCENDING (§2.8) + TableMapCursor order_steps = TableMapOrder( ctx, value.steps ); + if ( !order_steps.ok ) { return -1; } // the sort could not run + if ( order_steps.count > 0 ) + { + const uint64_t ref_steps = ids.ref( 0x124250ad5a5b6d14ull ); + int64_t body_steps = 1 + TableLebBytes( (uint64_t) order_steps.count ); // the element kind byte and the count + for ( int32_t i = 0; i < order_steps.count; i++ ) + { + const int64_t elem_steps = TrailsStepsEntryMeasureBodyRetain( ctx, numbering, ids, *order_steps[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_steps < 0 ) { TableMapRelease( order_steps ); return -1; } + body_steps += TableLebBytes( (uint64_t) ( elem_steps ) ) + ( elem_steps ); // BUT THE ENTRY ALWAYS RIDES: identity here is the key + } + bytes += TableLebBytes( ref_steps ) + 1 + TableLebBytes( (uint64_t) ( body_steps ) ) + ( body_steps ); + } + TableMapRelease( order_steps ); + } + if ( value.after != 0 ) { bytes += TableLebBytes( ids.ref( 0xbf82010f6f71eae9ull ) ) + 1 + 4; } // after + bytes += TableRetainTailMeasure( retain, ids, path ); + return bytes; +} + +template +inline bool TrailsSaveBodyFieldsRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Trails & value, TableRetain * retain, const TableRetainPath & path ) +{ + { + TableMapCursor order_steps = TableMapOrder( ctx, value.steps ); // steps + if ( !order_steps.ok ) { return false; } + if ( order_steps.count > 0 ) // an EMPTY map elides, the by-value rule (§3) + { + const uint64_t ref_steps = ids.ref( 0x124250ad5a5b6d14ull ); + int64_t body_steps = 1 + TableLebBytes( (uint64_t) order_steps.count ); + for ( int32_t i = 0; i < order_steps.count; i++ ) + { + const int64_t elem_steps = TrailsStepsEntryMeasureBodyRetain( ctx, numbering, ids, *order_steps[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_steps < 0 ) { TableMapRelease( order_steps ); return false; } + body_steps += TableLebBytes( (uint64_t) ( elem_steps ) ) + ( elem_steps ); + } + w.putleb( ref_steps ); w.put8( 14 ); w.putleb( (uint64_t) body_steps ); + w.put8( 13 ); w.putleb( (uint64_t) order_steps.count ); + for ( int32_t i = 0; i < order_steps.count; i++ ) + { + const int64_t elem_len_steps = TrailsStepsEntryMeasureBodyRetain( ctx, numbering, ids, *order_steps[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ); + if ( elem_len_steps < 0 ) { TableMapRelease( order_steps ); return false; } + w.putleb( (uint64_t) elem_len_steps ); + if ( !TrailsStepsEntrySaveBodyRetain( ctx, numbering, w, ids, *order_steps[i], retain, TableRetainStepInto( path, 0, (uint32_t) ( i ) ) ) ) { TableMapRelease( order_steps ); return false; } + } + } + TableMapRelease( order_steps ); + } + if ( value.after != 0 ) + { + w.putleb( ids.ref( 0xbf82010f6f71eae9ull ) ); w.put8( 4 ); // after + w.put32( uint32_t( value.after ) ); + } + if ( !TableRetainTailSave( retain, ids, w, path ) ) { return false; } + return !w.overflow; +} + +template +inline bool TrailsSaveBodyRetain( const Ctx & ctx, const TableNumbering & numbering, TableWriter & w, TableRetainIds & ids, const Trails & value, TableRetain * retain, const TableRetainPath & path ) +{ + if ( !TrailsSaveBodyFieldsRetain( ctx, numbering, w, ids, value, retain, path ) ) { return false; } + w.put8( 0 ); // the ZERO REFERENCE that ends the body + return !w.overflow; +} + +inline bool TrailsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, Trails & value, TableRetain * retain, const TableRetainPath & path ) +{ + TrailsReset( value ); // prefill declared defaults in place, then overlay + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so + // whatever an earlier occurrence of it left is discarded before the + // winning one is read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t field_ref = 0; + if ( !r.getleb( field_ref ) ) { r.report->malformed = true; return false; } + if ( field_ref == 0 ) return true; // the body ENDS AT ITS OWN ZERO REFERENCE + if ( r.ids == NULL || field_ref > (uint64_t) r.ids->count ) { r.report->malformed = true; return false; } // a reference ABOVE the entry count const uint64_t field_id = r.ids->at( field_ref ); if ( !r.has( 1 ) ) { r.report->malformed = true; return false; } uint8_t kind = r.get8(); @@ -8950,6 +9497,164 @@ inline bool TrailsLoadBodyRetain( TableReader & r, const TableNodeMap & nodes, T } } +// The BITPACKED body's read (docs/SPEC-TABLES.md §3.3): the declared +// defaults first, then whatever the wire says, field by field. An entry this +// build cannot name is skipped by its SHAPE and counted; one whose kind is +// not this field's is a kind mismatch and skipped the same way. +// UNDER RETENTION the same body keeps the fields this build cannot name, +// resolved against the CONNECTION'S VOCABULARY instead of a trailer, with the +// path threaded at every child-body descent (docs/SPEC-TABLES.md §3.3, §6.6). +// The reader's own data is exactly what it would have been with retention off. +inline bool TrailsLoadMessageBodyRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, Trails & value, TableRetain * retain, const TableRetainPath & path ) +{ + (void) nodes; (void) index_bits; + TrailsReset( value ); + // A RETAINED RECORD DIES WITH THE BODY OCCURRENCE THAT CARRIED IT + // (docs/SPEC-TABLES.md §6.6): this body is being established, so whatever + // an earlier occurrence of it left is discarded before the winning one is + // read. The discard moves neither counter. + TableRetainDiscardBody( retain, path ); + for ( ;; ) + { + uint64_t ref = 0; + if ( !r.get( ref, vocabulary.ref_bits ) ) { report->malformed = true; return false; } + if ( ref == 0 ) { return true; } // the body ENDS AT ITS OWN ZERO REFERENCE + if ( ref > (uint64_t) vocabulary.count ) { report->malformed = true; return false; } + const TableMessageEntry & entry = TableVocabularyEntryAt( vocabulary, ref ); + // A RESERVED ID IN ANY BODY BUT THE ONE WHOSE TRANSPORT IT IS, IS + // MALFORMED (§3.1, §3.3): the node table is the ROOT body's first + // field and is read before this walk begins, so meeting one here is + // a second numbering wherever it sits + if ( TableMessageReserved( entry.id ) ) { report->malformed = true; return false; } + switch ( entry.id ) + { + case 0x124250ad5a5b6d14ull: // steps + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 14 || entry.elem_kind != 13 ) + { + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + uint64_t count = 0; + if ( !r.get( count, TableBitsRequired( entry.min, entry.max ) ) ) { report->malformed = true; return false; } + count += (uint64_t) entry.min; + // THE READ COMMITS TO REPLACE HERE (docs/SPEC-TABLES.md §6.6): the + // records under this field go with the value it is about to lose. + TableRetainDiscardField( retain, path, 0 ); + TableMapFill fill = TableMapFillBegin( nodes, value.steps, (uint32_t) count ); + if ( !fill.ok ) { report->malformed = true; return false; } // the measure and the load disagree + uint32_t last_key = 0; + bool landed = false; + bool map_widened = false; + for ( uint64_t i = 0; i < count; i++ ) + { + const TrailsStepsEntryMessageKeyRead read = TrailsStepsEntryMessageReadKey( r, vocabulary, index_bits ); + if ( read.malformed ) { report->malformed = true; return false; } + // A KEY KIND THE DECLARATION WIDENS: the map counts ONE widened (§2.8, §4) + if ( read.widened && !map_widened ) { map_widened = true; report->widened++; } + if ( read.kind_bad ) + { + // A MAP WITH HALF ITS KEYS IS NOT A MAP (§2.8): the map resets to + // EMPTY, ONE kind_mismatch is counted for it, and the rest of its + // entries are stepped over by their shapes + report->kind_mismatch++; + TableMapFillReset( fill ); + r.offset = read.end; + for ( uint64_t j = i + 1; j < count; j++ ) { if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { report->malformed = true; return false; } } + break; + } + if ( read.over ) { report->clamped++; r.offset = read.end; continue; } // dropped whole, one count per entry + const int order = landed ? TableKeyOrder( (uint64_t) last_key, (uint64_t) read.key ) : -1; + if ( order > 0 ) { report->malformed = true; return false; } // DESCENDING: not a body any conforming writer produced + TrailsStepsEntry * slot = NULL; + if ( order == 0 ) + { + // EQUAL: a DUPLICATE. The slot that entry took is reset by the + // decode below, so LAST WINS WHOLE, and the count excludes it. + slot = TableMapFillLast( fill ); + report->duplicate++; + } + else + { + slot = TableMapFillNext( fill ); // ASCENDING: the next slot + } + if ( slot == NULL ) { report->malformed = true; return false; } + if ( !TrailsStepsEntryLoadMessageBodyRetain( r, vocabulary, report, nodes, index_bits, *slot, retain, TableRetainStepInto( path, 0, (uint32_t) ( fill.map->count - 1 ) ) ) ) { return false; } + if ( r.offset != read.end ) { report->malformed = true; return false; } // the scan and the decode disagree about where the entry ends + last_key = read.key; // the WIRE keys of the entries that LAND + landed = true; + } + TableMapFillEnd( fill ); + } + break; + } + case 0xbf82010f6f71eae9ull: // after + { + // THE KIND MISMATCH IS FOUND IN THE ANNOUNCEMENT, not on the body. + // A RANGE that moved is not one: the shapes differ and the entry + // carries the SENDER's, so the field decodes and clamps (§4). + if ( entry.kind != 4 || entry.elem_kind != 0 ) + { + if ( entry.elem_kind == 0 && TableKindWidens( entry.kind, 4 ) ) + { + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + report->widened++; + break; + } + report->kind_mismatch++; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + break; + } + { + const int64_t width = entry.value_bits; + uint64_t raw = 0; + if ( width < 0 || !r.get( raw, width ) ) { report->malformed = true; return false; } + int64_t decoded_wide = (int64_t) raw; + if ( entry.packing == 1 ) { decoded_wide = (int64_t) ( raw + (uint64_t) entry.base_lo ); } + else if ( width > 0 && width < 64 ) + { + const uint64_t sign = uint64_t(1) << ( width - 1 ); + if ( ( raw & sign ) != 0 ) { decoded_wide = (int64_t) ( raw | ~( ( uint64_t(1) << width ) - 1 ) ); } + } + if ( decoded_wide < -2147483648ll ) { decoded_wide = -2147483648ll; report->clamped++; } + if ( decoded_wide > 2147483647ll ) { decoded_wide = 2147483647ll; report->clamped++; } + int32_t decoded_v = (int32_t) decoded_wide; + value.after = decoded_v; + } + break; + } + default: + report->unknown++; + { + const int64_t unknown_at = r.offset; + if ( !TableMessageSkip( r, vocabulary, index_bits, entry ) ) { report->malformed = true; return false; } + TableMessageRetainCapture( retain, r, vocabulary, index_bits, entry, path, report, unknown_at ); + } + break; + } + } +} + // TrailsNodeBodyRetain: PASS TWO's half — decode one record's body into the storage it // already owns. // EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the @@ -9123,6 +9828,182 @@ inline const Trails * TrailsLoadRetain( uint8_t * region, int64_t region_bytes, return root; } +// TrailsNodeMessageBodyRetain: PASS TWO's half, which decodes one record's body into +// storage it already owns, its map entries carved from its own extent. +// EACH NODE BODY IS A PATH ROOT of its own (docs/SPEC-TABLES.md §6.6): the +// index is this body's own directory position, which the batch's load fills +// from the framing and nothing afterwards renumbers. +inline bool TrailsNodeMessageBodyRetain( uint64_t type_id, TableBitReader & r, const TableVocabulary & vocabulary, TableReport * report, const TableNodeMap & nodes, int64_t index_bits, uint8_t * at, TableRetain * retain, uint32_t node ) +{ + TableExtentCarve carve; + carve.at = at + TrailsNodeRecordBytes( type_id ); + carve.left = 0; + { + // the extent this record was placed with, re-read from the framing + TableBitReader walk = r; + int64_t extent = 0; + if ( !TrailsNodeMessageExtent( type_id, walk, vocabulary, index_bits, extent ) ) { report->malformed = true; return false; } + carve.left = extent; + } + TableExtentCarve * const outer = nodes.carve; + nodes.carve = &carve; + (void) nodes; (void) index_bits; // every node this root can name is a FIXED table + bool ok = false; + switch ( type_id ) + { + case 0x52cfa1d198476806ull: ok = ItemLoadMessageBodyRetain( r, vocabulary, report, index_bits, *(Item *) at, retain, TableRetainPathRoot( (const void *) at, node ) ); break; // Item + // a record this dispatch cannot name never reaches here: pass one left it absent + default: report->malformed = true; break; + } + nodes.carve = outer; + return ok; +} + +// TrailsLoadMessageBodyIntoRetain: one body of a batch into the region at `used`. Its +// chunk is the node DIRECTORY, then the records in wire order, then the root +// and the extent its maps take, so every offset a pass needs is known when +// the pass reaches it. PASS ONE fills the numbering from the framing and +// places every node; PASS TWO decodes each record's body into the storage it +// owns; the ROOT's own body decodes last, so every index it carries resolves +// against a numbering already known whole. +// UNDER RETENTION the body's own retention buffer is reset here and belongs +// to it from here on: a batch takes ONE REGION and ONE BUFFER A BODY, because +// each body carries its own node directory inside that one region and a +// record's first step is an index into it (docs/SPEC-TABLES.md §3.3, §6.6). +inline bool TrailsLoadMessageBodyIntoRetain( TableBitReader & r, const TableVocabulary & vocabulary, TableReport * out, uint8_t * region, int64_t region_bytes, int64_t & used, const Trails * & root_out, TableRetain * retain ) +{ + // the node table opens the body, or the body has none + int64_t count = 0; + if ( !TableMessageNodeTableOpen( r, vocabulary, count ) ) { out->malformed = true; return false; } + const int64_t directory_bytes = ( count + 1 ) * (int64_t) sizeof( TableNodeDirEntry ); + if ( used + directory_bytes > region_bytes ) { out->malformed = true; return false; } + TableNodeDirEntry * directory = (TableNodeDirEntry *) ( region + used ); + used += directory_bytes; + const int64_t index_bits = TableBitsRequired( 0, count + 1 ); + TableNodeMap nodes; + nodes.base = region; + nodes.entries = directory; + nodes.count = count + 1; + nodes.good = false; + + // PASS ONE: the numbering from the framing, every node placed, no body read + const int64_t records_start = r.offset; + int32_t unknown_records = 0; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_id = 0; + int64_t extent = 0, length = 0; + if ( !TrailsMessageRecordScan( r, vocabulary, index_bits, type_id, extent, length ) ) { out->malformed = true; return false; } + const int64_t storage = TrailsNodeMessageStorage( type_id, extent, length ); + directory[k + 1].type_id = type_id; + if ( storage <= 0 ) + { + // a record whose type id this build cannot name KEEPS ITS INDEX, is + // counted once here and not once per pointer, and every reference + // to it reads null (§3.1) + unknown_records++; + directory[k + 1].offset = kTableNodeAbsent; + continue; + } + if ( used + storage > region_bytes ) { out->malformed = true; return false; } + directory[k + 1].offset = (uint64_t) used; + TrailsNodePlace( type_id, region + used, length ); + used += storage; + } + const int64_t fields_start = r.offset; + int64_t root_extent = 0; + { + TableBitReader walk = r; + if ( !TrailsMessageExtent( walk, vocabulary, index_bits, root_extent ) ) { out->malformed = true; return false; } + } + const int64_t root_bytes = TableAlignUp64( TableAlignUp64( (int64_t) sizeof( Trails ) ) + root_extent ); + if ( used + root_bytes > region_bytes ) { out->malformed = true; return false; } + directory[0].offset = (uint64_t) used; + directory[0].type_id = 0xb4578774a78fb150ull; + Trails * root = new ( region + used ) Trails; // lifetime only: LoadMessageBody's first act is TrailsReset + TrailsReset( *root ); + root_out = root; + TableExtentCarve root_carve; + root_carve.at = region + used + TableAlignUp64( (int64_t) sizeof( Trails ) ); + root_carve.left = root_extent; + used += root_bytes; + nodes.good = true; + // A NODE RECORD whose type id this reader cannot name is one of the SIX + // EXCLUDED CLASSES (§6.6): it is a whole node, and putting one back means + // renumbering a graph the writer numbers from its own edges. + out->unknown += unknown_records; + out->retain_lost += unknown_records; + // THE BUFFER BELONGS TO THIS BODY from here on: it resets both stores and + // writes into neither id list, because a retained record carries its + // field's identity in the record itself (§6.6). + TableRetainReset( retain, nodes, region ); + + // PASS TWO: each record's body into its own storage, in wire order + r.offset = records_start; + for ( int64_t k = 0; k < count; k++ ) + { + uint64_t type_ref = 0; + if ( !r.get( type_ref, vocabulary.ref_bits ) ) { out->malformed = true; return false; } + const uint64_t type_id = directory[k + 1].type_id; + if ( type_id == kTableBytesTypeId || type_id == kTableStringTypeId ) + { + uint64_t length = 0; + if ( !r.get( length, 32 ) || !r.align() || !r.has( (int64_t) length * 8 ) ) { out->malformed = true; return false; } + if ( directory[k + 1].offset != kTableNodeAbsent && length > 0 ) { memcpy( region + directory[k + 1].offset + kTableBlobHeader, r.buffer + r.offset / 8, (size_t) length ); } + r.offset += (int64_t) length * 8; + continue; + } + if ( directory[k + 1].offset == kTableNodeAbsent ) + { + if ( !TableMessageSkipBody( r, vocabulary, index_bits ) ) { out->malformed = true; return false; } + continue; + } + if ( !TrailsNodeMessageBodyRetain( type_id, r, vocabulary, out, nodes, index_bits, region + directory[k + 1].offset, retain, (uint32_t) ( k + 2 ) ) ) { return false; } + } + if ( r.offset != fields_start ) { out->malformed = true; return false; } // the two passes disagree about the table's extent + + // and the ROOT's own body last + nodes.carve = &root_carve; // the ROOT's extent is its own, like every node's + return TrailsLoadMessageBodyRetain( r, vocabulary, out, nodes, index_bits, *root, retain, TableRetainPathRoot( (const void *) root, 1 ) ); +} + +// TrailsLoadRetainMessages: decode a BATCH into the caller's exact-sized region and +// write each body's root into `roots`. `count` is IN and OUT: the storage the +// caller has room for, then what it got. M above the capacity is a refusal +// by name with count holding the wire's M; damage inside body k delivers +// bodies 1 to k - 1 and count says k - 1 (§3.3). LOAD IS A SCAN: it follows +// no reference, so there is no depth cap and no visited set. NULL roots +// beyond count are not bodies. +// A BATCH TAKES ONE REGION AND ONE RETENTION BUFFER A BODY (§3.3, §6.6): +// `retains` is an array parallel to `roots`, each entry reset by this call +// and each holding the records of the body it belongs to, which is what keeps +// a record's first step an index into that body's own node directory. A +// SaveRetain from `roots[k]` takes `retains[k]` and is the file form's own +// pair unchanged: retention writing FORM 2 refuses by name (§3.3). +inline bool TrailsLoadRetainMessages( const Trails ** roots, int64_t * count, uint8_t * region, int64_t region_bytes, const TableVocabulary & vocabulary, const uint8_t * buffer, int64_t bytes, TableRetain * retains, TableReport * report ) +{ + TableReport ignored; + TableReport * out = report != NULL ? report : &ignored; + if ( roots == NULL || count == NULL ) { out->malformed = true; return false; } + const int64_t capacity = *count; + *count = 0; + TableMessageBatchReader br; + const int64_t bodies = TableMessageBatchOpen( br, vocabulary, buffer, bytes, out ); + if ( bodies < 0 ) { return false; } + if ( bodies > capacity ) { *count = bodies; TableMessageRefuseBatch( out ); return false; } + if ( region == NULL || region_bytes < 0 || ( ( (uintptr_t) region ) & ( kTableAlign - 1 ) ) != 0 ) { out->malformed = true; return false; } + memset( region, 0, (size_t) region_bytes ); + int64_t used = 0; + for ( int64_t b = 0; b < bodies; b++ ) + { + roots[b] = NULL; + if ( !TrailsLoadMessageBodyIntoRetain( br.r, vocabulary, out, region, region_bytes, used, roots[b], retains != NULL ? &retains[b] : NULL ) ) { *count = b; return false; } + br.remaining--; + } + *count = bodies; + return TableMessageBatchClose( br ); +} + // TrailsMeasureRetain and TrailsSaveRetain: the pair, with the retained tail in // every body it belongs to (docs/SPEC-TABLES.md §6.6). They drop the same // records under the same walk, so Measure's answer is the size the save From cc99a056066b53b3a9c733309e83eb4dbc3e7dc6 Mon Sep 17 00:00:00 2001 From: Rowan Date: Mon, 7 Sep 2026 07:04:59 -0400 Subject: [PATCH 8/9] tables: gofmt the retain surface test (#525) A blank line the em-dash pass left behind. Co-Authored-By: Claude Opus 5 --- test/conformance/harness/retain_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/test/conformance/harness/retain_test.go b/test/conformance/harness/retain_test.go index 632a49032..06d932af7 100644 --- a/test/conformance/harness/retain_test.go +++ b/test/conformance/harness/retain_test.go @@ -140,4 +140,3 @@ func TestTheOracleAnswersEveryRetainRow(t *testing.T) { }) } } - From 60ffbeb8237cab84e46a72478b09c8ab57cacd51 Mon Sep 17 00:00:00 2001 From: Rowan Date: Mon, 7 Sep 2026 07:09:58 -0400 Subject: [PATCH 9/9] tables: the surplus element's branch is a switch (#525) golangci's gocritic reads the three-way branch as one, and it is: an element of an unbounded array, an element inside this build's bound, and one past it. `message-surplus-lands-on-zero` anchors on that branch and takes the switch. Co-Authored-By: Claude Opus 5 --- internal/tablewire/messagedecode.go | 7 ++++--- tools/sabotage/message.go | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/internal/tablewire/messagedecode.go b/internal/tablewire/messagedecode.go index c12c7fd43..9a6056de8 100644 --- a/internal/tablewire/messagedecode.go +++ b/internal/tablewire/messagedecode.go @@ -760,12 +760,13 @@ func (d *bitDecoder) array(fv *tabletext.Field, entry ir.TableVocabularyEntry) b var sink tabletext.Cell cell := &sink mine := true - if f.Array == ir.ArrayList { + switch { + case f.Array == ir.ArrayList: fv.Elems = append(fv.Elems, d.m.ElementZero(f)) cell = &fv.Elems[i] - } else if i < kept { + case i < kept: cell = &fv.Elems[i] - } else { + default: mine = false // an element past this build's bound: read into a sink and dropped } element := func() bool { return d.element(cell, f, shape) } diff --git a/tools/sabotage/message.go b/tools/sabotage/message.go index 882ca0527..32c7dbe76 100644 --- a/tools/sabotage/message.go +++ b/tools/sabotage/message.go @@ -273,8 +273,8 @@ var messageRoundTwoSabotages = map[string][]edit{ // A DISCARDED SURPLUS ELEMENT NEVER ACQUIRES A LIVE DESTINATION (M1): land // it on element zero instead. "message-surplus-lands-on-zero": {{ - old: "\t\tvar sink tabletext.Cell\n\t\tcell := &sink\n\t\tmine := true\n\t\tif f.Array == ir.ArrayList {\n", - new: "\t\tcell := &fv.Elems[0] // SABOTAGED: a surplus element overwrites element zero\n\t\tmine := true\n\t\tif f.Array == ir.ArrayList {\n", + old: "\t\tvar sink tabletext.Cell\n\t\tcell := &sink\n\t\tmine := true\n\t\tswitch {\n\t\tcase f.Array == ir.ArrayList:\n", + new: "\t\tcell := &fv.Elems[0] // SABOTAGED: a surplus element overwrites element zero\n\t\tmine := true\n\t\tswitch {\n\t\tcase f.Array == ir.ArrayList:\n", }}, // A RANGED 128-BIT VALUE READS AT ITS ANNOUNCED WIDTH (M2): read the raw

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 z%0D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