64624bdfdb
The relay-inbound path (REQ / COUNT / NEG-OPEN) was the only place ManualFilterDeserializer still went through `jp.codec.readTree(jp)`, materializing a full ObjectNode per filter before walking it. The Command/Message/Event deserializers next door already stream straight off the JsonParser; this brings filter parsing onto the same shape. - Add ManualFilterDeserializer.fromJson(JsonParser): mirrors EventDeserializer's hand-rolled token loop. Dispatches on field name, reads the seven fixed keys + dynamic #x / &x tag arrays via nextToken / nextTextValue / longValue / intValue, and drops invalid entries silently (same tolerance as the tree-based mapNotNull path). - Wire the four internal call sites — three in CommandDeserializer (REQ, COUNT, NEG-OPEN) and the standalone FilterDeserializer — to the streaming overload. - Keep the existing fromJson(ObjectNode) overload as-is for any external/cross-format adapter that already has a tree in hand. For a single REQ with N filters this drops N ObjectNode trees per inbound frame, which at 10k connections × ~5 filters × 1 msg/s is ~50k tree allocations/sec we don't have to do. No behavioral change: all quartz JVM tests pass (including the cross-mapper round-trip suite that compares Jackson and KotlinSerialization output) and geode's relay tests pass.