diff --git a/runtime/conformance/README.md b/runtime/conformance/README.md index d4bb31f..1a49340 100644 --- a/runtime/conformance/README.md +++ b/runtime/conformance/README.md @@ -62,6 +62,17 @@ find become `found-*` vectors; the fuzz README says how. `profiles_are_proven` checks that every case each profile fact names exists, passes against `comline-runtime`, and shows the stated value. +The exception to "computed here" is the `sizes-*` features: their cases (a +type, its byte range, and values that reach the ends of it with the bytes they +encode to) are written in the specification, from a model of the encoders, and +this runtime is what proves them. `run` asks the real encoders to write each +witness's value as its type, requires exactly the witness's bytes, and +requires `WireFormat::encoded_len` to give the witness's length; +`size_rules_are_proven` holds every rule a profile's `sizes` states to cases +that pass. A witness that disagrees with the encoder is a fault in the +specification's vectors, fixed there, unless the encoder is what's wrong. +`tests/properties.rs` checks `encoded_len` against `encode` over random values. + ## Support, and its proof Rust's claims are in [`support/rust.json`](support/rust.json), held to the diff --git a/runtime/conformance/reports/rust.json b/runtime/conformance/reports/rust.json index 3aec7fc..a3a9105 100644 --- a/runtime/conformance/reports/rust.json +++ b/runtime/conformance/reports/rust.json @@ -566,6 +566,197 @@ "name-hash/com.acme.custom-format" ] }, + "sizes-json": { + "state": "supported", + "proven_by": [ + "sizes-json/bool", + "sizes-json/u8", + "sizes-json/u16", + "sizes-json/u32", + "sizes-json/u64", + "sizes-json/u128", + "sizes-json/i8", + "sizes-json/i16", + "sizes-json/i32", + "sizes-json/i64", + "sizes-json/i128", + "sizes-json/f32", + "sizes-json/f64", + "sizes-json/char", + "sizes-json/unit", + "sizes-json/string-unbounded", + "sizes-json/string-max-0", + "sizes-json/string-max-1", + "sizes-json/string-max-3", + "sizes-json/string-max-7", + "sizes-json/string-max-8", + "sizes-json/string-max-31", + "sizes-json/string-max-32", + "sizes-json/string-max-63", + "sizes-json/string-max-64", + "sizes-json/string-fixed-3", + "sizes-json/string-fixed-8", + "sizes-json/string-fixed-32", + "sizes-json/array-unbounded", + "sizes-json/array-unbounded-strings", + "sizes-json/array-max-0", + "sizes-json/array-max-1", + "sizes-json/array-max-3", + "sizes-json/array-max-2-of-strings", + "sizes-json/array-max-3-of-options", + "sizes-json/fixed-4", + "sizes-json/fixed-1", + "sizes-json/fixed-2-of-strings", + "sizes-json/fixed-3-of-options", + "sizes-json/option-u8", + "sizes-json/option-bool", + "sizes-json/option-string", + "sizes-json/option-max-3-chars", + "sizes-json/option-struct", + "sizes-json/struct-point", + "sizes-json/struct-empty", + "sizes-json/struct-mixed", + "sizes-json/struct-nested", + "sizes-json/struct-15-fields", + "sizes-json/struct-16-fields", + "sizes-json/struct-long-names", + "sizes-json/enum-color", + "sizes-json/enum-single", + "sizes-json/enum-129-variants", + "sizes-json/enum-long-names", + "sizes-json/recursive-chain-3", + "sizes-json/recursive-tree-2" + ] + }, + "sizes-msgpack": { + "state": "supported", + "proven_by": [ + "sizes-msgpack/bool", + "sizes-msgpack/u8", + "sizes-msgpack/u16", + "sizes-msgpack/u32", + "sizes-msgpack/u64", + "sizes-msgpack/u128", + "sizes-msgpack/i8", + "sizes-msgpack/i16", + "sizes-msgpack/i32", + "sizes-msgpack/i64", + "sizes-msgpack/i128", + "sizes-msgpack/f32", + "sizes-msgpack/f64", + "sizes-msgpack/char", + "sizes-msgpack/unit", + "sizes-msgpack/string-unbounded", + "sizes-msgpack/string-max-0", + "sizes-msgpack/string-max-1", + "sizes-msgpack/string-max-3", + "sizes-msgpack/string-max-7", + "sizes-msgpack/string-max-8", + "sizes-msgpack/string-max-31", + "sizes-msgpack/string-max-32", + "sizes-msgpack/string-max-63", + "sizes-msgpack/string-max-64", + "sizes-msgpack/string-max-16384", + "sizes-msgpack/string-fixed-3", + "sizes-msgpack/string-fixed-8", + "sizes-msgpack/string-fixed-32", + "sizes-msgpack/array-unbounded", + "sizes-msgpack/array-unbounded-strings", + "sizes-msgpack/array-max-3", + "sizes-msgpack/array-max-15", + "sizes-msgpack/array-max-16", + "sizes-msgpack/array-max-2-of-strings", + "sizes-msgpack/array-max-3-of-options", + "sizes-msgpack/fixed-4", + "sizes-msgpack/fixed-15", + "sizes-msgpack/fixed-16", + "sizes-msgpack/fixed-1", + "sizes-msgpack/fixed-2-of-strings", + "sizes-msgpack/fixed-3-of-options", + "sizes-msgpack/option-u8", + "sizes-msgpack/option-bool", + "sizes-msgpack/option-string", + "sizes-msgpack/option-max-3-chars", + "sizes-msgpack/option-struct", + "sizes-msgpack/struct-point", + "sizes-msgpack/struct-empty", + "sizes-msgpack/struct-mixed", + "sizes-msgpack/struct-nested", + "sizes-msgpack/struct-15-fields", + "sizes-msgpack/struct-16-fields", + "sizes-msgpack/struct-long-names", + "sizes-msgpack/enum-color", + "sizes-msgpack/enum-single", + "sizes-msgpack/enum-129-variants", + "sizes-msgpack/enum-long-names", + "sizes-msgpack/recursive-chain-3", + "sizes-msgpack/recursive-tree-2" + ] + }, + "sizes-packed": { + "state": "supported", + "proven_by": [ + "sizes-packed/bool", + "sizes-packed/u8", + "sizes-packed/u16", + "sizes-packed/u32", + "sizes-packed/u64", + "sizes-packed/u128", + "sizes-packed/i8", + "sizes-packed/i16", + "sizes-packed/i32", + "sizes-packed/i64", + "sizes-packed/i128", + "sizes-packed/f32", + "sizes-packed/f64", + "sizes-packed/char", + "sizes-packed/unit", + "sizes-packed/string-unbounded", + "sizes-packed/string-max-0", + "sizes-packed/string-max-1", + "sizes-packed/string-max-3", + "sizes-packed/string-max-7", + "sizes-packed/string-max-8", + "sizes-packed/string-max-31", + "sizes-packed/string-max-32", + "sizes-packed/string-max-63", + "sizes-packed/string-max-64", + "sizes-packed/string-max-4095", + "sizes-packed/string-max-4096", + "sizes-packed/string-fixed-3", + "sizes-packed/string-fixed-8", + "sizes-packed/string-fixed-32", + "sizes-packed/array-unbounded", + "sizes-packed/array-unbounded-strings", + "sizes-packed/array-max-3", + "sizes-packed/array-max-127", + "sizes-packed/array-max-128", + "sizes-packed/array-max-2-of-strings", + "sizes-packed/array-max-3-of-options", + "sizes-packed/fixed-4", + "sizes-packed/fixed-1", + "sizes-packed/fixed-2-of-strings", + "sizes-packed/fixed-3-of-options", + "sizes-packed/option-u8", + "sizes-packed/option-bool", + "sizes-packed/option-string", + "sizes-packed/option-max-3-chars", + "sizes-packed/option-struct", + "sizes-packed/struct-point", + "sizes-packed/struct-empty", + "sizes-packed/struct-mixed", + "sizes-packed/struct-nested", + "sizes-packed/struct-15-fields", + "sizes-packed/struct-16-fields", + "sizes-packed/struct-long-names", + "sizes-packed/enum-color", + "sizes-packed/enum-single", + "sizes-packed/enum-129-variants", + "sizes-packed/enum-long-names", + "sizes-packed/recursive-chain-3", + "sizes-packed/recursive-tree-2" + ] + }, "stream": { "state": "supported", "proven_by": [ diff --git a/runtime/conformance/spec/README.md b/runtime/conformance/spec/README.md index 2d28c77..1df1fa0 100644 --- a/runtime/conformance/spec/README.md +++ b/runtime/conformance/spec/README.md @@ -27,8 +27,8 @@ will read it. - [`features.json`](features.json), generated from the catalog: the wire features, with stable ids: `name-hash`, `handshake`, `envelope`, `framing-datagram`, `framing-datagram2`, - `framing-datagram3`, `handshake-comline2`, `framing-jsonrpc`, `stream`, `format-json`, `format-msgpack` and - `format-packed`. + `framing-datagram3`, `handshake-comline2`, `framing-jsonrpc`, `stream`, `format-json`, `format-msgpack`, + `format-packed`, `sizes-packed`, `sizes-msgpack` and `sizes-json`. - `vectors/.json`: that feature's cases. - [`benches/`](benches/README.md): the benchmarks every runtime runs, in the same value encoding. @@ -62,6 +62,7 @@ The ops, and what their `input` holds: | `stream_prefix` | `len`, `max` | encode and decode: the 4-byte length prefix of a `len`-byte frame under the limit `max` | | `comline2_message` | a `comline@2` message: `type` (`hello`, `answer` or `verdict`) and `message` | encode and decode | | `comline2_negotiate` | `step`, and as the step needs `side`, `params`, `local` (this end's hello), `pending`; then `reply` and `result` | decode: `bytes`, the peer's message, run through `step` give exactly `reply` (the message this end sends, or `null`) and `result` (`accepted`, or `refused` with its reason and side) | +| `size` | `format`, `type`, `min`, `max` (`null` for no bound), `witnesses`, and `upper_bound` when `max` is only a bound | encode: every witness's `value`, as `type`, gives its `bytes`, and a witness's length is as the case says (see [Sizes](#sizes)) | | `stream_split` | `max`, `frames`, `rest`, `needed` | encode and decode: a byte stream of `frames`, each behind its prefix, then `rest` | - **Encode and decode:** encoding the input gives exactly `bytes`, and decoding @@ -309,6 +310,67 @@ check writes (`reports/.json`) in its own repository, in the formats define. Rust's are in [`runtime/conformance`](https://github.com/ComlineProject/runtime/blob/main/runtime/conformance). +## Sizes + +How many bytes each kind of value takes in a format is data too: each official +format's `sizes` in the [catalog](catalog/readme.md#size-rules) (and in its +profile, which must say the same), from which a compiler computes the least +and most bytes a type can take, and every rule is proven by `size` cases in +`vectors/sizes-.json`. + +A `size` case gives a `type`, in the notation of a `decode` case's plus +`{"fixed_string": {"len": N}}` for `char[N]`, a string of exactly N characters +(`{"string"...}` of any kind counts characters, not bytes), the range +`[min, max]` the rules give it in `format`, and values that encode to the +ends of it, with the bytes each encodes to: + +```json +{ + "id": "sizes-msgpack/string-max-8", + "op": "size", + "input": { + "format": "msgpack@1", + "type": { "bounded_string": { "max": 8 } }, + "min": 1, + "max": 34, + "witnesses": { + "min": { "value": { "string": "" }, "bytes": "a0" }, + "max": { "value": { "string": "😀😀😀😀😀😀😀😀" }, "bytes": "d920f09f9880..." }, + "between": [ { "value": { "string": "a" }, "bytes": "a161" } ] + } + } +} +``` + +- `witnesses.min` encodes to exactly `min` bytes, and `witnesses.max` to exactly + `max`. Where `max` is `null` (no bound), no value reaches it and there is no + `max` witness. Where `upper_bound` is `true`, `max` is only a bound, which no + value is known to reach, and there is none either. No official format's rule + is one today: they are all reached. +- `between` holds values that encode to lengths from `min` to `max`, at the + edges of a header's tiers where the format has them: a MessagePack string of 31 + and 32 bytes, an array of 15 and 16 items, a varint's 127 and 128. +- A witness's bytes are exactly what `value` encodes to as `type`, not just JSON + that is equal: the length of a float's text counts. Floats appear only where + `serde_json`'s older and newer float writers (`ryu`, `zmij`) print the same + text; a float in exponent notation, which they spell differently, has no + witness. +- The runtime's `encode` writes the bytes of every witness: that run is the + proof of them, not this repository's checks. `specs/check.sh` checks what a + file alone can: every rule names `proven_by` cases that exist, are for its + format and have its kind of value in their type (a scalar's rule is proven by + the case of that scalar alone, with the same bounds), every case proves a + rule, and each witness is as long as its case says. + +What the vectors don't witness, and the rules say all the same, from the +definitions of the formats: a varint of 4 or 5 bytes (a count from 2^21: a +witness would be 2 MiB or more), and MessagePack's 5-byte array header (a count +from 65536: 65,536 values, more than the spec tooling checks in reasonable +time). A float's longest JSON text is witnessed (24 bytes for an `f64`, 16 for an +`f32`), but that no float is longer follows from how `serde_json` writes one +(at most 24 bytes in either writer, and 16 for an `f32`, where an exhaustive +check of the decade that could be longer finds none), not from a vector. + ## Encoding profiles [`profiles/`](profiles) holds one profile per official encoding name @@ -317,7 +379,7 @@ define. Rust's are in [`runtime/conformance`](https://github.com/ComlineProject/ `comline@2.json`): facts about how it encodes, which the version comparison turns into bumps. A format states `struct_fields`, `unknown_field`, `missing_optional`, `enum_variants`, -`unknown_variant`, `integer_width` and `output`; a framing states `calls`, +`unknown_variant`, `integer_width` and `output`, and may state `sizes`; a framing states `calls`, `directions`, `errors` and `payload`. The catalog gives each fact's values and what they mean ([`catalog/facts.cue`](catalog/facts.cue)). diff --git a/runtime/conformance/spec/REV b/runtime/conformance/spec/REV index b085043..bb47add 100644 --- a/runtime/conformance/spec/REV +++ b/runtime/conformance/spec/REV @@ -1 +1 @@ -69d88327431275017ccce99fec43060467515a9f +9a7142c395b2aefb7d4d77e9b36c74187c6f0199 diff --git a/runtime/conformance/spec/catalog/encodings.cue b/runtime/conformance/spec/catalog/encodings.cue index c85e573..b7d5fe8 100644 --- a/runtime/conformance/spec/catalog/encodings.cue +++ b/runtime/conformance/spec/catalog/encodings.cue @@ -6,6 +6,84 @@ encodings: { title: "packed" description: "Fixed-width fields back to back, varint lengths, no tags." feature: "format-packed" + sizes: { + feature: "sizes-packed" + scalars: { + "bool": {min: 1, max: 1, proven_by: ["sizes-packed/bool"]} + u8: {min: 1, max: 1, proven_by: ["sizes-packed/u8"]} + u16: {min: 2, max: 2, proven_by: ["sizes-packed/u16"]} + u32: {min: 4, max: 4, proven_by: ["sizes-packed/u32"]} + u64: {min: 8, max: 8, proven_by: ["sizes-packed/u64"]} + u128: {min: 16, max: 16, proven_by: ["sizes-packed/u128"]} + s8: {min: 1, max: 1, proven_by: ["sizes-packed/i8"]} + s16: {min: 2, max: 2, proven_by: ["sizes-packed/i16"]} + s32: {min: 4, max: 4, proven_by: ["sizes-packed/i32"]} + s64: {min: 8, max: 8, proven_by: ["sizes-packed/i64"]} + s128: {min: 16, max: 16, proven_by: ["sizes-packed/i128"]} + f32: {min: 4, max: 4, proven_by: ["sizes-packed/f32"]} + f64: {min: 8, max: 8, proven_by: ["sizes-packed/f64"]} + char: {min: 1, max: 4, proven_by: ["sizes-packed/char"]} + unit: {min: 0, max: 0, proven_by: ["sizes-packed/unit"]} + } + "string": {header: {kind: "varint_leb128"}, body: "utf8", proven_by: [ + "sizes-packed/string-unbounded", + "sizes-packed/string-max-0", + "sizes-packed/string-max-1", + "sizes-packed/string-max-3", + "sizes-packed/string-max-7", + "sizes-packed/string-max-8", + "sizes-packed/string-max-31", + "sizes-packed/string-max-32", + "sizes-packed/string-max-63", + "sizes-packed/string-max-64", + "sizes-packed/string-max-4095", + "sizes-packed/string-max-4096", + "sizes-packed/string-fixed-3", + "sizes-packed/string-fixed-8", + "sizes-packed/string-fixed-32", + ]} + array: {header: {kind: "varint_leb128"}, proven_by: [ + "sizes-packed/array-unbounded", + "sizes-packed/array-unbounded-strings", + "sizes-packed/array-max-3", + "sizes-packed/array-max-127", + "sizes-packed/array-max-128", + "sizes-packed/array-max-2-of-strings", + "sizes-packed/array-max-3-of-options", + "sizes-packed/recursive-tree-2", + ]} + fixed_array: {header: {kind: "none"}, proven_by: [ + "sizes-packed/fixed-4", + "sizes-packed/fixed-1", + "sizes-packed/fixed-2-of-strings", + "sizes-packed/fixed-3-of-options", + ]} + option: {none: 1, some: 1, proven_by: [ + "sizes-packed/option-u8", + "sizes-packed/option-bool", + "sizes-packed/option-string", + "sizes-packed/option-max-3-chars", + "sizes-packed/option-struct", + "sizes-packed/recursive-chain-3", + ]} + "struct": {header: {kind: "none"}, proven_by: [ + "sizes-packed/struct-point", + "sizes-packed/struct-empty", + "sizes-packed/struct-mixed", + "sizes-packed/struct-nested", + "sizes-packed/struct-15-fields", + "sizes-packed/struct-16-fields", + "sizes-packed/struct-long-names", + "sizes-packed/recursive-chain-3", + "sizes-packed/recursive-tree-2", + ]} + "enum": {tag: "varint_index", proven_by: [ + "sizes-packed/enum-color", + "sizes-packed/enum-single", + "sizes-packed/enum-129-variants", + "sizes-packed/enum-long-names", + ]} + } tags: ["official"] } "json@1": { @@ -13,6 +91,82 @@ encodings: { title: "JSON" description: "Values as UTF-8 JSON: a struct as an object." feature: "format-json" + sizes: { + feature: "sizes-json" + scalars: { + "bool": {min: 4, max: 5, proven_by: ["sizes-json/bool"]} + u8: {min: 1, max: 3, proven_by: ["sizes-json/u8"]} + u16: {min: 1, max: 5, proven_by: ["sizes-json/u16"]} + u32: {min: 1, max: 10, proven_by: ["sizes-json/u32"]} + u64: {min: 1, max: 20, proven_by: ["sizes-json/u64"]} + u128: {min: 1, max: 39, proven_by: ["sizes-json/u128"]} + s8: {min: 1, max: 4, proven_by: ["sizes-json/i8"]} + s16: {min: 1, max: 6, proven_by: ["sizes-json/i16"]} + s32: {min: 1, max: 11, proven_by: ["sizes-json/i32"]} + s64: {min: 1, max: 20, proven_by: ["sizes-json/i64"]} + s128: {min: 1, max: 40, proven_by: ["sizes-json/i128"]} + f32: {min: 3, max: 16, proven_by: ["sizes-json/f32"]} + f64: {min: 3, max: 24, proven_by: ["sizes-json/f64"]} + char: {min: 3, max: 8, proven_by: ["sizes-json/char"]} + unit: {min: 4, max: 4, proven_by: ["sizes-json/unit"]} + } + "string": {header: {kind: "delimited", before: 1, after: 1, between: 0}, body: "json_escaped", proven_by: [ + "sizes-json/string-unbounded", + "sizes-json/string-max-0", + "sizes-json/string-max-1", + "sizes-json/string-max-3", + "sizes-json/string-max-7", + "sizes-json/string-max-8", + "sizes-json/string-max-31", + "sizes-json/string-max-32", + "sizes-json/string-max-63", + "sizes-json/string-max-64", + "sizes-json/string-fixed-3", + "sizes-json/string-fixed-8", + "sizes-json/string-fixed-32", + ]} + array: {header: {kind: "delimited", before: 1, after: 1, between: 1}, proven_by: [ + "sizes-json/array-unbounded", + "sizes-json/array-unbounded-strings", + "sizes-json/array-max-0", + "sizes-json/array-max-1", + "sizes-json/array-max-3", + "sizes-json/array-max-2-of-strings", + "sizes-json/array-max-3-of-options", + "sizes-json/recursive-tree-2", + ]} + fixed_array: {header: {kind: "delimited", before: 1, after: 1, between: 1}, proven_by: [ + "sizes-json/fixed-4", + "sizes-json/fixed-1", + "sizes-json/fixed-2-of-strings", + "sizes-json/fixed-3-of-options", + ]} + option: {none: 4, some: 0, proven_by: [ + "sizes-json/option-u8", + "sizes-json/option-bool", + "sizes-json/option-string", + "sizes-json/option-max-3-chars", + "sizes-json/option-struct", + "sizes-json/recursive-chain-3", + ]} + "struct": {header: {kind: "delimited", before: 1, after: 1, between: 1}, key_extra: 3, proven_by: [ + "sizes-json/struct-point", + "sizes-json/struct-empty", + "sizes-json/struct-mixed", + "sizes-json/struct-nested", + "sizes-json/struct-15-fields", + "sizes-json/struct-16-fields", + "sizes-json/struct-long-names", + "sizes-json/recursive-chain-3", + "sizes-json/recursive-tree-2", + ]} + "enum": {tag: "name", header: {kind: "delimited", before: 1, after: 1, between: 0}, proven_by: [ + "sizes-json/enum-color", + "sizes-json/enum-single", + "sizes-json/enum-129-variants", + "sizes-json/enum-long-names", + ]} + } tags: ["official"] } "msgpack@1": { @@ -20,6 +174,85 @@ encodings: { title: "MessagePack" description: "Values as MessagePack: a struct as an array." feature: "format-msgpack" + sizes: { + feature: "sizes-msgpack" + scalars: { + "bool": {min: 1, max: 1, proven_by: ["sizes-msgpack/bool"]} + u8: {min: 1, max: 2, proven_by: ["sizes-msgpack/u8"]} + u16: {min: 1, max: 3, proven_by: ["sizes-msgpack/u16"]} + u32: {min: 1, max: 5, proven_by: ["sizes-msgpack/u32"]} + u64: {min: 1, max: 9, proven_by: ["sizes-msgpack/u64"]} + u128: {min: 18, max: 18, proven_by: ["sizes-msgpack/u128"]} + s8: {min: 1, max: 2, proven_by: ["sizes-msgpack/i8"]} + s16: {min: 1, max: 3, proven_by: ["sizes-msgpack/i16"]} + s32: {min: 1, max: 5, proven_by: ["sizes-msgpack/i32"]} + s64: {min: 1, max: 9, proven_by: ["sizes-msgpack/i64"]} + s128: {min: 18, max: 18, proven_by: ["sizes-msgpack/i128"]} + f32: {min: 5, max: 5, proven_by: ["sizes-msgpack/f32"]} + f64: {min: 9, max: 9, proven_by: ["sizes-msgpack/f64"]} + char: {min: 2, max: 5, proven_by: ["sizes-msgpack/char"]} + unit: {min: 1, max: 1, proven_by: ["sizes-msgpack/unit"]} + } + "string": {header: {kind: "msgpack_str"}, body: "utf8", proven_by: [ + "sizes-msgpack/string-unbounded", + "sizes-msgpack/string-max-0", + "sizes-msgpack/string-max-1", + "sizes-msgpack/string-max-3", + "sizes-msgpack/string-max-7", + "sizes-msgpack/string-max-8", + "sizes-msgpack/string-max-31", + "sizes-msgpack/string-max-32", + "sizes-msgpack/string-max-63", + "sizes-msgpack/string-max-64", + "sizes-msgpack/string-max-16384", + "sizes-msgpack/string-fixed-3", + "sizes-msgpack/string-fixed-8", + "sizes-msgpack/string-fixed-32", + ]} + array: {header: {kind: "msgpack_array"}, proven_by: [ + "sizes-msgpack/array-unbounded", + "sizes-msgpack/array-unbounded-strings", + "sizes-msgpack/array-max-3", + "sizes-msgpack/array-max-15", + "sizes-msgpack/array-max-16", + "sizes-msgpack/array-max-2-of-strings", + "sizes-msgpack/array-max-3-of-options", + "sizes-msgpack/recursive-tree-2", + ]} + fixed_array: {header: {kind: "msgpack_array"}, proven_by: [ + "sizes-msgpack/fixed-4", + "sizes-msgpack/fixed-15", + "sizes-msgpack/fixed-16", + "sizes-msgpack/fixed-1", + "sizes-msgpack/fixed-2-of-strings", + "sizes-msgpack/fixed-3-of-options", + ]} + option: {none: 1, some: 0, proven_by: [ + "sizes-msgpack/option-u8", + "sizes-msgpack/option-bool", + "sizes-msgpack/option-string", + "sizes-msgpack/option-max-3-chars", + "sizes-msgpack/option-struct", + "sizes-msgpack/recursive-chain-3", + ]} + "struct": {header: {kind: "msgpack_array"}, proven_by: [ + "sizes-msgpack/struct-point", + "sizes-msgpack/struct-empty", + "sizes-msgpack/struct-mixed", + "sizes-msgpack/struct-nested", + "sizes-msgpack/struct-15-fields", + "sizes-msgpack/struct-16-fields", + "sizes-msgpack/struct-long-names", + "sizes-msgpack/recursive-chain-3", + "sizes-msgpack/recursive-tree-2", + ]} + "enum": {tag: "name", header: {kind: "msgpack_str"}, proven_by: [ + "sizes-msgpack/enum-color", + "sizes-msgpack/enum-single", + "sizes-msgpack/enum-129-variants", + "sizes-msgpack/enum-long-names", + ]} + } tags: ["official"] } "jsonrpc@1": { diff --git a/runtime/conformance/spec/catalog/features.cue b/runtime/conformance/spec/catalog/features.cue index e24fc4f..90c7f8e 100644 --- a/runtime/conformance/spec/catalog/features.cue +++ b/runtime/conformance/spec/catalog/features.cue @@ -52,4 +52,16 @@ features: { title: "packed wire format" description: "values as packed@1: fixed-width fields back to back, varint lengths, no tags" } + "sizes-packed": { + title: "packed sizes" + description: "how many bytes each kind of value takes in packed@1, each rule proven by values written to exactly its minimum and maximum" + } + "sizes-msgpack": { + title: "MessagePack sizes" + description: "how many bytes each kind of value takes in msgpack@1, each rule proven by values written to exactly its minimum and maximum" + } + "sizes-json": { + title: "JSON sizes" + description: "how many bytes each kind of value takes in json@1, each rule proven by values written to exactly its minimum and maximum, or by a declared upper bound" + } } diff --git a/runtime/conformance/spec/catalog/gen/catalog.json b/runtime/conformance/spec/catalog/gen/catalog.json index 6c6a477..70f5156 100644 --- a/runtime/conformance/spec/catalog/gen/catalog.json +++ b/runtime/conformance/spec/catalog/gen/catalog.json @@ -4,31 +4,54 @@ "status": "stable", "title": "schema agreement", "description": "Both ends were built from compatible schemas, which the handshake checks.", - "comes_from": "handshake" + "comes_from": "handshake", + "scopes": [ + "package", + "protocol" + ] }, "encoding_agreement": { "status": "stable", "title": "encoding agreement", "description": "Both ends use the same format and framing, which the handshake checks.", - "comes_from": "handshake" + "comes_from": "handshake", + "scopes": [ + "package", + "protocol" + ] }, "encoding_conformance": { "status": "stable", "title": "encoding conformance", "description": "An implementation encodes what its name promises, proven by conformance vectors.", - "comes_from": "encoding" + "comes_from": "encoding", + "scopes": [ + "package", + "protocol" + ] }, "version_honesty": { "status": "stable", "title": "version honesty", "description": "A version bump says what the change breaks, as the version comparison works it out.", - "comes_from": "policy" + "comes_from": "policy", + "scopes": [ + "package", + "protocol" + ] }, "bounded_size": { "status": "stable", "title": "bounded size", "description": "Every value has a maximum size, so a decoder refuses an oversized one before allocating it.", - "comes_from": "type" + "comes_from": "type", + "scopes": [ + "protocol", + "function", + "argument", + "field", + "type" + ] } }, "facts": { @@ -180,6 +203,202 @@ "aliases": [], "profile": true, "feature": "format-packed", + "sizes": { + "feature": "sizes-packed", + "scalars": { + "bool": { + "min": 1, + "max": 1, + "proven_by": [ + "sizes-packed/bool" + ] + }, + "u8": { + "min": 1, + "max": 1, + "proven_by": [ + "sizes-packed/u8" + ] + }, + "u16": { + "min": 2, + "max": 2, + "proven_by": [ + "sizes-packed/u16" + ] + }, + "u32": { + "min": 4, + "max": 4, + "proven_by": [ + "sizes-packed/u32" + ] + }, + "u64": { + "min": 8, + "max": 8, + "proven_by": [ + "sizes-packed/u64" + ] + }, + "u128": { + "min": 16, + "max": 16, + "proven_by": [ + "sizes-packed/u128" + ] + }, + "s8": { + "min": 1, + "max": 1, + "proven_by": [ + "sizes-packed/i8" + ] + }, + "s16": { + "min": 2, + "max": 2, + "proven_by": [ + "sizes-packed/i16" + ] + }, + "s32": { + "min": 4, + "max": 4, + "proven_by": [ + "sizes-packed/i32" + ] + }, + "s64": { + "min": 8, + "max": 8, + "proven_by": [ + "sizes-packed/i64" + ] + }, + "s128": { + "min": 16, + "max": 16, + "proven_by": [ + "sizes-packed/i128" + ] + }, + "f32": { + "min": 4, + "max": 4, + "proven_by": [ + "sizes-packed/f32" + ] + }, + "f64": { + "min": 8, + "max": 8, + "proven_by": [ + "sizes-packed/f64" + ] + }, + "char": { + "min": 1, + "max": 4, + "proven_by": [ + "sizes-packed/char" + ] + }, + "unit": { + "min": 0, + "max": 0, + "proven_by": [ + "sizes-packed/unit" + ] + } + }, + "string": { + "header": { + "kind": "varint_leb128" + }, + "body": "utf8", + "proven_by": [ + "sizes-packed/string-unbounded", + "sizes-packed/string-max-0", + "sizes-packed/string-max-1", + "sizes-packed/string-max-3", + "sizes-packed/string-max-7", + "sizes-packed/string-max-8", + "sizes-packed/string-max-31", + "sizes-packed/string-max-32", + "sizes-packed/string-max-63", + "sizes-packed/string-max-64", + "sizes-packed/string-max-4095", + "sizes-packed/string-max-4096", + "sizes-packed/string-fixed-3", + "sizes-packed/string-fixed-8", + "sizes-packed/string-fixed-32" + ] + }, + "array": { + "header": { + "kind": "varint_leb128" + }, + "proven_by": [ + "sizes-packed/array-unbounded", + "sizes-packed/array-unbounded-strings", + "sizes-packed/array-max-3", + "sizes-packed/array-max-127", + "sizes-packed/array-max-128", + "sizes-packed/array-max-2-of-strings", + "sizes-packed/array-max-3-of-options", + "sizes-packed/recursive-tree-2" + ] + }, + "fixed_array": { + "header": { + "kind": "none" + }, + "proven_by": [ + "sizes-packed/fixed-4", + "sizes-packed/fixed-1", + "sizes-packed/fixed-2-of-strings", + "sizes-packed/fixed-3-of-options" + ] + }, + "option": { + "none": 1, + "some": 1, + "proven_by": [ + "sizes-packed/option-u8", + "sizes-packed/option-bool", + "sizes-packed/option-string", + "sizes-packed/option-max-3-chars", + "sizes-packed/option-struct", + "sizes-packed/recursive-chain-3" + ] + }, + "struct": { + "header": { + "kind": "none" + }, + "proven_by": [ + "sizes-packed/struct-point", + "sizes-packed/struct-empty", + "sizes-packed/struct-mixed", + "sizes-packed/struct-nested", + "sizes-packed/struct-15-fields", + "sizes-packed/struct-16-fields", + "sizes-packed/struct-long-names", + "sizes-packed/recursive-chain-3", + "sizes-packed/recursive-tree-2" + ] + }, + "enum": { + "tag": "varint_index", + "proven_by": [ + "sizes-packed/enum-color", + "sizes-packed/enum-single", + "sizes-packed/enum-129-variants", + "sizes-packed/enum-long-names" + ] + } + }, "tags": [ "official" ] @@ -192,6 +411,219 @@ "aliases": [], "profile": true, "feature": "format-json", + "sizes": { + "feature": "sizes-json", + "scalars": { + "bool": { + "min": 4, + "max": 5, + "proven_by": [ + "sizes-json/bool" + ] + }, + "u8": { + "min": 1, + "max": 3, + "proven_by": [ + "sizes-json/u8" + ] + }, + "u16": { + "min": 1, + "max": 5, + "proven_by": [ + "sizes-json/u16" + ] + }, + "u32": { + "min": 1, + "max": 10, + "proven_by": [ + "sizes-json/u32" + ] + }, + "u64": { + "min": 1, + "max": 20, + "proven_by": [ + "sizes-json/u64" + ] + }, + "u128": { + "min": 1, + "max": 39, + "proven_by": [ + "sizes-json/u128" + ] + }, + "s8": { + "min": 1, + "max": 4, + "proven_by": [ + "sizes-json/i8" + ] + }, + "s16": { + "min": 1, + "max": 6, + "proven_by": [ + "sizes-json/i16" + ] + }, + "s32": { + "min": 1, + "max": 11, + "proven_by": [ + "sizes-json/i32" + ] + }, + "s64": { + "min": 1, + "max": 20, + "proven_by": [ + "sizes-json/i64" + ] + }, + "s128": { + "min": 1, + "max": 40, + "proven_by": [ + "sizes-json/i128" + ] + }, + "f32": { + "min": 3, + "max": 16, + "proven_by": [ + "sizes-json/f32" + ] + }, + "f64": { + "min": 3, + "max": 24, + "proven_by": [ + "sizes-json/f64" + ] + }, + "char": { + "min": 3, + "max": 8, + "proven_by": [ + "sizes-json/char" + ] + }, + "unit": { + "min": 4, + "max": 4, + "proven_by": [ + "sizes-json/unit" + ] + } + }, + "string": { + "header": { + "kind": "delimited", + "before": 1, + "after": 1, + "between": 0 + }, + "body": "json_escaped", + "proven_by": [ + "sizes-json/string-unbounded", + "sizes-json/string-max-0", + "sizes-json/string-max-1", + "sizes-json/string-max-3", + "sizes-json/string-max-7", + "sizes-json/string-max-8", + "sizes-json/string-max-31", + "sizes-json/string-max-32", + "sizes-json/string-max-63", + "sizes-json/string-max-64", + "sizes-json/string-fixed-3", + "sizes-json/string-fixed-8", + "sizes-json/string-fixed-32" + ] + }, + "array": { + "header": { + "kind": "delimited", + "before": 1, + "after": 1, + "between": 1 + }, + "proven_by": [ + "sizes-json/array-unbounded", + "sizes-json/array-unbounded-strings", + "sizes-json/array-max-0", + "sizes-json/array-max-1", + "sizes-json/array-max-3", + "sizes-json/array-max-2-of-strings", + "sizes-json/array-max-3-of-options", + "sizes-json/recursive-tree-2" + ] + }, + "fixed_array": { + "header": { + "kind": "delimited", + "before": 1, + "after": 1, + "between": 1 + }, + "proven_by": [ + "sizes-json/fixed-4", + "sizes-json/fixed-1", + "sizes-json/fixed-2-of-strings", + "sizes-json/fixed-3-of-options" + ] + }, + "option": { + "none": 4, + "some": 0, + "proven_by": [ + "sizes-json/option-u8", + "sizes-json/option-bool", + "sizes-json/option-string", + "sizes-json/option-max-3-chars", + "sizes-json/option-struct", + "sizes-json/recursive-chain-3" + ] + }, + "struct": { + "header": { + "kind": "delimited", + "before": 1, + "after": 1, + "between": 1 + }, + "key_extra": 3, + "proven_by": [ + "sizes-json/struct-point", + "sizes-json/struct-empty", + "sizes-json/struct-mixed", + "sizes-json/struct-nested", + "sizes-json/struct-15-fields", + "sizes-json/struct-16-fields", + "sizes-json/struct-long-names", + "sizes-json/recursive-chain-3", + "sizes-json/recursive-tree-2" + ] + }, + "enum": { + "tag": "name", + "header": { + "kind": "delimited", + "before": 1, + "after": 1, + "between": 0 + }, + "proven_by": [ + "sizes-json/enum-color", + "sizes-json/enum-single", + "sizes-json/enum-129-variants", + "sizes-json/enum-long-names" + ] + } + }, "tags": [ "official" ] @@ -204,6 +636,206 @@ "aliases": [], "profile": true, "feature": "format-msgpack", + "sizes": { + "feature": "sizes-msgpack", + "scalars": { + "bool": { + "min": 1, + "max": 1, + "proven_by": [ + "sizes-msgpack/bool" + ] + }, + "u8": { + "min": 1, + "max": 2, + "proven_by": [ + "sizes-msgpack/u8" + ] + }, + "u16": { + "min": 1, + "max": 3, + "proven_by": [ + "sizes-msgpack/u16" + ] + }, + "u32": { + "min": 1, + "max": 5, + "proven_by": [ + "sizes-msgpack/u32" + ] + }, + "u64": { + "min": 1, + "max": 9, + "proven_by": [ + "sizes-msgpack/u64" + ] + }, + "u128": { + "min": 18, + "max": 18, + "proven_by": [ + "sizes-msgpack/u128" + ] + }, + "s8": { + "min": 1, + "max": 2, + "proven_by": [ + "sizes-msgpack/i8" + ] + }, + "s16": { + "min": 1, + "max": 3, + "proven_by": [ + "sizes-msgpack/i16" + ] + }, + "s32": { + "min": 1, + "max": 5, + "proven_by": [ + "sizes-msgpack/i32" + ] + }, + "s64": { + "min": 1, + "max": 9, + "proven_by": [ + "sizes-msgpack/i64" + ] + }, + "s128": { + "min": 18, + "max": 18, + "proven_by": [ + "sizes-msgpack/i128" + ] + }, + "f32": { + "min": 5, + "max": 5, + "proven_by": [ + "sizes-msgpack/f32" + ] + }, + "f64": { + "min": 9, + "max": 9, + "proven_by": [ + "sizes-msgpack/f64" + ] + }, + "char": { + "min": 2, + "max": 5, + "proven_by": [ + "sizes-msgpack/char" + ] + }, + "unit": { + "min": 1, + "max": 1, + "proven_by": [ + "sizes-msgpack/unit" + ] + } + }, + "string": { + "header": { + "kind": "msgpack_str" + }, + "body": "utf8", + "proven_by": [ + "sizes-msgpack/string-unbounded", + "sizes-msgpack/string-max-0", + "sizes-msgpack/string-max-1", + "sizes-msgpack/string-max-3", + "sizes-msgpack/string-max-7", + "sizes-msgpack/string-max-8", + "sizes-msgpack/string-max-31", + "sizes-msgpack/string-max-32", + "sizes-msgpack/string-max-63", + "sizes-msgpack/string-max-64", + "sizes-msgpack/string-max-16384", + "sizes-msgpack/string-fixed-3", + "sizes-msgpack/string-fixed-8", + "sizes-msgpack/string-fixed-32" + ] + }, + "array": { + "header": { + "kind": "msgpack_array" + }, + "proven_by": [ + "sizes-msgpack/array-unbounded", + "sizes-msgpack/array-unbounded-strings", + "sizes-msgpack/array-max-3", + "sizes-msgpack/array-max-15", + "sizes-msgpack/array-max-16", + "sizes-msgpack/array-max-2-of-strings", + "sizes-msgpack/array-max-3-of-options", + "sizes-msgpack/recursive-tree-2" + ] + }, + "fixed_array": { + "header": { + "kind": "msgpack_array" + }, + "proven_by": [ + "sizes-msgpack/fixed-4", + "sizes-msgpack/fixed-15", + "sizes-msgpack/fixed-16", + "sizes-msgpack/fixed-1", + "sizes-msgpack/fixed-2-of-strings", + "sizes-msgpack/fixed-3-of-options" + ] + }, + "option": { + "none": 1, + "some": 0, + "proven_by": [ + "sizes-msgpack/option-u8", + "sizes-msgpack/option-bool", + "sizes-msgpack/option-string", + "sizes-msgpack/option-max-3-chars", + "sizes-msgpack/option-struct", + "sizes-msgpack/recursive-chain-3" + ] + }, + "struct": { + "header": { + "kind": "msgpack_array" + }, + "proven_by": [ + "sizes-msgpack/struct-point", + "sizes-msgpack/struct-empty", + "sizes-msgpack/struct-mixed", + "sizes-msgpack/struct-nested", + "sizes-msgpack/struct-15-fields", + "sizes-msgpack/struct-16-fields", + "sizes-msgpack/struct-long-names", + "sizes-msgpack/recursive-chain-3", + "sizes-msgpack/recursive-tree-2" + ] + }, + "enum": { + "tag": "name", + "header": { + "kind": "msgpack_str" + }, + "proven_by": [ + "sizes-msgpack/enum-color", + "sizes-msgpack/enum-single", + "sizes-msgpack/enum-129-variants", + "sizes-msgpack/enum-long-names" + ] + } + }, "tags": [ "official" ] @@ -365,6 +997,21 @@ "status": "stable", "title": "packed wire format", "description": "values as packed@1: fixed-width fields back to back, varint lengths, no tags" + }, + "sizes-packed": { + "status": "stable", + "title": "packed sizes", + "description": "how many bytes each kind of value takes in packed@1, each rule proven by values written to exactly its minimum and maximum" + }, + "sizes-msgpack": { + "status": "stable", + "title": "MessagePack sizes", + "description": "how many bytes each kind of value takes in msgpack@1, each rule proven by values written to exactly its minimum and maximum" + }, + "sizes-json": { + "status": "stable", + "title": "JSON sizes", + "description": "how many bytes each kind of value takes in json@1, each rule proven by values written to exactly its minimum and maximum, or by a declared upper bound" } }, "sets": { @@ -375,6 +1022,14 @@ "version_honesty", "bounded_size" ], + "scopes": [ + "package", + "protocol", + "function", + "argument", + "field", + "type" + ], "formats": [ "packed@1", "json@1", @@ -445,7 +1100,10 @@ "framing-jsonrpc", "format-json", "format-msgpack", - "format-packed" + "format-packed", + "sizes-packed", + "sizes-msgpack", + "sizes-json" ], "aliases": { "jsonrpc": "jsonrpc@1", diff --git a/runtime/conformance/spec/catalog/guarantees.cue b/runtime/conformance/spec/catalog/guarantees.cue index c9af68f..5b1bb6c 100644 --- a/runtime/conformance/spec/catalog/guarantees.cue +++ b/runtime/conformance/spec/catalog/guarantees.cue @@ -5,25 +5,30 @@ guarantees: { title: "schema agreement" description: "Both ends were built from compatible schemas, which the handshake checks." comes_from: "handshake" + scopes: ["package", "protocol"] } encoding_agreement: { title: "encoding agreement" description: "Both ends use the same format and framing, which the handshake checks." comes_from: "handshake" + scopes: ["package", "protocol"] } encoding_conformance: { title: "encoding conformance" description: "An implementation encodes what its name promises, proven by conformance vectors." comes_from: "encoding" + scopes: ["package", "protocol"] } version_honesty: { title: "version honesty" description: "A version bump says what the change breaks, as the version comparison works it out." comes_from: "policy" + scopes: ["package", "protocol"] } bounded_size: { title: "bounded size" description: "Every value has a maximum size, so a decoder refuses an oversized one before allocating it." comes_from: "type" + scopes: ["protocol", "function", "argument", "field", "type"] } } diff --git a/runtime/conformance/spec/catalog/readme.md b/runtime/conformance/spec/catalog/readme.md index 245b52a..1b97991 100644 --- a/runtime/conformance/spec/catalog/readme.md +++ b/runtime/conformance/spec/catalog/readme.md @@ -10,7 +10,8 @@ Sets of names are queries over the entries, so they can't drift from them. | Guarantees | `schema_agreement`, `bounded_size`, ... | [`guarantees.cue`](guarantees.cue) | | Facts, with their values | `struct_fields`, `calls`, `schema_agreement`, ... | [`facts.cue`](facts.cue) | | Official encodings, with their aliases | `packed@1`, `jsonrpc@1`, `comline@2`, `none`, ... | [`encodings.cue`](encodings.cue) | -| Wire features | `name-hash`, `framing-datagram3`, ... | [`features.cue`](features.cue) | +| Size rules of the formats | `packed@1`'s `sizes`, ... | [`encodings.cue`](encodings.cue), [`schema.cue`](schema.cue) | +| Wire features | `name-hash`, `framing-datagram3`, `sizes-packed`, ... | [`features.cue`](features.cue) | | Sets | `formats`, `framing_facts`, `aliases`, ... | [`sets.cue`](sets.cue) | What an entry may say, and the rules across entries, are in @@ -23,9 +24,95 @@ What an entry may say, and the rules across entries, are in (`frozen_as`: `jsonrpc`, `datagram`), that spelling is an alias too. - A reference (`establishes`, `feature`) names an entry that exists. - A handshake's facts are booleans. +- A guarantee's `scopes` say where an `@unverified` marker acknowledging it + may sit: any of `package`, `protocol`, `function`, `argument`, `field` and + `type`, outermost to innermost, each at most once. They follow from where + its cause is: what the handshake, a policy or the encoding gives up + (`schema_agreement`, `version_honesty`, `encoding_conformance`, ...) is + settled for a package or a protocol, so those are its scopes; what a type + gives up (`bounded_size`) can also be acknowledged on a function, an + argument, a field or the type itself, and must include `type`. The schema + checks both, and `sets.scopes` lists the vocabulary. - `since` is the spec version that introduced an entry, where the changelog names one. +## Size rules + +A format entry may carry `sizes`: how many bytes each kind of value takes, as +data, so a compiler can compute the least and most bytes a type takes in that +format, and a runtime be held to it. The three official formats have them; a +custom format may declare them in its profile (`sizes`, in the same shape), +and one that doesn't has no size, which nothing guesses. Every rule lists the +vector cases that prove it (`proven_by`, in the feature `sizes.feature` names: +`vectors/sizes-.json`), and `specs/check.sh` refuses one with none, +or one whose cases don't exist or don't show it. The vocabulary is closed; the +schema is [`schema.cue`](schema.cue). Sizes are in bytes, a *count* is of items +and a *length* of bytes. + +**`scalars`** gives `[min, max]` bytes, `min` and `max` both reached by some value, +for each primitive, named as a schema spells it (`s8` where a vector's type says +`i8`): `bool`, `u8`, `u16`, `u32`, `u64`, `u128`, `s8`, `s16`, `s32`, `s64`, +`s128`, `f32`, `f64`, `char` (one Unicode scalar value) and `unit`. Where a +rule has `upper_bound`, `max` is only a bound that no value is known to reach. + +**A header** is what a count or a length costs ahead of what it measures: + +| `kind` | Bytes | +| --- | --- | +| `none` | 0 | +| `varint_leb128` | the number as an unsigned LEB128 varint, 7 bits a byte: 1 byte up to 127, 2 up to 16,383, 3 up to 2,097,151, 4 up to 268,435,455, 5 up to 2^35 - 1 (counts and lengths are at most 2^32 - 1) | +| `msgpack_str` | a MessagePack string header on a length: 1 byte up to 31, 2 up to 255, 3 up to 65,535, 5 above | +| `msgpack_array` | a MessagePack array header on a count: 1 byte up to 15, 3 up to 65,535, 5 above | +| `delimited` | `before` bytes, then the items with `between` bytes between each two, then `after` bytes: the same whatever the count, plus `between` for each item after the first (JSON: `[`, `]`, `,`) | + +**`string`** (a string, `char[max N]` or `char[N]`): a `header` on the *length in +bytes*, then the characters as `body`: `utf8`, 1 to 4 bytes a character, or +`json_escaped`, the contents of a JSON string as `serde_json` writes it, 1 to 6 +bytes a character: a character is itself in UTF-8 (1 to 4 bytes), except `"` and +`\` (2 bytes: `\"`, `\\`), the controls U+0008, U+0009, U+000A, U+000C and U+000D +(2 bytes: `\b`, `\t`, `\n`, `\f`, `\r`), and the other controls U+0000 to U+001F +(6 bytes: `\u00XX`, in lower case). Nothing above U+001F is escaped, DEL included. +A bounded string's most bytes is its characters' most times its bound, and the +header is of that length: `char[max N]` is `header(4N) + 4N` bytes at most in UTF-8. +A string takes `header(0)` bytes at least, and `char[N]` `header(N) + N`. + +**`array`** (`T[]`, `T[max N]`): a `header` on the item count, then the items. +**`fixed_array`** (`T[N]`): a `header` on N, then the items; where the header is +`none` the count isn't written at all. + +**`option`**: `none` bytes for an absent value, and `some` bytes and then the value +for a present one. `packed@1` has `none` and `some` of 1 (a tag byte). `msgpack@1` +and `json@1` write an absent value as `nil` or `null` (`none` 1 and 4) and a +present one as the value alone (`some` 0), so an option's range is that of +`min(none, value)` to `max(none, value)`. + +**`struct`**: a `header` on the field count, then the fields, in declaration +order. With `key_extra`, which goes with the fact `struct_fields = by_name`, +each field also takes its name's UTF-8 bytes and `key_extra` more (JSON: 2 +quotes and a colon, 3). A field name is written as it is, and has no escapes. + +**`enum`** (variants without fields): `tag` `varint_index` is the variant's index as +a varint (`enum_variants = by_index`), and `name` is the variant's name as a +string behind a `header` on its length (`by_name`); in JSON the header is a +delimited pair of quotes. The size of an enum is that of its shortest and longest +variant. + +**Recursion** has no rule of its own: a type that contains itself under +`@max_depth = D` takes the sizes of the rules above to depth D, where the value +at level D + 1 can't be: an option there is absent, an array empty. + +Not here yet, because no generator writes one (generated Rust refuses a union, +and an enum has only unit variants): unions, and enums with fields. Nor a map, +which no type is, nor a MessagePack header on one. JSON `NaN` and infinity are +written as `null`, a value the rules' range for a float contains, and no +vector writes. + +**Where a rule can't be reached exactly** it says so: `upper_bound`. None of the +official formats has one, as every `max` is reached by a witness. A JSON float's +text is the shortest that reads back as the same number, as `serde_json` writes it +(the `ryu` and `zmij` of its versions agree on every float in positional +notation, which the witnesses keep to). + ## What reads it - [`specs/profile.cue`](../specs/profile.cue) takes each kind's facts and @@ -42,7 +129,8 @@ What an entry may say, and the rules across entries, are in case, with anything but letters and digits as `_`: `packed@1` is `encoding::PACKED_1`. - `specs/check.sh` checks that `profiles/` holds exactly the encodings with a - profile, each of its encoding's kind, and `vectors/` exactly the features. + profile, each of its encoding's kind and, for a format with `sizes`, stating + the same, and `vectors/` exactly the features. A third party's encoding isn't an entry here: its package declares it in `config.idp`, in the same shape, and the same rules judge it. diff --git a/runtime/conformance/spec/catalog/rust.cue b/runtime/conformance/spec/catalog/rust.cue index 6289daa..733417c 100644 --- a/runtime/conformance/spec/catalog/rust.cue +++ b/runtime/conformance/spec/catalog/rust.cue @@ -34,6 +34,65 @@ _rust: { #in: "format" | "framing" | "handshake" out: {format: "Kind::Format", framing: "Kind::Framing", handshake: "Kind::Handshake"}[#in] } + scope: { + #in: #Scope + out: {package: "Scope::Package", protocol: "Scope::Protocol", function: "Scope::Function", argument: "Scope::Argument", field: "Scope::Field", type: "Scope::Type"}[#in] + } + scopes: { + #in: [...#Scope] + out: "&[" + strings.Join([for s in #in {(scope & {#in: s}).out}], ", ") + "]" + } + header: { + #in: {...} + let h = #in + out: [ + if h.kind == "none" {"Header::None"}, + if h.kind == "varint_leb128" {"Header::VarintLeb128"}, + if h.kind == "msgpack_str" {"Header::MsgpackStr"}, + if h.kind == "msgpack_array" {"Header::MsgpackArray"}, + if h.kind == "delimited" {"Header::Delimited { before: \(h.before), after: \(h.after), between: \(h.between) }"}, + ][0] + } + width: { + #in: {...} + let w = #in + out: "Width { min: \(w.min), max: \(w.max), upper_bound: \([if w.upper_bound != _|_ {"true"}, "false"][0]), proven_by: \((list & {#in: w.proven_by}).out) }" + } + // An encoding's size rules, as a `Sizes` constant. + sizes: { + #name: string + #in: {...} + let s = #in + let enum_tag = [ + if s.enum.tag == "varint_index" {"EnumTag::VarintIndex"}, + if s.enum.tag == "name" {"EnumTag::Name(\((header & {#in: s.enum.header}).out))"}, + ][0] + let key_extra = [if s.struct.key_extra != _|_ {"Some(\(s.struct.key_extra))"}, "None"][0] + let proofs = { + #of: [...string] + out: (list & {#in: #of}).out + } + out: strings.Join([ + "const \(#name): Sizes = Sizes {", + " feature: \((str & {#in: s.feature}).out),", + " scalars: Scalars {", + for n in ["bool", "u8", "u16", "u32", "u64", "u128", "s8", "s16", "s32", "s64", "s128", "f32", "f64", "char", "unit"] { + " \(n): \((width & {#in: s.scalars[n]}).out)," + }, + " },", + " string: StringSize {", + " header: \((header & {#in: s."string".header}).out),", + " body: \({utf8: "Body::Utf8", json_escaped: "Body::JsonEscaped"}[s."string".body]),", + " proven_by: \((proofs & {#of: s."string".proven_by}).out),", + " },", + " array: SeqSize { header: \((header & {#in: s.array.header}).out), proven_by: \((proofs & {#of: s.array.proven_by}).out) },", + " fixed_array: SeqSize { header: \((header & {#in: s.fixed_array.header}).out), proven_by: \((proofs & {#of: s.fixed_array.proven_by}).out) },", + " option: OptionSize { none: \(s.option.none), some: \(s.option.some), proven_by: \((proofs & {#of: s.option.proven_by}).out) },", + " struct_: StructSize { header: \((header & {#in: s."struct".header}).out), key_extra: \(key_extra), proven_by: \((proofs & {#of: s."struct".proven_by}).out) },", + " enum_: EnumSize { tag: \(enum_tag), proven_by: \((proofs & {#of: s."enum".proven_by}).out) },", + "};", + ], "\n") + } status: { #in: "stable" | "experimental" | "deprecated" out: {stable: "Status::Stable", experimental: "Status::Experimental", deprecated: "Status::Deprecated"}[#in] @@ -80,7 +139,10 @@ _set: { rust_catalog: """ // Generated from the catalog's CUE by `specs/check.sh`: don't edit by hand. - use crate::{Encoding, Fact, Feature, Guarantee, Kind, Origin, Status, Value}; + use crate::{ + Body, Encoding, EnumSize, EnumTag, Fact, Feature, Guarantee, Header, Kind, Origin, OptionSize, Scalars, Scope, + SeqSize, Sizes, Status, StringSize, StructSize, Value, Width, + }; pub const SPEC_VERSION: &str = \((_rust.str & {#in: _spec_version}).out); @@ -92,6 +154,7 @@ rust_catalog: """ title: \((_rust.str & {#in: g.title}).out), description: \((_rust.str & {#in: g.description}).out), comes_from: \({handshake: "Origin::Handshake", encoding: "Origin::Encoding", policy: "Origin::Policy", type: "Origin::Type"}[g.comes_from]), + scopes: \((_rust.scopes & {#in: g.scopes}).out), \((_rust.lifecycle & {#in: g}).out) }, """}], "\n")) @@ -112,6 +175,7 @@ rust_catalog: """ """}], "\n")) ]; + \(strings.Join([for id, e in encodings if e.sizes != _|_ {(_rust.sizes & {#name: "SIZES_" + (_rust.const & {#in: id}).out, #in: e.sizes}).out + "\n"}], "\n")) /// Every official encoding, by its wire name. pub const ENCODINGS: &[Encoding] = &[ \(strings.Join([for id, e in encodings {""" @@ -124,6 +188,7 @@ rust_catalog: """ frozen_as: \((_rust.opt & {#in: [if e.frozen_as != _|_ {e.frozen_as}, null][0]}).out), profile: \(e.profile), feature: \((_rust.opt & {#in: [if e.feature != _|_ {e.feature}, null][0]}).out), + sizes: \([if e.sizes != _|_ {"Some(&SIZES_" + (_rust.const & {#in: id}).out + ")"}, "None"][0]), tags: \((_rust.list & {#in: e.tags}).out), \((_rust.lifecycle & {#in: e}).out) }, @@ -165,6 +230,7 @@ rust_catalog: """ /// The catalog's sets. pub mod sets { \((_set & {#name: "GUARANTEES", #in: sets.guarantees}).out) + \((_set & {#name: "SCOPES", #in: sets.scopes}).out) \((_set & {#name: "FORMATS", #in: sets.formats}).out) \((_set & {#name: "FRAMINGS", #in: sets.framings}).out) \((_set & {#name: "HANDSHAKES", #in: sets.handshakes}).out) diff --git a/runtime/conformance/spec/catalog/schema.cue b/runtime/conformance/spec/catalog/schema.cue index ac9282c..887d85d 100644 --- a/runtime/conformance/spec/catalog/schema.cue +++ b/runtime/conformance/spec/catalog/schema.cue @@ -13,6 +13,12 @@ import "list" } } +// Where an `@unverified` marker may sit, outermost to innermost: the +// package, a protocol in it, a function of the protocol, one of its +// arguments, a field of a type, a type. +#Scopes: ["package", "protocol", "function", "argument", "field", "type"] +#Scope: or(#Scopes) + // A guarantee Comline gives between peers, which a protocol can give up // with `@unverified`. Its id is the name written in `accept_unverified`, // diagnostics and generated docs. @@ -23,6 +29,9 @@ import "list" // What gives it up: the handshake, the format and framing, a handshake // policy, or a type. comes_from!: "handshake" | "encoding" | "policy" | "type" + // Where an `@unverified` marker acknowledging it may sit, which follows + // from where its cause is. In `#Scopes` order, each at most once. + scopes!: [#Scope, ...#Scope] }) // A fact an encoding's profile states, with every value it may take and @@ -53,9 +62,84 @@ import "list" profile: bool | *true // The feature whose vectors prove it. feature?: or([for id, _ in features {id}]) + // How many bytes each kind of value takes: a format's, and only a + // format's. A format without one has no size rules, and nothing computes + // one for it. + sizes?: #Sizes tags: [...string] }) +// A reference to a vector case, `/`. +#CaseRef: =~"^[a-z0-9.@_-]+/[a-z0-9.@_-]+$" + +// The cases that prove a rule: at least one, each in the feature the sizes +// name (`specs/check.sh` checks that they exist and show the rule). +#Proofs: [#CaseRef, ...#CaseRef] + +// What a count or a length costs on the wire, ahead of what it measures. +// `catalog/readme.md` defines each kind. +#Header: + close({kind: "none"}) | + close({kind: "varint_leb128"}) | + close({kind: "msgpack_str"}) | + close({kind: "msgpack_array"}) | + close({kind: "delimited", before: uint, after: uint, between: uint}) + +// The bytes a kind of value takes: at least `min`, at most `max`. With +// `upper_bound`, `max` is only a bound that no witness reaches: the longest +// value may be shorter. +#Width: close({ + min!: uint + max!: uint + upper_bound?: true + proven_by!: #Proofs + _min_le_max: true & (min <= max) +}) + +// How many bytes each kind of value of a format takes, as data a compiler +// computes a type's range from, and the vectors of `feature` prove: the rule +// of every kind of value has `proven_by` cases. A struct, an enum and an +// array are as the format's facts say (`struct_fields`, `enum_variants`). +// Unions, and enums with fields, are not here: no generator writes one. +#Sizes: close({ + // The feature whose vectors, `vectors/.json`, prove the rules. + feature!: or([for id, _ in features {id}]) + scalars!: close({ + "bool"!: #Width + u8!: #Width + u16!: #Width + u32!: #Width + u64!: #Width + u128!: #Width + s8!: #Width + s16!: #Width + s32!: #Width + s64!: #Width + s128!: #Width + f32!: #Width + f64!: #Width + char!: #Width + unit!: #Width + }) + // A string, a `char[max N]` and a `char[N]`: a header on the length in + // bytes, then the characters. + "string"!: close({header!: #Header, body!: "utf8" | "json_escaped", proven_by!: #Proofs}) + // `T[]` and `T[max N]`: a header on the item count, then the items. + array!: close({header!: #Header, proven_by!: #Proofs}) + // `T[N]`: a header on N, then the items. + fixed_array!: close({header!: #Header, proven_by!: #Proofs}) + // `none` bytes for an absent value, `some` bytes and the value for a + // present one. + option!: close({none!: uint, some!: uint, proven_by!: #Proofs}) + // A header on the field count, then the fields. With `key_extra`, each + // field also takes its name's bytes and `key_extra` more. + "struct"!: close({header!: #Header, key_extra?: uint, proven_by!: #Proofs}) + // A unit variant: by its index as a varint, or by its name behind a header + // on the name's length. + "enum"!: close({tag!: "varint_index", proven_by!: #Proofs}) | + close({tag!: "name", header!: #Header, proven_by!: #Proofs}) +}) + // A wire feature: a set of vector cases, `vectors/.json`. #Feature: close({ #Lifecycle @@ -74,6 +158,21 @@ facts: {[=~#SnakeId]: #Fact, [!~#SnakeId]: _|_} encodings: {[=~#EncodingId]: #Encoding, [!~#EncodingId]: _|_} features: {[=~#FeatureId]: #Feature, [!~#FeatureId]: _|_} +// Size rules are a format's. +_sizes_are_a_formats: [for id, e in encodings if e.sizes != _|_ if e.kind != "format" {id}] & [] + +// A guarantee's scopes follow from where it comes from: what a type gives +// up can be acknowledged on the type, or on whatever uses it, down from the +// protocol; what the handshake, the policies and the encoding give up is +// settled by the package and its protocols, never below a protocol. +_scope_rank: {for i, s in #Scopes {(s): i}} +_scopes_are_ordered: [for id, g in guarantees + let ranks = [for s in g.scopes {_scope_rank[s]}] + if len([for i, r in ranks if i > 0 if r <= ranks[i-1] {i}]) > 0 {id}] & [] +_scopes_follow_origin: [for id, g in guarantees + let inner = [for s in g.scopes if _scope_rank[s] >= _scope_rank["function"] {s}] + if (g.comes_from == "type" && !list.Contains(g.scopes, "type")) || (g.comes_from != "type" && len(inner) > 0) {id}] & [] + // A handshake's facts are booleans. _boolean_handshake_facts: [for id, f in facts if f.applies_to == "handshake" if [for v, _ in f.values {v}] != ["true", "false"] {id}] & [] @@ -92,5 +191,9 @@ _frozen_is_an_alias: [for id, e in encodings if e.frozen_as != _|_ if !list.Cont #OfficialProfile: { name!: or(sets.profiled) kind!: encodings[name].kind + // A format with size rules states them as the catalog does. + if encodings[name].sizes != _|_ { + sizes!: encodings[name].sizes + } ... } diff --git a/runtime/conformance/spec/catalog/sets.cue b/runtime/conformance/spec/catalog/sets.cue index 6932211..07b2b64 100644 --- a/runtime/conformance/spec/catalog/sets.cue +++ b/runtime/conformance/spec/catalog/sets.cue @@ -4,6 +4,8 @@ package catalog // label that names a top-level field is quoted, so it doesn't shadow it. sets: { "guarantees": [for id, _ in guarantees {id}] + // Where an `@unverified` marker may sit, outermost to innermost. + scopes: #Scopes formats: [for id, e in encodings if e.kind == "format" {id}] framings: [for id, e in encodings if e.kind == "framing" {id}] handshakes: [for id, e in encodings if e.kind == "handshake" {id}] diff --git a/runtime/conformance/spec/features.json b/runtime/conformance/spec/features.json index 54063cc..cda796b 100644 --- a/runtime/conformance/spec/features.json +++ b/runtime/conformance/spec/features.json @@ -60,6 +60,21 @@ "id": "format-packed", "title": "packed wire format", "description": "values as packed@1: fixed-width fields back to back, varint lengths, no tags" + }, + { + "id": "sizes-packed", + "title": "packed sizes", + "description": "how many bytes each kind of value takes in packed@1, each rule proven by values written to exactly its minimum and maximum" + }, + { + "id": "sizes-msgpack", + "title": "MessagePack sizes", + "description": "how many bytes each kind of value takes in msgpack@1, each rule proven by values written to exactly its minimum and maximum" + }, + { + "id": "sizes-json", + "title": "JSON sizes", + "description": "how many bytes each kind of value takes in json@1, each rule proven by values written to exactly its minimum and maximum, or by a declared upper bound" } ] } diff --git a/runtime/conformance/spec/profiles/json@1.json b/runtime/conformance/spec/profiles/json@1.json index ffa4856..a7e5ffc 100644 --- a/runtime/conformance/spec/profiles/json@1.json +++ b/runtime/conformance/spec/profiles/json@1.json @@ -50,5 +50,218 @@ "format-json/unit" ] } + }, + "sizes": { + "feature": "sizes-json", + "scalars": { + "bool": { + "min": 4, + "max": 5, + "proven_by": [ + "sizes-json/bool" + ] + }, + "u8": { + "min": 1, + "max": 3, + "proven_by": [ + "sizes-json/u8" + ] + }, + "u16": { + "min": 1, + "max": 5, + "proven_by": [ + "sizes-json/u16" + ] + }, + "u32": { + "min": 1, + "max": 10, + "proven_by": [ + "sizes-json/u32" + ] + }, + "u64": { + "min": 1, + "max": 20, + "proven_by": [ + "sizes-json/u64" + ] + }, + "u128": { + "min": 1, + "max": 39, + "proven_by": [ + "sizes-json/u128" + ] + }, + "s8": { + "min": 1, + "max": 4, + "proven_by": [ + "sizes-json/i8" + ] + }, + "s16": { + "min": 1, + "max": 6, + "proven_by": [ + "sizes-json/i16" + ] + }, + "s32": { + "min": 1, + "max": 11, + "proven_by": [ + "sizes-json/i32" + ] + }, + "s64": { + "min": 1, + "max": 20, + "proven_by": [ + "sizes-json/i64" + ] + }, + "s128": { + "min": 1, + "max": 40, + "proven_by": [ + "sizes-json/i128" + ] + }, + "f32": { + "min": 3, + "max": 16, + "proven_by": [ + "sizes-json/f32" + ] + }, + "f64": { + "min": 3, + "max": 24, + "proven_by": [ + "sizes-json/f64" + ] + }, + "char": { + "min": 3, + "max": 8, + "proven_by": [ + "sizes-json/char" + ] + }, + "unit": { + "min": 4, + "max": 4, + "proven_by": [ + "sizes-json/unit" + ] + } + }, + "string": { + "header": { + "kind": "delimited", + "before": 1, + "after": 1, + "between": 0 + }, + "body": "json_escaped", + "proven_by": [ + "sizes-json/string-unbounded", + "sizes-json/string-max-0", + "sizes-json/string-max-1", + "sizes-json/string-max-3", + "sizes-json/string-max-7", + "sizes-json/string-max-8", + "sizes-json/string-max-31", + "sizes-json/string-max-32", + "sizes-json/string-max-63", + "sizes-json/string-max-64", + "sizes-json/string-fixed-3", + "sizes-json/string-fixed-8", + "sizes-json/string-fixed-32" + ] + }, + "array": { + "header": { + "kind": "delimited", + "before": 1, + "after": 1, + "between": 1 + }, + "proven_by": [ + "sizes-json/array-unbounded", + "sizes-json/array-unbounded-strings", + "sizes-json/array-max-0", + "sizes-json/array-max-1", + "sizes-json/array-max-3", + "sizes-json/array-max-2-of-strings", + "sizes-json/array-max-3-of-options", + "sizes-json/recursive-tree-2" + ] + }, + "fixed_array": { + "header": { + "kind": "delimited", + "before": 1, + "after": 1, + "between": 1 + }, + "proven_by": [ + "sizes-json/fixed-4", + "sizes-json/fixed-1", + "sizes-json/fixed-2-of-strings", + "sizes-json/fixed-3-of-options" + ] + }, + "option": { + "none": 4, + "some": 0, + "proven_by": [ + "sizes-json/option-u8", + "sizes-json/option-bool", + "sizes-json/option-string", + "sizes-json/option-max-3-chars", + "sizes-json/option-struct", + "sizes-json/recursive-chain-3" + ] + }, + "struct": { + "header": { + "kind": "delimited", + "before": 1, + "after": 1, + "between": 1 + }, + "key_extra": 3, + "proven_by": [ + "sizes-json/struct-point", + "sizes-json/struct-empty", + "sizes-json/struct-mixed", + "sizes-json/struct-nested", + "sizes-json/struct-15-fields", + "sizes-json/struct-16-fields", + "sizes-json/struct-long-names", + "sizes-json/recursive-chain-3", + "sizes-json/recursive-tree-2" + ] + }, + "enum": { + "tag": "name", + "header": { + "kind": "delimited", + "before": 1, + "after": 1, + "between": 0 + }, + "proven_by": [ + "sizes-json/enum-color", + "sizes-json/enum-single", + "sizes-json/enum-129-variants", + "sizes-json/enum-long-names" + ] + } } } diff --git a/runtime/conformance/spec/profiles/msgpack@1.json b/runtime/conformance/spec/profiles/msgpack@1.json index 5cef00d..94f085b 100644 --- a/runtime/conformance/spec/profiles/msgpack@1.json +++ b/runtime/conformance/spec/profiles/msgpack@1.json @@ -47,5 +47,205 @@ "format-msgpack/struct" ] } + }, + "sizes": { + "feature": "sizes-msgpack", + "scalars": { + "bool": { + "min": 1, + "max": 1, + "proven_by": [ + "sizes-msgpack/bool" + ] + }, + "u8": { + "min": 1, + "max": 2, + "proven_by": [ + "sizes-msgpack/u8" + ] + }, + "u16": { + "min": 1, + "max": 3, + "proven_by": [ + "sizes-msgpack/u16" + ] + }, + "u32": { + "min": 1, + "max": 5, + "proven_by": [ + "sizes-msgpack/u32" + ] + }, + "u64": { + "min": 1, + "max": 9, + "proven_by": [ + "sizes-msgpack/u64" + ] + }, + "u128": { + "min": 18, + "max": 18, + "proven_by": [ + "sizes-msgpack/u128" + ] + }, + "s8": { + "min": 1, + "max": 2, + "proven_by": [ + "sizes-msgpack/i8" + ] + }, + "s16": { + "min": 1, + "max": 3, + "proven_by": [ + "sizes-msgpack/i16" + ] + }, + "s32": { + "min": 1, + "max": 5, + "proven_by": [ + "sizes-msgpack/i32" + ] + }, + "s64": { + "min": 1, + "max": 9, + "proven_by": [ + "sizes-msgpack/i64" + ] + }, + "s128": { + "min": 18, + "max": 18, + "proven_by": [ + "sizes-msgpack/i128" + ] + }, + "f32": { + "min": 5, + "max": 5, + "proven_by": [ + "sizes-msgpack/f32" + ] + }, + "f64": { + "min": 9, + "max": 9, + "proven_by": [ + "sizes-msgpack/f64" + ] + }, + "char": { + "min": 2, + "max": 5, + "proven_by": [ + "sizes-msgpack/char" + ] + }, + "unit": { + "min": 1, + "max": 1, + "proven_by": [ + "sizes-msgpack/unit" + ] + } + }, + "string": { + "header": { + "kind": "msgpack_str" + }, + "body": "utf8", + "proven_by": [ + "sizes-msgpack/string-unbounded", + "sizes-msgpack/string-max-0", + "sizes-msgpack/string-max-1", + "sizes-msgpack/string-max-3", + "sizes-msgpack/string-max-7", + "sizes-msgpack/string-max-8", + "sizes-msgpack/string-max-31", + "sizes-msgpack/string-max-32", + "sizes-msgpack/string-max-63", + "sizes-msgpack/string-max-64", + "sizes-msgpack/string-max-16384", + "sizes-msgpack/string-fixed-3", + "sizes-msgpack/string-fixed-8", + "sizes-msgpack/string-fixed-32" + ] + }, + "array": { + "header": { + "kind": "msgpack_array" + }, + "proven_by": [ + "sizes-msgpack/array-unbounded", + "sizes-msgpack/array-unbounded-strings", + "sizes-msgpack/array-max-3", + "sizes-msgpack/array-max-15", + "sizes-msgpack/array-max-16", + "sizes-msgpack/array-max-2-of-strings", + "sizes-msgpack/array-max-3-of-options", + "sizes-msgpack/recursive-tree-2" + ] + }, + "fixed_array": { + "header": { + "kind": "msgpack_array" + }, + "proven_by": [ + "sizes-msgpack/fixed-4", + "sizes-msgpack/fixed-15", + "sizes-msgpack/fixed-16", + "sizes-msgpack/fixed-1", + "sizes-msgpack/fixed-2-of-strings", + "sizes-msgpack/fixed-3-of-options" + ] + }, + "option": { + "none": 1, + "some": 0, + "proven_by": [ + "sizes-msgpack/option-u8", + "sizes-msgpack/option-bool", + "sizes-msgpack/option-string", + "sizes-msgpack/option-max-3-chars", + "sizes-msgpack/option-struct", + "sizes-msgpack/recursive-chain-3" + ] + }, + "struct": { + "header": { + "kind": "msgpack_array" + }, + "proven_by": [ + "sizes-msgpack/struct-point", + "sizes-msgpack/struct-empty", + "sizes-msgpack/struct-mixed", + "sizes-msgpack/struct-nested", + "sizes-msgpack/struct-15-fields", + "sizes-msgpack/struct-16-fields", + "sizes-msgpack/struct-long-names", + "sizes-msgpack/recursive-chain-3", + "sizes-msgpack/recursive-tree-2" + ] + }, + "enum": { + "tag": "name", + "header": { + "kind": "msgpack_str" + }, + "proven_by": [ + "sizes-msgpack/enum-color", + "sizes-msgpack/enum-single", + "sizes-msgpack/enum-129-variants", + "sizes-msgpack/enum-long-names" + ] + } } } diff --git a/runtime/conformance/spec/profiles/packed@1.json b/runtime/conformance/spec/profiles/packed@1.json index cba383f..6ea45d0 100644 --- a/runtime/conformance/spec/profiles/packed@1.json +++ b/runtime/conformance/spec/profiles/packed@1.json @@ -47,5 +47,201 @@ "format-packed/struct" ] } + }, + "sizes": { + "feature": "sizes-packed", + "scalars": { + "bool": { + "min": 1, + "max": 1, + "proven_by": [ + "sizes-packed/bool" + ] + }, + "u8": { + "min": 1, + "max": 1, + "proven_by": [ + "sizes-packed/u8" + ] + }, + "u16": { + "min": 2, + "max": 2, + "proven_by": [ + "sizes-packed/u16" + ] + }, + "u32": { + "min": 4, + "max": 4, + "proven_by": [ + "sizes-packed/u32" + ] + }, + "u64": { + "min": 8, + "max": 8, + "proven_by": [ + "sizes-packed/u64" + ] + }, + "u128": { + "min": 16, + "max": 16, + "proven_by": [ + "sizes-packed/u128" + ] + }, + "s8": { + "min": 1, + "max": 1, + "proven_by": [ + "sizes-packed/i8" + ] + }, + "s16": { + "min": 2, + "max": 2, + "proven_by": [ + "sizes-packed/i16" + ] + }, + "s32": { + "min": 4, + "max": 4, + "proven_by": [ + "sizes-packed/i32" + ] + }, + "s64": { + "min": 8, + "max": 8, + "proven_by": [ + "sizes-packed/i64" + ] + }, + "s128": { + "min": 16, + "max": 16, + "proven_by": [ + "sizes-packed/i128" + ] + }, + "f32": { + "min": 4, + "max": 4, + "proven_by": [ + "sizes-packed/f32" + ] + }, + "f64": { + "min": 8, + "max": 8, + "proven_by": [ + "sizes-packed/f64" + ] + }, + "char": { + "min": 1, + "max": 4, + "proven_by": [ + "sizes-packed/char" + ] + }, + "unit": { + "min": 0, + "max": 0, + "proven_by": [ + "sizes-packed/unit" + ] + } + }, + "string": { + "header": { + "kind": "varint_leb128" + }, + "body": "utf8", + "proven_by": [ + "sizes-packed/string-unbounded", + "sizes-packed/string-max-0", + "sizes-packed/string-max-1", + "sizes-packed/string-max-3", + "sizes-packed/string-max-7", + "sizes-packed/string-max-8", + "sizes-packed/string-max-31", + "sizes-packed/string-max-32", + "sizes-packed/string-max-63", + "sizes-packed/string-max-64", + "sizes-packed/string-max-4095", + "sizes-packed/string-max-4096", + "sizes-packed/string-fixed-3", + "sizes-packed/string-fixed-8", + "sizes-packed/string-fixed-32" + ] + }, + "array": { + "header": { + "kind": "varint_leb128" + }, + "proven_by": [ + "sizes-packed/array-unbounded", + "sizes-packed/array-unbounded-strings", + "sizes-packed/array-max-3", + "sizes-packed/array-max-127", + "sizes-packed/array-max-128", + "sizes-packed/array-max-2-of-strings", + "sizes-packed/array-max-3-of-options", + "sizes-packed/recursive-tree-2" + ] + }, + "fixed_array": { + "header": { + "kind": "none" + }, + "proven_by": [ + "sizes-packed/fixed-4", + "sizes-packed/fixed-1", + "sizes-packed/fixed-2-of-strings", + "sizes-packed/fixed-3-of-options" + ] + }, + "option": { + "none": 1, + "some": 1, + "proven_by": [ + "sizes-packed/option-u8", + "sizes-packed/option-bool", + "sizes-packed/option-string", + "sizes-packed/option-max-3-chars", + "sizes-packed/option-struct", + "sizes-packed/recursive-chain-3" + ] + }, + "struct": { + "header": { + "kind": "none" + }, + "proven_by": [ + "sizes-packed/struct-point", + "sizes-packed/struct-empty", + "sizes-packed/struct-mixed", + "sizes-packed/struct-nested", + "sizes-packed/struct-15-fields", + "sizes-packed/struct-16-fields", + "sizes-packed/struct-long-names", + "sizes-packed/recursive-chain-3", + "sizes-packed/recursive-tree-2" + ] + }, + "enum": { + "tag": "varint_index", + "proven_by": [ + "sizes-packed/enum-color", + "sizes-packed/enum-single", + "sizes-packed/enum-129-variants", + "sizes-packed/enum-long-names" + ] + } } } diff --git a/runtime/conformance/spec/rust/src/catalog.rs b/runtime/conformance/spec/rust/src/catalog.rs index 69f777b..1bb1e8f 100644 --- a/runtime/conformance/spec/rust/src/catalog.rs +++ b/runtime/conformance/spec/rust/src/catalog.rs @@ -1,6 +1,9 @@ // Generated from the catalog's CUE by `specs/check.sh`: don't edit by hand. -use crate::{Encoding, Fact, Feature, Guarantee, Kind, Origin, Status, Value}; +use crate::{ + Body, Encoding, EnumSize, EnumTag, Fact, Feature, Guarantee, Header, Kind, Origin, OptionSize, Scalars, Scope, + SeqSize, Sizes, Status, StringSize, StructSize, Value, Width, +}; pub const SPEC_VERSION: &str = r#"0.10"#; @@ -11,6 +14,7 @@ pub const GUARANTEES: &[Guarantee] = &[ title: r#"schema agreement"#, description: r#"Both ends were built from compatible schemas, which the handshake checks."#, comes_from: Origin::Handshake, + scopes: &[Scope::Package, Scope::Protocol], status: Status::Stable, replaced_by: None, since: None, @@ -20,6 +24,7 @@ pub const GUARANTEES: &[Guarantee] = &[ title: r#"encoding agreement"#, description: r#"Both ends use the same format and framing, which the handshake checks."#, comes_from: Origin::Handshake, + scopes: &[Scope::Package, Scope::Protocol], status: Status::Stable, replaced_by: None, since: None, @@ -29,6 +34,7 @@ pub const GUARANTEES: &[Guarantee] = &[ title: r#"encoding conformance"#, description: r#"An implementation encodes what its name promises, proven by conformance vectors."#, comes_from: Origin::Encoding, + scopes: &[Scope::Package, Scope::Protocol], status: Status::Stable, replaced_by: None, since: None, @@ -38,6 +44,7 @@ pub const GUARANTEES: &[Guarantee] = &[ title: r#"version honesty"#, description: r#"A version bump says what the change breaks, as the version comparison works it out."#, comes_from: Origin::Policy, + scopes: &[Scope::Package, Scope::Protocol], status: Status::Stable, replaced_by: None, since: None, @@ -47,6 +54,7 @@ pub const GUARANTEES: &[Guarantee] = &[ title: r#"bounded size"#, description: r#"Every value has a maximum size, so a decoder refuses an oversized one before allocating it."#, comes_from: Origin::Type, + scopes: &[Scope::Protocol, Scope::Function, Scope::Argument, Scope::Field, Scope::Type], status: Status::Stable, replaced_by: None, since: None, @@ -200,6 +208,99 @@ pub const FACTS: &[Fact] = &[ }, ]; +const SIZES_PACKED_1: Sizes = Sizes { + feature: r#"sizes-packed"#, + scalars: Scalars { + bool: Width { min: 1, max: 1, upper_bound: false, proven_by: &[r#"sizes-packed/bool"#] }, + u8: Width { min: 1, max: 1, upper_bound: false, proven_by: &[r#"sizes-packed/u8"#] }, + u16: Width { min: 2, max: 2, upper_bound: false, proven_by: &[r#"sizes-packed/u16"#] }, + u32: Width { min: 4, max: 4, upper_bound: false, proven_by: &[r#"sizes-packed/u32"#] }, + u64: Width { min: 8, max: 8, upper_bound: false, proven_by: &[r#"sizes-packed/u64"#] }, + u128: Width { min: 16, max: 16, upper_bound: false, proven_by: &[r#"sizes-packed/u128"#] }, + s8: Width { min: 1, max: 1, upper_bound: false, proven_by: &[r#"sizes-packed/i8"#] }, + s16: Width { min: 2, max: 2, upper_bound: false, proven_by: &[r#"sizes-packed/i16"#] }, + s32: Width { min: 4, max: 4, upper_bound: false, proven_by: &[r#"sizes-packed/i32"#] }, + s64: Width { min: 8, max: 8, upper_bound: false, proven_by: &[r#"sizes-packed/i64"#] }, + s128: Width { min: 16, max: 16, upper_bound: false, proven_by: &[r#"sizes-packed/i128"#] }, + f32: Width { min: 4, max: 4, upper_bound: false, proven_by: &[r#"sizes-packed/f32"#] }, + f64: Width { min: 8, max: 8, upper_bound: false, proven_by: &[r#"sizes-packed/f64"#] }, + char: Width { min: 1, max: 4, upper_bound: false, proven_by: &[r#"sizes-packed/char"#] }, + unit: Width { min: 0, max: 0, upper_bound: false, proven_by: &[r#"sizes-packed/unit"#] }, + }, + string: StringSize { + header: Header::VarintLeb128, + body: Body::Utf8, + proven_by: &[r#"sizes-packed/string-unbounded"#, r#"sizes-packed/string-max-0"#, r#"sizes-packed/string-max-1"#, r#"sizes-packed/string-max-3"#, r#"sizes-packed/string-max-7"#, r#"sizes-packed/string-max-8"#, r#"sizes-packed/string-max-31"#, r#"sizes-packed/string-max-32"#, r#"sizes-packed/string-max-63"#, r#"sizes-packed/string-max-64"#, r#"sizes-packed/string-max-4095"#, r#"sizes-packed/string-max-4096"#, r#"sizes-packed/string-fixed-3"#, r#"sizes-packed/string-fixed-8"#, r#"sizes-packed/string-fixed-32"#], + }, + array: SeqSize { header: Header::VarintLeb128, proven_by: &[r#"sizes-packed/array-unbounded"#, r#"sizes-packed/array-unbounded-strings"#, r#"sizes-packed/array-max-3"#, r#"sizes-packed/array-max-127"#, r#"sizes-packed/array-max-128"#, r#"sizes-packed/array-max-2-of-strings"#, r#"sizes-packed/array-max-3-of-options"#, r#"sizes-packed/recursive-tree-2"#] }, + fixed_array: SeqSize { header: Header::None, proven_by: &[r#"sizes-packed/fixed-4"#, r#"sizes-packed/fixed-1"#, r#"sizes-packed/fixed-2-of-strings"#, r#"sizes-packed/fixed-3-of-options"#] }, + option: OptionSize { none: 1, some: 1, proven_by: &[r#"sizes-packed/option-u8"#, r#"sizes-packed/option-bool"#, r#"sizes-packed/option-string"#, r#"sizes-packed/option-max-3-chars"#, r#"sizes-packed/option-struct"#, r#"sizes-packed/recursive-chain-3"#] }, + struct_: StructSize { header: Header::None, key_extra: None, proven_by: &[r#"sizes-packed/struct-point"#, r#"sizes-packed/struct-empty"#, r#"sizes-packed/struct-mixed"#, r#"sizes-packed/struct-nested"#, r#"sizes-packed/struct-15-fields"#, r#"sizes-packed/struct-16-fields"#, r#"sizes-packed/struct-long-names"#, r#"sizes-packed/recursive-chain-3"#, r#"sizes-packed/recursive-tree-2"#] }, + enum_: EnumSize { tag: EnumTag::VarintIndex, proven_by: &[r#"sizes-packed/enum-color"#, r#"sizes-packed/enum-single"#, r#"sizes-packed/enum-129-variants"#, r#"sizes-packed/enum-long-names"#] }, +}; + +const SIZES_JSON_1: Sizes = Sizes { + feature: r#"sizes-json"#, + scalars: Scalars { + bool: Width { min: 4, max: 5, upper_bound: false, proven_by: &[r#"sizes-json/bool"#] }, + u8: Width { min: 1, max: 3, upper_bound: false, proven_by: &[r#"sizes-json/u8"#] }, + u16: Width { min: 1, max: 5, upper_bound: false, proven_by: &[r#"sizes-json/u16"#] }, + u32: Width { min: 1, max: 10, upper_bound: false, proven_by: &[r#"sizes-json/u32"#] }, + u64: Width { min: 1, max: 20, upper_bound: false, proven_by: &[r#"sizes-json/u64"#] }, + u128: Width { min: 1, max: 39, upper_bound: false, proven_by: &[r#"sizes-json/u128"#] }, + s8: Width { min: 1, max: 4, upper_bound: false, proven_by: &[r#"sizes-json/i8"#] }, + s16: Width { min: 1, max: 6, upper_bound: false, proven_by: &[r#"sizes-json/i16"#] }, + s32: Width { min: 1, max: 11, upper_bound: false, proven_by: &[r#"sizes-json/i32"#] }, + s64: Width { min: 1, max: 20, upper_bound: false, proven_by: &[r#"sizes-json/i64"#] }, + s128: Width { min: 1, max: 40, upper_bound: false, proven_by: &[r#"sizes-json/i128"#] }, + f32: Width { min: 3, max: 16, upper_bound: false, proven_by: &[r#"sizes-json/f32"#] }, + f64: Width { min: 3, max: 24, upper_bound: false, proven_by: &[r#"sizes-json/f64"#] }, + char: Width { min: 3, max: 8, upper_bound: false, proven_by: &[r#"sizes-json/char"#] }, + unit: Width { min: 4, max: 4, upper_bound: false, proven_by: &[r#"sizes-json/unit"#] }, + }, + string: StringSize { + header: Header::Delimited { before: 1, after: 1, between: 0 }, + body: Body::JsonEscaped, + proven_by: &[r#"sizes-json/string-unbounded"#, r#"sizes-json/string-max-0"#, r#"sizes-json/string-max-1"#, r#"sizes-json/string-max-3"#, r#"sizes-json/string-max-7"#, r#"sizes-json/string-max-8"#, r#"sizes-json/string-max-31"#, r#"sizes-json/string-max-32"#, r#"sizes-json/string-max-63"#, r#"sizes-json/string-max-64"#, r#"sizes-json/string-fixed-3"#, r#"sizes-json/string-fixed-8"#, r#"sizes-json/string-fixed-32"#], + }, + array: SeqSize { header: Header::Delimited { before: 1, after: 1, between: 1 }, proven_by: &[r#"sizes-json/array-unbounded"#, r#"sizes-json/array-unbounded-strings"#, r#"sizes-json/array-max-0"#, r#"sizes-json/array-max-1"#, r#"sizes-json/array-max-3"#, r#"sizes-json/array-max-2-of-strings"#, r#"sizes-json/array-max-3-of-options"#, r#"sizes-json/recursive-tree-2"#] }, + fixed_array: SeqSize { header: Header::Delimited { before: 1, after: 1, between: 1 }, proven_by: &[r#"sizes-json/fixed-4"#, r#"sizes-json/fixed-1"#, r#"sizes-json/fixed-2-of-strings"#, r#"sizes-json/fixed-3-of-options"#] }, + option: OptionSize { none: 4, some: 0, proven_by: &[r#"sizes-json/option-u8"#, r#"sizes-json/option-bool"#, r#"sizes-json/option-string"#, r#"sizes-json/option-max-3-chars"#, r#"sizes-json/option-struct"#, r#"sizes-json/recursive-chain-3"#] }, + struct_: StructSize { header: Header::Delimited { before: 1, after: 1, between: 1 }, key_extra: Some(3), proven_by: &[r#"sizes-json/struct-point"#, r#"sizes-json/struct-empty"#, r#"sizes-json/struct-mixed"#, r#"sizes-json/struct-nested"#, r#"sizes-json/struct-15-fields"#, r#"sizes-json/struct-16-fields"#, r#"sizes-json/struct-long-names"#, r#"sizes-json/recursive-chain-3"#, r#"sizes-json/recursive-tree-2"#] }, + enum_: EnumSize { tag: EnumTag::Name(Header::Delimited { before: 1, after: 1, between: 0 }), proven_by: &[r#"sizes-json/enum-color"#, r#"sizes-json/enum-single"#, r#"sizes-json/enum-129-variants"#, r#"sizes-json/enum-long-names"#] }, +}; + +const SIZES_MSGPACK_1: Sizes = Sizes { + feature: r#"sizes-msgpack"#, + scalars: Scalars { + bool: Width { min: 1, max: 1, upper_bound: false, proven_by: &[r#"sizes-msgpack/bool"#] }, + u8: Width { min: 1, max: 2, upper_bound: false, proven_by: &[r#"sizes-msgpack/u8"#] }, + u16: Width { min: 1, max: 3, upper_bound: false, proven_by: &[r#"sizes-msgpack/u16"#] }, + u32: Width { min: 1, max: 5, upper_bound: false, proven_by: &[r#"sizes-msgpack/u32"#] }, + u64: Width { min: 1, max: 9, upper_bound: false, proven_by: &[r#"sizes-msgpack/u64"#] }, + u128: Width { min: 18, max: 18, upper_bound: false, proven_by: &[r#"sizes-msgpack/u128"#] }, + s8: Width { min: 1, max: 2, upper_bound: false, proven_by: &[r#"sizes-msgpack/i8"#] }, + s16: Width { min: 1, max: 3, upper_bound: false, proven_by: &[r#"sizes-msgpack/i16"#] }, + s32: Width { min: 1, max: 5, upper_bound: false, proven_by: &[r#"sizes-msgpack/i32"#] }, + s64: Width { min: 1, max: 9, upper_bound: false, proven_by: &[r#"sizes-msgpack/i64"#] }, + s128: Width { min: 18, max: 18, upper_bound: false, proven_by: &[r#"sizes-msgpack/i128"#] }, + f32: Width { min: 5, max: 5, upper_bound: false, proven_by: &[r#"sizes-msgpack/f32"#] }, + f64: Width { min: 9, max: 9, upper_bound: false, proven_by: &[r#"sizes-msgpack/f64"#] }, + char: Width { min: 2, max: 5, upper_bound: false, proven_by: &[r#"sizes-msgpack/char"#] }, + unit: Width { min: 1, max: 1, upper_bound: false, proven_by: &[r#"sizes-msgpack/unit"#] }, + }, + string: StringSize { + header: Header::MsgpackStr, + body: Body::Utf8, + proven_by: &[r#"sizes-msgpack/string-unbounded"#, r#"sizes-msgpack/string-max-0"#, r#"sizes-msgpack/string-max-1"#, r#"sizes-msgpack/string-max-3"#, r#"sizes-msgpack/string-max-7"#, r#"sizes-msgpack/string-max-8"#, r#"sizes-msgpack/string-max-31"#, r#"sizes-msgpack/string-max-32"#, r#"sizes-msgpack/string-max-63"#, r#"sizes-msgpack/string-max-64"#, r#"sizes-msgpack/string-max-16384"#, r#"sizes-msgpack/string-fixed-3"#, r#"sizes-msgpack/string-fixed-8"#, r#"sizes-msgpack/string-fixed-32"#], + }, + array: SeqSize { header: Header::MsgpackArray, proven_by: &[r#"sizes-msgpack/array-unbounded"#, r#"sizes-msgpack/array-unbounded-strings"#, r#"sizes-msgpack/array-max-3"#, r#"sizes-msgpack/array-max-15"#, r#"sizes-msgpack/array-max-16"#, r#"sizes-msgpack/array-max-2-of-strings"#, r#"sizes-msgpack/array-max-3-of-options"#, r#"sizes-msgpack/recursive-tree-2"#] }, + fixed_array: SeqSize { header: Header::MsgpackArray, proven_by: &[r#"sizes-msgpack/fixed-4"#, r#"sizes-msgpack/fixed-15"#, r#"sizes-msgpack/fixed-16"#, r#"sizes-msgpack/fixed-1"#, r#"sizes-msgpack/fixed-2-of-strings"#, r#"sizes-msgpack/fixed-3-of-options"#] }, + option: OptionSize { none: 1, some: 0, proven_by: &[r#"sizes-msgpack/option-u8"#, r#"sizes-msgpack/option-bool"#, r#"sizes-msgpack/option-string"#, r#"sizes-msgpack/option-max-3-chars"#, r#"sizes-msgpack/option-struct"#, r#"sizes-msgpack/recursive-chain-3"#] }, + struct_: StructSize { header: Header::MsgpackArray, key_extra: None, proven_by: &[r#"sizes-msgpack/struct-point"#, r#"sizes-msgpack/struct-empty"#, r#"sizes-msgpack/struct-mixed"#, r#"sizes-msgpack/struct-nested"#, r#"sizes-msgpack/struct-15-fields"#, r#"sizes-msgpack/struct-16-fields"#, r#"sizes-msgpack/struct-long-names"#, r#"sizes-msgpack/recursive-chain-3"#, r#"sizes-msgpack/recursive-tree-2"#] }, + enum_: EnumSize { tag: EnumTag::Name(Header::MsgpackStr), proven_by: &[r#"sizes-msgpack/enum-color"#, r#"sizes-msgpack/enum-single"#, r#"sizes-msgpack/enum-129-variants"#, r#"sizes-msgpack/enum-long-names"#] }, +}; + /// Every official encoding, by its wire name. pub const ENCODINGS: &[Encoding] = &[ Encoding { @@ -211,6 +312,7 @@ pub const ENCODINGS: &[Encoding] = &[ frozen_as: None, profile: true, feature: Some(r#"format-packed"#), + sizes: Some(&SIZES_PACKED_1), tags: &[r#"official"#], status: Status::Stable, replaced_by: None, @@ -225,6 +327,7 @@ pub const ENCODINGS: &[Encoding] = &[ frozen_as: None, profile: true, feature: Some(r#"format-json"#), + sizes: Some(&SIZES_JSON_1), tags: &[r#"official"#], status: Status::Stable, replaced_by: None, @@ -239,6 +342,7 @@ pub const ENCODINGS: &[Encoding] = &[ frozen_as: None, profile: true, feature: Some(r#"format-msgpack"#), + sizes: Some(&SIZES_MSGPACK_1), tags: &[r#"official"#], status: Status::Stable, replaced_by: None, @@ -253,6 +357,7 @@ pub const ENCODINGS: &[Encoding] = &[ frozen_as: Some(r#"jsonrpc"#), profile: true, feature: Some(r#"framing-jsonrpc"#), + sizes: None, tags: &[r#"official"#], status: Status::Stable, replaced_by: None, @@ -267,6 +372,7 @@ pub const ENCODINGS: &[Encoding] = &[ frozen_as: Some(r#"datagram"#), profile: true, feature: Some(r#"framing-datagram"#), + sizes: None, tags: &[r#"official"#], status: Status::Stable, replaced_by: None, @@ -281,6 +387,7 @@ pub const ENCODINGS: &[Encoding] = &[ frozen_as: None, profile: true, feature: Some(r#"framing-datagram2"#), + sizes: None, tags: &[r#"official"#], status: Status::Stable, replaced_by: None, @@ -295,6 +402,7 @@ pub const ENCODINGS: &[Encoding] = &[ frozen_as: None, profile: true, feature: Some(r#"framing-datagram3"#), + sizes: None, tags: &[r#"official"#], status: Status::Stable, replaced_by: None, @@ -309,6 +417,7 @@ pub const ENCODINGS: &[Encoding] = &[ frozen_as: None, profile: true, feature: Some(r#"handshake"#), + sizes: None, tags: &[r#"official"#], status: Status::Stable, replaced_by: None, @@ -323,6 +432,7 @@ pub const ENCODINGS: &[Encoding] = &[ frozen_as: None, profile: true, feature: Some(r#"handshake-comline2"#), + sizes: None, tags: &[r#"official"#], status: Status::Stable, replaced_by: None, @@ -337,6 +447,7 @@ pub const ENCODINGS: &[Encoding] = &[ frozen_as: None, profile: false, feature: None, + sizes: None, tags: &[r#"official"#], status: Status::Stable, replaced_by: None, @@ -442,6 +553,30 @@ pub const FEATURES: &[Feature] = &[ replaced_by: None, since: None, }, + Feature { + id: r#"sizes-packed"#, + title: r#"packed sizes"#, + description: r#"how many bytes each kind of value takes in packed@1, each rule proven by values written to exactly its minimum and maximum"#, + status: Status::Stable, + replaced_by: None, + since: None, + }, + Feature { + id: r#"sizes-msgpack"#, + title: r#"MessagePack sizes"#, + description: r#"how many bytes each kind of value takes in msgpack@1, each rule proven by values written to exactly its minimum and maximum"#, + status: Status::Stable, + replaced_by: None, + since: None, + }, + Feature { + id: r#"sizes-json"#, + title: r#"JSON sizes"#, + description: r#"how many bytes each kind of value takes in json@1, each rule proven by values written to exactly its minimum and maximum, or by a declared upper bound"#, + status: Status::Stable, + replaced_by: None, + since: None, + }, ]; /// Guarantee ids. @@ -498,11 +633,15 @@ pub mod feature { pub const FORMAT_JSON: &str = r#"format-json"#; pub const FORMAT_MSGPACK: &str = r#"format-msgpack"#; pub const FORMAT_PACKED: &str = r#"format-packed"#; + pub const SIZES_PACKED: &str = r#"sizes-packed"#; + pub const SIZES_MSGPACK: &str = r#"sizes-msgpack"#; + pub const SIZES_JSON: &str = r#"sizes-json"#; } /// The catalog's sets. pub mod sets { pub const GUARANTEES: &[&str] = &[r#"schema_agreement"#, r#"encoding_agreement"#, r#"encoding_conformance"#, r#"version_honesty"#, r#"bounded_size"#]; + pub const SCOPES: &[&str] = &[r#"package"#, r#"protocol"#, r#"function"#, r#"argument"#, r#"field"#, r#"type"#]; pub const FORMATS: &[&str] = &[r#"packed@1"#, r#"json@1"#, r#"msgpack@1"#]; pub const FRAMINGS: &[&str] = &[r#"jsonrpc@1"#, r#"datagram@1"#, r#"datagram@2"#, r#"datagram@3"#]; pub const HANDSHAKES: &[&str] = &[r#"comline@1"#, r#"comline@2"#, r#"none"#]; @@ -511,7 +650,7 @@ pub mod sets { pub const FORMAT_FACTS: &[&str] = &[r#"struct_fields"#, r#"unknown_field"#, r#"missing_optional"#, r#"enum_variants"#, r#"unknown_variant"#, r#"integer_width"#, r#"output"#]; pub const FRAMING_FACTS: &[&str] = &[r#"calls"#, r#"directions"#, r#"errors"#, r#"payload"#]; pub const HANDSHAKE_FACTS: &[&str] = &[r#"schema_agreement"#, r#"encoding_agreement"#]; - pub const FEATURES: &[&str] = &[r#"name-hash"#, r#"handshake"#, r#"envelope"#, r#"framing-datagram"#, r#"framing-datagram2"#, r#"framing-datagram3"#, r#"handshake-comline2"#, r#"stream"#, r#"framing-jsonrpc"#, r#"format-json"#, r#"format-msgpack"#, r#"format-packed"#]; + pub const FEATURES: &[&str] = &[r#"name-hash"#, r#"handshake"#, r#"envelope"#, r#"framing-datagram"#, r#"framing-datagram2"#, r#"framing-datagram3"#, r#"handshake-comline2"#, r#"stream"#, r#"framing-jsonrpc"#, r#"format-json"#, r#"format-msgpack"#, r#"format-packed"#, r#"sizes-packed"#, r#"sizes-msgpack"#, r#"sizes-json"#]; /// Every alias, with the wire name it resolves to. pub const ALIASES: &[(&str, &str)] = &[(r#"jsonrpc"#, r#"jsonrpc@1"#), (r#"json-rpc"#, r#"jsonrpc@1"#), (r#"jsonrpc-2.0"#, r#"jsonrpc@1"#), (r#"datagram"#, r#"datagram@1"#), (r#"comline.datagram"#, r#"datagram@1"#)]; } diff --git a/runtime/conformance/spec/rust/src/lib.rs b/runtime/conformance/spec/rust/src/lib.rs index cd3531b..f7fffc9 100644 --- a/runtime/conformance/spec/rust/src/lib.rs +++ b/runtime/conformance/spec/rust/src/lib.rs @@ -4,8 +4,8 @@ //! The Comline specification's catalog of shared names, as Rust constants: //! the guarantees, the facts and the values each may take, the official -//! encodings with their aliases, and the wire features, with the sets they -//! form. `catalog/` in the specification is the source; [`catalog`]'s data is +//! encodings with their aliases and their size rules, and the wire features, +//! with the sets they form. `catalog/` in the specification is the source; [`catalog`]'s data is //! generated from it by `specs/check.sh`, and CI fails when it's stale. //! //! The ids are published names: they never change. A rename adds an entry and @@ -52,6 +52,38 @@ pub enum Origin { Type, } +/// Where an `@unverified` marker may sit, outermost to innermost. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum Scope { + /// The whole package. + Package, + /// A protocol in it. + Protocol, + /// A function of a protocol. + Function, + /// An argument of a function. + Argument, + /// A field of a type. + Field, + /// A type. + Type, +} + +impl Scope { + /// As the catalog writes it: `package`, `protocol`, `function`, + /// `argument`, `field`, `type`. + pub const fn as_str(self) -> &'static str { + match self { + Scope::Package => "package", + Scope::Protocol => "protocol", + Scope::Function => "function", + Scope::Argument => "argument", + Scope::Field => "field", + Scope::Type => "type", + } + } +} + /// Where an entry stands. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum Status { @@ -69,12 +101,23 @@ pub struct Guarantee { pub title: &'static str, pub description: &'static str, pub comes_from: Origin, + /// Where an `@unverified` marker acknowledging it may sit, outermost to + /// innermost. + pub scopes: &'static [Scope], pub status: Status, pub replaced_by: Option<&'static str>, /// The spec version that introduced it, where the changelog names one. pub since: Option<&'static str>, } +impl Guarantee { + /// Whether an `@unverified` marker acknowledging this guarantee may sit + /// at `scope`. + pub fn allows_scope(&self, scope: Scope) -> bool { + self.scopes.contains(&scope) + } +} + /// One value a fact may take, and what it means. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Value { @@ -120,6 +163,9 @@ pub struct Encoding { pub profile: bool, /// The feature whose vectors prove it. pub feature: Option<&'static str>, + /// How many bytes each kind of value takes: a format's, and only an + /// official format's. `None` is no size rules, not a size of zero. + pub sizes: Option<&'static Sizes>, pub tags: &'static [&'static str], pub status: Status, pub replaced_by: Option<&'static str>, @@ -147,6 +193,272 @@ pub struct Feature { pub since: Option<&'static str>, } +/// A primitive type, as the size rules name it. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum Primitive { + Bool, + U8, + U16, + U32, + U64, + U128, + S8, + S16, + S32, + S64, + S128, + F32, + F64, + Char, + Unit, +} + +impl Primitive { + /// Every primitive, in the order the catalog lists them. + pub const ALL: [Primitive; 15] = [ + Primitive::Bool, + Primitive::U8, + Primitive::U16, + Primitive::U32, + Primitive::U64, + Primitive::U128, + Primitive::S8, + Primitive::S16, + Primitive::S32, + Primitive::S64, + Primitive::S128, + Primitive::F32, + Primitive::F64, + Primitive::Char, + Primitive::Unit, + ]; + + /// As a schema and the catalog write it: `bool`, `u8`, `s64`, `char`... + pub const fn as_str(self) -> &'static str { + match self { + Primitive::Bool => "bool", + Primitive::U8 => "u8", + Primitive::U16 => "u16", + Primitive::U32 => "u32", + Primitive::U64 => "u64", + Primitive::U128 => "u128", + Primitive::S8 => "s8", + Primitive::S16 => "s16", + Primitive::S32 => "s32", + Primitive::S64 => "s64", + Primitive::S128 => "s128", + Primitive::F32 => "f32", + Primitive::F64 => "f64", + Primitive::Char => "char", + Primitive::Unit => "unit", + } + } +} + +/// What a count or a length costs on the wire, ahead of what it measures. +/// `catalog/readme.md` defines each kind. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Header { + /// Nothing: the count is in the type, or isn't said. + None, + /// The count as an unsigned LEB128 varint: 7 bits a byte. + VarintLeb128, + /// A MessagePack string header on a length in bytes: 1 byte up to 31, 2 + /// up to 255, 3 up to 65535, 5 above. + MsgpackStr, + /// A MessagePack array header on an item count: 1 byte up to 15, 3 up to + /// 65535, 5 above. + MsgpackArray, + /// Delimiters around the items, and a separator between two: `before` + /// bytes, the items with `between` bytes between each two, `after` bytes. + Delimited { before: u64, after: u64, between: u64 }, +} + +impl Header { + /// The bytes before and after what `count` measures, apart from the + /// separators between items (see [`Header::between`]). + pub const fn len(&self, count: u64) -> u64 { + match *self { + Header::None => 0, + Header::VarintLeb128 => { + let mut bytes = 1; + // 7 bits a byte, so 10 bytes hold 64 bits. + while bytes < 10 && count >> (7 * bytes) != 0 { + bytes += 1; + } + bytes + } + Header::MsgpackStr => match count { + 0..=31 => 1, + 32..=255 => 2, + 256..=65535 => 3, + _ => 5, + }, + Header::MsgpackArray => match count { + 0..=15 => 1, + 16..=65535 => 3, + _ => 5, + }, + Header::Delimited { before, after, .. } => before + after, + } + } + + /// The bytes between two consecutive items: only a delimited sequence + /// has any. + pub const fn between(&self) -> u64 { + match *self { + Header::Delimited { between, .. } => between, + _ => 0, + } + } +} + +/// How a string's characters are written. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Body { + /// UTF-8: 1 to 4 bytes a character. + Utf8, + /// A JSON string's contents: 1 to 6 bytes a character (`\u0001` is 6). + JsonEscaped, +} + +impl Body { + /// The most bytes one character takes. + pub const fn max_per_char(self) -> u64 { + match self { + Body::Utf8 => 4, + Body::JsonEscaped => 6, + } + } +} + +/// The bytes a kind of value takes: at least `min`, at most `max`. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct Width { + pub min: u64, + pub max: u64, + /// `max` is a bound that no witness reaches: the longest value may be + /// shorter. Otherwise some value takes exactly `max` bytes. + pub upper_bound: bool, + /// The vector cases that prove it. + pub proven_by: &'static [&'static str], +} + +/// The bytes of each primitive. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct Scalars { + pub bool: Width, + pub u8: Width, + pub u16: Width, + pub u32: Width, + pub u64: Width, + pub u128: Width, + pub s8: Width, + pub s16: Width, + pub s32: Width, + pub s64: Width, + pub s128: Width, + pub f32: Width, + pub f64: Width, + pub char: Width, + pub unit: Width, +} + +impl Scalars { + /// The rule of one primitive. + pub const fn of(&self, primitive: Primitive) -> &Width { + match primitive { + Primitive::Bool => &self.bool, + Primitive::U8 => &self.u8, + Primitive::U16 => &self.u16, + Primitive::U32 => &self.u32, + Primitive::U64 => &self.u64, + Primitive::U128 => &self.u128, + Primitive::S8 => &self.s8, + Primitive::S16 => &self.s16, + Primitive::S32 => &self.s32, + Primitive::S64 => &self.s64, + Primitive::S128 => &self.s128, + Primitive::F32 => &self.f32, + Primitive::F64 => &self.f64, + Primitive::Char => &self.char, + Primitive::Unit => &self.unit, + } + } +} + +/// A string, a `char[max N]` or a `char[N]`: a header on the length in bytes, +/// then the characters. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct StringSize { + pub header: Header, + pub body: Body, + pub proven_by: &'static [&'static str], +} + +/// An array, `T[]`, `T[max N]` or `T[N]`: a header on the item count, then +/// the items. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct SeqSize { + pub header: Header, + pub proven_by: &'static [&'static str], +} + +/// An option: `none` bytes when absent, `some` bytes and the value when +/// present. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct OptionSize { + pub none: u64, + pub some: u64, + pub proven_by: &'static [&'static str], +} + +/// A struct: a header on the field count, then the fields, each with its +/// name's bytes and `key_extra` more when `key_extra` is set. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct StructSize { + pub header: Header, + pub key_extra: Option, + pub proven_by: &'static [&'static str], +} + +/// How an enum's variant is told. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum EnumTag { + /// Its index, as a LEB128 varint. + VarintIndex, + /// Its name, behind a header on the name's length in bytes. + Name(Header), +} + +/// An enum of unit variants. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct EnumSize { + pub tag: EnumTag, + pub proven_by: &'static [&'static str], +} + +/// How many bytes each kind of value of a format takes, as data a type's +/// range is computed from. Every rule is proven by the vector cases it +/// lists, in `vectors/.json`. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct Sizes { + /// The feature whose vectors prove the rules. + pub feature: &'static str, + pub scalars: Scalars, + pub string: StringSize, + pub array: SeqSize, + pub fixed_array: SeqSize, + pub option: OptionSize, + pub struct_: StructSize, + pub enum_: EnumSize, +} + +/// The size rules of the official format whose wire name is `id`. +pub fn sizes(id: &str) -> Option<&'static Sizes> { + encoding(id).and_then(|e| e.sizes) +} + /// The guarantee `id`. pub fn guarantee(id: &str) -> Option<&'static Guarantee> { GUARANTEES.iter().find(|g| g.id == id) @@ -226,6 +538,137 @@ mod tests { } } + #[test] + fn every_guarantee_has_scopes_in_order() { + let rank = |s: &Scope| sets::SCOPES.iter().position(|id| *id == s.as_str()).unwrap(); + for g in GUARANTEES { + assert!(!g.scopes.is_empty(), "{}", g.id); + assert!(g.scopes.windows(2).all(|w| rank(&w[0]) < rank(&w[1])), "{}", g.id); + assert_eq!(g.comes_from == Origin::Type, g.allows_scope(Scope::Type), "{}", g.id); + } + } + + #[test] + fn a_type_guarantee_reaches_below_the_protocol() { + let bounded = guarantee(guarantee::BOUNDED_SIZE).unwrap(); + assert!(bounded.allows_scope(Scope::Field)); + assert!(!bounded.allows_scope(Scope::Package)); + let agreement = guarantee(guarantee::SCHEMA_AGREEMENT).unwrap(); + assert!(agreement.allows_scope(Scope::Package) && agreement.allows_scope(Scope::Protocol)); + assert!(!agreement.allows_scope(Scope::Field)); + } + + #[test] + fn scopes_match_their_set() { + let all = [ + Scope::Package, + Scope::Protocol, + Scope::Function, + Scope::Argument, + Scope::Field, + Scope::Type, + ]; + assert!(all.iter().map(|s| s.as_str()).eq(sets::SCOPES.iter().copied())); + } + + fn sizes_of(id: &str) -> &'static Sizes { + sizes(id).expect("an official format has size rules") + } + + fn range(width: &Width) -> (u64, u64) { + (width.min, width.max) + } + + #[test] + fn scalar_widths_are_what_each_format_writes() { + let packed = sizes_of(encoding::PACKED_1); + assert_eq!(range(&packed.scalars.u32), (4, 4)); + assert_eq!(range(&packed.scalars.char), (1, 4)); + assert_eq!(range(&packed.scalars.unit), (0, 0)); + let msgpack = sizes_of(encoding::MSGPACK_1); + assert_eq!(range(&msgpack.scalars.u64), (1, 9)); + assert_eq!(range(&msgpack.scalars.u128), (18, 18)); + let json = sizes_of(encoding::JSON_1); + assert_eq!(range(json.scalars.of(Primitive::S64)), (1, 20)); + assert_eq!(range(&json.scalars.f64), (3, 24)); + assert_eq!(range(&json.scalars.f32), (3, 16)); + assert_eq!(range(&json.scalars.char), (3, 8)); + } + + #[test] + fn no_official_rule_is_only_an_upper_bound() { + for id in sets::FORMATS { + for p in Primitive::ALL { + assert!(!sizes_of(id).scalars.of(p).upper_bound, "{id} {}", p.as_str()); + } + } + } + + #[test] + fn only_the_official_formats_have_sizes() { + for e in ENCODINGS { + assert_eq!(e.sizes.is_some(), e.kind == Kind::Format, "{}", e.id); + } + for id in sets::FORMATS { + assert!(sizes(id).is_some(), "{id}"); + } + assert!(sizes(encoding::DATAGRAM_3).is_none()); + assert!(sizes("com.acme.custom-format").is_none()); + } + + #[test] + fn every_rule_is_proven_by_cases_in_its_feature() { + for id in sets::FORMATS { + let s = sizes_of(id); + assert!(feature(s.feature).is_some(), "{id}"); + let prefix_ok = |proofs: &[&str]| { + !proofs.is_empty() && proofs.iter().all(|c| c.strip_prefix(s.feature).is_some_and(|r| r.starts_with('/'))) + }; + for p in Primitive::ALL { + let w = s.scalars.of(p); + assert!(w.min <= w.max && prefix_ok(w.proven_by), "{id} {}", p.as_str()); + } + assert!(prefix_ok(s.string.proven_by), "{id} string"); + assert!(prefix_ok(s.array.proven_by), "{id} array"); + assert!(prefix_ok(s.fixed_array.proven_by), "{id} fixed_array"); + assert!(prefix_ok(s.option.proven_by), "{id} option"); + assert!(prefix_ok(s.struct_.proven_by), "{id} struct"); + assert!(prefix_ok(s.enum_.proven_by), "{id} enum"); + } + } + + #[test] + fn headers_grow_with_the_count() { + for (count, expected) in [(0, 1), (127, 1), (128, 2), (16383, 2), (16384, 3), (2097151, 3), (2097152, 4), (u64::MAX, 10)] { + assert_eq!(Header::VarintLeb128.len(count), expected, "varint {count}"); + } + for (count, expected) in [(0, 1), (31, 1), (32, 2), (255, 2), (256, 3), (65535, 3), (65536, 5)] { + assert_eq!(Header::MsgpackStr.len(count), expected, "str {count}"); + } + for (count, expected) in [(0, 1), (15, 1), (16, 3), (65535, 3), (65536, 5)] { + assert_eq!(Header::MsgpackArray.len(count), expected, "array {count}"); + } + let delimited = Header::Delimited { before: 1, after: 1, between: 1 }; + assert_eq!((delimited.len(0), delimited.len(1000), delimited.between()), (2, 2, 1)); + assert_eq!((Header::None.len(7), Header::None.between()), (0, 0)); + } + + #[test] + fn each_format_writes_structs_and_enums_as_its_facts_say() { + let packed = sizes_of(encoding::PACKED_1); + assert_eq!(packed.struct_.header, Header::None); + assert_eq!(packed.struct_.key_extra, None); + assert_eq!(packed.enum_.tag, EnumTag::VarintIndex); + let msgpack = sizes_of(encoding::MSGPACK_1); + assert_eq!(msgpack.struct_.header, Header::MsgpackArray); + assert_eq!(msgpack.enum_.tag, EnumTag::Name(Header::MsgpackStr)); + let json = sizes_of(encoding::JSON_1); + assert_eq!(json.struct_.key_extra, Some(3)); + assert_eq!(json.string.body, Body::JsonEscaped); + assert_eq!((json.option.none, json.option.some), (4, 0)); + assert_eq!((packed.option.none, packed.option.some), (1, 1)); + } + #[test] fn the_spec_version_is_a_version() { let (major, minor) = SPEC_VERSION.split_once('.').unwrap(); diff --git a/runtime/conformance/spec/specs/check.sh b/runtime/conformance/spec/specs/check.sh index 73fb484..7e961e2 100755 --- a/runtime/conformance/spec/specs/check.sh +++ b/runtime/conformance/spec/specs/check.sh @@ -2,7 +2,8 @@ # Generates gen/*.schema.json (and benches/bench.schema.json, which ships with # the benches so a vendored copy of them is whole) from the specs, and # features.json, catalog/gen/catalog.json and rust/src/catalog.rs from the -# catalog, and vets every corpus file against them. `--check` fails instead of +# catalog, and vets every corpus file against them (and, with jq, holds the +# size rules to their vectors). `--check` fails instead of # writing when a generated file is stale. set -eu cd "$(dirname "$0")" @@ -95,6 +96,22 @@ for file in ../profiles/*.json; do fi done +# A format's size rules are proven by its size vectors: every rule lists cases +# that exist and show it, every case proves a rule, and every witness is as long +# as its case says (`specs/sizes.jq`). +for file in ../profiles/*.json; do + feature=$(jq -r '.sizes.feature // empty' "$file") + [ -n "$feature" ] || continue + if ! problems=$(jq -n -r --slurpfile profile "$file" --slurpfile vectors "../vectors/$feature.json" -f sizes.jq); then + echo "$file or ../vectors/$feature.json can't be read as size rules and vectors" >&2 + failed=1 + elif [ -n "$problems" ]; then + echo "$file's size rules aren't proven by ../vectors/$feature.json:" >&2 + echo "$problems" >&2 + failed=1 + fi +done + # Not the schema the benches ship with. vet Bench $(ls ../benches/*.json | grep -v '/bench\.schema\.json$') vet Features ../features.json diff --git a/runtime/conformance/spec/specs/gen/profile.schema.json b/runtime/conformance/spec/specs/gen/profile.schema.json index c7d0187..32ed6b6 100644 --- a/runtime/conformance/spec/specs/gen/profile.schema.json +++ b/runtime/conformance/spec/specs/gen/profile.schema.json @@ -42,9 +42,14 @@ "description": "A vector case's id: `/`.", "pattern": "^[a-z0-9.@_-]+/[a-z0-9.@_-]+$" }, + "CaseRef": { + "type": "string", + "description": "A reference to a vector case, `/`.", + "pattern": "^[a-z0-9.@_-]+/[a-z0-9.@_-]+$" + }, "FormatProfile": { "type": "object", - "description": "A format states every fact.", + "description": "A format states every fact. It may also state how many bytes each kind of\nvalue takes (`sizes`, `catalog/schema.cue`): an official format's are the\ncatalog's, which `specs/check.sh` holds the profile to; a custom format\nwithout them has no size, and nothing guesses one.", "additionalProperties": false, "properties": { "$schema": { @@ -203,6 +208,9 @@ }, "name": { "$ref": "#/$defs/ProfileName" + }, + "sizes": { + "$ref": "#/$defs/Sizes" } }, "required": [ @@ -354,11 +362,112 @@ "name" ] }, + "Header": { + "description": "What a count or a length costs on the wire, ahead of what it measures.\n`catalog/readme.md` defines each kind.", + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "kind": { + "const": "none" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "kind": { + "const": "varint_leb128" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "kind": { + "const": "msgpack_str" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "kind": { + "const": "msgpack_array" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "after": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "minimum": 0 + } + ] + }, + "before": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "minimum": 0 + } + ] + }, + "between": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "minimum": 0 + } + ] + }, + "kind": { + "const": "delimited" + } + }, + "required": [ + "after", + "before", + "between" + ] + } + ] + }, "ProfileName": { "type": "string", "description": "A profile's name: an encoding at a version.", "pattern": "^[a-z0-9._-]+@[0-9]+$" }, + "Proofs": { + "type": "array", + "description": "The cases that prove a rule: at least one, each in the feature the sizes\nname (`specs/check.sh` checks that they exist and show the rule).", + "items": { + "$ref": "#/$defs/CaseRef" + }, + "prefixItems": [ + { + "$ref": "#/$defs/CaseRef" + } + ], + "minItems": 1 + }, "ProvenBy": { "type": "array", "description": "The cases that prove a fact.", @@ -371,6 +480,315 @@ } ], "minItems": 1 + }, + "Sizes": { + "type": "object", + "description": "How many bytes each kind of value of a format takes, as data a compiler\ncomputes a type's range from, and the vectors of `feature` prove: the rule\nof every kind of value has `proven_by` cases. A struct, an enum and an\narray are as the format's facts say (`struct_fields`, `enum_variants`).\nUnions, and enums with fields, are not here: no generator writes one.", + "additionalProperties": false, + "properties": { + "array": { + "type": "object", + "description": "`T[]` and `T[max N]`: a header on the item count, then the items.", + "additionalProperties": false, + "properties": { + "header": { + "$ref": "#/$defs/Header" + }, + "proven_by": { + "$ref": "#/$defs/Proofs" + } + }, + "required": [ + "header", + "proven_by" + ] + }, + "enum": { + "description": "A unit variant: by its index as a varint, or by its name behind a header\non the name's length.", + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "proven_by": { + "$ref": "#/$defs/Proofs" + }, + "tag": { + "const": "varint_index" + } + }, + "required": [ + "proven_by", + "tag" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "header": { + "$ref": "#/$defs/Header" + }, + "proven_by": { + "$ref": "#/$defs/Proofs" + }, + "tag": { + "const": "name" + } + }, + "required": [ + "header", + "proven_by", + "tag" + ] + } + ] + }, + "feature": { + "description": "The feature whose vectors, `vectors/.json`, prove the rules.", + "enum": [ + "name-hash", + "handshake", + "envelope", + "framing-datagram", + "framing-datagram2", + "framing-datagram3", + "handshake-comline2", + "stream", + "framing-jsonrpc", + "format-json", + "format-msgpack", + "format-packed", + "sizes-packed", + "sizes-msgpack", + "sizes-json" + ] + }, + "fixed_array": { + "type": "object", + "description": "`T[N]`: a header on N, then the items.", + "additionalProperties": false, + "properties": { + "header": { + "$ref": "#/$defs/Header" + }, + "proven_by": { + "$ref": "#/$defs/Proofs" + } + }, + "required": [ + "header", + "proven_by" + ] + }, + "option": { + "type": "object", + "description": "`none` bytes for an absent value, `some` bytes and the value for a\npresent one.", + "additionalProperties": false, + "properties": { + "none": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "minimum": 0 + } + ] + }, + "proven_by": { + "$ref": "#/$defs/Proofs" + }, + "some": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "minimum": 0 + } + ] + } + }, + "required": [ + "none", + "proven_by", + "some" + ] + }, + "scalars": { + "type": "object", + "additionalProperties": false, + "properties": { + "bool": { + "$ref": "#/$defs/Width" + }, + "char": { + "$ref": "#/$defs/Width" + }, + "f32": { + "$ref": "#/$defs/Width" + }, + "f64": { + "$ref": "#/$defs/Width" + }, + "s128": { + "$ref": "#/$defs/Width" + }, + "s16": { + "$ref": "#/$defs/Width" + }, + "s32": { + "$ref": "#/$defs/Width" + }, + "s64": { + "$ref": "#/$defs/Width" + }, + "s8": { + "$ref": "#/$defs/Width" + }, + "u128": { + "$ref": "#/$defs/Width" + }, + "u16": { + "$ref": "#/$defs/Width" + }, + "u32": { + "$ref": "#/$defs/Width" + }, + "u64": { + "$ref": "#/$defs/Width" + }, + "u8": { + "$ref": "#/$defs/Width" + }, + "unit": { + "$ref": "#/$defs/Width" + } + }, + "required": [ + "bool", + "char", + "f32", + "f64", + "s128", + "s16", + "s32", + "s64", + "s8", + "u128", + "u16", + "u32", + "u64", + "u8", + "unit" + ] + }, + "string": { + "type": "object", + "description": "A string, a `char[max N]` and a `char[N]`: a header on the length in\nbytes, then the characters.", + "additionalProperties": false, + "properties": { + "body": { + "enum": [ + "utf8", + "json_escaped" + ] + }, + "header": { + "$ref": "#/$defs/Header" + }, + "proven_by": { + "$ref": "#/$defs/Proofs" + } + }, + "required": [ + "body", + "header", + "proven_by" + ] + }, + "struct": { + "type": "object", + "description": "A header on the field count, then the fields. With `key_extra`, each\nfield also takes its name's bytes and `key_extra` more.", + "additionalProperties": false, + "properties": { + "header": { + "$ref": "#/$defs/Header" + }, + "key_extra": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "minimum": 0 + } + ] + }, + "proven_by": { + "$ref": "#/$defs/Proofs" + } + }, + "required": [ + "header", + "proven_by" + ] + } + }, + "required": [ + "array", + "enum", + "feature", + "fixed_array", + "option", + "scalars", + "string", + "struct" + ] + }, + "Width": { + "type": "object", + "description": "The bytes a kind of value takes: at least `min`, at most `max`. With\n`upper_bound`, `max` is only a bound that no witness reaches: the longest\nvalue may be shorter.", + "additionalProperties": false, + "properties": { + "max": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "minimum": 0 + } + ] + }, + "min": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "minimum": 0 + } + ] + }, + "proven_by": { + "$ref": "#/$defs/Proofs" + }, + "upper_bound": { + "const": true + } + }, + "required": [ + "max", + "min", + "proven_by" + ] } }, "description": "`profiles/.json`: facts about how an encoding encodes, each naming\nthe vector cases that prove it. Which facts each kind states, and the\nvalues each may take, are the catalog's (`catalog/facts.cue`).", diff --git a/runtime/conformance/spec/specs/gen/vectors.schema.json b/runtime/conformance/spec/specs/gen/vectors.schema.json index ff3b4b2..a6fba87 100644 --- a/runtime/conformance/spec/specs/gen/vectors.schema.json +++ b/runtime/conformance/spec/specs/gen/vectors.schema.json @@ -724,6 +724,26 @@ "input", "op" ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "$ref": "#/$defs/CaseId" + }, + "input": { + "$ref": "#/$defs/SizeInput" + }, + "op": { + "const": "size" + } + }, + "required": [ + "id", + "input", + "op" + ] } ] }, @@ -1489,6 +1509,11 @@ "value" ] }, + "EncodingName": { + "type": "string", + "description": "A wire format's or a framing's name, versioned or not, namespaced or not.", + "pattern": "^[a-z0-9._-]+(@[0-9]+)?$" + }, "Expect": { "description": "By default, exact.", "enum": [ @@ -1788,6 +1813,382 @@ "description": "A signed integer as a decimal string.", "pattern": "^(0|-?[1-9][0-9]*)$" }, + "SizeBytes": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "maximum": 9007199254740991, + "minimum": 0 + } + ] + }, + "SizeInput": { + "type": "object", + "description": "How many bytes a type takes in a format: at least `min`, at most `max` (`null`:\nno bound), and values written to each, as `witnesses`. A `size` case has no\n`bytes`: each witness has its own. The numbers are at most 2^53, so a JSON\nreader that holds numbers as doubles keeps them exact.\n\n- `witnesses.min` encodes to exactly `min` bytes.\n- `witnesses.max` encodes to exactly `max` bytes. It is left out when `max`\n is `null`, which no value reaches, and when `upper_bound` is `true`: then\n `max` is only a bound that no value is known to reach.\n- Every value in `between` encodes to a length from `min` to `max`.\n\nEncoding a witness's `value` as `type` in `format` gives its `bytes`\nexactly (not `compare`d as JSON, so a float's text counts too).", + "additionalProperties": false, + "properties": { + "format": { + "$ref": "#/$defs/EncodingName" + }, + "max": { + "anyOf": [ + { + "type": "null" + }, + { + "$ref": "#/$defs/SizeBytes" + } + ] + }, + "min": { + "$ref": "#/$defs/SizeBytes" + }, + "type": { + "$ref": "#/$defs/SizeType" + }, + "upper_bound": { + "const": true + }, + "witnesses": { + "type": "object", + "additionalProperties": false, + "properties": { + "between": { + "type": "array", + "items": { + "$ref": "#/$defs/Witness" + } + }, + "max": { + "$ref": "#/$defs/Witness" + }, + "min": { + "$ref": "#/$defs/Witness" + } + }, + "required": [ + "min" + ] + } + }, + "required": [ + "format", + "max", + "min", + "type", + "witnesses" + ] + }, + "SizeType": { + "description": "A type a `size` case gives the range of: `#Type`, and `fixed_string` for\n`char[N]`, a string of exactly N characters. The sizes of `string`,\n`bounded_string` and `fixed_string` count characters (Unicode scalar\nvalues), as `char[max N]` does.", + "anyOf": [ + { + "const": "bool" + }, + { + "const": "u8" + }, + { + "const": "u16" + }, + { + "const": "u32" + }, + { + "const": "u64" + }, + { + "const": "u128" + }, + { + "const": "i8" + }, + { + "const": "i16" + }, + { + "const": "i32" + }, + { + "const": "i64" + }, + { + "const": "i128" + }, + { + "const": "f32" + }, + { + "const": "f64" + }, + { + "const": "string" + }, + { + "const": "char" + }, + { + "const": "unit" + }, + { + "const": "self" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "bounded_string": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "maximum": 4294967295, + "minimum": 0 + } + ] + } + }, + "required": [ + "max" + ] + } + }, + "required": [ + "bounded_string" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "fixed_string": { + "type": "object", + "additionalProperties": false, + "properties": { + "len": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "maximum": 4294967295, + "minimum": 0 + } + ] + } + }, + "required": [ + "len" + ] + } + }, + "required": [ + "fixed_string" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "option": { + "$ref": "#/$defs/SizeType" + } + }, + "required": [ + "option" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "array": { + "$ref": "#/$defs/SizeType" + } + }, + "required": [ + "array" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "fixed": { + "type": "object", + "additionalProperties": false, + "properties": { + "len": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "minimum": 0 + } + ] + }, + "of": { + "$ref": "#/$defs/SizeType" + } + }, + "required": [ + "len", + "of" + ] + } + }, + "required": [ + "fixed" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "bounded_array": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "maximum": 4294967295, + "minimum": 0 + } + ] + }, + "of": { + "$ref": "#/$defs/SizeType" + } + }, + "required": [ + "max", + "of" + ] + } + }, + "required": [ + "bounded_array" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "recursive": { + "type": "object", + "additionalProperties": false, + "properties": { + "max_depth": { + "allOf": [ + { + "type": "number" + }, + { + "type": "integer", + "maximum": 4294967295, + "minimum": 0 + } + ] + }, + "of": { + "$ref": "#/$defs/SizeType" + } + }, + "required": [ + "max_depth", + "of" + ] + } + }, + "required": [ + "recursive" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "struct": { + "type": "object", + "additionalProperties": false, + "properties": { + "fields": { + "type": "array", + "items": { + "type": "array", + "prefixItems": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/SizeType" + } + ], + "maxItems": 2, + "minItems": 2 + } + }, + "name": { + "type": "string" + } + }, + "required": [ + "fields", + "name" + ] + } + }, + "required": [ + "struct" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "enum": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "variants": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "name", + "variants" + ] + } + }, + "required": [ + "enum" + ] + } + ] + }, "StreamSplitInput": { "type": "object", "additionalProperties": false, @@ -2482,6 +2883,22 @@ } } ] + }, + "Witness": { + "type": "object", + "additionalProperties": false, + "properties": { + "bytes": { + "$ref": "#/$defs/Hex" + }, + "value": { + "$ref": "#/$defs/Value" + } + }, + "required": [ + "bytes", + "value" + ] } }, "type": "object", diff --git a/runtime/conformance/spec/specs/profile.cue b/runtime/conformance/spec/specs/profile.cue index 7c92626..c06caaa 100644 --- a/runtime/conformance/spec/specs/profile.cue +++ b/runtime/conformance/spec/specs/profile.cue @@ -7,7 +7,10 @@ import "github.com/comlineproject/specification/catalog" // values each may take, are the catalog's (`catalog/facts.cue`). #Profile: #FormatProfile | #FramingProfile | #HandshakeProfile -// A format states every fact. +// A format states every fact. It may also state how many bytes each kind of +// value takes (`sizes`, `catalog/schema.cue`): an official format's are the +// catalog's, which `specs/check.sh` holds the profile to; a custom format +// without them has no size, and nothing guesses one. #FormatProfile: close({ $schema?: string name!: #ProfileName @@ -17,6 +20,7 @@ import "github.com/comlineproject/specification/catalog" (id)!: close({value!: or([for v, _ in fact.values {v}]), proven_by!: #ProvenBy}) } }) + sizes?: catalog.#Sizes }) // A framing states every fact. diff --git a/runtime/conformance/spec/specs/readme.md b/runtime/conformance/spec/specs/readme.md index ae41769..b01fc8f 100644 --- a/runtime/conformance/spec/specs/readme.md +++ b/runtime/conformance/spec/specs/readme.md @@ -14,7 +14,7 @@ runtime that vendors `benches/` alone has it. | `#Support` | `support/.json`, in each runtime's repository | [`support.cue`](support.cue) | | `#Vectors` | `vectors/*.json` | [`vectors.cue`](vectors.cue) | -Values and types (`#Value`, `#Type`) are in [`types.cue`](types.cue), and what +Values and types (`#Value`, `#Type`, `#SizeType`) are in [`types.cue`](types.cue), and what the others share in [`common.cue`](common.cue). Which facts a profile states, and their values, come from [the catalog](../catalog/readme.md), which the specs import: the CUE module (`cue.mod/`) is the repository's root, so run @@ -26,7 +26,10 @@ file: a third party's needn't have one. `./check.sh` regenerates `gen/` and `benches/bench.schema.json` from the specs, and `../features.json` and `../catalog/gen/catalog.json` from the catalog, and vets every file. It also checks that `profiles/` and `vectors/` -hold exactly what the catalog names. CI runs `./check.sh --check`, which fails +hold exactly what the catalog names, and, with [`jq`](https://jqlang.github.io/jq/) +([`sizes.jq`](sizes.jq)), that each format's size rules are proven by its +size vectors: every rule lists cases that exist and show it, every case proves +a rule, and every witness is as long as its case says. CI runs `./check.sh --check`, which fails instead when a generated file is stale. It needs [`cue`](https://cuelang.org) at the version `.github/workflows/check.yml` pins. diff --git a/runtime/conformance/spec/specs/sizes.jq b/runtime/conformance/spec/specs/sizes.jq new file mode 100644 index 0000000..c159b89 --- /dev/null +++ b/runtime/conformance/spec/specs/sizes.jq @@ -0,0 +1,93 @@ +# Holds a format's size rules to its size vectors: `specs/check.sh` runs this +# with the format's profile ($profile) and the vectors of the feature its +# `sizes` name ($vectors), and fails on any line it prints. +# +# - every rule lists cases that exist, in that feature, for that format, and +# whose type has the rule's kind of value in it; +# - a scalar's rule is proven by the case whose type is that scalar alone, +# and states the same bounds as the case; +# - every case proves some rule; +# - each witness is as long as its case says: `min` and `max` exactly, a +# `between` within them; `max` has a witness unless it is `null` or an +# upper bound. +# - the facts and the sizes agree on how structs and enums are written. + +# The kinds of value a type is built of: its scalars' and constructors' names. +def kinds: + if type == "string" then [.] + else + to_entries[0] as $e + | [$e.key] + ( + if $e.key == "option" or $e.key == "array" then ($e.value | kinds) + elif $e.key == "fixed" or $e.key == "bounded_array" or $e.key == "recursive" then ($e.value.of | kinds) + elif $e.key == "struct" then ([$e.value.fields[][1] | kinds] | add // []) + else [] end) + end; + +# A scalar as a type spells it: `s8` is `i8`. +def as_type: if test("^s[0-9]+$") then "i" + .[1:] else . end; + +def has_kind($ks; $k): $ks | any(. == $k); + +# Whether a type with these kinds shows the rule. +def shows($rule; $ks): + if ($rule | startswith("scalars.")) then has_kind($ks; $rule | ltrimstr("scalars.") | as_type) + elif $rule == "string" then ($ks | any(. == "string" or . == "bounded_string" or . == "fixed_string")) + elif $rule == "array" then ($ks | any(. == "array" or . == "bounded_array")) + elif $rule == "fixed_array" then has_kind($ks; "fixed") + else has_kind($ks; $rule) end; + +def bytes_len: (.bytes | length) / 2; + +$profile[0] as $p +| $vectors[0] as $v +| $p.sizes as $s +| ([$s.scalars | to_entries[] | {rule: ("scalars." + .key), rule_def: .value}] + + [("string", "array", "fixed_array", "option", "struct", "enum") as $k | {rule: $k, rule_def: $s[$k]}]) as $rules +| ($v.cases | map({key: .id, value: .}) | from_entries) as $cases +| ([$s.scalars | to_entries[] | select(.value.upper_bound == true) | .key | as_type]) as $upper_types +| ( + # Rules and the cases that prove them. + ($rules[] as $r + | $r.rule_def.proven_by[] as $id + | ($cases[$id]) as $c + | if $c == null then "\($r.rule): no case \($id) in \($s.feature)" + elif ($id | startswith($s.feature + "/")) | not then "\($r.rule): \($id) isn't in \($s.feature)" + elif $c.input.format != $p.name then "\($r.rule): \($id) is for \($c.input.format), not \($p.name)" + elif shows($r.rule; $c.input.type | kinds) | not then "\($r.rule): \($id) has none of it in its type" + elif ($r.rule | startswith("scalars.")) and ($c.input.type != ($r.rule | ltrimstr("scalars.") | as_type)) then + "\($r.rule): \($id) isn't the scalar alone" + elif ($r.rule | startswith("scalars.")) + and ([$c.input.min, $c.input.max, ($c.input.upper_bound // false)] != [$r.rule_def.min, $r.rule_def.max, ($r.rule_def.upper_bound // false)]) then + "\($r.rule): \($id) says [\($c.input.min), \($c.input.max)], the rule [\($r.rule_def.min), \($r.rule_def.max)]" + else empty end), + # Every case proves something. + ($v.cases[] as $c + | select([$rules[].rule_def.proven_by[]] | any(. == $c.id) | not) + | "\($c.id): proves no rule"), + # Witnesses. + ($v.cases[] as $c + | $c.input as $i + | ($i.type | kinds) as $ks + | (if $c.op != "size" then "\($c.id): not a size case" else empty end), + (if $i.format != $p.name then "\($c.id): for \($i.format), not \($p.name)" else empty end), + (if $i.max != null and $i.max < $i.min then "\($c.id): max under min" else empty end), + (if (($i.upper_bound // false) != ($ks | any(. as $k | $upper_types | any(. == $k)))) and ($i.format == $p.name) + then "\($c.id): upper_bound doesn't follow the scalars' rules" else empty end), + ($i.witnesses.min | select(bytes_len != $i.min) | "\($c.id): the min witness is \(bytes_len) bytes, not \($i.min)"), + (if $i.max == null or ($i.upper_bound // false) then + (if $i.witnesses.max != null then "\($c.id): a max witness for a max no value is known to reach" else empty end) + else + ($i.witnesses.max // null) as $m + | if $m == null then "\($c.id): no max witness" + elif ($m | bytes_len) != $i.max then "\($c.id): the max witness is \($m | bytes_len) bytes, not \($i.max)" + else empty end + end), + (($i.witnesses.between // [])[] | select(bytes_len < $i.min or ($i.max != null and bytes_len > $i.max)) + | "\($c.id): a between witness of \(bytes_len) bytes is outside [\($i.min), \($i.max)]"), + (if ($i.max == null or ($i.max - $i.min) >= 2) and (($i.witnesses.between // []) | length) == 0 + then "\($c.id): no value between min and max" else empty end)), + # Facts and sizes agree. + (if (($p.facts.struct_fields.value == "by_name") != ($s.struct.key_extra != null)) then "struct: key_extra goes with struct_fields = by_name" else empty end), + (if (($p.facts.enum_variants.value == "by_index") != ($s.enum.tag == "varint_index")) then "enum: varint_index goes with enum_variants = by_index" else empty end) + ) diff --git a/runtime/conformance/spec/specs/types.cue b/runtime/conformance/spec/specs/types.cue index a90cf95..1c0c6a0 100644 --- a/runtime/conformance/spec/specs/types.cue +++ b/runtime/conformance/spec/specs/types.cue @@ -42,3 +42,21 @@ package conformance close({"struct"!: close({name!: string, fields!: [...[string, #Value]]})}) | close({unit_variant!: close({"enum"!: string, index!: uint32, variant!: string})}) | close({unit!: null}) + +// A type a `size` case gives the range of: `#Type`, and `fixed_string` for +// `char[N]`, a string of exactly N characters. The sizes of `string`, +// `bounded_string` and `fixed_string` count characters (Unicode scalar +// values), as `char[max N]` does. +#SizeType: + "bool" | "u8" | "u16" | "u32" | "u64" | "u128" | + "i8" | "i16" | "i32" | "i64" | "i128" | + "f32" | "f64" | "string" | "char" | "unit" | "self" | + close({bounded_string!: close({max!: uint32})}) | + close({fixed_string!: close({len!: uint32})}) | + close({option!: #SizeType}) | + close({array!: #SizeType}) | + close({fixed!: close({of!: #SizeType, len!: uint})}) | + close({bounded_array!: close({of!: #SizeType, max!: uint32})}) | + close({recursive!: close({max_depth!: uint32, of!: #SizeType})}) | + close({"struct"!: close({name!: string, fields!: [...[string, #SizeType]]})}) | + close({"enum"!: close({name!: string, variants!: [...string]})}) diff --git a/runtime/conformance/spec/specs/vectors.cue b/runtime/conformance/spec/specs/vectors.cue index 68b00bf..6d6e599 100644 --- a/runtime/conformance/spec/specs/vectors.cue +++ b/runtime/conformance/spec/specs/vectors.cue @@ -35,7 +35,8 @@ package conformance close({id!: #CaseId, bytes!: #Hex, compare?: #Compare, expect!: "reject", op!: "stream_split", input!: close({max!: uint})}) | *close({id!: #CaseId, bytes!: #Hex, compare?: #Compare, expect?: "exact", op!: "comline2_message", input!: #Comline2Message}) | close({id!: #CaseId, bytes!: #Hex, compare?: #Compare, expect!: "reject", op!: "comline2_message", input?: #Comline2Message}) | - close({id!: #CaseId, bytes!: #Hex, compare?: #Compare, expect?: #Expect, op!: "comline2_negotiate", input!: #Comline2Negotiate}) + close({id!: #CaseId, bytes!: #Hex, compare?: #Compare, expect?: #Expect, op!: "comline2_negotiate", input!: #Comline2Negotiate}) | + close({id!: #CaseId, op!: "size", input!: #SizeInput}) // By default, exact. #Expect: "exact" | "reject" @@ -205,3 +206,33 @@ package conformance close({accepted!: #Comline2Negotiated}) | close({refused!: #Comline2Refusal}) }) + +// How many bytes a type takes in a format: at least `min`, at most `max` (`null`: +// no bound), and values written to each, as `witnesses`. A `size` case has no +// `bytes`: each witness has its own. The numbers are at most 2^53, so a JSON +// reader that holds numbers as doubles keeps them exact. +// +// - `witnesses.min` encodes to exactly `min` bytes. +// - `witnesses.max` encodes to exactly `max` bytes. It is left out when `max` +// is `null`, which no value reaches, and when `upper_bound` is `true`: then +// `max` is only a bound that no value is known to reach. +// - Every value in `between` encodes to a length from `min` to `max`. +// +// Encoding a witness's `value` as `type` in `format` gives its `bytes` +// exactly (not `compare`d as JSON, so a float's text counts too). +#SizeInput: close({ + format!: #EncodingName + type!: #SizeType + min!: #SizeBytes + max!: null | #SizeBytes + upper_bound?: true + witnesses!: close({ + min!: #Witness + max?: #Witness + between?: [...#Witness] + }) +}) + +#SizeBytes: uint & <=9007199254740991 + +#Witness: close({value!: #Value, bytes!: #Hex}) diff --git a/runtime/conformance/spec/vectors/sizes-json.json b/runtime/conformance/spec/vectors/sizes-json.json new file mode 100644 index 0000000..884e78a --- /dev/null +++ b/runtime/conformance/spec/vectors/sizes-json.json @@ -0,0 +1,5639 @@ +{ + "$schema": "../specs/gen/vectors.schema.json", + "feature": "sizes-json", + "cases": [ + { + "id": "sizes-json/bool", + "op": "size", + "input": { + "format": "json@1", + "max": 5, + "min": 4, + "type": "bool", + "witnesses": { + "max": { + "bytes": "66616c7365", + "value": { + "bool": false + } + }, + "min": { + "bytes": "74727565", + "value": { + "bool": true + } + } + } + } + }, + { + "id": "sizes-json/u8", + "op": "size", + "input": { + "format": "json@1", + "max": 3, + "min": 1, + "type": "u8", + "witnesses": { + "between": [ + { + "bytes": "31", + "value": { + "u8": 1 + } + }, + { + "bytes": "313238", + "value": { + "u8": 128 + } + }, + { + "bytes": "323535", + "value": { + "u8": 255 + } + } + ], + "max": { + "bytes": "313237", + "value": { + "u8": 127 + } + }, + "min": { + "bytes": "30", + "value": { + "u8": 0 + } + } + } + } + }, + { + "id": "sizes-json/u16", + "op": "size", + "input": { + "format": "json@1", + "max": 5, + "min": 1, + "type": "u16", + "witnesses": { + "between": [ + { + "bytes": "313237", + "value": { + "u16": 127 + } + }, + { + "bytes": "313238", + "value": { + "u16": 128 + } + }, + { + "bytes": "323535", + "value": { + "u16": 255 + } + }, + { + "bytes": "323536", + "value": { + "u16": 256 + } + } + ], + "max": { + "bytes": "3635353335", + "value": { + "u16": 65535 + } + }, + "min": { + "bytes": "30", + "value": { + "u16": 0 + } + } + } + } + }, + { + "id": "sizes-json/u32", + "op": "size", + "input": { + "format": "json@1", + "max": 10, + "min": 1, + "type": "u32", + "witnesses": { + "between": [ + { + "bytes": "313237", + "value": { + "u32": 127 + } + }, + { + "bytes": "313238", + "value": { + "u32": 128 + } + }, + { + "bytes": "323535", + "value": { + "u32": 255 + } + }, + { + "bytes": "323536", + "value": { + "u32": 256 + } + }, + { + "bytes": "3635353335", + "value": { + "u32": 65535 + } + }, + { + "bytes": "3635353336", + "value": { + "u32": 65536 + } + } + ], + "max": { + "bytes": "34323934393637323935", + "value": { + "u32": 4294967295 + } + }, + "min": { + "bytes": "30", + "value": { + "u32": 0 + } + } + } + } + }, + { + "id": "sizes-json/u64", + "op": "size", + "input": { + "format": "json@1", + "max": 20, + "min": 1, + "type": "u64", + "witnesses": { + "between": [ + { + "bytes": "313237", + "value": { + "u64": "127" + } + }, + { + "bytes": "313238", + "value": { + "u64": "128" + } + }, + { + "bytes": "323535", + "value": { + "u64": "255" + } + }, + { + "bytes": "323536", + "value": { + "u64": "256" + } + }, + { + "bytes": "3635353335", + "value": { + "u64": "65535" + } + }, + { + "bytes": "3635353336", + "value": { + "u64": "65536" + } + }, + { + "bytes": "34323934393637323935", + "value": { + "u64": "4294967295" + } + }, + { + "bytes": "34323934393637323936", + "value": { + "u64": "4294967296" + } + } + ], + "max": { + "bytes": "3138343436373434303733373039353531363135", + "value": { + "u64": "18446744073709551615" + } + }, + "min": { + "bytes": "30", + "value": { + "u64": "0" + } + } + } + } + }, + { + "id": "sizes-json/u128", + "op": "size", + "input": { + "format": "json@1", + "max": 39, + "min": 1, + "type": "u128", + "witnesses": { + "between": [ + { + "bytes": "31", + "value": { + "u128": "1" + } + }, + { + "bytes": "3138343436373434303733373039353531363136", + "value": { + "u128": "18446744073709551616" + } + } + ], + "max": { + "bytes": "333430323832333636393230393338343633343633333734363037343331373638323131343535", + "value": { + "u128": "340282366920938463463374607431768211455" + } + }, + "min": { + "bytes": "30", + "value": { + "u128": "0" + } + } + } + } + }, + { + "id": "sizes-json/i8", + "op": "size", + "input": { + "format": "json@1", + "max": 4, + "min": 1, + "type": "i8", + "witnesses": { + "between": [ + { + "bytes": "2d31", + "value": { + "i8": -1 + } + }, + { + "bytes": "2d3332", + "value": { + "i8": -32 + } + }, + { + "bytes": "2d3333", + "value": { + "i8": -33 + } + }, + { + "bytes": "313237", + "value": { + "i8": 127 + } + } + ], + "max": { + "bytes": "2d313238", + "value": { + "i8": -128 + } + }, + "min": { + "bytes": "30", + "value": { + "i8": 0 + } + } + } + } + }, + { + "id": "sizes-json/i16", + "op": "size", + "input": { + "format": "json@1", + "max": 6, + "min": 1, + "type": "i16", + "witnesses": { + "between": [ + { + "bytes": "2d31", + "value": { + "i16": -1 + } + }, + { + "bytes": "2d3333", + "value": { + "i16": -33 + } + }, + { + "bytes": "2d313238", + "value": { + "i16": -128 + } + }, + { + "bytes": "2d313239", + "value": { + "i16": -129 + } + }, + { + "bytes": "313237", + "value": { + "i16": 127 + } + }, + { + "bytes": "313238", + "value": { + "i16": 128 + } + }, + { + "bytes": "323535", + "value": { + "i16": 255 + } + }, + { + "bytes": "323536", + "value": { + "i16": 256 + } + }, + { + "bytes": "3332373637", + "value": { + "i16": 32767 + } + } + ], + "max": { + "bytes": "2d3332373638", + "value": { + "i16": -32768 + } + }, + "min": { + "bytes": "30", + "value": { + "i16": 0 + } + } + } + } + }, + { + "id": "sizes-json/i32", + "op": "size", + "input": { + "format": "json@1", + "max": 11, + "min": 1, + "type": "i32", + "witnesses": { + "between": [ + { + "bytes": "2d31", + "value": { + "i32": -1 + } + }, + { + "bytes": "2d313238", + "value": { + "i32": -128 + } + }, + { + "bytes": "2d313239", + "value": { + "i32": -129 + } + }, + { + "bytes": "2d3332373638", + "value": { + "i32": -32768 + } + }, + { + "bytes": "2d3332373639", + "value": { + "i32": -32769 + } + }, + { + "bytes": "323535", + "value": { + "i32": 255 + } + }, + { + "bytes": "323536", + "value": { + "i32": 256 + } + }, + { + "bytes": "3635353335", + "value": { + "i32": 65535 + } + }, + { + "bytes": "3635353336", + "value": { + "i32": 65536 + } + }, + { + "bytes": "32313437343833363437", + "value": { + "i32": 2147483647 + } + } + ], + "max": { + "bytes": "2d32313437343833363438", + "value": { + "i32": -2147483648 + } + }, + "min": { + "bytes": "30", + "value": { + "i32": 0 + } + } + } + } + }, + { + "id": "sizes-json/i64", + "op": "size", + "input": { + "format": "json@1", + "max": 20, + "min": 1, + "type": "i64", + "witnesses": { + "between": [ + { + "bytes": "2d31", + "value": { + "i64": "-1" + } + }, + { + "bytes": "2d3332373639", + "value": { + "i64": "-32769" + } + }, + { + "bytes": "2d32313437343833363439", + "value": { + "i64": "-2147483649" + } + }, + { + "bytes": "2d32313437343833363438", + "value": { + "i64": "-2147483648" + } + }, + { + "bytes": "3635353336", + "value": { + "i64": "65536" + } + }, + { + "bytes": "34323934393637323935", + "value": { + "i64": "4294967295" + } + }, + { + "bytes": "34323934393637323936", + "value": { + "i64": "4294967296" + } + }, + { + "bytes": "39323233333732303336383534373735383037", + "value": { + "i64": "9223372036854775807" + } + } + ], + "max": { + "bytes": "2d39323233333732303336383534373735383038", + "value": { + "i64": "-9223372036854775808" + } + }, + "min": { + "bytes": "30", + "value": { + "i64": "0" + } + } + } + } + }, + { + "id": "sizes-json/i128", + "op": "size", + "input": { + "format": "json@1", + "max": 40, + "min": 1, + "type": "i128", + "witnesses": { + "between": [ + { + "bytes": "2d31", + "value": { + "i128": "-1" + } + }, + { + "bytes": "31323637363530363030323238323239343031343936373033323035333736", + "value": { + "i128": "1267650600228229401496703205376" + } + }, + { + "bytes": "313730313431313833343630343639323331373331363837333033373135383834313035373237", + "value": { + "i128": "170141183460469231731687303715884105727" + } + } + ], + "max": { + "bytes": "2d313730313431313833343630343639323331373331363837333033373135383834313035373238", + "value": { + "i128": "-170141183460469231731687303715884105728" + } + }, + "min": { + "bytes": "30", + "value": { + "i128": "0" + } + } + } + } + }, + { + "id": "sizes-json/f32", + "op": "size", + "input": { + "format": "json@1", + "max": 16, + "min": 3, + "type": "f32", + "witnesses": { + "between": [ + { + "bytes": "312e30", + "value": { + "f32": 1.0 + } + }, + { + "bytes": "2d302e3235", + "value": { + "f32": -0.25 + } + }, + { + "bytes": "3132333435362e3739", + "value": { + "f32": 123456.7890625 + } + }, + { + "bytes": "302e303030303132333435363739", + "value": { + "f32": 0.000012345679351710714 + } + }, + { + "bytes": "2d302e303030303132333435363739", + "value": { + "f32": -0.000012345679351710714 + } + } + ], + "max": { + "bytes": "2d363233333637363330303030302e30", + "value": { + "f32": -6233676316672.0 + } + }, + "min": { + "bytes": "302e30", + "value": { + "f32": 0.0 + } + } + } + } + }, + { + "id": "sizes-json/f64", + "op": "size", + "input": { + "format": "json@1", + "max": 24, + "min": 3, + "type": "f64", + "witnesses": { + "between": [ + { + "bytes": "312e30", + "value": { + "f64": 1.0 + } + }, + { + "bytes": "2d302e3235", + "value": { + "f64": -0.25 + } + }, + { + "bytes": "3132333435363738392e313235", + "value": { + "f64": 123456789.125 + } + }, + { + "bytes": "302e3030303031", + "value": { + "f64": 0.00001 + } + }, + { + "bytes": "313030303030303030303030303030302e30", + "value": { + "f64": 1000000000000000.0 + } + } + ], + "max": { + "bytes": "2d302e303030303132363130343730353435353235333237", + "value": { + "f64": -0.000012610470545525327 + } + }, + "min": { + "bytes": "302e30", + "value": { + "f64": 0.0 + } + } + } + } + }, + { + "id": "sizes-json/char", + "op": "size", + "input": { + "format": "json@1", + "max": 8, + "min": 3, + "type": "char", + "witnesses": { + "between": [ + { + "bytes": "22c3a922", + "value": { + "char": "é" + } + }, + { + "bytes": "22e282ac22", + "value": { + "char": "€" + } + }, + { + "bytes": "22f09f988022", + "value": { + "char": "😀" + } + }, + { + "bytes": "225c2222", + "value": { + "char": "\"" + } + }, + { + "bytes": "225c6e22", + "value": { + "char": "\n" + } + }, + { + "bytes": "227f22", + "value": { + "char": "" + } + } + ], + "max": { + "bytes": "225c753030303122", + "value": { + "char": "\u0001" + } + }, + "min": { + "bytes": "226122", + "value": { + "char": "a" + } + } + } + } + }, + { + "id": "sizes-json/unit", + "op": "size", + "input": { + "format": "json@1", + "max": 4, + "min": 4, + "type": "unit", + "witnesses": { + "max": { + "bytes": "6e756c6c", + "value": { + "unit": null + } + }, + "min": { + "bytes": "6e756c6c", + "value": { + "unit": null + } + } + } + } + }, + { + "id": "sizes-json/string-unbounded", + "op": "size", + "input": { + "format": "json@1", + "max": null, + "min": 2, + "type": "string", + "witnesses": { + "between": [ + { + "bytes": "226122", + "value": { + "string": "a" + } + }, + { + "bytes": "2261616161616161616161616161616122", + "value": { + "string": "aaaaaaaaaaaaaaa" + } + }, + { + "bytes": "226161616161616161616161616161616122", + "value": { + "string": "aaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "226161616161616161616161616161616161616161616161616161616161616122", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "22616161616161616161616161616161616161616161616161616161616161616122", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "226161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616122", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "22616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616122", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "2261616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616122", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "226161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616122", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "2268c3a96c6c6f22", + "value": { + "string": "héllo" + } + }, + { + "bytes": "22f09f988022", + "value": { + "string": "😀" + } + }, + { + "bytes": "22736179205c2268695c225c6e22", + "value": { + "string": "say \"hi\"\n" + } + }, + { + "bytes": "225c5c22", + "value": { + "string": "\\" + } + }, + { + "bytes": "225c75303030315c753030316622", + "value": { + "string": "\u0001\u001f" + } + }, + { + "bytes": "22e282ac6122", + "value": { + "string": "€a" + } + } + ], + "min": { + "bytes": "2222", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-json/string-max-0", + "op": "size", + "input": { + "format": "json@1", + "max": 2, + "min": 2, + "type": { + "bounded_string": { + "max": 0 + } + }, + "witnesses": { + "max": { + "bytes": "2222", + "value": { + "string": "" + } + }, + "min": { + "bytes": "2222", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-json/string-max-1", + "op": "size", + "input": { + "format": "json@1", + "max": 8, + "min": 2, + "type": { + "bounded_string": { + "max": 1 + } + }, + "witnesses": { + "between": [ + { + "bytes": "226122", + "value": { + "string": "a" + } + }, + { + "bytes": "22c3a922", + "value": { + "string": "é" + } + }, + { + "bytes": "22e282ac22", + "value": { + "string": "€" + } + }, + { + "bytes": "225c2222", + "value": { + "string": "\"" + } + }, + { + "bytes": "225c5c22", + "value": { + "string": "\\" + } + }, + { + "bytes": "22f09f988022", + "value": { + "string": "😀" + } + } + ], + "max": { + "bytes": "225c753030303122", + "value": { + "string": "\u0001" + } + }, + "min": { + "bytes": "2222", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-json/string-max-3", + "op": "size", + "input": { + "format": "json@1", + "max": 20, + "min": 2, + "type": { + "bounded_string": { + "max": 3 + } + }, + "witnesses": { + "between": [ + { + "bytes": "2261616122", + "value": { + "string": "aaa" + } + }, + { + "bytes": "22c3a9c3a9c3a922", + "value": { + "string": "ééé" + } + }, + { + "bytes": "22e282ace282ace282ac22", + "value": { + "string": "€€€" + } + }, + { + "bytes": "225c225c225c2222", + "value": { + "string": "\"\"\"" + } + }, + { + "bytes": "225c5c5c5c5c5c22", + "value": { + "string": "\\\\\\" + } + }, + { + "bytes": "22c3a9c3a922", + "value": { + "string": "éé" + } + } + ], + "max": { + "bytes": "225c75303030315c75303030315c753030303122", + "value": { + "string": "\u0001\u0001\u0001" + } + }, + "min": { + "bytes": "2222", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-json/string-max-7", + "op": "size", + "input": { + "format": "json@1", + "max": 44, + "min": 2, + "type": { + "bounded_string": { + "max": 7 + } + }, + "witnesses": { + "between": [ + { + "bytes": "226161616161616122", + "value": { + "string": "aaaaaaa" + } + }, + { + "bytes": "22c3a9c3a9c3a9c3a9c3a9c3a9c3a922", + "value": { + "string": "ééééééé" + } + }, + { + "bytes": "22e282ace282ace282ace282ace282ace282ace282ac22", + "value": { + "string": "€€€€€€€" + } + }, + { + "bytes": "225c225c225c225c225c225c225c2222", + "value": { + "string": "\"\"\"\"\"\"\"" + } + }, + { + "bytes": "225c5c5c5c5c5c5c5c5c5c5c5c5c5c22", + "value": { + "string": "\\\\\\\\\\\\\\" + } + }, + { + "bytes": "222022", + "value": { + "string": " " + } + } + ], + "max": { + "bytes": "225c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c753030303122", + "value": { + "string": "\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + } + }, + "min": { + "bytes": "2222", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-json/string-max-8", + "op": "size", + "input": { + "format": "json@1", + "max": 50, + "min": 2, + "type": { + "bounded_string": { + "max": 8 + } + }, + "witnesses": { + "between": [ + { + "bytes": "22616161616161616122", + "value": { + "string": "aaaaaaaa" + } + }, + { + "bytes": "22c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a922", + "value": { + "string": "éééééééé" + } + }, + { + "bytes": "22e282ace282ace282ace282ace282ace282ace282ace282ac22", + "value": { + "string": "€€€€€€€€" + } + }, + { + "bytes": "225c225c225c225c225c225c225c225c2222", + "value": { + "string": "\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "225c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c22", + "value": { + "string": "\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "22c3a922", + "value": { + "string": "é" + } + } + ], + "max": { + "bytes": "225c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c753030303122", + "value": { + "string": "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + } + }, + "min": { + "bytes": "2222", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-json/string-max-31", + "op": "size", + "input": { + "format": "json@1", + "max": 188, + "min": 2, + "type": { + "bounded_string": { + "max": 31 + } + }, + "witnesses": { + "between": [ + { + "bytes": "226161616161616161616161616161616161616161616161616161616161616122", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "22c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a922", + "value": { + "string": "ééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "22e282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac22", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c2222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "225c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c22", + "value": { + "string": "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "22c3a9e282ac22", + "value": { + "string": "é€" + } + } + ], + "max": { + "bytes": "225c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c753030303122", + "value": { + "string": "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + } + }, + "min": { + "bytes": "2222", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-json/string-max-32", + "op": "size", + "input": { + "format": "json@1", + "max": 194, + "min": 2, + "type": { + "bounded_string": { + "max": 32 + } + }, + "witnesses": { + "between": [ + { + "bytes": "22616161616161616161616161616161616161616161616161616161616161616122", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "22c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a922", + "value": { + "string": "éééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "22e282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac22", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c2222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "225c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c22", + "value": { + "string": "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "22f09f98806122", + "value": { + "string": "😀a" + } + } + ], + "max": { + "bytes": "225c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c753030303122", + "value": { + "string": "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + } + }, + "min": { + "bytes": "2222", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-json/string-max-63", + "op": "size", + "input": { + "format": "json@1", + "max": 380, + "min": 2, + "type": { + "bounded_string": { + "max": 63 + } + }, + "witnesses": { + "between": [ + { + "bytes": "2261616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616122", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "22c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a922", + "value": { + "string": "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "22e282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac22", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c2222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "225c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c22", + "value": { + "string": "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "227f7f22", + "value": { + "string": "" + } + } + ], + "max": { + "bytes": "225c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c753030303122", + "value": { + "string": "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + } + }, + "min": { + "bytes": "2222", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-json/string-max-64", + "op": "size", + "input": { + "format": "json@1", + "max": 386, + "min": 2, + "type": { + "bounded_string": { + "max": 64 + } + }, + "witnesses": { + "between": [ + { + "bytes": "226161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616122", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "22c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a922", + "value": { + "string": "éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "22e282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac22", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c2222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "225c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c22", + "value": { + "string": "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "225c753030303122", + "value": { + "string": "\u0001" + } + } + ], + "max": { + "bytes": "225c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c753030303122", + "value": { + "string": "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + } + }, + "min": { + "bytes": "2222", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-json/string-fixed-3", + "op": "size", + "input": { + "format": "json@1", + "max": 20, + "min": 5, + "type": { + "fixed_string": { + "len": 3 + } + }, + "witnesses": { + "between": [ + { + "bytes": "22c3a9c3a9c3a922", + "value": { + "string": "ééé" + } + }, + { + "bytes": "22e282ace282ace282ac22", + "value": { + "string": "€€€" + } + }, + { + "bytes": "225c225c225c2222", + "value": { + "string": "\"\"\"" + } + }, + { + "bytes": "222061e282ac22", + "value": { + "string": " a€" + } + } + ], + "max": { + "bytes": "225c75303030315c75303030315c753030303122", + "value": { + "string": "\u0001\u0001\u0001" + } + }, + "min": { + "bytes": "2261616122", + "value": { + "string": "aaa" + } + } + } + } + }, + { + "id": "sizes-json/string-fixed-8", + "op": "size", + "input": { + "format": "json@1", + "max": 50, + "min": 10, + "type": { + "fixed_string": { + "len": 8 + } + }, + "witnesses": { + "between": [ + { + "bytes": "22c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a922", + "value": { + "string": "éééééééé" + } + }, + { + "bytes": "22e282ace282ace282ace282ace282ace282ace282ace282ac22", + "value": { + "string": "€€€€€€€€" + } + }, + { + "bytes": "225c225c225c225c225c225c225c225c2222", + "value": { + "string": "\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "225c7530303031e282ac7f5c6e5c7530303031e282ac7ff09f988022", + "value": { + "string": "\u0001€\n\u0001€😀" + } + } + ], + "max": { + "bytes": "225c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c753030303122", + "value": { + "string": "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + } + }, + "min": { + "bytes": "22616161616161616122", + "value": { + "string": "aaaaaaaa" + } + } + } + } + }, + { + "id": "sizes-json/string-fixed-32", + "op": "size", + "input": { + "format": "json@1", + "max": 194, + "min": 34, + "type": { + "fixed_string": { + "len": 32 + } + }, + "witnesses": { + "between": [ + { + "bytes": "22c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a922", + "value": { + "string": "éééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "22e282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac22", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c225c2222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "22615c753030303161622062f09f98806262e282ac7f5c227f5c6e7f5c5c5c7530303031f09f9880e282ac615c5c5c5c5c75303030315c7530303031f09f98805c6e2020615c7530303031c3a95c2222", + "value": { + "string": "a\u0001ab b😀bb€\"\n\\\u0001😀€a\\\\\u0001\u0001😀\n a\u0001é\"" + } + } + ], + "max": { + "bytes": "225c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c753030303122", + "value": { + "string": "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + } + }, + "min": { + "bytes": "22616161616161616161616161616161616161616161616161616161616161616122", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + } + } + } + }, + { + "id": "sizes-json/array-unbounded", + "op": "size", + "input": { + "format": "json@1", + "max": null, + "min": 2, + "type": { + "array": "u8" + }, + "witnesses": { + "between": [ + { + "bytes": "5b305d", + "value": { + "array": [ + { + "u8": 0 + } + ] + } + }, + { + "bytes": "5b302c315d", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 1 + } + ] + } + }, + { + "bytes": "5b302c312c325d", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 1 + }, + { + "u8": 2 + } + ] + } + }, + { + "bytes": "5b302c312c322c332c342c352c362c372c382c392c31302c31312c31322c31332c31342c31352c31362c31372c31382c31395d", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 1 + }, + { + "u8": 2 + }, + { + "u8": 3 + }, + { + "u8": 4 + }, + { + "u8": 5 + }, + { + "u8": 6 + }, + { + "u8": 7 + }, + { + "u8": 8 + }, + { + "u8": 9 + }, + { + "u8": 10 + }, + { + "u8": 11 + }, + { + "u8": 12 + }, + { + "u8": 13 + }, + { + "u8": 14 + }, + { + "u8": 15 + }, + { + "u8": 16 + }, + { + "u8": 17 + }, + { + "u8": 18 + }, + { + "u8": 19 + } + ] + } + }, + { + "bytes": "5b3235352c3235352c3235355d", + "value": { + "array": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + } + ], + "min": { + "bytes": "5b5d", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-json/array-unbounded-strings", + "op": "size", + "input": { + "format": "json@1", + "max": null, + "min": 2, + "type": { + "array": "string" + }, + "witnesses": { + "between": [ + { + "bytes": "5b2261222c226263222c22225d", + "value": { + "array": [ + { + "string": "a" + }, + { + "string": "bc" + }, + { + "string": "" + } + ] + } + }, + { + "bytes": "5b22f09f9880f09f9880f09f9880225d", + "value": { + "array": [ + { + "string": "😀😀😀" + } + ] + } + }, + { + "bytes": "5b22225d", + "value": { + "array": [ + { + "string": "" + } + ] + } + } + ], + "min": { + "bytes": "5b5d", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-json/array-max-0", + "op": "size", + "input": { + "format": "json@1", + "max": 2, + "min": 2, + "type": { + "bounded_array": { + "max": 0, + "of": "u8" + } + }, + "witnesses": { + "max": { + "bytes": "5b5d", + "value": { + "array": [] + } + }, + "min": { + "bytes": "5b5d", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-json/array-max-1", + "op": "size", + "input": { + "format": "json@1", + "max": 5, + "min": 2, + "type": { + "bounded_array": { + "max": 1, + "of": "u8" + } + }, + "witnesses": { + "between": [ + { + "bytes": "5b305d", + "value": { + "array": [ + { + "u8": 0 + } + ] + } + }, + { + "bytes": "5b3235355d", + "value": { + "array": [ + { + "u8": 255 + } + ] + } + } + ], + "max": { + "bytes": "5b3132375d", + "value": { + "array": [ + { + "u8": 127 + } + ] + } + }, + "min": { + "bytes": "5b5d", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-json/array-max-3", + "op": "size", + "input": { + "format": "json@1", + "max": 13, + "min": 2, + "type": { + "bounded_array": { + "max": 3, + "of": "u8" + } + }, + "witnesses": { + "between": [ + { + "bytes": "5b302c302c305d", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + }, + { + "bytes": "5b3235352c3235352c3235355d", + "value": { + "array": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "5b375d", + "value": { + "array": [ + { + "u8": 7 + } + ] + } + }, + { + "bytes": "5b302c3132375d", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 127 + } + ] + } + } + ], + "max": { + "bytes": "5b3132372c3132372c3132375d", + "value": { + "array": [ + { + "u8": 127 + }, + { + "u8": 127 + }, + { + "u8": 127 + } + ] + } + }, + "min": { + "bytes": "5b5d", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-json/array-max-2-of-strings", + "op": "size", + "input": { + "format": "json@1", + "max": 31, + "min": 2, + "type": { + "bounded_array": { + "max": 2, + "of": { + "bounded_string": { + "max": 2 + } + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "5b226162222c22f09f9880f09f9880225d", + "value": { + "array": [ + { + "string": "ab" + }, + { + "string": "😀😀" + } + ] + } + }, + { + "bytes": "5b22225d", + "value": { + "array": [ + { + "string": "" + } + ] + } + }, + { + "bytes": "5b22c3a9e282ac222c225c75303030315c7530303031225d", + "value": { + "array": [ + { + "string": "é€" + }, + { + "string": "\u0001\u0001" + } + ] + } + }, + { + "bytes": "5b22222c22e282ac5c6e225d", + "value": { + "array": [ + { + "string": "" + }, + { + "string": "€\n" + } + ] + } + } + ], + "max": { + "bytes": "5b225c75303030315c7530303031222c225c75303030315c7530303031225d", + "value": { + "array": [ + { + "string": "\u0001\u0001" + }, + { + "string": "\u0001\u0001" + } + ] + } + }, + "min": { + "bytes": "5b5d", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-json/array-max-3-of-options", + "op": "size", + "input": { + "format": "json@1", + "max": 16, + "min": 2, + "type": { + "bounded_array": { + "max": 3, + "of": { + "option": "u8" + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "5b6e756c6c2c3235352c305d", + "value": { + "array": [ + { + "option": null + }, + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 0 + } + } + ] + } + }, + { + "bytes": "5b3235352c3235352c3235355d", + "value": { + "array": [ + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 255 + } + } + ] + } + }, + { + "bytes": "5b3235352c6e756c6c5d", + "value": { + "array": [ + { + "option": { + "u8": 255 + } + }, + { + "option": null + } + ] + } + } + ], + "max": { + "bytes": "5b6e756c6c2c6e756c6c2c6e756c6c5d", + "value": { + "array": [ + { + "option": null + }, + { + "option": null + }, + { + "option": null + } + ] + } + }, + "min": { + "bytes": "5b5d", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-json/fixed-4", + "op": "size", + "input": { + "format": "json@1", + "max": 17, + "min": 9, + "type": { + "fixed": { + "len": 4, + "of": "u8" + } + }, + "witnesses": { + "between": [ + { + "bytes": "5b3235352c3235352c3235352c3235355d", + "value": { + "tuple": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "5b312c3230302c332c345d", + "value": { + "tuple": [ + { + "u8": 1 + }, + { + "u8": 200 + }, + { + "u8": 3 + }, + { + "u8": 4 + } + ] + } + }, + { + "bytes": "5b3235352c3235352c312c3235355d", + "value": { + "tuple": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 1 + }, + { + "u8": 255 + } + ] + } + } + ], + "max": { + "bytes": "5b3132372c3132372c3132372c3132375d", + "value": { + "tuple": [ + { + "u8": 127 + }, + { + "u8": 127 + }, + { + "u8": 127 + }, + { + "u8": 127 + } + ] + } + }, + "min": { + "bytes": "5b302c302c302c305d", + "value": { + "tuple": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + } + } + } + }, + { + "id": "sizes-json/fixed-1", + "op": "size", + "input": { + "format": "json@1", + "max": 7, + "min": 6, + "type": { + "fixed": { + "len": 1, + "of": "bool" + } + }, + "witnesses": { + "max": { + "bytes": "5b66616c73655d", + "value": { + "tuple": [ + { + "bool": false + } + ] + } + }, + "min": { + "bytes": "5b747275655d", + "value": { + "tuple": [ + { + "bool": true + } + ] + } + } + } + } + }, + { + "id": "sizes-json/fixed-2-of-strings", + "op": "size", + "input": { + "format": "json@1", + "max": 31, + "min": 7, + "type": { + "fixed": { + "len": 2, + "of": { + "bounded_string": { + "max": 2 + } + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "5b226162222c22f09f9880f09f9880225d", + "value": { + "tuple": [ + { + "string": "ab" + }, + { + "string": "😀😀" + } + ] + } + }, + { + "bytes": "5b225c5c7f222c22225d", + "value": { + "tuple": [ + { + "string": "\\" + }, + { + "string": "" + } + ] + } + } + ], + "max": { + "bytes": "5b225c75303030315c7530303031222c225c75303030315c7530303031225d", + "value": { + "tuple": [ + { + "string": "\u0001\u0001" + }, + { + "string": "\u0001\u0001" + } + ] + } + }, + "min": { + "bytes": "5b22222c22225d", + "value": { + "tuple": [ + { + "string": "" + }, + { + "string": "" + } + ] + } + } + } + } + }, + { + "id": "sizes-json/fixed-3-of-options", + "op": "size", + "input": { + "format": "json@1", + "max": 16, + "min": 7, + "type": { + "fixed": { + "len": 3, + "of": { + "option": "u8" + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "5b6e756c6c2c3235352c305d", + "value": { + "tuple": [ + { + "option": null + }, + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 0 + } + } + ] + } + }, + { + "bytes": "5b3235352c3235352c3235355d", + "value": { + "tuple": [ + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 255 + } + } + ] + } + }, + { + "bytes": "5b3132372c312c6e756c6c5d", + "value": { + "tuple": [ + { + "option": { + "u8": 127 + } + }, + { + "option": { + "u8": 1 + } + }, + { + "option": null + } + ] + } + } + ], + "max": { + "bytes": "5b6e756c6c2c6e756c6c2c6e756c6c5d", + "value": { + "tuple": [ + { + "option": null + }, + { + "option": null + }, + { + "option": null + } + ] + } + }, + "min": { + "bytes": "5b302c302c305d", + "value": { + "tuple": [ + { + "option": { + "u8": 0 + } + }, + { + "option": { + "u8": 0 + } + }, + { + "option": { + "u8": 0 + } + } + ] + } + } + } + } + }, + { + "id": "sizes-json/option-u8", + "op": "size", + "input": { + "format": "json@1", + "max": 4, + "min": 1, + "type": { + "option": "u8" + }, + "witnesses": { + "between": [ + { + "bytes": "313237", + "value": { + "option": { + "u8": 127 + } + } + }, + { + "bytes": "313238", + "value": { + "option": { + "u8": 128 + } + } + }, + { + "bytes": "323535", + "value": { + "option": { + "u8": 255 + } + } + } + ], + "max": { + "bytes": "6e756c6c", + "value": { + "option": null + } + }, + "min": { + "bytes": "30", + "value": { + "option": { + "u8": 0 + } + } + } + } + } + }, + { + "id": "sizes-json/option-bool", + "op": "size", + "input": { + "format": "json@1", + "max": 5, + "min": 4, + "type": { + "option": "bool" + }, + "witnesses": { + "between": [ + { + "bytes": "74727565", + "value": { + "option": { + "bool": true + } + } + } + ], + "max": { + "bytes": "66616c7365", + "value": { + "option": { + "bool": false + } + } + }, + "min": { + "bytes": "6e756c6c", + "value": { + "option": null + } + } + } + } + }, + { + "id": "sizes-json/option-string", + "op": "size", + "input": { + "format": "json@1", + "max": null, + "min": 2, + "type": { + "option": "string" + }, + "witnesses": { + "between": [ + { + "bytes": "6e756c6c", + "value": { + "option": null + } + }, + { + "bytes": "2268656c6c6f22", + "value": { + "option": { + "string": "hello" + } + } + } + ], + "min": { + "bytes": "2222", + "value": { + "option": { + "string": "" + } + } + } + } + } + }, + { + "id": "sizes-json/option-max-3-chars", + "op": "size", + "input": { + "format": "json@1", + "max": 20, + "min": 2, + "type": { + "option": { + "bounded_string": { + "max": 3 + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "6e756c6c", + "value": { + "option": null + } + }, + { + "bytes": "22616222", + "value": { + "option": { + "string": "ab" + } + } + }, + { + "bytes": "22f09f9880f09f9880f09f988022", + "value": { + "option": { + "string": "😀😀😀" + } + } + } + ], + "max": { + "bytes": "225c75303030315c75303030315c753030303122", + "value": { + "option": { + "string": "\u0001\u0001\u0001" + } + } + }, + "min": { + "bytes": "2222", + "value": { + "option": { + "string": "" + } + } + } + } + } + }, + { + "id": "sizes-json/option-struct", + "op": "size", + "input": { + "format": "json@1", + "max": 33, + "min": 4, + "type": { + "option": { + "struct": { + "fields": [ + [ + "x", + "i32" + ], + [ + "y", + "i32" + ] + ], + "name": "Point" + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "7b2278223a302c2279223a307d", + "value": { + "option": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + } + }, + { + "bytes": "7b2278223a2d312c2279223a3330307d", + "value": { + "option": { + "struct": { + "fields": [ + [ + "x", + { + "i32": -1 + } + ], + [ + "y", + { + "i32": 300 + } + ] + ], + "name": "Point" + } + } + } + }, + { + "bytes": "7b2278223a3235352c2279223a36353533367d", + "value": { + "option": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 255 + } + ], + [ + "y", + { + "i32": 65536 + } + ] + ], + "name": "Point" + } + } + } + } + ], + "max": { + "bytes": "7b2278223a2d323134373438333634382c2279223a2d323134373438333634387d", + "value": { + "option": { + "struct": { + "fields": [ + [ + "x", + { + "i32": -2147483648 + } + ], + [ + "y", + { + "i32": -2147483648 + } + ] + ], + "name": "Point" + } + } + } + }, + "min": { + "bytes": "6e756c6c", + "value": { + "option": null + } + } + } + } + }, + { + "id": "sizes-json/struct-point", + "op": "size", + "input": { + "format": "json@1", + "max": 33, + "min": 13, + "type": { + "struct": { + "fields": [ + [ + "x", + "i32" + ], + [ + "y", + "i32" + ] + ], + "name": "Point" + } + }, + "witnesses": { + "between": [ + { + "bytes": "7b2278223a312c2279223a2d327d", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 1 + } + ], + [ + "y", + { + "i32": -2 + } + ] + ], + "name": "Point" + } + } + }, + { + "bytes": "7b2278223a323134373438333634372c2279223a307d", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 2147483647 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + }, + { + "bytes": "7b2278223a2d323134373438333634382c2279223a2d33323736387d", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": -2147483648 + } + ], + [ + "y", + { + "i32": -32768 + } + ] + ], + "name": "Point" + } + } + } + ], + "max": { + "bytes": "7b2278223a2d323134373438333634382c2279223a2d323134373438333634387d", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": -2147483648 + } + ], + [ + "y", + { + "i32": -2147483648 + } + ] + ], + "name": "Point" + } + } + }, + "min": { + "bytes": "7b2278223a302c2279223a307d", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + } + } + } + }, + { + "id": "sizes-json/struct-empty", + "op": "size", + "input": { + "format": "json@1", + "max": 2, + "min": 2, + "type": { + "struct": { + "fields": [], + "name": "Empty" + } + }, + "witnesses": { + "max": { + "bytes": "7b7d", + "value": { + "struct": { + "fields": [], + "name": "Empty" + } + } + }, + "min": { + "bytes": "7b7d", + "value": { + "struct": { + "fields": [], + "name": "Empty" + } + } + } + } + } + }, + { + "id": "sizes-json/struct-mixed", + "op": "size", + "input": { + "format": "json@1", + "max": 206, + "min": 38, + "type": { + "struct": { + "fields": [ + [ + "id", + "u32" + ], + [ + "name", + { + "bounded_string": { + "max": 16 + } + } + ], + [ + "tags", + { + "bounded_array": { + "max": 4, + "of": "u8" + } + } + ], + [ + "note", + { + "option": { + "bounded_string": { + "max": 8 + } + } + } + ] + ], + "name": "Msg" + } + }, + "witnesses": { + "between": [ + { + "bytes": "7b226964223a372c226e616d65223a226869222c2274616773223a5b312c325d2c226e6f7465223a6e756c6c7d", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 7 + } + ], + [ + "name", + { + "string": "hi" + } + ], + [ + "tags", + { + "array": [ + { + "u8": 1 + }, + { + "u8": 2 + } + ] + } + ], + [ + "note", + { + "option": null + } + ] + ], + "name": "Msg" + } + } + }, + { + "bytes": "7b226964223a37303030302c226e616d65223a2268c3a96c6c6f2077c3b6726c64222c2274616773223a5b5d2c226e6f7465223a2278227d", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 70000 + } + ], + [ + "name", + { + "string": "héllo wörld" + } + ], + [ + "tags", + { + "array": [] + } + ], + [ + "note", + { + "option": { + "string": "x" + } + } + ] + ], + "name": "Msg" + } + } + }, + { + "bytes": "7b226964223a3235352c226e616d65223a22222c2274616773223a5b5d2c226e6f7465223a22e282ac227d", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 255 + } + ], + [ + "name", + { + "string": "" + } + ], + [ + "tags", + { + "array": [] + } + ], + [ + "note", + { + "option": { + "string": "€" + } + } + ] + ], + "name": "Msg" + } + } + } + ], + "max": { + "bytes": "7b226964223a343239343936373239352c226e616d65223a225c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c7530303031222c2274616773223a5b3132372c3132372c3132372c3132375d2c226e6f7465223a225c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c7530303031227d", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 4294967295 + } + ], + [ + "name", + { + "string": "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + } + ], + [ + "tags", + { + "array": [ + { + "u8": 127 + }, + { + "u8": 127 + }, + { + "u8": 127 + }, + { + "u8": 127 + } + ] + } + ], + [ + "note", + { + "option": { + "string": "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + } + } + ] + ], + "name": "Msg" + } + } + }, + "min": { + "bytes": "7b226964223a302c226e616d65223a22222c2274616773223a5b5d2c226e6f7465223a22227d", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 0 + } + ], + [ + "name", + { + "string": "" + } + ], + [ + "tags", + { + "array": [] + } + ], + [ + "note", + { + "option": { + "string": "" + } + } + ] + ], + "name": "Msg" + } + } + } + } + } + }, + { + "id": "sizes-json/struct-nested", + "op": "size", + "input": { + "format": "json@1", + "max": 140, + "min": 52, + "type": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + "i32" + ], + [ + "y", + "i32" + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + "i32" + ], + [ + "y", + "i32" + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": { + "bounded_string": { + "max": 8 + } + } + } + ] + ], + "name": "Line" + } + }, + "witnesses": { + "between": [ + { + "bytes": "7b2266726f6d223a7b2278223a302c2279223a307d2c22746f223a7b2278223a332c2279223a347d2c226c6162656c223a6e756c6c7d", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 3 + } + ], + [ + "y", + { + "i32": 4 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": null + } + ] + ], + "name": "Line" + } + } + }, + { + "bytes": "7b2266726f6d223a7b2278223a2d352c2279223a357d2c22746f223a7b2278223a3130302c2279223a3130307d2c226c6162656c223a226162227d", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": -5 + } + ], + [ + "y", + { + "i32": 5 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 100 + } + ], + [ + "y", + { + "i32": 100 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": { + "string": "ab" + } + } + ] + ], + "name": "Line" + } + } + }, + { + "bytes": "7b2266726f6d223a7b2278223a36353533352c2279223a36353533367d2c22746f223a7b2278223a2d33323736382c2279223a2d33323736387d2c226c6162656c223a6e756c6c7d", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 65535 + } + ], + [ + "y", + { + "i32": 65536 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": -32768 + } + ], + [ + "y", + { + "i32": -32768 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": null + } + ] + ], + "name": "Line" + } + } + } + ], + "max": { + "bytes": "7b2266726f6d223a7b2278223a2d323134373438333634382c2279223a2d323134373438333634387d2c22746f223a7b2278223a2d323134373438333634382c2279223a2d323134373438333634387d2c226c6162656c223a225c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c75303030315c7530303031227d", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": -2147483648 + } + ], + [ + "y", + { + "i32": -2147483648 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": -2147483648 + } + ], + [ + "y", + { + "i32": -2147483648 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": { + "string": "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" + } + } + ] + ], + "name": "Line" + } + } + }, + "min": { + "bytes": "7b2266726f6d223a7b2278223a302c2279223a307d2c22746f223a7b2278223a302c2279223a307d2c226c6162656c223a22227d", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": { + "string": "" + } + } + ] + ], + "name": "Line" + } + } + } + } + } + }, + { + "id": "sizes-json/struct-15-fields", + "op": "size", + "input": { + "format": "json@1", + "max": 151, + "min": 121, + "type": { + "struct": { + "fields": [ + [ + "f00", + "u8" + ], + [ + "f01", + "u8" + ], + [ + "f02", + "u8" + ], + [ + "f03", + "u8" + ], + [ + "f04", + "u8" + ], + [ + "f05", + "u8" + ], + [ + "f06", + "u8" + ], + [ + "f07", + "u8" + ], + [ + "f08", + "u8" + ], + [ + "f09", + "u8" + ], + [ + "f10", + "u8" + ], + [ + "f11", + "u8" + ], + [ + "f12", + "u8" + ], + [ + "f13", + "u8" + ], + [ + "f14", + "u8" + ] + ], + "name": "Wide15" + } + }, + "witnesses": { + "between": [ + { + "bytes": "7b22663030223a3235352c22663031223a3235352c22663032223a3235352c22663033223a3235352c22663034223a3235352c22663035223a3235352c22663036223a3235352c22663037223a3235352c22663038223a3235352c22663039223a3235352c22663130223a3235352c22663131223a3235352c22663132223a3235352c22663133223a3235352c22663134223a3235357d", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 255 + } + ], + [ + "f01", + { + "u8": 255 + } + ], + [ + "f02", + { + "u8": 255 + } + ], + [ + "f03", + { + "u8": 255 + } + ], + [ + "f04", + { + "u8": 255 + } + ], + [ + "f05", + { + "u8": 255 + } + ], + [ + "f06", + { + "u8": 255 + } + ], + [ + "f07", + { + "u8": 255 + } + ], + [ + "f08", + { + "u8": 255 + } + ], + [ + "f09", + { + "u8": 255 + } + ], + [ + "f10", + { + "u8": 255 + } + ], + [ + "f11", + { + "u8": 255 + } + ], + [ + "f12", + { + "u8": 255 + } + ], + [ + "f13", + { + "u8": 255 + } + ], + [ + "f14", + { + "u8": 255 + } + ] + ], + "name": "Wide15" + } + } + }, + { + "bytes": "7b22663030223a302c22663031223a31372c22663032223a33342c22663033223a35312c22663034223a36382c22663035223a38352c22663036223a3130322c22663037223a3131392c22663038223a3133362c22663039223a3135332c22663130223a3137302c22663131223a3138372c22663132223a3230342c22663133223a3232312c22663134223a3233387d", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 17 + } + ], + [ + "f02", + { + "u8": 34 + } + ], + [ + "f03", + { + "u8": 51 + } + ], + [ + "f04", + { + "u8": 68 + } + ], + [ + "f05", + { + "u8": 85 + } + ], + [ + "f06", + { + "u8": 102 + } + ], + [ + "f07", + { + "u8": 119 + } + ], + [ + "f08", + { + "u8": 136 + } + ], + [ + "f09", + { + "u8": 153 + } + ], + [ + "f10", + { + "u8": 170 + } + ], + [ + "f11", + { + "u8": 187 + } + ], + [ + "f12", + { + "u8": 204 + } + ], + [ + "f13", + { + "u8": 221 + } + ], + [ + "f14", + { + "u8": 238 + } + ] + ], + "name": "Wide15" + } + } + }, + { + "bytes": "7b22663030223a3132372c22663031223a3132382c22663032223a3132372c22663033223a302c22663034223a3132372c22663035223a312c22663036223a302c22663037223a302c22663038223a3132382c22663039223a3132382c22663130223a312c22663131223a312c22663132223a312c22663133223a3235352c22663134223a317d", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 127 + } + ], + [ + "f01", + { + "u8": 128 + } + ], + [ + "f02", + { + "u8": 127 + } + ], + [ + "f03", + { + "u8": 0 + } + ], + [ + "f04", + { + "u8": 127 + } + ], + [ + "f05", + { + "u8": 1 + } + ], + [ + "f06", + { + "u8": 0 + } + ], + [ + "f07", + { + "u8": 0 + } + ], + [ + "f08", + { + "u8": 128 + } + ], + [ + "f09", + { + "u8": 128 + } + ], + [ + "f10", + { + "u8": 1 + } + ], + [ + "f11", + { + "u8": 1 + } + ], + [ + "f12", + { + "u8": 1 + } + ], + [ + "f13", + { + "u8": 255 + } + ], + [ + "f14", + { + "u8": 1 + } + ] + ], + "name": "Wide15" + } + } + } + ], + "max": { + "bytes": "7b22663030223a3132372c22663031223a3132372c22663032223a3132372c22663033223a3132372c22663034223a3132372c22663035223a3132372c22663036223a3132372c22663037223a3132372c22663038223a3132372c22663039223a3132372c22663130223a3132372c22663131223a3132372c22663132223a3132372c22663133223a3132372c22663134223a3132377d", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 127 + } + ], + [ + "f01", + { + "u8": 127 + } + ], + [ + "f02", + { + "u8": 127 + } + ], + [ + "f03", + { + "u8": 127 + } + ], + [ + "f04", + { + "u8": 127 + } + ], + [ + "f05", + { + "u8": 127 + } + ], + [ + "f06", + { + "u8": 127 + } + ], + [ + "f07", + { + "u8": 127 + } + ], + [ + "f08", + { + "u8": 127 + } + ], + [ + "f09", + { + "u8": 127 + } + ], + [ + "f10", + { + "u8": 127 + } + ], + [ + "f11", + { + "u8": 127 + } + ], + [ + "f12", + { + "u8": 127 + } + ], + [ + "f13", + { + "u8": 127 + } + ], + [ + "f14", + { + "u8": 127 + } + ] + ], + "name": "Wide15" + } + } + }, + "min": { + "bytes": "7b22663030223a302c22663031223a302c22663032223a302c22663033223a302c22663034223a302c22663035223a302c22663036223a302c22663037223a302c22663038223a302c22663039223a302c22663130223a302c22663131223a302c22663132223a302c22663133223a302c22663134223a307d", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 0 + } + ], + [ + "f02", + { + "u8": 0 + } + ], + [ + "f03", + { + "u8": 0 + } + ], + [ + "f04", + { + "u8": 0 + } + ], + [ + "f05", + { + "u8": 0 + } + ], + [ + "f06", + { + "u8": 0 + } + ], + [ + "f07", + { + "u8": 0 + } + ], + [ + "f08", + { + "u8": 0 + } + ], + [ + "f09", + { + "u8": 0 + } + ], + [ + "f10", + { + "u8": 0 + } + ], + [ + "f11", + { + "u8": 0 + } + ], + [ + "f12", + { + "u8": 0 + } + ], + [ + "f13", + { + "u8": 0 + } + ], + [ + "f14", + { + "u8": 0 + } + ] + ], + "name": "Wide15" + } + } + } + } + } + }, + { + "id": "sizes-json/struct-16-fields", + "op": "size", + "input": { + "format": "json@1", + "max": 161, + "min": 129, + "type": { + "struct": { + "fields": [ + [ + "f00", + "u8" + ], + [ + "f01", + "u8" + ], + [ + "f02", + "u8" + ], + [ + "f03", + "u8" + ], + [ + "f04", + "u8" + ], + [ + "f05", + "u8" + ], + [ + "f06", + "u8" + ], + [ + "f07", + "u8" + ], + [ + "f08", + "u8" + ], + [ + "f09", + "u8" + ], + [ + "f10", + "u8" + ], + [ + "f11", + "u8" + ], + [ + "f12", + "u8" + ], + [ + "f13", + "u8" + ], + [ + "f14", + "u8" + ], + [ + "f15", + "u8" + ] + ], + "name": "Wide16" + } + }, + "witnesses": { + "between": [ + { + "bytes": "7b22663030223a3235352c22663031223a3235352c22663032223a3235352c22663033223a3235352c22663034223a3235352c22663035223a3235352c22663036223a3235352c22663037223a3235352c22663038223a3235352c22663039223a3235352c22663130223a3235352c22663131223a3235352c22663132223a3235352c22663133223a3235352c22663134223a3235352c22663135223a3235357d", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 255 + } + ], + [ + "f01", + { + "u8": 255 + } + ], + [ + "f02", + { + "u8": 255 + } + ], + [ + "f03", + { + "u8": 255 + } + ], + [ + "f04", + { + "u8": 255 + } + ], + [ + "f05", + { + "u8": 255 + } + ], + [ + "f06", + { + "u8": 255 + } + ], + [ + "f07", + { + "u8": 255 + } + ], + [ + "f08", + { + "u8": 255 + } + ], + [ + "f09", + { + "u8": 255 + } + ], + [ + "f10", + { + "u8": 255 + } + ], + [ + "f11", + { + "u8": 255 + } + ], + [ + "f12", + { + "u8": 255 + } + ], + [ + "f13", + { + "u8": 255 + } + ], + [ + "f14", + { + "u8": 255 + } + ], + [ + "f15", + { + "u8": 255 + } + ] + ], + "name": "Wide16" + } + } + }, + { + "bytes": "7b22663030223a302c22663031223a31372c22663032223a33342c22663033223a35312c22663034223a36382c22663035223a38352c22663036223a3130322c22663037223a3131392c22663038223a3133362c22663039223a3135332c22663130223a3137302c22663131223a3138372c22663132223a3230342c22663133223a3232312c22663134223a3233382c22663135223a3235357d", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 17 + } + ], + [ + "f02", + { + "u8": 34 + } + ], + [ + "f03", + { + "u8": 51 + } + ], + [ + "f04", + { + "u8": 68 + } + ], + [ + "f05", + { + "u8": 85 + } + ], + [ + "f06", + { + "u8": 102 + } + ], + [ + "f07", + { + "u8": 119 + } + ], + [ + "f08", + { + "u8": 136 + } + ], + [ + "f09", + { + "u8": 153 + } + ], + [ + "f10", + { + "u8": 170 + } + ], + [ + "f11", + { + "u8": 187 + } + ], + [ + "f12", + { + "u8": 204 + } + ], + [ + "f13", + { + "u8": 221 + } + ], + [ + "f14", + { + "u8": 238 + } + ], + [ + "f15", + { + "u8": 255 + } + ] + ], + "name": "Wide16" + } + } + }, + { + "bytes": "7b22663030223a312c22663031223a3235352c22663032223a302c22663033223a312c22663034223a3132382c22663035223a3235352c22663036223a3132372c22663037223a3235352c22663038223a3132372c22663039223a312c22663130223a302c22663131223a3235352c22663132223a3235352c22663133223a302c22663134223a3132382c22663135223a317d", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 1 + } + ], + [ + "f01", + { + "u8": 255 + } + ], + [ + "f02", + { + "u8": 0 + } + ], + [ + "f03", + { + "u8": 1 + } + ], + [ + "f04", + { + "u8": 128 + } + ], + [ + "f05", + { + "u8": 255 + } + ], + [ + "f06", + { + "u8": 127 + } + ], + [ + "f07", + { + "u8": 255 + } + ], + [ + "f08", + { + "u8": 127 + } + ], + [ + "f09", + { + "u8": 1 + } + ], + [ + "f10", + { + "u8": 0 + } + ], + [ + "f11", + { + "u8": 255 + } + ], + [ + "f12", + { + "u8": 255 + } + ], + [ + "f13", + { + "u8": 0 + } + ], + [ + "f14", + { + "u8": 128 + } + ], + [ + "f15", + { + "u8": 1 + } + ] + ], + "name": "Wide16" + } + } + } + ], + "max": { + "bytes": "7b22663030223a3132372c22663031223a3132372c22663032223a3132372c22663033223a3132372c22663034223a3132372c22663035223a3132372c22663036223a3132372c22663037223a3132372c22663038223a3132372c22663039223a3132372c22663130223a3132372c22663131223a3132372c22663132223a3132372c22663133223a3132372c22663134223a3132372c22663135223a3132377d", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 127 + } + ], + [ + "f01", + { + "u8": 127 + } + ], + [ + "f02", + { + "u8": 127 + } + ], + [ + "f03", + { + "u8": 127 + } + ], + [ + "f04", + { + "u8": 127 + } + ], + [ + "f05", + { + "u8": 127 + } + ], + [ + "f06", + { + "u8": 127 + } + ], + [ + "f07", + { + "u8": 127 + } + ], + [ + "f08", + { + "u8": 127 + } + ], + [ + "f09", + { + "u8": 127 + } + ], + [ + "f10", + { + "u8": 127 + } + ], + [ + "f11", + { + "u8": 127 + } + ], + [ + "f12", + { + "u8": 127 + } + ], + [ + "f13", + { + "u8": 127 + } + ], + [ + "f14", + { + "u8": 127 + } + ], + [ + "f15", + { + "u8": 127 + } + ] + ], + "name": "Wide16" + } + } + }, + "min": { + "bytes": "7b22663030223a302c22663031223a302c22663032223a302c22663033223a302c22663034223a302c22663035223a302c22663036223a302c22663037223a302c22663038223a302c22663039223a302c22663130223a302c22663131223a302c22663132223a302c22663133223a302c22663134223a302c22663135223a307d", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 0 + } + ], + [ + "f02", + { + "u8": 0 + } + ], + [ + "f03", + { + "u8": 0 + } + ], + [ + "f04", + { + "u8": 0 + } + ], + [ + "f05", + { + "u8": 0 + } + ], + [ + "f06", + { + "u8": 0 + } + ], + [ + "f07", + { + "u8": 0 + } + ], + [ + "f08", + { + "u8": 0 + } + ], + [ + "f09", + { + "u8": 0 + } + ], + [ + "f10", + { + "u8": 0 + } + ], + [ + "f11", + { + "u8": 0 + } + ], + [ + "f12", + { + "u8": 0 + } + ], + [ + "f13", + { + "u8": 0 + } + ], + [ + "f14", + { + "u8": 0 + } + ], + [ + "f15", + { + "u8": 0 + } + ] + ], + "name": "Wide16" + } + } + } + } + } + }, + { + "id": "sizes-json/struct-long-names", + "op": "size", + "input": { + "format": "json@1", + "max": 53, + "min": 46, + "type": { + "struct": { + "fields": [ + [ + "id", + "u8" + ], + [ + "a_much_longer_field_name", + "u16" + ], + [ + "x", + { + "option": "bool" + } + ] + ], + "name": "Named" + } + }, + "witnesses": { + "between": [ + { + "bytes": "7b226964223a312c22615f6d7563685f6c6f6e6765725f6669656c645f6e616d65223a3330302c2278223a747275657d", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u8": 1 + } + ], + [ + "a_much_longer_field_name", + { + "u16": 300 + } + ], + [ + "x", + { + "option": { + "bool": true + } + } + ] + ], + "name": "Named" + } + } + }, + { + "bytes": "7b226964223a302c22615f6d7563685f6c6f6e6765725f6669656c645f6e616d65223a3132372c2278223a6e756c6c7d", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u8": 0 + } + ], + [ + "a_much_longer_field_name", + { + "u16": 127 + } + ], + [ + "x", + { + "option": null + } + ] + ], + "name": "Named" + } + } + } + ], + "max": { + "bytes": "7b226964223a3132372c22615f6d7563685f6c6f6e6765725f6669656c645f6e616d65223a36353533352c2278223a66616c73657d", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u8": 127 + } + ], + [ + "a_much_longer_field_name", + { + "u16": 65535 + } + ], + [ + "x", + { + "option": { + "bool": false + } + } + ] + ], + "name": "Named" + } + } + }, + "min": { + "bytes": "7b226964223a302c22615f6d7563685f6c6f6e6765725f6669656c645f6e616d65223a302c2278223a6e756c6c7d", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u8": 0 + } + ], + [ + "a_much_longer_field_name", + { + "u16": 0 + } + ], + [ + "x", + { + "option": null + } + ] + ], + "name": "Named" + } + } + } + } + } + }, + { + "id": "sizes-json/enum-color", + "op": "size", + "input": { + "format": "json@1", + "max": 7, + "min": 5, + "type": { + "enum": { + "name": "Color", + "variants": [ + "Red", + "Green", + "Blue" + ] + } + }, + "witnesses": { + "between": [ + { + "bytes": "22426c756522", + "value": { + "unit_variant": { + "enum": "Color", + "index": 2, + "variant": "Blue" + } + } + } + ], + "max": { + "bytes": "22477265656e22", + "value": { + "unit_variant": { + "enum": "Color", + "index": 1, + "variant": "Green" + } + } + }, + "min": { + "bytes": "2252656422", + "value": { + "unit_variant": { + "enum": "Color", + "index": 0, + "variant": "Red" + } + } + } + } + } + }, + { + "id": "sizes-json/enum-single", + "op": "size", + "input": { + "format": "json@1", + "max": 6, + "min": 6, + "type": { + "enum": { + "name": "Only", + "variants": [ + "Only" + ] + } + }, + "witnesses": { + "max": { + "bytes": "224f6e6c7922", + "value": { + "unit_variant": { + "enum": "Only", + "index": 0, + "variant": "Only" + } + } + }, + "min": { + "bytes": "224f6e6c7922", + "value": { + "unit_variant": { + "enum": "Only", + "index": 0, + "variant": "Only" + } + } + } + } + } + }, + { + "id": "sizes-json/enum-129-variants", + "op": "size", + "input": { + "format": "json@1", + "max": 6, + "min": 6, + "type": { + "enum": { + "name": "Many", + "variants": [ + "v000", + "v001", + "v002", + "v003", + "v004", + "v005", + "v006", + "v007", + "v008", + "v009", + "v010", + "v011", + "v012", + "v013", + "v014", + "v015", + "v016", + "v017", + "v018", + "v019", + "v020", + "v021", + "v022", + "v023", + "v024", + "v025", + "v026", + "v027", + "v028", + "v029", + "v030", + "v031", + "v032", + "v033", + "v034", + "v035", + "v036", + "v037", + "v038", + "v039", + "v040", + "v041", + "v042", + "v043", + "v044", + "v045", + "v046", + "v047", + "v048", + "v049", + "v050", + "v051", + "v052", + "v053", + "v054", + "v055", + "v056", + "v057", + "v058", + "v059", + "v060", + "v061", + "v062", + "v063", + "v064", + "v065", + "v066", + "v067", + "v068", + "v069", + "v070", + "v071", + "v072", + "v073", + "v074", + "v075", + "v076", + "v077", + "v078", + "v079", + "v080", + "v081", + "v082", + "v083", + "v084", + "v085", + "v086", + "v087", + "v088", + "v089", + "v090", + "v091", + "v092", + "v093", + "v094", + "v095", + "v096", + "v097", + "v098", + "v099", + "v100", + "v101", + "v102", + "v103", + "v104", + "v105", + "v106", + "v107", + "v108", + "v109", + "v110", + "v111", + "v112", + "v113", + "v114", + "v115", + "v116", + "v117", + "v118", + "v119", + "v120", + "v121", + "v122", + "v123", + "v124", + "v125", + "v126", + "v127", + "v128" + ] + } + }, + "witnesses": { + "between": [ + { + "bytes": "227630303122", + "value": { + "unit_variant": { + "enum": "Many", + "index": 1, + "variant": "v001" + } + } + }, + { + "bytes": "227631323622", + "value": { + "unit_variant": { + "enum": "Many", + "index": 126, + "variant": "v126" + } + } + }, + { + "bytes": "227631323722", + "value": { + "unit_variant": { + "enum": "Many", + "index": 127, + "variant": "v127" + } + } + }, + { + "bytes": "227631323822", + "value": { + "unit_variant": { + "enum": "Many", + "index": 128, + "variant": "v128" + } + } + } + ], + "max": { + "bytes": "227630303022", + "value": { + "unit_variant": { + "enum": "Many", + "index": 0, + "variant": "v000" + } + } + }, + "min": { + "bytes": "227630303022", + "value": { + "unit_variant": { + "enum": "Many", + "index": 0, + "variant": "v000" + } + } + } + } + } + }, + { + "id": "sizes-json/enum-long-names", + "op": "size", + "input": { + "format": "json@1", + "max": 34, + "min": 3, + "type": { + "enum": { + "name": "Long", + "variants": [ + "a", + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "ccccccccccccccccccccccccccccccc", + "dddddddddddddddddddddddddddddddd" + ] + } + }, + "witnesses": { + "between": [ + { + "bytes": "2262626262626262626262626262626262626262626262626262626262626222", + "value": { + "unit_variant": { + "enum": "Long", + "index": 1, + "variant": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + } + } + }, + { + "bytes": "226363636363636363636363636363636363636363636363636363636363636322", + "value": { + "unit_variant": { + "enum": "Long", + "index": 2, + "variant": "ccccccccccccccccccccccccccccccc" + } + } + } + ], + "max": { + "bytes": "22646464646464646464646464646464646464646464646464646464646464646422", + "value": { + "unit_variant": { + "enum": "Long", + "index": 3, + "variant": "dddddddddddddddddddddddddddddddd" + } + } + }, + "min": { + "bytes": "226122", + "value": { + "unit_variant": { + "enum": "Long", + "index": 0, + "variant": "a" + } + } + } + } + } + }, + { + "id": "sizes-json/recursive-chain-3", + "op": "size", + "input": { + "format": "json@1", + "max": 31, + "min": 13, + "type": { + "recursive": { + "max_depth": 3, + "of": { + "struct": { + "fields": [ + [ + "next", + { + "option": "self" + } + ] + ], + "name": "Node" + } + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "7b226e657874223a7b226e657874223a6e756c6c7d7d", + "value": { + "struct": { + "fields": [ + [ + "next", + { + "option": { + "struct": { + "fields": [ + [ + "next", + { + "option": null + } + ] + ], + "name": "Node" + } + } + } + ] + ], + "name": "Node" + } + } + } + ], + "max": { + "bytes": "7b226e657874223a7b226e657874223a7b226e657874223a6e756c6c7d7d7d", + "value": { + "struct": { + "fields": [ + [ + "next", + { + "option": { + "struct": { + "fields": [ + [ + "next", + { + "option": { + "struct": { + "fields": [ + [ + "next", + { + "option": null + } + ] + ], + "name": "Node" + } + } + } + ] + ], + "name": "Node" + } + } + } + ] + ], + "name": "Node" + } + } + }, + "min": { + "bytes": "7b226e657874223a6e756c6c7d", + "value": { + "struct": { + "fields": [ + [ + "next", + { + "option": null + } + ] + ], + "name": "Node" + } + } + } + } + } + }, + { + "id": "sizes-json/recursive-tree-2", + "op": "size", + "input": { + "format": "json@1", + "max": 46, + "min": 15, + "type": { + "recursive": { + "max_depth": 2, + "of": { + "struct": { + "fields": [ + [ + "children", + { + "bounded_array": { + "max": 2, + "of": "self" + } + } + ] + ], + "name": "Tree" + } + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "7b226368696c6472656e223a5b7b226368696c6472656e223a5b5d7d5d7d", + "value": { + "struct": { + "fields": [ + [ + "children", + { + "array": [ + { + "struct": { + "fields": [ + [ + "children", + { + "array": [] + } + ] + ], + "name": "Tree" + } + } + ] + } + ] + ], + "name": "Tree" + } + } + } + ], + "max": { + "bytes": "7b226368696c6472656e223a5b7b226368696c6472656e223a5b5d7d2c7b226368696c6472656e223a5b5d7d5d7d", + "value": { + "struct": { + "fields": [ + [ + "children", + { + "array": [ + { + "struct": { + "fields": [ + [ + "children", + { + "array": [] + } + ] + ], + "name": "Tree" + } + }, + { + "struct": { + "fields": [ + [ + "children", + { + "array": [] + } + ] + ], + "name": "Tree" + } + } + ] + } + ] + ], + "name": "Tree" + } + } + }, + "min": { + "bytes": "7b226368696c6472656e223a5b5d7d", + "value": { + "struct": { + "fields": [ + [ + "children", + { + "array": [] + } + ] + ], + "name": "Tree" + } + } + } + } + } + } + ] +} diff --git a/runtime/conformance/spec/vectors/sizes-msgpack.json b/runtime/conformance/spec/vectors/sizes-msgpack.json new file mode 100644 index 0000000..e72f683 --- /dev/null +++ b/runtime/conformance/spec/vectors/sizes-msgpack.json @@ -0,0 +1,8285 @@ +{ + "$schema": "../specs/gen/vectors.schema.json", + "feature": "sizes-msgpack", + "cases": [ + { + "id": "sizes-msgpack/bool", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 1, + "min": 1, + "type": "bool", + "witnesses": { + "between": [ + { + "bytes": "c2", + "value": { + "bool": false + } + } + ], + "max": { + "bytes": "c3", + "value": { + "bool": true + } + }, + "min": { + "bytes": "c3", + "value": { + "bool": true + } + } + } + } + }, + { + "id": "sizes-msgpack/u8", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 2, + "min": 1, + "type": "u8", + "witnesses": { + "between": [ + { + "bytes": "01", + "value": { + "u8": 1 + } + }, + { + "bytes": "7f", + "value": { + "u8": 127 + } + }, + { + "bytes": "ccff", + "value": { + "u8": 255 + } + } + ], + "max": { + "bytes": "cc80", + "value": { + "u8": 128 + } + }, + "min": { + "bytes": "00", + "value": { + "u8": 0 + } + } + } + } + }, + { + "id": "sizes-msgpack/u16", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 3, + "min": 1, + "type": "u16", + "witnesses": { + "between": [ + { + "bytes": "7f", + "value": { + "u16": 127 + } + }, + { + "bytes": "cc80", + "value": { + "u16": 128 + } + }, + { + "bytes": "ccff", + "value": { + "u16": 255 + } + }, + { + "bytes": "cdffff", + "value": { + "u16": 65535 + } + } + ], + "max": { + "bytes": "cd0100", + "value": { + "u16": 256 + } + }, + "min": { + "bytes": "00", + "value": { + "u16": 0 + } + } + } + } + }, + { + "id": "sizes-msgpack/u32", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 5, + "min": 1, + "type": "u32", + "witnesses": { + "between": [ + { + "bytes": "7f", + "value": { + "u32": 127 + } + }, + { + "bytes": "cc80", + "value": { + "u32": 128 + } + }, + { + "bytes": "ccff", + "value": { + "u32": 255 + } + }, + { + "bytes": "cd0100", + "value": { + "u32": 256 + } + }, + { + "bytes": "cdffff", + "value": { + "u32": 65535 + } + }, + { + "bytes": "ceffffffff", + "value": { + "u32": 4294967295 + } + } + ], + "max": { + "bytes": "ce00010000", + "value": { + "u32": 65536 + } + }, + "min": { + "bytes": "00", + "value": { + "u32": 0 + } + } + } + } + }, + { + "id": "sizes-msgpack/u64", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 9, + "min": 1, + "type": "u64", + "witnesses": { + "between": [ + { + "bytes": "7f", + "value": { + "u64": "127" + } + }, + { + "bytes": "cc80", + "value": { + "u64": "128" + } + }, + { + "bytes": "ccff", + "value": { + "u64": "255" + } + }, + { + "bytes": "cd0100", + "value": { + "u64": "256" + } + }, + { + "bytes": "cdffff", + "value": { + "u64": "65535" + } + }, + { + "bytes": "ce00010000", + "value": { + "u64": "65536" + } + }, + { + "bytes": "ceffffffff", + "value": { + "u64": "4294967295" + } + }, + { + "bytes": "cfffffffffffffffff", + "value": { + "u64": "18446744073709551615" + } + } + ], + "max": { + "bytes": "cf0000000100000000", + "value": { + "u64": "4294967296" + } + }, + "min": { + "bytes": "00", + "value": { + "u64": "0" + } + } + } + } + }, + { + "id": "sizes-msgpack/u128", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 18, + "min": 18, + "type": "u128", + "witnesses": { + "between": [ + { + "bytes": "c41000000000000000000000000000000001", + "value": { + "u128": "1" + } + }, + { + "bytes": "c41000000000000000010000000000000000", + "value": { + "u128": "18446744073709551616" + } + }, + { + "bytes": "c410ffffffffffffffffffffffffffffffff", + "value": { + "u128": "340282366920938463463374607431768211455" + } + } + ], + "max": { + "bytes": "c41000000000000000000000000000000000", + "value": { + "u128": "0" + } + }, + "min": { + "bytes": "c41000000000000000000000000000000000", + "value": { + "u128": "0" + } + } + } + } + }, + { + "id": "sizes-msgpack/i8", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 2, + "min": 1, + "type": "i8", + "witnesses": { + "between": [ + { + "bytes": "ff", + "value": { + "i8": -1 + } + }, + { + "bytes": "e0", + "value": { + "i8": -32 + } + }, + { + "bytes": "d080", + "value": { + "i8": -128 + } + }, + { + "bytes": "7f", + "value": { + "i8": 127 + } + } + ], + "max": { + "bytes": "d0df", + "value": { + "i8": -33 + } + }, + "min": { + "bytes": "00", + "value": { + "i8": 0 + } + } + } + } + }, + { + "id": "sizes-msgpack/i16", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 3, + "min": 1, + "type": "i16", + "witnesses": { + "between": [ + { + "bytes": "ff", + "value": { + "i16": -1 + } + }, + { + "bytes": "d0df", + "value": { + "i16": -33 + } + }, + { + "bytes": "d080", + "value": { + "i16": -128 + } + }, + { + "bytes": "d18000", + "value": { + "i16": -32768 + } + }, + { + "bytes": "7f", + "value": { + "i16": 127 + } + }, + { + "bytes": "cc80", + "value": { + "i16": 128 + } + }, + { + "bytes": "ccff", + "value": { + "i16": 255 + } + }, + { + "bytes": "cd0100", + "value": { + "i16": 256 + } + }, + { + "bytes": "cd7fff", + "value": { + "i16": 32767 + } + } + ], + "max": { + "bytes": "d1ff7f", + "value": { + "i16": -129 + } + }, + "min": { + "bytes": "00", + "value": { + "i16": 0 + } + } + } + } + }, + { + "id": "sizes-msgpack/i32", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 5, + "min": 1, + "type": "i32", + "witnesses": { + "between": [ + { + "bytes": "ff", + "value": { + "i32": -1 + } + }, + { + "bytes": "d080", + "value": { + "i32": -128 + } + }, + { + "bytes": "d1ff7f", + "value": { + "i32": -129 + } + }, + { + "bytes": "d18000", + "value": { + "i32": -32768 + } + }, + { + "bytes": "d280000000", + "value": { + "i32": -2147483648 + } + }, + { + "bytes": "ccff", + "value": { + "i32": 255 + } + }, + { + "bytes": "cd0100", + "value": { + "i32": 256 + } + }, + { + "bytes": "cdffff", + "value": { + "i32": 65535 + } + }, + { + "bytes": "ce00010000", + "value": { + "i32": 65536 + } + }, + { + "bytes": "ce7fffffff", + "value": { + "i32": 2147483647 + } + } + ], + "max": { + "bytes": "d2ffff7fff", + "value": { + "i32": -32769 + } + }, + "min": { + "bytes": "00", + "value": { + "i32": 0 + } + } + } + } + }, + { + "id": "sizes-msgpack/i64", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 9, + "min": 1, + "type": "i64", + "witnesses": { + "between": [ + { + "bytes": "ff", + "value": { + "i64": "-1" + } + }, + { + "bytes": "d2ffff7fff", + "value": { + "i64": "-32769" + } + }, + { + "bytes": "d280000000", + "value": { + "i64": "-2147483648" + } + }, + { + "bytes": "d38000000000000000", + "value": { + "i64": "-9223372036854775808" + } + }, + { + "bytes": "ce00010000", + "value": { + "i64": "65536" + } + }, + { + "bytes": "ceffffffff", + "value": { + "i64": "4294967295" + } + }, + { + "bytes": "cf0000000100000000", + "value": { + "i64": "4294967296" + } + }, + { + "bytes": "cf7fffffffffffffff", + "value": { + "i64": "9223372036854775807" + } + } + ], + "max": { + "bytes": "d3ffffffff7fffffff", + "value": { + "i64": "-2147483649" + } + }, + "min": { + "bytes": "00", + "value": { + "i64": "0" + } + } + } + } + }, + { + "id": "sizes-msgpack/i128", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 18, + "min": 18, + "type": "i128", + "witnesses": { + "between": [ + { + "bytes": "c410ffffffffffffffffffffffffffffffff", + "value": { + "i128": "-1" + } + }, + { + "bytes": "c41000000010000000000000000000000000", + "value": { + "i128": "1267650600228229401496703205376" + } + }, + { + "bytes": "c41080000000000000000000000000000000", + "value": { + "i128": "-170141183460469231731687303715884105728" + } + }, + { + "bytes": "c4107fffffffffffffffffffffffffffffff", + "value": { + "i128": "170141183460469231731687303715884105727" + } + } + ], + "max": { + "bytes": "c41000000000000000000000000000000000", + "value": { + "i128": "0" + } + }, + "min": { + "bytes": "c41000000000000000000000000000000000", + "value": { + "i128": "0" + } + } + } + } + }, + { + "id": "sizes-msgpack/f32", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 5, + "min": 5, + "type": "f32", + "witnesses": { + "between": [ + { + "bytes": "ca3f800000", + "value": { + "f32": 1.0 + } + }, + { + "bytes": "cabe800000", + "value": { + "f32": -0.25 + } + }, + { + "bytes": "ca47f12065", + "value": { + "f32": 123456.7890625 + } + }, + { + "bytes": "ca374f204a", + "value": { + "f32": 0.000012345679351710714 + } + }, + { + "bytes": "cab74f204a", + "value": { + "f32": -0.000012345679351710714 + } + }, + { + "bytes": "cad4b56c82", + "value": { + "f32": -6233676316672.0 + } + }, + { + "bytes": "ca7f7fffff", + "value": { + "f32": 3.4028234663852886e+38 + } + }, + { + "bytes": "caff7fffff", + "value": { + "f32": -3.4028234663852886e+38 + } + }, + { + "bytes": "ca00800000", + "value": { + "f32": 1.1754943508222875e-38 + } + }, + { + "bytes": "ca00000001", + "value": { + "f32": 1.401298464324817e-45 + } + } + ], + "max": { + "bytes": "ca00000000", + "value": { + "f32": 0.0 + } + }, + "min": { + "bytes": "ca00000000", + "value": { + "f32": 0.0 + } + } + } + } + }, + { + "id": "sizes-msgpack/f64", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 9, + "min": 9, + "type": "f64", + "witnesses": { + "between": [ + { + "bytes": "cb3ff0000000000000", + "value": { + "f64": 1.0 + } + }, + { + "bytes": "cbbfd0000000000000", + "value": { + "f64": -0.25 + } + }, + { + "bytes": "cb419d6f3454800000", + "value": { + "f64": 123456789.125 + } + }, + { + "bytes": "cb3ee4f8b588e368f1", + "value": { + "f64": 0.00001 + } + }, + { + "bytes": "cb430c6bf526340000", + "value": { + "f64": 1000000000000000.0 + } + }, + { + "bytes": "cbbeea7231dfe396c6", + "value": { + "f64": -0.000012610470545525327 + } + }, + { + "bytes": "cb7fefffffffffffff", + "value": { + "f64": 1.7976931348623157e+308 + } + }, + { + "bytes": "cbffefffffffffffff", + "value": { + "f64": -1.7976931348623157e+308 + } + }, + { + "bytes": "cb0000000000000001", + "value": { + "f64": 5e-324 + } + }, + { + "bytes": "cb062483bf55de65f2", + "value": { + "f64": 4.520618856987477e-279 + } + } + ], + "max": { + "bytes": "cb0000000000000000", + "value": { + "f64": 0.0 + } + }, + "min": { + "bytes": "cb0000000000000000", + "value": { + "f64": 0.0 + } + } + } + } + }, + { + "id": "sizes-msgpack/char", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 5, + "min": 2, + "type": "char", + "witnesses": { + "between": [ + { + "bytes": "a2c3a9", + "value": { + "char": "é" + } + }, + { + "bytes": "a3e282ac", + "value": { + "char": "€" + } + }, + { + "bytes": "a101", + "value": { + "char": "\u0001" + } + }, + { + "bytes": "a122", + "value": { + "char": "\"" + } + }, + { + "bytes": "a10a", + "value": { + "char": "\n" + } + }, + { + "bytes": "a17f", + "value": { + "char": "" + } + } + ], + "max": { + "bytes": "a4f09f9880", + "value": { + "char": "😀" + } + }, + "min": { + "bytes": "a161", + "value": { + "char": "a" + } + } + } + } + }, + { + "id": "sizes-msgpack/unit", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 1, + "min": 1, + "type": "unit", + "witnesses": { + "max": { + "bytes": "c0", + "value": { + "unit": null + } + }, + "min": { + "bytes": "c0", + "value": { + "unit": null + } + } + } + } + }, + { + "id": "sizes-msgpack/string-unbounded", + "op": "size", + "input": { + "format": "msgpack@1", + "max": null, + "min": 1, + "type": "string", + "witnesses": { + "between": [ + { + "bytes": "a161", + "value": { + "string": "a" + } + }, + { + "bytes": "af616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaa" + } + }, + { + "bytes": "b061616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "bf61616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "d9206161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "d97f61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "d9806161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "d9ff616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "da010061616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "a668c3a96c6c6f", + "value": { + "string": "héllo" + } + }, + { + "bytes": "a4f09f9880", + "value": { + "string": "😀" + } + }, + { + "bytes": "a973617920226869220a", + "value": { + "string": "say \"hi\"\n" + } + }, + { + "bytes": "a15c", + "value": { + "string": "\\" + } + }, + { + "bytes": "a2011f", + "value": { + "string": "\u0001\u001f" + } + }, + { + "bytes": "a30a7f62", + "value": { + "string": "\nb" + } + } + ], + "min": { + "bytes": "a0", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-msgpack/string-max-0", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 1, + "min": 1, + "type": { + "bounded_string": { + "max": 0 + } + }, + "witnesses": { + "max": { + "bytes": "a0", + "value": { + "string": "" + } + }, + "min": { + "bytes": "a0", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-msgpack/string-max-1", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 5, + "min": 1, + "type": { + "bounded_string": { + "max": 1 + } + }, + "witnesses": { + "between": [ + { + "bytes": "a161", + "value": { + "string": "a" + } + }, + { + "bytes": "a2c3a9", + "value": { + "string": "é" + } + }, + { + "bytes": "a3e282ac", + "value": { + "string": "€" + } + }, + { + "bytes": "a122", + "value": { + "string": "\"" + } + }, + { + "bytes": "a15c", + "value": { + "string": "\\" + } + } + ], + "max": { + "bytes": "a4f09f9880", + "value": { + "string": "😀" + } + }, + "min": { + "bytes": "a0", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-msgpack/string-max-3", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 13, + "min": 1, + "type": { + "bounded_string": { + "max": 3 + } + }, + "witnesses": { + "between": [ + { + "bytes": "a3616161", + "value": { + "string": "aaa" + } + }, + { + "bytes": "a6c3a9c3a9c3a9", + "value": { + "string": "ééé" + } + }, + { + "bytes": "a9e282ace282ace282ac", + "value": { + "string": "€€€" + } + }, + { + "bytes": "a3222222", + "value": { + "string": "\"\"\"" + } + }, + { + "bytes": "a35c5c5c", + "value": { + "string": "\\\\\\" + } + }, + { + "bytes": "a25c7f", + "value": { + "string": "\\" + } + } + ], + "max": { + "bytes": "acf09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀" + } + }, + "min": { + "bytes": "a0", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-msgpack/string-max-7", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 29, + "min": 1, + "type": { + "bounded_string": { + "max": 7 + } + }, + "witnesses": { + "between": [ + { + "bytes": "a761616161616161", + "value": { + "string": "aaaaaaa" + } + }, + { + "bytes": "aec3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "ééééééé" + } + }, + { + "bytes": "b5e282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€" + } + }, + { + "bytes": "a722222222222222", + "value": { + "string": "\"\"\"\"\"\"\"" + } + }, + { + "bytes": "a75c5c5c5c5c5c5c", + "value": { + "string": "\\\\\\\\\\\\\\" + } + }, + { + "bytes": "a5e282ac610a", + "value": { + "string": "€a\n" + } + } + ], + "max": { + "bytes": "bcf09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "a0", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-msgpack/string-max-8", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 34, + "min": 1, + "type": { + "bounded_string": { + "max": 8 + } + }, + "witnesses": { + "between": [ + { + "bytes": "a86161616161616161", + "value": { + "string": "aaaaaaaa" + } + }, + { + "bytes": "b0c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "éééééééé" + } + }, + { + "bytes": "b8e282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€" + } + }, + { + "bytes": "a82222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "a85c5c5c5c5c5c5c5c", + "value": { + "string": "\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "a2620a", + "value": { + "string": "b\n" + } + } + ], + "max": { + "bytes": "d920f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "a0", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-msgpack/string-max-31", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 126, + "min": 1, + "type": { + "bounded_string": { + "max": 31 + } + }, + "witnesses": { + "between": [ + { + "bytes": "bf61616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "d93ec3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "ééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "d95de282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "bf22222222222222222222222222222222222222222222222222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "bf5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c", + "value": { + "string": "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "a45c62c3a9", + "value": { + "string": "\\bé" + } + } + ], + "max": { + "bytes": "d97cf09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "a0", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-msgpack/string-max-32", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 130, + "min": 1, + "type": { + "bounded_string": { + "max": 32 + } + }, + "witnesses": { + "between": [ + { + "bytes": "d9206161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "d940c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "éééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "d960e282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "d9202222222222222222222222222222222222222222222222222222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "d9205c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c", + "value": { + "string": "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "a2c3a9", + "value": { + "string": "é" + } + } + ], + "max": { + "bytes": "d980f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "a0", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-msgpack/string-max-63", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 254, + "min": 1, + "type": { + "bounded_string": { + "max": 63 + } + }, + "witnesses": { + "between": [ + { + "bytes": "d93f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "d97ec3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "d9bde282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "d93f222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "d93f5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c", + "value": { + "string": "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "a162", + "value": { + "string": "b" + } + } + ], + "max": { + "bytes": "d9fcf09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "a0", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-msgpack/string-max-64", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 259, + "min": 1, + "type": { + "bounded_string": { + "max": 64 + } + }, + "witnesses": { + "between": [ + { + "bytes": "d94061616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "d980c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "d9c0e282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "d94022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "d9405c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c", + "value": { + "string": "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "a5f09f98805c", + "value": { + "string": "😀\\" + } + } + ], + "max": { + "bytes": "da0100f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "a0", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-msgpack/string-max-16384", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 65541, + "min": 1, + "type": { + "bounded_string": { + "max": 16384 + } + }, + "witnesses": { + "between": [ + { + "bytes": "da400061616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "a4e282ac5c", + "value": { + "string": "€\\" + } + } + ], + "max": { + "bytes": "db00010000f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "a0", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-msgpack/string-fixed-3", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 13, + "min": 4, + "type": { + "fixed_string": { + "len": 3 + } + }, + "witnesses": { + "between": [ + { + "bytes": "a6c3a9c3a9c3a9", + "value": { + "string": "ééé" + } + }, + { + "bytes": "a9e282ace282ace282ac", + "value": { + "string": "€€€" + } + }, + { + "bytes": "a3222222", + "value": { + "string": "\"\"\"" + } + }, + { + "bytes": "a7c3a961f09f9880", + "value": { + "string": "éa😀" + } + } + ], + "max": { + "bytes": "acf09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀" + } + }, + "min": { + "bytes": "a3616161", + "value": { + "string": "aaa" + } + } + } + } + }, + { + "id": "sizes-msgpack/string-fixed-8", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 34, + "min": 9, + "type": { + "fixed_string": { + "len": 8 + } + }, + "witnesses": { + "between": [ + { + "bytes": "b0c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "éééééééé" + } + }, + { + "bytes": "b8e282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€" + } + }, + { + "bytes": "a82222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "b2f09f9880e282ace282acf09f988062225c62", + "value": { + "string": "😀€€😀b\"\\b" + } + } + ], + "max": { + "bytes": "d920f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "a86161616161616161", + "value": { + "string": "aaaaaaaa" + } + } + } + } + }, + { + "id": "sizes-msgpack/string-fixed-32", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 130, + "min": 34, + "type": { + "fixed_string": { + "len": 32 + } + }, + "witnesses": { + "between": [ + { + "bytes": "d940c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "éééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "d960e282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "d9202222222222222222222222222222222222222222222222222222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "d931c3a961e282ac0162615c5c620120e282acc3a9615cc3a9207ff09f9880016120e282ac20e282ac0a015cf09f988022200a", + "value": { + "string": "éa€\u0001ba\\\\b\u0001 €éa\\é 😀\u0001a € €\n\u0001\\😀\" \n" + } + } + ], + "max": { + "bytes": "d980f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "d9206161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + } + } + } + }, + { + "id": "sizes-msgpack/array-unbounded", + "op": "size", + "input": { + "format": "msgpack@1", + "max": null, + "min": 1, + "type": { + "array": "u8" + }, + "witnesses": { + "between": [ + { + "bytes": "9100", + "value": { + "array": [ + { + "u8": 0 + } + ] + } + }, + { + "bytes": "920001", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 1 + } + ] + } + }, + { + "bytes": "9f000102030405060708090a0b0c0d0e", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 1 + }, + { + "u8": 2 + }, + { + "u8": 3 + }, + { + "u8": 4 + }, + { + "u8": 5 + }, + { + "u8": 6 + }, + { + "u8": 7 + }, + { + "u8": 8 + }, + { + "u8": 9 + }, + { + "u8": 10 + }, + { + "u8": 11 + }, + { + "u8": 12 + }, + { + "u8": 13 + }, + { + "u8": 14 + } + ] + } + }, + { + "bytes": "dc0010000102030405060708090a0b0c0d0e0f", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 1 + }, + { + "u8": 2 + }, + { + "u8": 3 + }, + { + "u8": 4 + }, + { + "u8": 5 + }, + { + "u8": 6 + }, + { + "u8": 7 + }, + { + "u8": 8 + }, + { + "u8": 9 + }, + { + "u8": 10 + }, + { + "u8": 11 + }, + { + "u8": 12 + }, + { + "u8": 13 + }, + { + "u8": 14 + }, + { + "u8": 15 + } + ] + } + }, + { + "bytes": "dc00ff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7fcc80cc81cc82cc83cc84cc85cc86cc87cc88cc89cc8acc8bcc8ccc8dcc8ecc8fcc90cc91cc92cc93cc94cc95cc96cc97cc98cc99cc9acc9bcc9ccc9dcc9ecc9fcca0cca1cca2cca3cca4cca5cca6cca7cca8cca9ccaaccabccacccadccaeccafccb0ccb1ccb2ccb3ccb4ccb5ccb6ccb7ccb8ccb9ccbaccbbccbcccbdccbeccbfccc0ccc1ccc2ccc3ccc4ccc5ccc6ccc7ccc8ccc9cccacccbcccccccdcccecccfccd0ccd1ccd2ccd3ccd4ccd5ccd6ccd7ccd8ccd9ccdaccdbccdcccddccdeccdfcce0cce1cce2cce3cce4cce5cce6cce7cce8cce9cceaccebccecccedcceeccefccf0ccf1ccf2ccf3ccf4ccf5ccf6ccf7ccf8ccf9ccfaccfbccfcccfdccfe", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 1 + }, + { + "u8": 2 + }, + { + "u8": 3 + }, + { + "u8": 4 + }, + { + "u8": 5 + }, + { + "u8": 6 + }, + { + "u8": 7 + }, + { + "u8": 8 + }, + { + "u8": 9 + }, + { + "u8": 10 + }, + { + "u8": 11 + }, + { + "u8": 12 + }, + { + "u8": 13 + }, + { + "u8": 14 + }, + { + "u8": 15 + }, + { + "u8": 16 + }, + { + "u8": 17 + }, + { + "u8": 18 + }, + { + "u8": 19 + }, + { + "u8": 20 + }, + { + "u8": 21 + }, + { + "u8": 22 + }, + { + "u8": 23 + }, + { + "u8": 24 + }, + { + "u8": 25 + }, + { + "u8": 26 + }, + { + "u8": 27 + }, + { + "u8": 28 + }, + { + "u8": 29 + }, + { + "u8": 30 + }, + { + "u8": 31 + }, + { + "u8": 32 + }, + { + "u8": 33 + }, + { + "u8": 34 + }, + { + "u8": 35 + }, + { + "u8": 36 + }, + { + "u8": 37 + }, + { + "u8": 38 + }, + { + "u8": 39 + }, + { + "u8": 40 + }, + { + "u8": 41 + }, + { + "u8": 42 + }, + { + "u8": 43 + }, + { + "u8": 44 + }, + { + "u8": 45 + }, + { + "u8": 46 + }, + { + "u8": 47 + }, + { + "u8": 48 + }, + { + "u8": 49 + }, + { + "u8": 50 + }, + { + "u8": 51 + }, + { + "u8": 52 + }, + { + "u8": 53 + }, + { + "u8": 54 + }, + { + "u8": 55 + }, + { + "u8": 56 + }, + { + "u8": 57 + }, + { + "u8": 58 + }, + { + "u8": 59 + }, + { + "u8": 60 + }, + { + "u8": 61 + }, + { + "u8": 62 + }, + { + "u8": 63 + }, + { + "u8": 64 + }, + { + "u8": 65 + }, + { + "u8": 66 + }, + { + "u8": 67 + }, + { + "u8": 68 + }, + { + "u8": 69 + }, + { + "u8": 70 + }, + { + "u8": 71 + }, + { + "u8": 72 + }, + { + "u8": 73 + }, + { + "u8": 74 + }, + { + "u8": 75 + }, + { + "u8": 76 + }, + { + "u8": 77 + }, + { + "u8": 78 + }, + { + "u8": 79 + }, + { + "u8": 80 + }, + { + "u8": 81 + }, + { + "u8": 82 + }, + { + "u8": 83 + }, + { + "u8": 84 + }, + { + "u8": 85 + }, + { + "u8": 86 + }, + { + "u8": 87 + }, + { + "u8": 88 + }, + { + "u8": 89 + }, + { + "u8": 90 + }, + { + "u8": 91 + }, + { + "u8": 92 + }, + { + "u8": 93 + }, + { + "u8": 94 + }, + { + "u8": 95 + }, + { + "u8": 96 + }, + { + "u8": 97 + }, + { + "u8": 98 + }, + { + "u8": 99 + }, + { + "u8": 100 + }, + { + "u8": 101 + }, + { + "u8": 102 + }, + { + "u8": 103 + }, + { + "u8": 104 + }, + { + "u8": 105 + }, + { + "u8": 106 + }, + { + "u8": 107 + }, + { + "u8": 108 + }, + { + "u8": 109 + }, + { + "u8": 110 + }, + { + "u8": 111 + }, + { + "u8": 112 + }, + { + "u8": 113 + }, + { + "u8": 114 + }, + { + "u8": 115 + }, + { + "u8": 116 + }, + { + "u8": 117 + }, + { + "u8": 118 + }, + { + "u8": 119 + }, + { + "u8": 120 + }, + { + "u8": 121 + }, + { + "u8": 122 + }, + { + "u8": 123 + }, + { + "u8": 124 + }, + { + "u8": 125 + }, + { + "u8": 126 + }, + { + "u8": 127 + }, + { + "u8": 128 + }, + { + "u8": 129 + }, + { + "u8": 130 + }, + { + "u8": 131 + }, + { + "u8": 132 + }, + { + "u8": 133 + }, + { + "u8": 134 + }, + { + "u8": 135 + }, + { + "u8": 136 + }, + { + "u8": 137 + }, + { + "u8": 138 + }, + { + "u8": 139 + }, + { + "u8": 140 + }, + { + "u8": 141 + }, + { + "u8": 142 + }, + { + "u8": 143 + }, + { + "u8": 144 + }, + { + "u8": 145 + }, + { + "u8": 146 + }, + { + "u8": 147 + }, + { + "u8": 148 + }, + { + "u8": 149 + }, + { + "u8": 150 + }, + { + "u8": 151 + }, + { + "u8": 152 + }, + { + "u8": 153 + }, + { + "u8": 154 + }, + { + "u8": 155 + }, + { + "u8": 156 + }, + { + "u8": 157 + }, + { + "u8": 158 + }, + { + "u8": 159 + }, + { + "u8": 160 + }, + { + "u8": 161 + }, + { + "u8": 162 + }, + { + "u8": 163 + }, + { + "u8": 164 + }, + { + "u8": 165 + }, + { + "u8": 166 + }, + { + "u8": 167 + }, + { + "u8": 168 + }, + { + "u8": 169 + }, + { + "u8": 170 + }, + { + "u8": 171 + }, + { + "u8": 172 + }, + { + "u8": 173 + }, + { + "u8": 174 + }, + { + "u8": 175 + }, + { + "u8": 176 + }, + { + "u8": 177 + }, + { + "u8": 178 + }, + { + "u8": 179 + }, + { + "u8": 180 + }, + { + "u8": 181 + }, + { + "u8": 182 + }, + { + "u8": 183 + }, + { + "u8": 184 + }, + { + "u8": 185 + }, + { + "u8": 186 + }, + { + "u8": 187 + }, + { + "u8": 188 + }, + { + "u8": 189 + }, + { + "u8": 190 + }, + { + "u8": 191 + }, + { + "u8": 192 + }, + { + "u8": 193 + }, + { + "u8": 194 + }, + { + "u8": 195 + }, + { + "u8": 196 + }, + { + "u8": 197 + }, + { + "u8": 198 + }, + { + "u8": 199 + }, + { + "u8": 200 + }, + { + "u8": 201 + }, + { + "u8": 202 + }, + { + "u8": 203 + }, + { + "u8": 204 + }, + { + "u8": 205 + }, + { + "u8": 206 + }, + { + "u8": 207 + }, + { + "u8": 208 + }, + { + "u8": 209 + }, + { + "u8": 210 + }, + { + "u8": 211 + }, + { + "u8": 212 + }, + { + "u8": 213 + }, + { + "u8": 214 + }, + { + "u8": 215 + }, + { + "u8": 216 + }, + { + "u8": 217 + }, + { + "u8": 218 + }, + { + "u8": 219 + }, + { + "u8": 220 + }, + { + "u8": 221 + }, + { + "u8": 222 + }, + { + "u8": 223 + }, + { + "u8": 224 + }, + { + "u8": 225 + }, + { + "u8": 226 + }, + { + "u8": 227 + }, + { + "u8": 228 + }, + { + "u8": 229 + }, + { + "u8": 230 + }, + { + "u8": 231 + }, + { + "u8": 232 + }, + { + "u8": 233 + }, + { + "u8": 234 + }, + { + "u8": 235 + }, + { + "u8": 236 + }, + { + "u8": 237 + }, + { + "u8": 238 + }, + { + "u8": 239 + }, + { + "u8": 240 + }, + { + "u8": 241 + }, + { + "u8": 242 + }, + { + "u8": 243 + }, + { + "u8": 244 + }, + { + "u8": 245 + }, + { + "u8": 246 + }, + { + "u8": 247 + }, + { + "u8": 248 + }, + { + "u8": 249 + }, + { + "u8": 250 + }, + { + "u8": 251 + }, + { + "u8": 252 + }, + { + "u8": 253 + }, + { + "u8": 254 + } + ] + } + }, + { + "bytes": "dc0100000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7fcc80cc81cc82cc83cc84cc85cc86cc87cc88cc89cc8acc8bcc8ccc8dcc8ecc8fcc90cc91cc92cc93cc94cc95cc96cc97cc98cc99cc9acc9bcc9ccc9dcc9ecc9fcca0cca1cca2cca3cca4cca5cca6cca7cca8cca9ccaaccabccacccadccaeccafccb0ccb1ccb2ccb3ccb4ccb5ccb6ccb7ccb8ccb9ccbaccbbccbcccbdccbeccbfccc0ccc1ccc2ccc3ccc4ccc5ccc6ccc7ccc8ccc9cccacccbcccccccdcccecccfccd0ccd1ccd2ccd3ccd4ccd5ccd6ccd7ccd8ccd9ccdaccdbccdcccddccdeccdfcce0cce1cce2cce3cce4cce5cce6cce7cce8cce9cceaccebccecccedcceeccefccf0ccf1ccf2ccf3ccf4ccf5ccf6ccf7ccf8ccf9ccfaccfbccfcccfdccfeccff", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 1 + }, + { + "u8": 2 + }, + { + "u8": 3 + }, + { + "u8": 4 + }, + { + "u8": 5 + }, + { + "u8": 6 + }, + { + "u8": 7 + }, + { + "u8": 8 + }, + { + "u8": 9 + }, + { + "u8": 10 + }, + { + "u8": 11 + }, + { + "u8": 12 + }, + { + "u8": 13 + }, + { + "u8": 14 + }, + { + "u8": 15 + }, + { + "u8": 16 + }, + { + "u8": 17 + }, + { + "u8": 18 + }, + { + "u8": 19 + }, + { + "u8": 20 + }, + { + "u8": 21 + }, + { + "u8": 22 + }, + { + "u8": 23 + }, + { + "u8": 24 + }, + { + "u8": 25 + }, + { + "u8": 26 + }, + { + "u8": 27 + }, + { + "u8": 28 + }, + { + "u8": 29 + }, + { + "u8": 30 + }, + { + "u8": 31 + }, + { + "u8": 32 + }, + { + "u8": 33 + }, + { + "u8": 34 + }, + { + "u8": 35 + }, + { + "u8": 36 + }, + { + "u8": 37 + }, + { + "u8": 38 + }, + { + "u8": 39 + }, + { + "u8": 40 + }, + { + "u8": 41 + }, + { + "u8": 42 + }, + { + "u8": 43 + }, + { + "u8": 44 + }, + { + "u8": 45 + }, + { + "u8": 46 + }, + { + "u8": 47 + }, + { + "u8": 48 + }, + { + "u8": 49 + }, + { + "u8": 50 + }, + { + "u8": 51 + }, + { + "u8": 52 + }, + { + "u8": 53 + }, + { + "u8": 54 + }, + { + "u8": 55 + }, + { + "u8": 56 + }, + { + "u8": 57 + }, + { + "u8": 58 + }, + { + "u8": 59 + }, + { + "u8": 60 + }, + { + "u8": 61 + }, + { + "u8": 62 + }, + { + "u8": 63 + }, + { + "u8": 64 + }, + { + "u8": 65 + }, + { + "u8": 66 + }, + { + "u8": 67 + }, + { + "u8": 68 + }, + { + "u8": 69 + }, + { + "u8": 70 + }, + { + "u8": 71 + }, + { + "u8": 72 + }, + { + "u8": 73 + }, + { + "u8": 74 + }, + { + "u8": 75 + }, + { + "u8": 76 + }, + { + "u8": 77 + }, + { + "u8": 78 + }, + { + "u8": 79 + }, + { + "u8": 80 + }, + { + "u8": 81 + }, + { + "u8": 82 + }, + { + "u8": 83 + }, + { + "u8": 84 + }, + { + "u8": 85 + }, + { + "u8": 86 + }, + { + "u8": 87 + }, + { + "u8": 88 + }, + { + "u8": 89 + }, + { + "u8": 90 + }, + { + "u8": 91 + }, + { + "u8": 92 + }, + { + "u8": 93 + }, + { + "u8": 94 + }, + { + "u8": 95 + }, + { + "u8": 96 + }, + { + "u8": 97 + }, + { + "u8": 98 + }, + { + "u8": 99 + }, + { + "u8": 100 + }, + { + "u8": 101 + }, + { + "u8": 102 + }, + { + "u8": 103 + }, + { + "u8": 104 + }, + { + "u8": 105 + }, + { + "u8": 106 + }, + { + "u8": 107 + }, + { + "u8": 108 + }, + { + "u8": 109 + }, + { + "u8": 110 + }, + { + "u8": 111 + }, + { + "u8": 112 + }, + { + "u8": 113 + }, + { + "u8": 114 + }, + { + "u8": 115 + }, + { + "u8": 116 + }, + { + "u8": 117 + }, + { + "u8": 118 + }, + { + "u8": 119 + }, + { + "u8": 120 + }, + { + "u8": 121 + }, + { + "u8": 122 + }, + { + "u8": 123 + }, + { + "u8": 124 + }, + { + "u8": 125 + }, + { + "u8": 126 + }, + { + "u8": 127 + }, + { + "u8": 128 + }, + { + "u8": 129 + }, + { + "u8": 130 + }, + { + "u8": 131 + }, + { + "u8": 132 + }, + { + "u8": 133 + }, + { + "u8": 134 + }, + { + "u8": 135 + }, + { + "u8": 136 + }, + { + "u8": 137 + }, + { + "u8": 138 + }, + { + "u8": 139 + }, + { + "u8": 140 + }, + { + "u8": 141 + }, + { + "u8": 142 + }, + { + "u8": 143 + }, + { + "u8": 144 + }, + { + "u8": 145 + }, + { + "u8": 146 + }, + { + "u8": 147 + }, + { + "u8": 148 + }, + { + "u8": 149 + }, + { + "u8": 150 + }, + { + "u8": 151 + }, + { + "u8": 152 + }, + { + "u8": 153 + }, + { + "u8": 154 + }, + { + "u8": 155 + }, + { + "u8": 156 + }, + { + "u8": 157 + }, + { + "u8": 158 + }, + { + "u8": 159 + }, + { + "u8": 160 + }, + { + "u8": 161 + }, + { + "u8": 162 + }, + { + "u8": 163 + }, + { + "u8": 164 + }, + { + "u8": 165 + }, + { + "u8": 166 + }, + { + "u8": 167 + }, + { + "u8": 168 + }, + { + "u8": 169 + }, + { + "u8": 170 + }, + { + "u8": 171 + }, + { + "u8": 172 + }, + { + "u8": 173 + }, + { + "u8": 174 + }, + { + "u8": 175 + }, + { + "u8": 176 + }, + { + "u8": 177 + }, + { + "u8": 178 + }, + { + "u8": 179 + }, + { + "u8": 180 + }, + { + "u8": 181 + }, + { + "u8": 182 + }, + { + "u8": 183 + }, + { + "u8": 184 + }, + { + "u8": 185 + }, + { + "u8": 186 + }, + { + "u8": 187 + }, + { + "u8": 188 + }, + { + "u8": 189 + }, + { + "u8": 190 + }, + { + "u8": 191 + }, + { + "u8": 192 + }, + { + "u8": 193 + }, + { + "u8": 194 + }, + { + "u8": 195 + }, + { + "u8": 196 + }, + { + "u8": 197 + }, + { + "u8": 198 + }, + { + "u8": 199 + }, + { + "u8": 200 + }, + { + "u8": 201 + }, + { + "u8": 202 + }, + { + "u8": 203 + }, + { + "u8": 204 + }, + { + "u8": 205 + }, + { + "u8": 206 + }, + { + "u8": 207 + }, + { + "u8": 208 + }, + { + "u8": 209 + }, + { + "u8": 210 + }, + { + "u8": 211 + }, + { + "u8": 212 + }, + { + "u8": 213 + }, + { + "u8": 214 + }, + { + "u8": 215 + }, + { + "u8": 216 + }, + { + "u8": 217 + }, + { + "u8": 218 + }, + { + "u8": 219 + }, + { + "u8": 220 + }, + { + "u8": 221 + }, + { + "u8": 222 + }, + { + "u8": 223 + }, + { + "u8": 224 + }, + { + "u8": 225 + }, + { + "u8": 226 + }, + { + "u8": 227 + }, + { + "u8": 228 + }, + { + "u8": 229 + }, + { + "u8": 230 + }, + { + "u8": 231 + }, + { + "u8": 232 + }, + { + "u8": 233 + }, + { + "u8": 234 + }, + { + "u8": 235 + }, + { + "u8": 236 + }, + { + "u8": 237 + }, + { + "u8": 238 + }, + { + "u8": 239 + }, + { + "u8": 240 + }, + { + "u8": 241 + }, + { + "u8": 242 + }, + { + "u8": 243 + }, + { + "u8": 244 + }, + { + "u8": 245 + }, + { + "u8": 246 + }, + { + "u8": 247 + }, + { + "u8": 248 + }, + { + "u8": 249 + }, + { + "u8": 250 + }, + { + "u8": 251 + }, + { + "u8": 252 + }, + { + "u8": 253 + }, + { + "u8": 254 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "93ccffccffccff", + "value": { + "array": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "91cc80", + "value": { + "array": [ + { + "u8": 128 + } + ] + } + } + ], + "min": { + "bytes": "90", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-msgpack/array-unbounded-strings", + "op": "size", + "input": { + "format": "msgpack@1", + "max": null, + "min": 1, + "type": { + "array": "string" + }, + "witnesses": { + "between": [ + { + "bytes": "93a161a26263a0", + "value": { + "array": [ + { + "string": "a" + }, + { + "string": "bc" + }, + { + "string": "" + } + ] + } + }, + { + "bytes": "91acf09f9880f09f9880f09f9880", + "value": { + "array": [ + { + "string": "😀😀😀" + } + ] + } + }, + { + "bytes": "92a0a2c3a9", + "value": { + "array": [ + { + "string": "" + }, + { + "string": "é" + } + ] + } + } + ], + "min": { + "bytes": "90", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-msgpack/array-max-3", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 7, + "min": 1, + "type": { + "bounded_array": { + "max": 3, + "of": "u8" + } + }, + "witnesses": { + "between": [ + { + "bytes": "93000000", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + }, + { + "bytes": "93ccffccffccff", + "value": { + "array": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "9107", + "value": { + "array": [ + { + "u8": 7 + } + ] + } + }, + { + "bytes": "91cc80", + "value": { + "array": [ + { + "u8": 128 + } + ] + } + } + ], + "max": { + "bytes": "93cc80cc80cc80", + "value": { + "array": [ + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + } + ] + } + }, + "min": { + "bytes": "90", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-msgpack/array-max-15", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 31, + "min": 1, + "type": { + "bounded_array": { + "max": 15, + "of": "u8" + } + }, + "witnesses": { + "between": [ + { + "bytes": "9f000000000000000000000000000000", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + }, + { + "bytes": "9fccffccffccffccffccffccffccffccffccffccffccffccffccffccffccff", + "value": { + "array": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "9707070707070707", + "value": { + "array": [ + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + } + ] + } + }, + { + "bytes": "92ccffccff", + "value": { + "array": [ + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + } + ], + "max": { + "bytes": "9fcc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80", + "value": { + "array": [ + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + } + ] + } + }, + "min": { + "bytes": "90", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-msgpack/array-max-16", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 35, + "min": 1, + "type": { + "bounded_array": { + "max": 16, + "of": "u8" + } + }, + "witnesses": { + "between": [ + { + "bytes": "dc001000000000000000000000000000000000", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + }, + { + "bytes": "dc0010ccffccffccffccffccffccffccffccffccffccffccffccffccffccffccffccff", + "value": { + "array": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "980707070707070707", + "value": { + "array": [ + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + } + ] + } + }, + { + "bytes": "92007f", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 127 + } + ] + } + } + ], + "max": { + "bytes": "dc0010cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80", + "value": { + "array": [ + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + } + ] + } + }, + "min": { + "bytes": "90", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-msgpack/array-max-2-of-strings", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 19, + "min": 1, + "type": { + "bounded_array": { + "max": 2, + "of": { + "bounded_string": { + "max": 2 + } + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "92a26162a8f09f9880f09f9880", + "value": { + "array": [ + { + "string": "ab" + }, + { + "string": "😀😀" + } + ] + } + }, + { + "bytes": "91a0", + "value": { + "array": [ + { + "string": "" + } + ] + } + }, + { + "bytes": "92a5c3a9e282aca20101", + "value": { + "array": [ + { + "string": "é€" + }, + { + "string": "\u0001\u0001" + } + ] + } + }, + { + "bytes": "92a15ca25c7f", + "value": { + "array": [ + { + "string": "\\" + }, + { + "string": "\\" + } + ] + } + } + ], + "max": { + "bytes": "92a8f09f9880f09f9880a8f09f9880f09f9880", + "value": { + "array": [ + { + "string": "😀😀" + }, + { + "string": "😀😀" + } + ] + } + }, + "min": { + "bytes": "90", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-msgpack/array-max-3-of-options", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 7, + "min": 1, + "type": { + "bounded_array": { + "max": 3, + "of": { + "option": "u8" + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "93c0ccff00", + "value": { + "array": [ + { + "option": null + }, + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 0 + } + } + ] + } + }, + { + "bytes": "93c0c0c0", + "value": { + "array": [ + { + "option": null + }, + { + "option": null + }, + { + "option": null + } + ] + } + }, + { + "bytes": "93ccffccffccff", + "value": { + "array": [ + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 255 + } + } + ] + } + }, + { + "bytes": "93017fc0", + "value": { + "array": [ + { + "option": { + "u8": 1 + } + }, + { + "option": { + "u8": 127 + } + }, + { + "option": null + } + ] + } + } + ], + "max": { + "bytes": "93cc80cc80cc80", + "value": { + "array": [ + { + "option": { + "u8": 128 + } + }, + { + "option": { + "u8": 128 + } + }, + { + "option": { + "u8": 128 + } + } + ] + } + }, + "min": { + "bytes": "90", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-msgpack/fixed-4", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 9, + "min": 5, + "type": { + "fixed": { + "len": 4, + "of": "u8" + } + }, + "witnesses": { + "between": [ + { + "bytes": "94ccffccffccffccff", + "value": { + "tuple": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "9401ccc80304", + "value": { + "tuple": [ + { + "u8": 1 + }, + { + "u8": 200 + }, + { + "u8": 3 + }, + { + "u8": 4 + } + ] + } + }, + { + "bytes": "9400ccffccff00", + "value": { + "tuple": [ + { + "u8": 0 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 0 + } + ] + } + } + ], + "max": { + "bytes": "94cc80cc80cc80cc80", + "value": { + "tuple": [ + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + } + ] + } + }, + "min": { + "bytes": "9400000000", + "value": { + "tuple": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + } + } + } + }, + { + "id": "sizes-msgpack/fixed-15", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 31, + "min": 16, + "type": { + "fixed": { + "len": 15, + "of": "u8" + } + }, + "witnesses": { + "between": [ + { + "bytes": "9fccffccffccffccffccffccffccffccffccffccffccffccffccffccffccff", + "value": { + "tuple": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "9f00017f01cc807f01cc80017fcc8001cc80cc80ccff", + "value": { + "tuple": [ + { + "u8": 0 + }, + { + "u8": 1 + }, + { + "u8": 127 + }, + { + "u8": 1 + }, + { + "u8": 128 + }, + { + "u8": 127 + }, + { + "u8": 1 + }, + { + "u8": 128 + }, + { + "u8": 1 + }, + { + "u8": 127 + }, + { + "u8": 128 + }, + { + "u8": 1 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 255 + } + ] + } + } + ], + "max": { + "bytes": "9fcc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80", + "value": { + "tuple": [ + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + } + ] + } + }, + "min": { + "bytes": "9f000000000000000000000000000000", + "value": { + "tuple": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + } + } + } + }, + { + "id": "sizes-msgpack/fixed-16", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 35, + "min": 19, + "type": { + "fixed": { + "len": 16, + "of": "u8" + } + }, + "witnesses": { + "between": [ + { + "bytes": "dc0010ccffccffccffccffccffccffccffccffccffccffccffccffccffccffccffccff", + "value": { + "tuple": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "dc0010017fccffcc807f00ccff017fccffcc80007f00017f", + "value": { + "tuple": [ + { + "u8": 1 + }, + { + "u8": 127 + }, + { + "u8": 255 + }, + { + "u8": 128 + }, + { + "u8": 127 + }, + { + "u8": 0 + }, + { + "u8": 255 + }, + { + "u8": 1 + }, + { + "u8": 127 + }, + { + "u8": 255 + }, + { + "u8": 128 + }, + { + "u8": 0 + }, + { + "u8": 127 + }, + { + "u8": 0 + }, + { + "u8": 1 + }, + { + "u8": 127 + } + ] + } + } + ], + "max": { + "bytes": "dc0010cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80", + "value": { + "tuple": [ + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + } + ] + } + }, + "min": { + "bytes": "dc001000000000000000000000000000000000", + "value": { + "tuple": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + } + } + } + }, + { + "id": "sizes-msgpack/fixed-1", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 2, + "min": 2, + "type": { + "fixed": { + "len": 1, + "of": "bool" + } + }, + "witnesses": { + "between": [ + { + "bytes": "91c2", + "value": { + "tuple": [ + { + "bool": false + } + ] + } + } + ], + "max": { + "bytes": "91c3", + "value": { + "tuple": [ + { + "bool": true + } + ] + } + }, + "min": { + "bytes": "91c3", + "value": { + "tuple": [ + { + "bool": true + } + ] + } + } + } + } + }, + { + "id": "sizes-msgpack/fixed-2-of-strings", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 19, + "min": 3, + "type": { + "fixed": { + "len": 2, + "of": { + "bounded_string": { + "max": 2 + } + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "92a26162a8f09f9880f09f9880", + "value": { + "tuple": [ + { + "string": "ab" + }, + { + "string": "😀😀" + } + ] + } + }, + { + "bytes": "92a161a120", + "value": { + "tuple": [ + { + "string": "a" + }, + { + "string": " " + } + ] + } + } + ], + "max": { + "bytes": "92a8f09f9880f09f9880a8f09f9880f09f9880", + "value": { + "tuple": [ + { + "string": "😀😀" + }, + { + "string": "😀😀" + } + ] + } + }, + "min": { + "bytes": "92a0a0", + "value": { + "tuple": [ + { + "string": "" + }, + { + "string": "" + } + ] + } + } + } + } + }, + { + "id": "sizes-msgpack/fixed-3-of-options", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 7, + "min": 4, + "type": { + "fixed": { + "len": 3, + "of": { + "option": "u8" + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "93c0ccff00", + "value": { + "tuple": [ + { + "option": null + }, + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 0 + } + } + ] + } + }, + { + "bytes": "93ccffccffccff", + "value": { + "tuple": [ + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 255 + } + } + ] + } + }, + { + "bytes": "937f01cc80", + "value": { + "tuple": [ + { + "option": { + "u8": 127 + } + }, + { + "option": { + "u8": 1 + } + }, + { + "option": { + "u8": 128 + } + } + ] + } + } + ], + "max": { + "bytes": "93cc80cc80cc80", + "value": { + "tuple": [ + { + "option": { + "u8": 128 + } + }, + { + "option": { + "u8": 128 + } + }, + { + "option": { + "u8": 128 + } + } + ] + } + }, + "min": { + "bytes": "93c0c0c0", + "value": { + "tuple": [ + { + "option": null + }, + { + "option": null + }, + { + "option": null + } + ] + } + } + } + } + }, + { + "id": "sizes-msgpack/option-u8", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 2, + "min": 1, + "type": { + "option": "u8" + }, + "witnesses": { + "between": [ + { + "bytes": "00", + "value": { + "option": { + "u8": 0 + } + } + }, + { + "bytes": "7f", + "value": { + "option": { + "u8": 127 + } + } + }, + { + "bytes": "ccff", + "value": { + "option": { + "u8": 255 + } + } + } + ], + "max": { + "bytes": "cc80", + "value": { + "option": { + "u8": 128 + } + } + }, + "min": { + "bytes": "c0", + "value": { + "option": null + } + } + } + } + }, + { + "id": "sizes-msgpack/option-bool", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 1, + "min": 1, + "type": { + "option": "bool" + }, + "witnesses": { + "between": [ + { + "bytes": "c3", + "value": { + "option": { + "bool": true + } + } + }, + { + "bytes": "c2", + "value": { + "option": { + "bool": false + } + } + } + ], + "max": { + "bytes": "c0", + "value": { + "option": null + } + }, + "min": { + "bytes": "c0", + "value": { + "option": null + } + } + } + } + }, + { + "id": "sizes-msgpack/option-string", + "op": "size", + "input": { + "format": "msgpack@1", + "max": null, + "min": 1, + "type": { + "option": "string" + }, + "witnesses": { + "between": [ + { + "bytes": "a0", + "value": { + "option": { + "string": "" + } + } + }, + { + "bytes": "a568656c6c6f", + "value": { + "option": { + "string": "hello" + } + } + }, + { + "bytes": "a27f20", + "value": { + "option": { + "string": " " + } + } + } + ], + "min": { + "bytes": "c0", + "value": { + "option": null + } + } + } + } + }, + { + "id": "sizes-msgpack/option-max-3-chars", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 13, + "min": 1, + "type": { + "option": { + "bounded_string": { + "max": 3 + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "a0", + "value": { + "option": { + "string": "" + } + } + }, + { + "bytes": "a26162", + "value": { + "option": { + "string": "ab" + } + } + }, + { + "bytes": "a3010101", + "value": { + "option": { + "string": "\u0001\u0001\u0001" + } + } + }, + { + "bytes": "a3c3a901", + "value": { + "option": { + "string": "é\u0001" + } + } + } + ], + "max": { + "bytes": "acf09f9880f09f9880f09f9880", + "value": { + "option": { + "string": "😀😀😀" + } + } + }, + "min": { + "bytes": "c0", + "value": { + "option": null + } + } + } + } + }, + { + "id": "sizes-msgpack/option-struct", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 11, + "min": 1, + "type": { + "option": { + "struct": { + "fields": [ + [ + "x", + "i32" + ], + [ + "y", + "i32" + ] + ], + "name": "Point" + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "920000", + "value": { + "option": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + } + }, + { + "bytes": "92ffcd012c", + "value": { + "option": { + "struct": { + "fields": [ + [ + "x", + { + "i32": -1 + } + ], + [ + "y", + { + "i32": 300 + } + ] + ], + "name": "Point" + } + } + } + }, + { + "bytes": "92d280000000d280000000", + "value": { + "option": { + "struct": { + "fields": [ + [ + "x", + { + "i32": -2147483648 + } + ], + [ + "y", + { + "i32": -2147483648 + } + ] + ], + "name": "Point" + } + } + } + }, + { + "bytes": "92d1ff7fccff", + "value": { + "option": { + "struct": { + "fields": [ + [ + "x", + { + "i32": -129 + } + ], + [ + "y", + { + "i32": 255 + } + ] + ], + "name": "Point" + } + } + } + } + ], + "max": { + "bytes": "92d2ffff7fffd2ffff7fff", + "value": { + "option": { + "struct": { + "fields": [ + [ + "x", + { + "i32": -32769 + } + ], + [ + "y", + { + "i32": -32769 + } + ] + ], + "name": "Point" + } + } + } + }, + "min": { + "bytes": "c0", + "value": { + "option": null + } + } + } + } + }, + { + "id": "sizes-msgpack/struct-point", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 11, + "min": 3, + "type": { + "struct": { + "fields": [ + [ + "x", + "i32" + ], + [ + "y", + "i32" + ] + ], + "name": "Point" + } + }, + "witnesses": { + "between": [ + { + "bytes": "9201fe", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 1 + } + ], + [ + "y", + { + "i32": -2 + } + ] + ], + "name": "Point" + } + } + }, + { + "bytes": "92d280000000d280000000", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": -2147483648 + } + ], + [ + "y", + { + "i32": -2147483648 + } + ] + ], + "name": "Point" + } + } + }, + { + "bytes": "92ce7fffffff00", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 2147483647 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + }, + { + "bytes": "92ce00010000cdffff", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 65536 + } + ], + [ + "y", + { + "i32": 65535 + } + ] + ], + "name": "Point" + } + } + } + ], + "max": { + "bytes": "92d2ffff7fffd2ffff7fff", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": -32769 + } + ], + [ + "y", + { + "i32": -32769 + } + ] + ], + "name": "Point" + } + } + }, + "min": { + "bytes": "920000", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + } + } + } + }, + { + "id": "sizes-msgpack/struct-empty", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 1, + "min": 1, + "type": { + "struct": { + "fields": [], + "name": "Empty" + } + }, + "witnesses": { + "max": { + "bytes": "90", + "value": { + "struct": { + "fields": [], + "name": "Empty" + } + } + }, + "min": { + "bytes": "90", + "value": { + "struct": { + "fields": [], + "name": "Empty" + } + } + } + } + } + }, + { + "id": "sizes-msgpack/struct-mixed", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 115, + "min": 5, + "type": { + "struct": { + "fields": [ + [ + "id", + "u32" + ], + [ + "name", + { + "bounded_string": { + "max": 16 + } + } + ], + [ + "tags", + { + "bounded_array": { + "max": 4, + "of": "u8" + } + } + ], + [ + "note", + { + "option": { + "bounded_string": { + "max": 8 + } + } + } + ] + ], + "name": "Msg" + } + }, + "witnesses": { + "between": [ + { + "bytes": "9407a26869920102c0", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 7 + } + ], + [ + "name", + { + "string": "hi" + } + ], + [ + "tags", + { + "array": [ + { + "u8": 1 + }, + { + "u8": 2 + } + ] + } + ], + [ + "note", + { + "option": null + } + ] + ], + "name": "Msg" + } + } + }, + { + "bytes": "94ce00011170ad68c3a96c6c6f2077c3b6726c6490a178", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 70000 + } + ], + [ + "name", + { + "string": "héllo wörld" + } + ], + [ + "tags", + { + "array": [] + } + ], + [ + "note", + { + "option": { + "string": "x" + } + } + ] + ], + "name": "Msg" + } + } + }, + { + "bytes": "9400a462e282ac91cc80a120", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 0 + } + ], + [ + "name", + { + "string": "b€" + } + ], + [ + "tags", + { + "array": [ + { + "u8": 128 + } + ] + } + ], + [ + "note", + { + "option": { + "string": " " + } + } + ] + ], + "name": "Msg" + } + } + } + ], + "max": { + "bytes": "94ce00010000d940f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f988094cc80cc80cc80cc80d920f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 65536 + } + ], + [ + "name", + { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + ], + [ + "tags", + { + "array": [ + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + }, + { + "u8": 128 + } + ] + } + ], + [ + "note", + { + "option": { + "string": "😀😀😀😀😀😀😀😀" + } + } + ] + ], + "name": "Msg" + } + } + }, + "min": { + "bytes": "9400a090c0", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 0 + } + ], + [ + "name", + { + "string": "" + } + ], + [ + "tags", + { + "array": [] + } + ], + [ + "note", + { + "option": null + } + ] + ], + "name": "Msg" + } + } + } + } + } + }, + { + "id": "sizes-msgpack/struct-nested", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 57, + "min": 8, + "type": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + "i32" + ], + [ + "y", + "i32" + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + "i32" + ], + [ + "y", + "i32" + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": { + "bounded_string": { + "max": 8 + } + } + } + ] + ], + "name": "Line" + } + }, + "witnesses": { + "between": [ + { + "bytes": "93920000920304c0", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 3 + } + ], + [ + "y", + { + "i32": 4 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": null + } + ] + ], + "name": "Line" + } + } + }, + { + "bytes": "9392fb05926464a26162", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": -5 + } + ], + [ + "y", + { + "i32": 5 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 100 + } + ], + [ + "y", + { + "i32": 100 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": { + "string": "ab" + } + } + ] + ], + "name": "Line" + } + } + }, + { + "bytes": "9392d18000d2ffff7fff92ce7fffffffd18000a4f09f9880", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": -32768 + } + ], + [ + "y", + { + "i32": -32769 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 2147483647 + } + ], + [ + "y", + { + "i32": -32768 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": { + "string": "😀" + } + } + ] + ], + "name": "Line" + } + } + } + ], + "max": { + "bytes": "9392d2ffff7fffd2ffff7fff92d2ffff7fffd2ffff7fffd920f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": -32769 + } + ], + [ + "y", + { + "i32": -32769 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": -32769 + } + ], + [ + "y", + { + "i32": -32769 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": { + "string": "😀😀😀😀😀😀😀😀" + } + } + ] + ], + "name": "Line" + } + } + }, + "min": { + "bytes": "93920000920000c0", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": null + } + ] + ], + "name": "Line" + } + } + } + } + } + }, + { + "id": "sizes-msgpack/struct-15-fields", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 31, + "min": 16, + "type": { + "struct": { + "fields": [ + [ + "f00", + "u8" + ], + [ + "f01", + "u8" + ], + [ + "f02", + "u8" + ], + [ + "f03", + "u8" + ], + [ + "f04", + "u8" + ], + [ + "f05", + "u8" + ], + [ + "f06", + "u8" + ], + [ + "f07", + "u8" + ], + [ + "f08", + "u8" + ], + [ + "f09", + "u8" + ], + [ + "f10", + "u8" + ], + [ + "f11", + "u8" + ], + [ + "f12", + "u8" + ], + [ + "f13", + "u8" + ], + [ + "f14", + "u8" + ] + ], + "name": "Wide15" + } + }, + "witnesses": { + "between": [ + { + "bytes": "9fccffccffccffccffccffccffccffccffccffccffccffccffccffccffccff", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 255 + } + ], + [ + "f01", + { + "u8": 255 + } + ], + [ + "f02", + { + "u8": 255 + } + ], + [ + "f03", + { + "u8": 255 + } + ], + [ + "f04", + { + "u8": 255 + } + ], + [ + "f05", + { + "u8": 255 + } + ], + [ + "f06", + { + "u8": 255 + } + ], + [ + "f07", + { + "u8": 255 + } + ], + [ + "f08", + { + "u8": 255 + } + ], + [ + "f09", + { + "u8": 255 + } + ], + [ + "f10", + { + "u8": 255 + } + ], + [ + "f11", + { + "u8": 255 + } + ], + [ + "f12", + { + "u8": 255 + } + ], + [ + "f13", + { + "u8": 255 + } + ], + [ + "f14", + { + "u8": 255 + } + ] + ], + "name": "Wide15" + } + } + }, + { + "bytes": "9f0011223344556677cc88cc99ccaaccbbccccccddccee", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 17 + } + ], + [ + "f02", + { + "u8": 34 + } + ], + [ + "f03", + { + "u8": 51 + } + ], + [ + "f04", + { + "u8": 68 + } + ], + [ + "f05", + { + "u8": 85 + } + ], + [ + "f06", + { + "u8": 102 + } + ], + [ + "f07", + { + "u8": 119 + } + ], + [ + "f08", + { + "u8": 136 + } + ], + [ + "f09", + { + "u8": 153 + } + ], + [ + "f10", + { + "u8": 170 + } + ], + [ + "f11", + { + "u8": 187 + } + ], + [ + "f12", + { + "u8": 204 + } + ], + [ + "f13", + { + "u8": 221 + } + ], + [ + "f14", + { + "u8": 238 + } + ] + ], + "name": "Wide15" + } + } + }, + { + "bytes": "9f007f0100ccff0001cc80cc80017fccffcc80ccff01", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 127 + } + ], + [ + "f02", + { + "u8": 1 + } + ], + [ + "f03", + { + "u8": 0 + } + ], + [ + "f04", + { + "u8": 255 + } + ], + [ + "f05", + { + "u8": 0 + } + ], + [ + "f06", + { + "u8": 1 + } + ], + [ + "f07", + { + "u8": 128 + } + ], + [ + "f08", + { + "u8": 128 + } + ], + [ + "f09", + { + "u8": 1 + } + ], + [ + "f10", + { + "u8": 127 + } + ], + [ + "f11", + { + "u8": 255 + } + ], + [ + "f12", + { + "u8": 128 + } + ], + [ + "f13", + { + "u8": 255 + } + ], + [ + "f14", + { + "u8": 1 + } + ] + ], + "name": "Wide15" + } + } + } + ], + "max": { + "bytes": "9fcc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 128 + } + ], + [ + "f01", + { + "u8": 128 + } + ], + [ + "f02", + { + "u8": 128 + } + ], + [ + "f03", + { + "u8": 128 + } + ], + [ + "f04", + { + "u8": 128 + } + ], + [ + "f05", + { + "u8": 128 + } + ], + [ + "f06", + { + "u8": 128 + } + ], + [ + "f07", + { + "u8": 128 + } + ], + [ + "f08", + { + "u8": 128 + } + ], + [ + "f09", + { + "u8": 128 + } + ], + [ + "f10", + { + "u8": 128 + } + ], + [ + "f11", + { + "u8": 128 + } + ], + [ + "f12", + { + "u8": 128 + } + ], + [ + "f13", + { + "u8": 128 + } + ], + [ + "f14", + { + "u8": 128 + } + ] + ], + "name": "Wide15" + } + } + }, + "min": { + "bytes": "9f000000000000000000000000000000", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 0 + } + ], + [ + "f02", + { + "u8": 0 + } + ], + [ + "f03", + { + "u8": 0 + } + ], + [ + "f04", + { + "u8": 0 + } + ], + [ + "f05", + { + "u8": 0 + } + ], + [ + "f06", + { + "u8": 0 + } + ], + [ + "f07", + { + "u8": 0 + } + ], + [ + "f08", + { + "u8": 0 + } + ], + [ + "f09", + { + "u8": 0 + } + ], + [ + "f10", + { + "u8": 0 + } + ], + [ + "f11", + { + "u8": 0 + } + ], + [ + "f12", + { + "u8": 0 + } + ], + [ + "f13", + { + "u8": 0 + } + ], + [ + "f14", + { + "u8": 0 + } + ] + ], + "name": "Wide15" + } + } + } + } + } + }, + { + "id": "sizes-msgpack/struct-16-fields", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 35, + "min": 19, + "type": { + "struct": { + "fields": [ + [ + "f00", + "u8" + ], + [ + "f01", + "u8" + ], + [ + "f02", + "u8" + ], + [ + "f03", + "u8" + ], + [ + "f04", + "u8" + ], + [ + "f05", + "u8" + ], + [ + "f06", + "u8" + ], + [ + "f07", + "u8" + ], + [ + "f08", + "u8" + ], + [ + "f09", + "u8" + ], + [ + "f10", + "u8" + ], + [ + "f11", + "u8" + ], + [ + "f12", + "u8" + ], + [ + "f13", + "u8" + ], + [ + "f14", + "u8" + ], + [ + "f15", + "u8" + ] + ], + "name": "Wide16" + } + }, + "witnesses": { + "between": [ + { + "bytes": "dc0010ccffccffccffccffccffccffccffccffccffccffccffccffccffccffccffccff", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 255 + } + ], + [ + "f01", + { + "u8": 255 + } + ], + [ + "f02", + { + "u8": 255 + } + ], + [ + "f03", + { + "u8": 255 + } + ], + [ + "f04", + { + "u8": 255 + } + ], + [ + "f05", + { + "u8": 255 + } + ], + [ + "f06", + { + "u8": 255 + } + ], + [ + "f07", + { + "u8": 255 + } + ], + [ + "f08", + { + "u8": 255 + } + ], + [ + "f09", + { + "u8": 255 + } + ], + [ + "f10", + { + "u8": 255 + } + ], + [ + "f11", + { + "u8": 255 + } + ], + [ + "f12", + { + "u8": 255 + } + ], + [ + "f13", + { + "u8": 255 + } + ], + [ + "f14", + { + "u8": 255 + } + ], + [ + "f15", + { + "u8": 255 + } + ] + ], + "name": "Wide16" + } + } + }, + { + "bytes": "dc00100011223344556677cc88cc99ccaaccbbccccccddcceeccff", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 17 + } + ], + [ + "f02", + { + "u8": 34 + } + ], + [ + "f03", + { + "u8": 51 + } + ], + [ + "f04", + { + "u8": 68 + } + ], + [ + "f05", + { + "u8": 85 + } + ], + [ + "f06", + { + "u8": 102 + } + ], + [ + "f07", + { + "u8": 119 + } + ], + [ + "f08", + { + "u8": 136 + } + ], + [ + "f09", + { + "u8": 153 + } + ], + [ + "f10", + { + "u8": 170 + } + ], + [ + "f11", + { + "u8": 187 + } + ], + [ + "f12", + { + "u8": 204 + } + ], + [ + "f13", + { + "u8": 221 + } + ], + [ + "f14", + { + "u8": 238 + } + ], + [ + "f15", + { + "u8": 255 + } + ] + ], + "name": "Wide16" + } + } + }, + { + "bytes": "dc0010cc80cc80007f0001cc8000ccffccff01ccffccff010001", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 128 + } + ], + [ + "f01", + { + "u8": 128 + } + ], + [ + "f02", + { + "u8": 0 + } + ], + [ + "f03", + { + "u8": 127 + } + ], + [ + "f04", + { + "u8": 0 + } + ], + [ + "f05", + { + "u8": 1 + } + ], + [ + "f06", + { + "u8": 128 + } + ], + [ + "f07", + { + "u8": 0 + } + ], + [ + "f08", + { + "u8": 255 + } + ], + [ + "f09", + { + "u8": 255 + } + ], + [ + "f10", + { + "u8": 1 + } + ], + [ + "f11", + { + "u8": 255 + } + ], + [ + "f12", + { + "u8": 255 + } + ], + [ + "f13", + { + "u8": 1 + } + ], + [ + "f14", + { + "u8": 0 + } + ], + [ + "f15", + { + "u8": 1 + } + ] + ], + "name": "Wide16" + } + } + } + ], + "max": { + "bytes": "dc0010cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80cc80", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 128 + } + ], + [ + "f01", + { + "u8": 128 + } + ], + [ + "f02", + { + "u8": 128 + } + ], + [ + "f03", + { + "u8": 128 + } + ], + [ + "f04", + { + "u8": 128 + } + ], + [ + "f05", + { + "u8": 128 + } + ], + [ + "f06", + { + "u8": 128 + } + ], + [ + "f07", + { + "u8": 128 + } + ], + [ + "f08", + { + "u8": 128 + } + ], + [ + "f09", + { + "u8": 128 + } + ], + [ + "f10", + { + "u8": 128 + } + ], + [ + "f11", + { + "u8": 128 + } + ], + [ + "f12", + { + "u8": 128 + } + ], + [ + "f13", + { + "u8": 128 + } + ], + [ + "f14", + { + "u8": 128 + } + ], + [ + "f15", + { + "u8": 128 + } + ] + ], + "name": "Wide16" + } + } + }, + "min": { + "bytes": "dc001000000000000000000000000000000000", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 0 + } + ], + [ + "f02", + { + "u8": 0 + } + ], + [ + "f03", + { + "u8": 0 + } + ], + [ + "f04", + { + "u8": 0 + } + ], + [ + "f05", + { + "u8": 0 + } + ], + [ + "f06", + { + "u8": 0 + } + ], + [ + "f07", + { + "u8": 0 + } + ], + [ + "f08", + { + "u8": 0 + } + ], + [ + "f09", + { + "u8": 0 + } + ], + [ + "f10", + { + "u8": 0 + } + ], + [ + "f11", + { + "u8": 0 + } + ], + [ + "f12", + { + "u8": 0 + } + ], + [ + "f13", + { + "u8": 0 + } + ], + [ + "f14", + { + "u8": 0 + } + ], + [ + "f15", + { + "u8": 0 + } + ] + ], + "name": "Wide16" + } + } + } + } + } + }, + { + "id": "sizes-msgpack/struct-long-names", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 7, + "min": 4, + "type": { + "struct": { + "fields": [ + [ + "id", + "u8" + ], + [ + "a_much_longer_field_name", + "u16" + ], + [ + "x", + { + "option": "bool" + } + ] + ], + "name": "Named" + } + }, + "witnesses": { + "between": [ + { + "bytes": "9301cd012cc3", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u8": 1 + } + ], + [ + "a_much_longer_field_name", + { + "u16": 300 + } + ], + [ + "x", + { + "option": { + "bool": true + } + } + ] + ], + "name": "Named" + } + } + }, + { + "bytes": "93ccff7fc2", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u8": 255 + } + ], + [ + "a_much_longer_field_name", + { + "u16": 127 + } + ], + [ + "x", + { + "option": { + "bool": false + } + } + ] + ], + "name": "Named" + } + } + } + ], + "max": { + "bytes": "93cc80cd0100c0", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u8": 128 + } + ], + [ + "a_much_longer_field_name", + { + "u16": 256 + } + ], + [ + "x", + { + "option": null + } + ] + ], + "name": "Named" + } + } + }, + "min": { + "bytes": "930000c0", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u8": 0 + } + ], + [ + "a_much_longer_field_name", + { + "u16": 0 + } + ], + [ + "x", + { + "option": null + } + ] + ], + "name": "Named" + } + } + } + } + } + }, + { + "id": "sizes-msgpack/enum-color", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 6, + "min": 4, + "type": { + "enum": { + "name": "Color", + "variants": [ + "Red", + "Green", + "Blue" + ] + } + }, + "witnesses": { + "between": [ + { + "bytes": "a4426c7565", + "value": { + "unit_variant": { + "enum": "Color", + "index": 2, + "variant": "Blue" + } + } + } + ], + "max": { + "bytes": "a5477265656e", + "value": { + "unit_variant": { + "enum": "Color", + "index": 1, + "variant": "Green" + } + } + }, + "min": { + "bytes": "a3526564", + "value": { + "unit_variant": { + "enum": "Color", + "index": 0, + "variant": "Red" + } + } + } + } + } + }, + { + "id": "sizes-msgpack/enum-single", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 5, + "min": 5, + "type": { + "enum": { + "name": "Only", + "variants": [ + "Only" + ] + } + }, + "witnesses": { + "max": { + "bytes": "a44f6e6c79", + "value": { + "unit_variant": { + "enum": "Only", + "index": 0, + "variant": "Only" + } + } + }, + "min": { + "bytes": "a44f6e6c79", + "value": { + "unit_variant": { + "enum": "Only", + "index": 0, + "variant": "Only" + } + } + } + } + } + }, + { + "id": "sizes-msgpack/enum-129-variants", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 5, + "min": 5, + "type": { + "enum": { + "name": "Many", + "variants": [ + "v000", + "v001", + "v002", + "v003", + "v004", + "v005", + "v006", + "v007", + "v008", + "v009", + "v010", + "v011", + "v012", + "v013", + "v014", + "v015", + "v016", + "v017", + "v018", + "v019", + "v020", + "v021", + "v022", + "v023", + "v024", + "v025", + "v026", + "v027", + "v028", + "v029", + "v030", + "v031", + "v032", + "v033", + "v034", + "v035", + "v036", + "v037", + "v038", + "v039", + "v040", + "v041", + "v042", + "v043", + "v044", + "v045", + "v046", + "v047", + "v048", + "v049", + "v050", + "v051", + "v052", + "v053", + "v054", + "v055", + "v056", + "v057", + "v058", + "v059", + "v060", + "v061", + "v062", + "v063", + "v064", + "v065", + "v066", + "v067", + "v068", + "v069", + "v070", + "v071", + "v072", + "v073", + "v074", + "v075", + "v076", + "v077", + "v078", + "v079", + "v080", + "v081", + "v082", + "v083", + "v084", + "v085", + "v086", + "v087", + "v088", + "v089", + "v090", + "v091", + "v092", + "v093", + "v094", + "v095", + "v096", + "v097", + "v098", + "v099", + "v100", + "v101", + "v102", + "v103", + "v104", + "v105", + "v106", + "v107", + "v108", + "v109", + "v110", + "v111", + "v112", + "v113", + "v114", + "v115", + "v116", + "v117", + "v118", + "v119", + "v120", + "v121", + "v122", + "v123", + "v124", + "v125", + "v126", + "v127", + "v128" + ] + } + }, + "witnesses": { + "between": [ + { + "bytes": "a476303031", + "value": { + "unit_variant": { + "enum": "Many", + "index": 1, + "variant": "v001" + } + } + }, + { + "bytes": "a476313236", + "value": { + "unit_variant": { + "enum": "Many", + "index": 126, + "variant": "v126" + } + } + }, + { + "bytes": "a476313237", + "value": { + "unit_variant": { + "enum": "Many", + "index": 127, + "variant": "v127" + } + } + }, + { + "bytes": "a476313238", + "value": { + "unit_variant": { + "enum": "Many", + "index": 128, + "variant": "v128" + } + } + } + ], + "max": { + "bytes": "a476303030", + "value": { + "unit_variant": { + "enum": "Many", + "index": 0, + "variant": "v000" + } + } + }, + "min": { + "bytes": "a476303030", + "value": { + "unit_variant": { + "enum": "Many", + "index": 0, + "variant": "v000" + } + } + } + } + } + }, + { + "id": "sizes-msgpack/enum-long-names", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 34, + "min": 2, + "type": { + "enum": { + "name": "Long", + "variants": [ + "a", + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "ccccccccccccccccccccccccccccccc", + "dddddddddddddddddddddddddddddddd" + ] + } + }, + "witnesses": { + "between": [ + { + "bytes": "be626262626262626262626262626262626262626262626262626262626262", + "value": { + "unit_variant": { + "enum": "Long", + "index": 1, + "variant": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + } + } + }, + { + "bytes": "bf63636363636363636363636363636363636363636363636363636363636363", + "value": { + "unit_variant": { + "enum": "Long", + "index": 2, + "variant": "ccccccccccccccccccccccccccccccc" + } + } + } + ], + "max": { + "bytes": "d9206464646464646464646464646464646464646464646464646464646464646464", + "value": { + "unit_variant": { + "enum": "Long", + "index": 3, + "variant": "dddddddddddddddddddddddddddddddd" + } + } + }, + "min": { + "bytes": "a161", + "value": { + "unit_variant": { + "enum": "Long", + "index": 0, + "variant": "a" + } + } + } + } + } + }, + { + "id": "sizes-msgpack/recursive-chain-3", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 4, + "min": 2, + "type": { + "recursive": { + "max_depth": 3, + "of": { + "struct": { + "fields": [ + [ + "next", + { + "option": "self" + } + ] + ], + "name": "Node" + } + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "9191c0", + "value": { + "struct": { + "fields": [ + [ + "next", + { + "option": { + "struct": { + "fields": [ + [ + "next", + { + "option": null + } + ] + ], + "name": "Node" + } + } + } + ] + ], + "name": "Node" + } + } + } + ], + "max": { + "bytes": "919191c0", + "value": { + "struct": { + "fields": [ + [ + "next", + { + "option": { + "struct": { + "fields": [ + [ + "next", + { + "option": { + "struct": { + "fields": [ + [ + "next", + { + "option": null + } + ] + ], + "name": "Node" + } + } + } + ] + ], + "name": "Node" + } + } + } + ] + ], + "name": "Node" + } + } + }, + "min": { + "bytes": "91c0", + "value": { + "struct": { + "fields": [ + [ + "next", + { + "option": null + } + ] + ], + "name": "Node" + } + } + } + } + } + }, + { + "id": "sizes-msgpack/recursive-tree-2", + "op": "size", + "input": { + "format": "msgpack@1", + "max": 6, + "min": 2, + "type": { + "recursive": { + "max_depth": 2, + "of": { + "struct": { + "fields": [ + [ + "children", + { + "bounded_array": { + "max": 2, + "of": "self" + } + } + ] + ], + "name": "Tree" + } + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "91919190", + "value": { + "struct": { + "fields": [ + [ + "children", + { + "array": [ + { + "struct": { + "fields": [ + [ + "children", + { + "array": [] + } + ] + ], + "name": "Tree" + } + } + ] + } + ] + ], + "name": "Tree" + } + } + } + ], + "max": { + "bytes": "919291909190", + "value": { + "struct": { + "fields": [ + [ + "children", + { + "array": [ + { + "struct": { + "fields": [ + [ + "children", + { + "array": [] + } + ] + ], + "name": "Tree" + } + }, + { + "struct": { + "fields": [ + [ + "children", + { + "array": [] + } + ] + ], + "name": "Tree" + } + } + ] + } + ] + ], + "name": "Tree" + } + } + }, + "min": { + "bytes": "9190", + "value": { + "struct": { + "fields": [ + [ + "children", + { + "array": [] + } + ] + ], + "name": "Tree" + } + } + } + } + } + } + ] +} diff --git a/runtime/conformance/spec/vectors/sizes-packed.json b/runtime/conformance/spec/vectors/sizes-packed.json new file mode 100644 index 0000000..52d724d --- /dev/null +++ b/runtime/conformance/spec/vectors/sizes-packed.json @@ -0,0 +1,8277 @@ +{ + "$schema": "../specs/gen/vectors.schema.json", + "feature": "sizes-packed", + "cases": [ + { + "id": "sizes-packed/bool", + "op": "size", + "input": { + "format": "packed@1", + "max": 1, + "min": 1, + "type": "bool", + "witnesses": { + "between": [ + { + "bytes": "00", + "value": { + "bool": false + } + } + ], + "max": { + "bytes": "01", + "value": { + "bool": true + } + }, + "min": { + "bytes": "01", + "value": { + "bool": true + } + } + } + } + }, + { + "id": "sizes-packed/u8", + "op": "size", + "input": { + "format": "packed@1", + "max": 1, + "min": 1, + "type": "u8", + "witnesses": { + "between": [ + { + "bytes": "01", + "value": { + "u8": 1 + } + }, + { + "bytes": "7f", + "value": { + "u8": 127 + } + }, + { + "bytes": "80", + "value": { + "u8": 128 + } + }, + { + "bytes": "ff", + "value": { + "u8": 255 + } + } + ], + "max": { + "bytes": "00", + "value": { + "u8": 0 + } + }, + "min": { + "bytes": "00", + "value": { + "u8": 0 + } + } + } + } + }, + { + "id": "sizes-packed/u16", + "op": "size", + "input": { + "format": "packed@1", + "max": 2, + "min": 2, + "type": "u16", + "witnesses": { + "between": [ + { + "bytes": "7f00", + "value": { + "u16": 127 + } + }, + { + "bytes": "8000", + "value": { + "u16": 128 + } + }, + { + "bytes": "ff00", + "value": { + "u16": 255 + } + }, + { + "bytes": "0001", + "value": { + "u16": 256 + } + }, + { + "bytes": "ffff", + "value": { + "u16": 65535 + } + } + ], + "max": { + "bytes": "0000", + "value": { + "u16": 0 + } + }, + "min": { + "bytes": "0000", + "value": { + "u16": 0 + } + } + } + } + }, + { + "id": "sizes-packed/u32", + "op": "size", + "input": { + "format": "packed@1", + "max": 4, + "min": 4, + "type": "u32", + "witnesses": { + "between": [ + { + "bytes": "7f000000", + "value": { + "u32": 127 + } + }, + { + "bytes": "80000000", + "value": { + "u32": 128 + } + }, + { + "bytes": "ff000000", + "value": { + "u32": 255 + } + }, + { + "bytes": "00010000", + "value": { + "u32": 256 + } + }, + { + "bytes": "ffff0000", + "value": { + "u32": 65535 + } + }, + { + "bytes": "00000100", + "value": { + "u32": 65536 + } + }, + { + "bytes": "ffffffff", + "value": { + "u32": 4294967295 + } + } + ], + "max": { + "bytes": "00000000", + "value": { + "u32": 0 + } + }, + "min": { + "bytes": "00000000", + "value": { + "u32": 0 + } + } + } + } + }, + { + "id": "sizes-packed/u64", + "op": "size", + "input": { + "format": "packed@1", + "max": 8, + "min": 8, + "type": "u64", + "witnesses": { + "between": [ + { + "bytes": "7f00000000000000", + "value": { + "u64": "127" + } + }, + { + "bytes": "8000000000000000", + "value": { + "u64": "128" + } + }, + { + "bytes": "ff00000000000000", + "value": { + "u64": "255" + } + }, + { + "bytes": "0001000000000000", + "value": { + "u64": "256" + } + }, + { + "bytes": "ffff000000000000", + "value": { + "u64": "65535" + } + }, + { + "bytes": "0000010000000000", + "value": { + "u64": "65536" + } + }, + { + "bytes": "ffffffff00000000", + "value": { + "u64": "4294967295" + } + }, + { + "bytes": "0000000001000000", + "value": { + "u64": "4294967296" + } + }, + { + "bytes": "ffffffffffffffff", + "value": { + "u64": "18446744073709551615" + } + } + ], + "max": { + "bytes": "0000000000000000", + "value": { + "u64": "0" + } + }, + "min": { + "bytes": "0000000000000000", + "value": { + "u64": "0" + } + } + } + } + }, + { + "id": "sizes-packed/u128", + "op": "size", + "input": { + "format": "packed@1", + "max": 16, + "min": 16, + "type": "u128", + "witnesses": { + "between": [ + { + "bytes": "01000000000000000000000000000000", + "value": { + "u128": "1" + } + }, + { + "bytes": "00000000000000000100000000000000", + "value": { + "u128": "18446744073709551616" + } + }, + { + "bytes": "ffffffffffffffffffffffffffffffff", + "value": { + "u128": "340282366920938463463374607431768211455" + } + } + ], + "max": { + "bytes": "00000000000000000000000000000000", + "value": { + "u128": "0" + } + }, + "min": { + "bytes": "00000000000000000000000000000000", + "value": { + "u128": "0" + } + } + } + } + }, + { + "id": "sizes-packed/i8", + "op": "size", + "input": { + "format": "packed@1", + "max": 1, + "min": 1, + "type": "i8", + "witnesses": { + "between": [ + { + "bytes": "ff", + "value": { + "i8": -1 + } + }, + { + "bytes": "e0", + "value": { + "i8": -32 + } + }, + { + "bytes": "df", + "value": { + "i8": -33 + } + }, + { + "bytes": "80", + "value": { + "i8": -128 + } + }, + { + "bytes": "7f", + "value": { + "i8": 127 + } + } + ], + "max": { + "bytes": "00", + "value": { + "i8": 0 + } + }, + "min": { + "bytes": "00", + "value": { + "i8": 0 + } + } + } + } + }, + { + "id": "sizes-packed/i16", + "op": "size", + "input": { + "format": "packed@1", + "max": 2, + "min": 2, + "type": "i16", + "witnesses": { + "between": [ + { + "bytes": "ffff", + "value": { + "i16": -1 + } + }, + { + "bytes": "dfff", + "value": { + "i16": -33 + } + }, + { + "bytes": "80ff", + "value": { + "i16": -128 + } + }, + { + "bytes": "7fff", + "value": { + "i16": -129 + } + }, + { + "bytes": "0080", + "value": { + "i16": -32768 + } + }, + { + "bytes": "7f00", + "value": { + "i16": 127 + } + }, + { + "bytes": "8000", + "value": { + "i16": 128 + } + }, + { + "bytes": "ff00", + "value": { + "i16": 255 + } + }, + { + "bytes": "0001", + "value": { + "i16": 256 + } + }, + { + "bytes": "ff7f", + "value": { + "i16": 32767 + } + } + ], + "max": { + "bytes": "0000", + "value": { + "i16": 0 + } + }, + "min": { + "bytes": "0000", + "value": { + "i16": 0 + } + } + } + } + }, + { + "id": "sizes-packed/i32", + "op": "size", + "input": { + "format": "packed@1", + "max": 4, + "min": 4, + "type": "i32", + "witnesses": { + "between": [ + { + "bytes": "ffffffff", + "value": { + "i32": -1 + } + }, + { + "bytes": "80ffffff", + "value": { + "i32": -128 + } + }, + { + "bytes": "7fffffff", + "value": { + "i32": -129 + } + }, + { + "bytes": "0080ffff", + "value": { + "i32": -32768 + } + }, + { + "bytes": "ff7fffff", + "value": { + "i32": -32769 + } + }, + { + "bytes": "00000080", + "value": { + "i32": -2147483648 + } + }, + { + "bytes": "ff000000", + "value": { + "i32": 255 + } + }, + { + "bytes": "00010000", + "value": { + "i32": 256 + } + }, + { + "bytes": "ffff0000", + "value": { + "i32": 65535 + } + }, + { + "bytes": "00000100", + "value": { + "i32": 65536 + } + }, + { + "bytes": "ffffff7f", + "value": { + "i32": 2147483647 + } + } + ], + "max": { + "bytes": "00000000", + "value": { + "i32": 0 + } + }, + "min": { + "bytes": "00000000", + "value": { + "i32": 0 + } + } + } + } + }, + { + "id": "sizes-packed/i64", + "op": "size", + "input": { + "format": "packed@1", + "max": 8, + "min": 8, + "type": "i64", + "witnesses": { + "between": [ + { + "bytes": "ffffffffffffffff", + "value": { + "i64": "-1" + } + }, + { + "bytes": "ff7fffffffffffff", + "value": { + "i64": "-32769" + } + }, + { + "bytes": "ffffff7fffffffff", + "value": { + "i64": "-2147483649" + } + }, + { + "bytes": "00000080ffffffff", + "value": { + "i64": "-2147483648" + } + }, + { + "bytes": "0000000000000080", + "value": { + "i64": "-9223372036854775808" + } + }, + { + "bytes": "0000010000000000", + "value": { + "i64": "65536" + } + }, + { + "bytes": "ffffffff00000000", + "value": { + "i64": "4294967295" + } + }, + { + "bytes": "0000000001000000", + "value": { + "i64": "4294967296" + } + }, + { + "bytes": "ffffffffffffff7f", + "value": { + "i64": "9223372036854775807" + } + } + ], + "max": { + "bytes": "0000000000000000", + "value": { + "i64": "0" + } + }, + "min": { + "bytes": "0000000000000000", + "value": { + "i64": "0" + } + } + } + } + }, + { + "id": "sizes-packed/i128", + "op": "size", + "input": { + "format": "packed@1", + "max": 16, + "min": 16, + "type": "i128", + "witnesses": { + "between": [ + { + "bytes": "ffffffffffffffffffffffffffffffff", + "value": { + "i128": "-1" + } + }, + { + "bytes": "00000000000000000000000010000000", + "value": { + "i128": "1267650600228229401496703205376" + } + }, + { + "bytes": "00000000000000000000000000000080", + "value": { + "i128": "-170141183460469231731687303715884105728" + } + }, + { + "bytes": "ffffffffffffffffffffffffffffff7f", + "value": { + "i128": "170141183460469231731687303715884105727" + } + } + ], + "max": { + "bytes": "00000000000000000000000000000000", + "value": { + "i128": "0" + } + }, + "min": { + "bytes": "00000000000000000000000000000000", + "value": { + "i128": "0" + } + } + } + } + }, + { + "id": "sizes-packed/f32", + "op": "size", + "input": { + "format": "packed@1", + "max": 4, + "min": 4, + "type": "f32", + "witnesses": { + "between": [ + { + "bytes": "0000803f", + "value": { + "f32": 1.0 + } + }, + { + "bytes": "000080be", + "value": { + "f32": -0.25 + } + }, + { + "bytes": "6520f147", + "value": { + "f32": 123456.7890625 + } + }, + { + "bytes": "4a204f37", + "value": { + "f32": 0.000012345679351710714 + } + }, + { + "bytes": "4a204fb7", + "value": { + "f32": -0.000012345679351710714 + } + }, + { + "bytes": "826cb5d4", + "value": { + "f32": -6233676316672.0 + } + }, + { + "bytes": "ffff7f7f", + "value": { + "f32": 3.4028234663852886e+38 + } + }, + { + "bytes": "ffff7fff", + "value": { + "f32": -3.4028234663852886e+38 + } + }, + { + "bytes": "00008000", + "value": { + "f32": 1.1754943508222875e-38 + } + }, + { + "bytes": "01000000", + "value": { + "f32": 1.401298464324817e-45 + } + } + ], + "max": { + "bytes": "00000000", + "value": { + "f32": 0.0 + } + }, + "min": { + "bytes": "00000000", + "value": { + "f32": 0.0 + } + } + } + } + }, + { + "id": "sizes-packed/f64", + "op": "size", + "input": { + "format": "packed@1", + "max": 8, + "min": 8, + "type": "f64", + "witnesses": { + "between": [ + { + "bytes": "000000000000f03f", + "value": { + "f64": 1.0 + } + }, + { + "bytes": "000000000000d0bf", + "value": { + "f64": -0.25 + } + }, + { + "bytes": "00008054346f9d41", + "value": { + "f64": 123456789.125 + } + }, + { + "bytes": "f168e388b5f8e43e", + "value": { + "f64": 0.00001 + } + }, + { + "bytes": "00003426f56b0c43", + "value": { + "f64": 1000000000000000.0 + } + }, + { + "bytes": "c696e3df3172eabe", + "value": { + "f64": -0.000012610470545525327 + } + }, + { + "bytes": "ffffffffffffef7f", + "value": { + "f64": 1.7976931348623157e+308 + } + }, + { + "bytes": "ffffffffffffefff", + "value": { + "f64": -1.7976931348623157e+308 + } + }, + { + "bytes": "0100000000000000", + "value": { + "f64": 5e-324 + } + }, + { + "bytes": "f265de55bf832406", + "value": { + "f64": 4.520618856987477e-279 + } + } + ], + "max": { + "bytes": "0000000000000000", + "value": { + "f64": 0.0 + } + }, + "min": { + "bytes": "0000000000000000", + "value": { + "f64": 0.0 + } + } + } + } + }, + { + "id": "sizes-packed/char", + "op": "size", + "input": { + "format": "packed@1", + "max": 4, + "min": 1, + "type": "char", + "witnesses": { + "between": [ + { + "bytes": "c3a9", + "value": { + "char": "é" + } + }, + { + "bytes": "e282ac", + "value": { + "char": "€" + } + }, + { + "bytes": "01", + "value": { + "char": "\u0001" + } + }, + { + "bytes": "22", + "value": { + "char": "\"" + } + }, + { + "bytes": "0a", + "value": { + "char": "\n" + } + }, + { + "bytes": "7f", + "value": { + "char": "" + } + } + ], + "max": { + "bytes": "f09f9880", + "value": { + "char": "😀" + } + }, + "min": { + "bytes": "61", + "value": { + "char": "a" + } + } + } + } + }, + { + "id": "sizes-packed/unit", + "op": "size", + "input": { + "format": "packed@1", + "max": 0, + "min": 0, + "type": "unit", + "witnesses": { + "max": { + "bytes": "", + "value": { + "unit": null + } + }, + "min": { + "bytes": "", + "value": { + "unit": null + } + } + } + } + }, + { + "id": "sizes-packed/string-unbounded", + "op": "size", + "input": { + "format": "packed@1", + "max": null, + "min": 1, + "type": "string", + "witnesses": { + "between": [ + { + "bytes": "0161", + "value": { + "string": "a" + } + }, + { + "bytes": "0f616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaa" + } + }, + { + "bytes": "1061616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "1f61616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "206161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "7f61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "80016161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "ff01616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "800261616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "ff7f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "80800161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "0668c3a96c6c6f", + "value": { + "string": "héllo" + } + }, + { + "bytes": "04f09f9880", + "value": { + "string": "😀" + } + }, + { + "bytes": "0973617920226869220a", + "value": { + "string": "say \"hi\"\n" + } + }, + { + "bytes": "015c", + "value": { + "string": "\\" + } + }, + { + "bytes": "02011f", + "value": { + "string": "\u0001\u001f" + } + }, + { + "bytes": "04017f205c", + "value": { + "string": "\u0001 \\" + } + } + ], + "min": { + "bytes": "00", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-packed/string-max-0", + "op": "size", + "input": { + "format": "packed@1", + "max": 1, + "min": 1, + "type": { + "bounded_string": { + "max": 0 + } + }, + "witnesses": { + "max": { + "bytes": "00", + "value": { + "string": "" + } + }, + "min": { + "bytes": "00", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-packed/string-max-1", + "op": "size", + "input": { + "format": "packed@1", + "max": 5, + "min": 1, + "type": { + "bounded_string": { + "max": 1 + } + }, + "witnesses": { + "between": [ + { + "bytes": "0161", + "value": { + "string": "a" + } + }, + { + "bytes": "02c3a9", + "value": { + "string": "é" + } + }, + { + "bytes": "03e282ac", + "value": { + "string": "€" + } + }, + { + "bytes": "0122", + "value": { + "string": "\"" + } + }, + { + "bytes": "015c", + "value": { + "string": "\\" + } + }, + { + "bytes": "0101", + "value": { + "string": "\u0001" + } + } + ], + "max": { + "bytes": "04f09f9880", + "value": { + "string": "😀" + } + }, + "min": { + "bytes": "00", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-packed/string-max-3", + "op": "size", + "input": { + "format": "packed@1", + "max": 13, + "min": 1, + "type": { + "bounded_string": { + "max": 3 + } + }, + "witnesses": { + "between": [ + { + "bytes": "03616161", + "value": { + "string": "aaa" + } + }, + { + "bytes": "06c3a9c3a9c3a9", + "value": { + "string": "ééé" + } + }, + { + "bytes": "09e282ace282ace282ac", + "value": { + "string": "€€€" + } + }, + { + "bytes": "03222222", + "value": { + "string": "\"\"\"" + } + }, + { + "bytes": "035c5c5c", + "value": { + "string": "\\\\\\" + } + }, + { + "bytes": "0562e282ac0a", + "value": { + "string": "b€\n" + } + } + ], + "max": { + "bytes": "0cf09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀" + } + }, + "min": { + "bytes": "00", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-packed/string-max-7", + "op": "size", + "input": { + "format": "packed@1", + "max": 29, + "min": 1, + "type": { + "bounded_string": { + "max": 7 + } + }, + "witnesses": { + "between": [ + { + "bytes": "0761616161616161", + "value": { + "string": "aaaaaaa" + } + }, + { + "bytes": "0ec3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "ééééééé" + } + }, + { + "bytes": "15e282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€" + } + }, + { + "bytes": "0722222222222222", + "value": { + "string": "\"\"\"\"\"\"\"" + } + }, + { + "bytes": "075c5c5c5c5c5c5c", + "value": { + "string": "\\\\\\\\\\\\\\" + } + }, + { + "bytes": "0120", + "value": { + "string": " " + } + } + ], + "max": { + "bytes": "1cf09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "00", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-packed/string-max-8", + "op": "size", + "input": { + "format": "packed@1", + "max": 33, + "min": 1, + "type": { + "bounded_string": { + "max": 8 + } + }, + "witnesses": { + "between": [ + { + "bytes": "086161616161616161", + "value": { + "string": "aaaaaaaa" + } + }, + { + "bytes": "10c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "éééééééé" + } + }, + { + "bytes": "18e282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€" + } + }, + { + "bytes": "082222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "085c5c5c5c5c5c5c5c", + "value": { + "string": "\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "04e282ac61", + "value": { + "string": "€a" + } + } + ], + "max": { + "bytes": "20f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "00", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-packed/string-max-31", + "op": "size", + "input": { + "format": "packed@1", + "max": 125, + "min": 1, + "type": { + "bounded_string": { + "max": 31 + } + }, + "witnesses": { + "between": [ + { + "bytes": "1f61616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "3ec3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "ééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "5de282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "1f22222222222222222222222222222222222222222222222222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "1f5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c", + "value": { + "string": "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "0520e282ac01", + "value": { + "string": " €\u0001" + } + } + ], + "max": { + "bytes": "7cf09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "00", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-packed/string-max-32", + "op": "size", + "input": { + "format": "packed@1", + "max": 130, + "min": 1, + "type": { + "bounded_string": { + "max": 32 + } + }, + "witnesses": { + "between": [ + { + "bytes": "206161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "40c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "éééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "60e282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "202222222222222222222222222222222222222222222222222222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "205c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c", + "value": { + "string": "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "025c62", + "value": { + "string": "\\b" + } + } + ], + "max": { + "bytes": "8001f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "00", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-packed/string-max-63", + "op": "size", + "input": { + "format": "packed@1", + "max": 254, + "min": 1, + "type": { + "bounded_string": { + "max": 63 + } + }, + "witnesses": { + "between": [ + { + "bytes": "3f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "7ec3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "bd01e282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "3f222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "3f5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c", + "value": { + "string": "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "0161", + "value": { + "string": "a" + } + } + ], + "max": { + "bytes": "fc01f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "00", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-packed/string-max-64", + "op": "size", + "input": { + "format": "packed@1", + "max": 258, + "min": 1, + "type": { + "bounded_string": { + "max": 64 + } + }, + "witnesses": { + "between": [ + { + "bytes": "4061616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "8001c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "c001e282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "4022222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "405c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c", + "value": { + "string": "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" + } + }, + { + "bytes": "0701c3a9f09f9880", + "value": { + "string": "\u0001é😀" + } + } + ], + "max": { + "bytes": "8002f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "00", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-packed/string-max-4095", + "op": "size", + "input": { + "format": "packed@1", + "max": 16382, + "min": 1, + "type": { + "bounded_string": { + "max": 4095 + } + }, + "witnesses": { + "between": [ + { + "bytes": "ff1f616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "03010a0a", + "value": { + "string": "\u0001\n\n" + } + } + ], + "max": { + "bytes": "fc7ff09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "00", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-packed/string-max-4096", + "op": "size", + "input": { + "format": "packed@1", + "max": 16387, + "min": 1, + "type": { + "bounded_string": { + "max": 4096 + } + }, + "witnesses": { + "between": [ + { + "bytes": "802061616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + }, + { + "bytes": "0561c3a9c3a9", + "value": { + "string": "aéé" + } + } + ], + "max": { + "bytes": "808001f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "00", + "value": { + "string": "" + } + } + } + } + }, + { + "id": "sizes-packed/string-fixed-3", + "op": "size", + "input": { + "format": "packed@1", + "max": 13, + "min": 4, + "type": { + "fixed_string": { + "len": 3 + } + }, + "witnesses": { + "between": [ + { + "bytes": "06c3a9c3a9c3a9", + "value": { + "string": "ééé" + } + }, + { + "bytes": "09e282ace282ace282ac", + "value": { + "string": "€€€" + } + }, + { + "bytes": "03222222", + "value": { + "string": "\"\"\"" + } + }, + { + "bytes": "055c22e282ac", + "value": { + "string": "\\\"€" + } + } + ], + "max": { + "bytes": "0cf09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀" + } + }, + "min": { + "bytes": "03616161", + "value": { + "string": "aaa" + } + } + } + } + }, + { + "id": "sizes-packed/string-fixed-8", + "op": "size", + "input": { + "format": "packed@1", + "max": 33, + "min": 9, + "type": { + "fixed_string": { + "len": 8 + } + }, + "witnesses": { + "between": [ + { + "bytes": "10c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "éééééééé" + } + }, + { + "bytes": "18e282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€" + } + }, + { + "bytes": "082222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "0ec3a9c3a9c3a92201f09f98806120", + "value": { + "string": "ééé\"\u0001😀a " + } + } + ], + "max": { + "bytes": "20f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "086161616161616161", + "value": { + "string": "aaaaaaaa" + } + } + } + } + }, + { + "id": "sizes-packed/string-fixed-32", + "op": "size", + "input": { + "format": "packed@1", + "max": 130, + "min": 33, + "type": { + "fixed_string": { + "len": 32 + } + }, + "witnesses": { + "between": [ + { + "bytes": "40c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9c3a9", + "value": { + "string": "éééééééééééééééééééééééééééééééé" + } + }, + { + "bytes": "60e282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ace282ac", + "value": { + "string": "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€" + } + }, + { + "bytes": "202222222222222222222222222222222222222222222222222222222222222222", + "value": { + "string": "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + } + }, + { + "bytes": "305c0a0a017fe282ac5cc3a922c3a97f22c3a961616161e282acc3a90a2062627f0af09f988020f09f98807f5ce282ac20", + "value": { + "string": "\\\n\n\u0001€\\é\"é\"éaaaa€é\n bb\n😀 😀\\€ " + } + } + ], + "max": { + "bytes": "8001f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + }, + "min": { + "bytes": "206161616161616161616161616161616161616161616161616161616161616161", + "value": { + "string": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + } + } + } + } + }, + { + "id": "sizes-packed/array-unbounded", + "op": "size", + "input": { + "format": "packed@1", + "max": null, + "min": 1, + "type": { + "array": "u8" + }, + "witnesses": { + "between": [ + { + "bytes": "0100", + "value": { + "array": [ + { + "u8": 0 + } + ] + } + }, + { + "bytes": "020001", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 1 + } + ] + } + }, + { + "bytes": "7f000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 1 + }, + { + "u8": 2 + }, + { + "u8": 3 + }, + { + "u8": 4 + }, + { + "u8": 5 + }, + { + "u8": 6 + }, + { + "u8": 7 + }, + { + "u8": 8 + }, + { + "u8": 9 + }, + { + "u8": 10 + }, + { + "u8": 11 + }, + { + "u8": 12 + }, + { + "u8": 13 + }, + { + "u8": 14 + }, + { + "u8": 15 + }, + { + "u8": 16 + }, + { + "u8": 17 + }, + { + "u8": 18 + }, + { + "u8": 19 + }, + { + "u8": 20 + }, + { + "u8": 21 + }, + { + "u8": 22 + }, + { + "u8": 23 + }, + { + "u8": 24 + }, + { + "u8": 25 + }, + { + "u8": 26 + }, + { + "u8": 27 + }, + { + "u8": 28 + }, + { + "u8": 29 + }, + { + "u8": 30 + }, + { + "u8": 31 + }, + { + "u8": 32 + }, + { + "u8": 33 + }, + { + "u8": 34 + }, + { + "u8": 35 + }, + { + "u8": 36 + }, + { + "u8": 37 + }, + { + "u8": 38 + }, + { + "u8": 39 + }, + { + "u8": 40 + }, + { + "u8": 41 + }, + { + "u8": 42 + }, + { + "u8": 43 + }, + { + "u8": 44 + }, + { + "u8": 45 + }, + { + "u8": 46 + }, + { + "u8": 47 + }, + { + "u8": 48 + }, + { + "u8": 49 + }, + { + "u8": 50 + }, + { + "u8": 51 + }, + { + "u8": 52 + }, + { + "u8": 53 + }, + { + "u8": 54 + }, + { + "u8": 55 + }, + { + "u8": 56 + }, + { + "u8": 57 + }, + { + "u8": 58 + }, + { + "u8": 59 + }, + { + "u8": 60 + }, + { + "u8": 61 + }, + { + "u8": 62 + }, + { + "u8": 63 + }, + { + "u8": 64 + }, + { + "u8": 65 + }, + { + "u8": 66 + }, + { + "u8": 67 + }, + { + "u8": 68 + }, + { + "u8": 69 + }, + { + "u8": 70 + }, + { + "u8": 71 + }, + { + "u8": 72 + }, + { + "u8": 73 + }, + { + "u8": 74 + }, + { + "u8": 75 + }, + { + "u8": 76 + }, + { + "u8": 77 + }, + { + "u8": 78 + }, + { + "u8": 79 + }, + { + "u8": 80 + }, + { + "u8": 81 + }, + { + "u8": 82 + }, + { + "u8": 83 + }, + { + "u8": 84 + }, + { + "u8": 85 + }, + { + "u8": 86 + }, + { + "u8": 87 + }, + { + "u8": 88 + }, + { + "u8": 89 + }, + { + "u8": 90 + }, + { + "u8": 91 + }, + { + "u8": 92 + }, + { + "u8": 93 + }, + { + "u8": 94 + }, + { + "u8": 95 + }, + { + "u8": 96 + }, + { + "u8": 97 + }, + { + "u8": 98 + }, + { + "u8": 99 + }, + { + "u8": 100 + }, + { + "u8": 101 + }, + { + "u8": 102 + }, + { + "u8": 103 + }, + { + "u8": 104 + }, + { + "u8": 105 + }, + { + "u8": 106 + }, + { + "u8": 107 + }, + { + "u8": 108 + }, + { + "u8": 109 + }, + { + "u8": 110 + }, + { + "u8": 111 + }, + { + "u8": 112 + }, + { + "u8": 113 + }, + { + "u8": 114 + }, + { + "u8": 115 + }, + { + "u8": 116 + }, + { + "u8": 117 + }, + { + "u8": 118 + }, + { + "u8": 119 + }, + { + "u8": 120 + }, + { + "u8": 121 + }, + { + "u8": 122 + }, + { + "u8": 123 + }, + { + "u8": 124 + }, + { + "u8": 125 + }, + { + "u8": 126 + } + ] + } + }, + { + "bytes": "8001000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 1 + }, + { + "u8": 2 + }, + { + "u8": 3 + }, + { + "u8": 4 + }, + { + "u8": 5 + }, + { + "u8": 6 + }, + { + "u8": 7 + }, + { + "u8": 8 + }, + { + "u8": 9 + }, + { + "u8": 10 + }, + { + "u8": 11 + }, + { + "u8": 12 + }, + { + "u8": 13 + }, + { + "u8": 14 + }, + { + "u8": 15 + }, + { + "u8": 16 + }, + { + "u8": 17 + }, + { + "u8": 18 + }, + { + "u8": 19 + }, + { + "u8": 20 + }, + { + "u8": 21 + }, + { + "u8": 22 + }, + { + "u8": 23 + }, + { + "u8": 24 + }, + { + "u8": 25 + }, + { + "u8": 26 + }, + { + "u8": 27 + }, + { + "u8": 28 + }, + { + "u8": 29 + }, + { + "u8": 30 + }, + { + "u8": 31 + }, + { + "u8": 32 + }, + { + "u8": 33 + }, + { + "u8": 34 + }, + { + "u8": 35 + }, + { + "u8": 36 + }, + { + "u8": 37 + }, + { + "u8": 38 + }, + { + "u8": 39 + }, + { + "u8": 40 + }, + { + "u8": 41 + }, + { + "u8": 42 + }, + { + "u8": 43 + }, + { + "u8": 44 + }, + { + "u8": 45 + }, + { + "u8": 46 + }, + { + "u8": 47 + }, + { + "u8": 48 + }, + { + "u8": 49 + }, + { + "u8": 50 + }, + { + "u8": 51 + }, + { + "u8": 52 + }, + { + "u8": 53 + }, + { + "u8": 54 + }, + { + "u8": 55 + }, + { + "u8": 56 + }, + { + "u8": 57 + }, + { + "u8": 58 + }, + { + "u8": 59 + }, + { + "u8": 60 + }, + { + "u8": 61 + }, + { + "u8": 62 + }, + { + "u8": 63 + }, + { + "u8": 64 + }, + { + "u8": 65 + }, + { + "u8": 66 + }, + { + "u8": 67 + }, + { + "u8": 68 + }, + { + "u8": 69 + }, + { + "u8": 70 + }, + { + "u8": 71 + }, + { + "u8": 72 + }, + { + "u8": 73 + }, + { + "u8": 74 + }, + { + "u8": 75 + }, + { + "u8": 76 + }, + { + "u8": 77 + }, + { + "u8": 78 + }, + { + "u8": 79 + }, + { + "u8": 80 + }, + { + "u8": 81 + }, + { + "u8": 82 + }, + { + "u8": 83 + }, + { + "u8": 84 + }, + { + "u8": 85 + }, + { + "u8": 86 + }, + { + "u8": 87 + }, + { + "u8": 88 + }, + { + "u8": 89 + }, + { + "u8": 90 + }, + { + "u8": 91 + }, + { + "u8": 92 + }, + { + "u8": 93 + }, + { + "u8": 94 + }, + { + "u8": 95 + }, + { + "u8": 96 + }, + { + "u8": 97 + }, + { + "u8": 98 + }, + { + "u8": 99 + }, + { + "u8": 100 + }, + { + "u8": 101 + }, + { + "u8": 102 + }, + { + "u8": 103 + }, + { + "u8": 104 + }, + { + "u8": 105 + }, + { + "u8": 106 + }, + { + "u8": 107 + }, + { + "u8": 108 + }, + { + "u8": 109 + }, + { + "u8": 110 + }, + { + "u8": 111 + }, + { + "u8": 112 + }, + { + "u8": 113 + }, + { + "u8": 114 + }, + { + "u8": 115 + }, + { + "u8": 116 + }, + { + "u8": 117 + }, + { + "u8": 118 + }, + { + "u8": 119 + }, + { + "u8": 120 + }, + { + "u8": 121 + }, + { + "u8": 122 + }, + { + "u8": 123 + }, + { + "u8": 124 + }, + { + "u8": 125 + }, + { + "u8": 126 + }, + { + "u8": 127 + } + ] + } + }, + { + "bytes": "03ffffff", + "value": { + "array": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + } + ], + "min": { + "bytes": "00", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-packed/array-unbounded-strings", + "op": "size", + "input": { + "format": "packed@1", + "max": null, + "min": 1, + "type": { + "array": "string" + }, + "witnesses": { + "between": [ + { + "bytes": "03016102626300", + "value": { + "array": [ + { + "string": "a" + }, + { + "string": "bc" + }, + { + "string": "" + } + ] + } + }, + { + "bytes": "010cf09f9880f09f9880f09f9880", + "value": { + "array": [ + { + "string": "😀😀😀" + } + ] + } + }, + { + "bytes": "0100", + "value": { + "array": [ + { + "string": "" + } + ] + } + } + ], + "min": { + "bytes": "00", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-packed/array-max-3", + "op": "size", + "input": { + "format": "packed@1", + "max": 4, + "min": 1, + "type": { + "bounded_array": { + "max": 3, + "of": "u8" + } + }, + "witnesses": { + "between": [ + { + "bytes": "03ffffff", + "value": { + "array": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "0107", + "value": { + "array": [ + { + "u8": 7 + } + ] + } + }, + { + "bytes": "0100", + "value": { + "array": [ + { + "u8": 0 + } + ] + } + } + ], + "max": { + "bytes": "03000000", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + }, + "min": { + "bytes": "00", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-packed/array-max-127", + "op": "size", + "input": { + "format": "packed@1", + "max": 128, + "min": 1, + "type": { + "bounded_array": { + "max": 127, + "of": "u8" + } + }, + "witnesses": { + "between": [ + { + "bytes": "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "value": { + "array": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "3f070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707", + "value": { + "array": [ + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + } + ] + } + }, + { + "bytes": "03018080", + "value": { + "array": [ + { + "u8": 1 + }, + { + "u8": 128 + }, + { + "u8": 128 + } + ] + } + } + ], + "max": { + "bytes": "7f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + }, + "min": { + "bytes": "00", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-packed/array-max-128", + "op": "size", + "input": { + "format": "packed@1", + "max": 130, + "min": 1, + "type": { + "bounded_array": { + "max": 128, + "of": "u8" + } + }, + "witnesses": { + "between": [ + { + "bytes": "8001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "value": { + "array": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "4007070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707", + "value": { + "array": [ + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + }, + { + "u8": 7 + } + ] + } + }, + { + "bytes": "03800180", + "value": { + "array": [ + { + "u8": 128 + }, + { + "u8": 1 + }, + { + "u8": 128 + } + ] + } + } + ], + "max": { + "bytes": "80010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "value": { + "array": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + }, + "min": { + "bytes": "00", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-packed/array-max-2-of-strings", + "op": "size", + "input": { + "format": "packed@1", + "max": 19, + "min": 1, + "type": { + "bounded_array": { + "max": 2, + "of": { + "bounded_string": { + "max": 2 + } + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "0202616208f09f9880f09f9880", + "value": { + "array": [ + { + "string": "ab" + }, + { + "string": "😀😀" + } + ] + } + }, + { + "bytes": "0100", + "value": { + "array": [ + { + "string": "" + } + ] + } + }, + { + "bytes": "0205c3a9e282ac020101", + "value": { + "array": [ + { + "string": "é€" + }, + { + "string": "\u0001\u0001" + } + ] + } + }, + { + "bytes": "020000", + "value": { + "array": [ + { + "string": "" + }, + { + "string": "" + } + ] + } + } + ], + "max": { + "bytes": "0208f09f9880f09f988008f09f9880f09f9880", + "value": { + "array": [ + { + "string": "😀😀" + }, + { + "string": "😀😀" + } + ] + } + }, + "min": { + "bytes": "00", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-packed/array-max-3-of-options", + "op": "size", + "input": { + "format": "packed@1", + "max": 7, + "min": 1, + "type": { + "bounded_array": { + "max": 3, + "of": { + "option": "u8" + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "030001ff0100", + "value": { + "array": [ + { + "option": null + }, + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 0 + } + } + ] + } + }, + { + "bytes": "03000000", + "value": { + "array": [ + { + "option": null + }, + { + "option": null + }, + { + "option": null + } + ] + } + }, + { + "bytes": "0301ff01ff01ff", + "value": { + "array": [ + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 255 + } + } + ] + } + }, + { + "bytes": "0100", + "value": { + "array": [ + { + "option": null + } + ] + } + } + ], + "max": { + "bytes": "03010001000100", + "value": { + "array": [ + { + "option": { + "u8": 0 + } + }, + { + "option": { + "u8": 0 + } + }, + { + "option": { + "u8": 0 + } + } + ] + } + }, + "min": { + "bytes": "00", + "value": { + "array": [] + } + } + } + } + }, + { + "id": "sizes-packed/fixed-4", + "op": "size", + "input": { + "format": "packed@1", + "max": 4, + "min": 4, + "type": { + "fixed": { + "len": 4, + "of": "u8" + } + }, + "witnesses": { + "between": [ + { + "bytes": "ffffffff", + "value": { + "tuple": [ + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + }, + { + "u8": 255 + } + ] + } + }, + { + "bytes": "01c80304", + "value": { + "tuple": [ + { + "u8": 1 + }, + { + "u8": 200 + }, + { + "u8": 3 + }, + { + "u8": 4 + } + ] + } + } + ], + "max": { + "bytes": "00000000", + "value": { + "tuple": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + }, + "min": { + "bytes": "00000000", + "value": { + "tuple": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + } + } + } + }, + { + "id": "sizes-packed/fixed-1", + "op": "size", + "input": { + "format": "packed@1", + "max": 1, + "min": 1, + "type": { + "fixed": { + "len": 1, + "of": "bool" + } + }, + "witnesses": { + "between": [ + { + "bytes": "00", + "value": { + "tuple": [ + { + "bool": false + } + ] + } + } + ], + "max": { + "bytes": "01", + "value": { + "tuple": [ + { + "bool": true + } + ] + } + }, + "min": { + "bytes": "01", + "value": { + "tuple": [ + { + "bool": true + } + ] + } + } + } + } + }, + { + "id": "sizes-packed/fixed-2-of-strings", + "op": "size", + "input": { + "format": "packed@1", + "max": 18, + "min": 2, + "type": { + "fixed": { + "len": 2, + "of": { + "bounded_string": { + "max": 2 + } + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "02616208f09f9880f09f9880", + "value": { + "tuple": [ + { + "string": "ab" + }, + { + "string": "😀😀" + } + ] + } + }, + { + "bytes": "027f20025c62", + "value": { + "tuple": [ + { + "string": " " + }, + { + "string": "\\b" + } + ] + } + } + ], + "max": { + "bytes": "08f09f9880f09f988008f09f9880f09f9880", + "value": { + "tuple": [ + { + "string": "😀😀" + }, + { + "string": "😀😀" + } + ] + } + }, + "min": { + "bytes": "0000", + "value": { + "tuple": [ + { + "string": "" + }, + { + "string": "" + } + ] + } + } + } + } + }, + { + "id": "sizes-packed/fixed-3-of-options", + "op": "size", + "input": { + "format": "packed@1", + "max": 6, + "min": 3, + "type": { + "fixed": { + "len": 3, + "of": { + "option": "u8" + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "0001ff0100", + "value": { + "tuple": [ + { + "option": null + }, + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 0 + } + } + ] + } + }, + { + "bytes": "01ff01ff01ff", + "value": { + "tuple": [ + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 255 + } + }, + { + "option": { + "u8": 255 + } + } + ] + } + }, + { + "bytes": "010100017f", + "value": { + "tuple": [ + { + "option": { + "u8": 1 + } + }, + { + "option": null + }, + { + "option": { + "u8": 127 + } + } + ] + } + } + ], + "max": { + "bytes": "010001000100", + "value": { + "tuple": [ + { + "option": { + "u8": 0 + } + }, + { + "option": { + "u8": 0 + } + }, + { + "option": { + "u8": 0 + } + } + ] + } + }, + "min": { + "bytes": "000000", + "value": { + "tuple": [ + { + "option": null + }, + { + "option": null + }, + { + "option": null + } + ] + } + } + } + } + }, + { + "id": "sizes-packed/option-u8", + "op": "size", + "input": { + "format": "packed@1", + "max": 2, + "min": 1, + "type": { + "option": "u8" + }, + "witnesses": { + "between": [ + { + "bytes": "017f", + "value": { + "option": { + "u8": 127 + } + } + }, + { + "bytes": "0180", + "value": { + "option": { + "u8": 128 + } + } + }, + { + "bytes": "01ff", + "value": { + "option": { + "u8": 255 + } + } + } + ], + "max": { + "bytes": "0100", + "value": { + "option": { + "u8": 0 + } + } + }, + "min": { + "bytes": "00", + "value": { + "option": null + } + } + } + } + }, + { + "id": "sizes-packed/option-bool", + "op": "size", + "input": { + "format": "packed@1", + "max": 2, + "min": 1, + "type": { + "option": "bool" + }, + "witnesses": { + "between": [ + { + "bytes": "0100", + "value": { + "option": { + "bool": false + } + } + } + ], + "max": { + "bytes": "0101", + "value": { + "option": { + "bool": true + } + } + }, + "min": { + "bytes": "00", + "value": { + "option": null + } + } + } + } + }, + { + "id": "sizes-packed/option-string", + "op": "size", + "input": { + "format": "packed@1", + "max": null, + "min": 1, + "type": { + "option": "string" + }, + "witnesses": { + "between": [ + { + "bytes": "0100", + "value": { + "option": { + "string": "" + } + } + }, + { + "bytes": "010568656c6c6f", + "value": { + "option": { + "string": "hello" + } + } + }, + { + "bytes": "010162", + "value": { + "option": { + "string": "b" + } + } + } + ], + "min": { + "bytes": "00", + "value": { + "option": null + } + } + } + } + }, + { + "id": "sizes-packed/option-max-3-chars", + "op": "size", + "input": { + "format": "packed@1", + "max": 14, + "min": 1, + "type": { + "option": { + "bounded_string": { + "max": 3 + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "0100", + "value": { + "option": { + "string": "" + } + } + }, + { + "bytes": "01026162", + "value": { + "option": { + "string": "ab" + } + } + }, + { + "bytes": "0103010101", + "value": { + "option": { + "string": "\u0001\u0001\u0001" + } + } + }, + { + "bytes": "0102625c", + "value": { + "option": { + "string": "b\\" + } + } + } + ], + "max": { + "bytes": "010cf09f9880f09f9880f09f9880", + "value": { + "option": { + "string": "😀😀😀" + } + } + }, + "min": { + "bytes": "00", + "value": { + "option": null + } + } + } + } + }, + { + "id": "sizes-packed/option-struct", + "op": "size", + "input": { + "format": "packed@1", + "max": 9, + "min": 1, + "type": { + "option": { + "struct": { + "fields": [ + [ + "x", + "i32" + ], + [ + "y", + "i32" + ] + ], + "name": "Point" + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "01ffffffff2c010000", + "value": { + "option": { + "struct": { + "fields": [ + [ + "x", + { + "i32": -1 + } + ], + [ + "y", + { + "i32": 300 + } + ] + ], + "name": "Point" + } + } + } + }, + { + "bytes": "010000008000000080", + "value": { + "option": { + "struct": { + "fields": [ + [ + "x", + { + "i32": -2147483648 + } + ], + [ + "y", + { + "i32": -2147483648 + } + ] + ], + "name": "Point" + } + } + } + } + ], + "max": { + "bytes": "010000000000000000", + "value": { + "option": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + } + }, + "min": { + "bytes": "00", + "value": { + "option": null + } + } + } + } + }, + { + "id": "sizes-packed/struct-point", + "op": "size", + "input": { + "format": "packed@1", + "max": 8, + "min": 8, + "type": { + "struct": { + "fields": [ + [ + "x", + "i32" + ], + [ + "y", + "i32" + ] + ], + "name": "Point" + } + }, + "witnesses": { + "between": [ + { + "bytes": "01000000feffffff", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 1 + } + ], + [ + "y", + { + "i32": -2 + } + ] + ], + "name": "Point" + } + } + }, + { + "bytes": "0000008000000080", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": -2147483648 + } + ], + [ + "y", + { + "i32": -2147483648 + } + ] + ], + "name": "Point" + } + } + }, + { + "bytes": "ffffff7f00000000", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 2147483647 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + } + ], + "max": { + "bytes": "0000000000000000", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + }, + "min": { + "bytes": "0000000000000000", + "value": { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + } + } + } + }, + { + "id": "sizes-packed/struct-empty", + "op": "size", + "input": { + "format": "packed@1", + "max": 0, + "min": 0, + "type": { + "struct": { + "fields": [], + "name": "Empty" + } + }, + "witnesses": { + "max": { + "bytes": "", + "value": { + "struct": { + "fields": [], + "name": "Empty" + } + } + }, + "min": { + "bytes": "", + "value": { + "struct": { + "fields": [], + "name": "Empty" + } + } + } + } + } + }, + { + "id": "sizes-packed/struct-mixed", + "op": "size", + "input": { + "format": "packed@1", + "max": 108, + "min": 7, + "type": { + "struct": { + "fields": [ + [ + "id", + "u32" + ], + [ + "name", + { + "bounded_string": { + "max": 16 + } + } + ], + [ + "tags", + { + "bounded_array": { + "max": 4, + "of": "u8" + } + } + ], + [ + "note", + { + "option": { + "bounded_string": { + "max": 8 + } + } + } + ] + ], + "name": "Msg" + } + }, + "witnesses": { + "between": [ + { + "bytes": "0700000002686902010200", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 7 + } + ], + [ + "name", + { + "string": "hi" + } + ], + [ + "tags", + { + "array": [ + { + "u8": 1 + }, + { + "u8": 2 + } + ] + } + ], + [ + "note", + { + "option": null + } + ] + ], + "name": "Msg" + } + } + }, + { + "bytes": "701101000d68c3a96c6c6f2077c3b6726c6400010178", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 70000 + } + ], + [ + "name", + { + "string": "héllo wörld" + } + ], + [ + "tags", + { + "array": [] + } + ], + [ + "note", + { + "option": { + "string": "x" + } + } + ] + ], + "name": "Msg" + } + } + }, + { + "bytes": "0000010000030100ff010661f09f988062", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 65536 + } + ], + [ + "name", + { + "string": "" + } + ], + [ + "tags", + { + "array": [ + { + "u8": 1 + }, + { + "u8": 0 + }, + { + "u8": 255 + } + ] + } + ], + [ + "note", + { + "option": { + "string": "a😀b" + } + } + ] + ], + "name": "Msg" + } + } + } + ], + "max": { + "bytes": "0000000040f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f988004000000000120f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 0 + } + ], + [ + "name", + { + "string": "😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀😀" + } + ], + [ + "tags", + { + "array": [ + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + }, + { + "u8": 0 + } + ] + } + ], + [ + "note", + { + "option": { + "string": "😀😀😀😀😀😀😀😀" + } + } + ] + ], + "name": "Msg" + } + } + }, + "min": { + "bytes": "00000000000000", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u32": 0 + } + ], + [ + "name", + { + "string": "" + } + ], + [ + "tags", + { + "array": [] + } + ], + [ + "note", + { + "option": null + } + ] + ], + "name": "Msg" + } + } + } + } + } + }, + { + "id": "sizes-packed/struct-nested", + "op": "size", + "input": { + "format": "packed@1", + "max": 50, + "min": 17, + "type": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + "i32" + ], + [ + "y", + "i32" + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + "i32" + ], + [ + "y", + "i32" + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": { + "bounded_string": { + "max": 8 + } + } + } + ] + ], + "name": "Line" + } + }, + "witnesses": { + "between": [ + { + "bytes": "0000000000000000030000000400000000", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 3 + } + ], + [ + "y", + { + "i32": 4 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": null + } + ] + ], + "name": "Line" + } + } + }, + { + "bytes": "fbffffff05000000640000006400000001026162", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": -5 + } + ], + [ + "y", + { + "i32": 5 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 100 + } + ], + [ + "y", + { + "i32": 100 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": { + "string": "ab" + } + } + ] + ], + "name": "Line" + } + } + }, + { + "bytes": "0000008000000000ffff0000000000800108e282acf09f988022", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": -2147483648 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 65535 + } + ], + [ + "y", + { + "i32": -2147483648 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": { + "string": "€😀\"" + } + } + ] + ], + "name": "Line" + } + } + } + ], + "max": { + "bytes": "000000000000000000000000000000000120f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880f09f9880", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": { + "string": "😀😀😀😀😀😀😀😀" + } + } + ] + ], + "name": "Line" + } + } + }, + "min": { + "bytes": "0000000000000000000000000000000000", + "value": { + "struct": { + "fields": [ + [ + "from", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + ], + [ + "to", + { + "struct": { + "fields": [ + [ + "x", + { + "i32": 0 + } + ], + [ + "y", + { + "i32": 0 + } + ] + ], + "name": "Point" + } + } + ], + [ + "label", + { + "option": null + } + ] + ], + "name": "Line" + } + } + } + } + } + }, + { + "id": "sizes-packed/struct-15-fields", + "op": "size", + "input": { + "format": "packed@1", + "max": 15, + "min": 15, + "type": { + "struct": { + "fields": [ + [ + "f00", + "u8" + ], + [ + "f01", + "u8" + ], + [ + "f02", + "u8" + ], + [ + "f03", + "u8" + ], + [ + "f04", + "u8" + ], + [ + "f05", + "u8" + ], + [ + "f06", + "u8" + ], + [ + "f07", + "u8" + ], + [ + "f08", + "u8" + ], + [ + "f09", + "u8" + ], + [ + "f10", + "u8" + ], + [ + "f11", + "u8" + ], + [ + "f12", + "u8" + ], + [ + "f13", + "u8" + ], + [ + "f14", + "u8" + ] + ], + "name": "Wide15" + } + }, + "witnesses": { + "between": [ + { + "bytes": "ffffffffffffffffffffffffffffff", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 255 + } + ], + [ + "f01", + { + "u8": 255 + } + ], + [ + "f02", + { + "u8": 255 + } + ], + [ + "f03", + { + "u8": 255 + } + ], + [ + "f04", + { + "u8": 255 + } + ], + [ + "f05", + { + "u8": 255 + } + ], + [ + "f06", + { + "u8": 255 + } + ], + [ + "f07", + { + "u8": 255 + } + ], + [ + "f08", + { + "u8": 255 + } + ], + [ + "f09", + { + "u8": 255 + } + ], + [ + "f10", + { + "u8": 255 + } + ], + [ + "f11", + { + "u8": 255 + } + ], + [ + "f12", + { + "u8": 255 + } + ], + [ + "f13", + { + "u8": 255 + } + ], + [ + "f14", + { + "u8": 255 + } + ] + ], + "name": "Wide15" + } + } + }, + { + "bytes": "00112233445566778899aabbccddee", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 17 + } + ], + [ + "f02", + { + "u8": 34 + } + ], + [ + "f03", + { + "u8": 51 + } + ], + [ + "f04", + { + "u8": 68 + } + ], + [ + "f05", + { + "u8": 85 + } + ], + [ + "f06", + { + "u8": 102 + } + ], + [ + "f07", + { + "u8": 119 + } + ], + [ + "f08", + { + "u8": 136 + } + ], + [ + "f09", + { + "u8": 153 + } + ], + [ + "f10", + { + "u8": 170 + } + ], + [ + "f11", + { + "u8": 187 + } + ], + [ + "f12", + { + "u8": 204 + } + ], + [ + "f13", + { + "u8": 221 + } + ], + [ + "f14", + { + "u8": 238 + } + ] + ], + "name": "Wide15" + } + } + } + ], + "max": { + "bytes": "000000000000000000000000000000", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 0 + } + ], + [ + "f02", + { + "u8": 0 + } + ], + [ + "f03", + { + "u8": 0 + } + ], + [ + "f04", + { + "u8": 0 + } + ], + [ + "f05", + { + "u8": 0 + } + ], + [ + "f06", + { + "u8": 0 + } + ], + [ + "f07", + { + "u8": 0 + } + ], + [ + "f08", + { + "u8": 0 + } + ], + [ + "f09", + { + "u8": 0 + } + ], + [ + "f10", + { + "u8": 0 + } + ], + [ + "f11", + { + "u8": 0 + } + ], + [ + "f12", + { + "u8": 0 + } + ], + [ + "f13", + { + "u8": 0 + } + ], + [ + "f14", + { + "u8": 0 + } + ] + ], + "name": "Wide15" + } + } + }, + "min": { + "bytes": "000000000000000000000000000000", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 0 + } + ], + [ + "f02", + { + "u8": 0 + } + ], + [ + "f03", + { + "u8": 0 + } + ], + [ + "f04", + { + "u8": 0 + } + ], + [ + "f05", + { + "u8": 0 + } + ], + [ + "f06", + { + "u8": 0 + } + ], + [ + "f07", + { + "u8": 0 + } + ], + [ + "f08", + { + "u8": 0 + } + ], + [ + "f09", + { + "u8": 0 + } + ], + [ + "f10", + { + "u8": 0 + } + ], + [ + "f11", + { + "u8": 0 + } + ], + [ + "f12", + { + "u8": 0 + } + ], + [ + "f13", + { + "u8": 0 + } + ], + [ + "f14", + { + "u8": 0 + } + ] + ], + "name": "Wide15" + } + } + } + } + } + }, + { + "id": "sizes-packed/struct-16-fields", + "op": "size", + "input": { + "format": "packed@1", + "max": 16, + "min": 16, + "type": { + "struct": { + "fields": [ + [ + "f00", + "u8" + ], + [ + "f01", + "u8" + ], + [ + "f02", + "u8" + ], + [ + "f03", + "u8" + ], + [ + "f04", + "u8" + ], + [ + "f05", + "u8" + ], + [ + "f06", + "u8" + ], + [ + "f07", + "u8" + ], + [ + "f08", + "u8" + ], + [ + "f09", + "u8" + ], + [ + "f10", + "u8" + ], + [ + "f11", + "u8" + ], + [ + "f12", + "u8" + ], + [ + "f13", + "u8" + ], + [ + "f14", + "u8" + ], + [ + "f15", + "u8" + ] + ], + "name": "Wide16" + } + }, + "witnesses": { + "between": [ + { + "bytes": "ffffffffffffffffffffffffffffffff", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 255 + } + ], + [ + "f01", + { + "u8": 255 + } + ], + [ + "f02", + { + "u8": 255 + } + ], + [ + "f03", + { + "u8": 255 + } + ], + [ + "f04", + { + "u8": 255 + } + ], + [ + "f05", + { + "u8": 255 + } + ], + [ + "f06", + { + "u8": 255 + } + ], + [ + "f07", + { + "u8": 255 + } + ], + [ + "f08", + { + "u8": 255 + } + ], + [ + "f09", + { + "u8": 255 + } + ], + [ + "f10", + { + "u8": 255 + } + ], + [ + "f11", + { + "u8": 255 + } + ], + [ + "f12", + { + "u8": 255 + } + ], + [ + "f13", + { + "u8": 255 + } + ], + [ + "f14", + { + "u8": 255 + } + ], + [ + "f15", + { + "u8": 255 + } + ] + ], + "name": "Wide16" + } + } + }, + { + "bytes": "00112233445566778899aabbccddeeff", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 17 + } + ], + [ + "f02", + { + "u8": 34 + } + ], + [ + "f03", + { + "u8": 51 + } + ], + [ + "f04", + { + "u8": 68 + } + ], + [ + "f05", + { + "u8": 85 + } + ], + [ + "f06", + { + "u8": 102 + } + ], + [ + "f07", + { + "u8": 119 + } + ], + [ + "f08", + { + "u8": 136 + } + ], + [ + "f09", + { + "u8": 153 + } + ], + [ + "f10", + { + "u8": 170 + } + ], + [ + "f11", + { + "u8": 187 + } + ], + [ + "f12", + { + "u8": 204 + } + ], + [ + "f13", + { + "u8": 221 + } + ], + [ + "f14", + { + "u8": 238 + } + ], + [ + "f15", + { + "u8": 255 + } + ] + ], + "name": "Wide16" + } + } + } + ], + "max": { + "bytes": "00000000000000000000000000000000", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 0 + } + ], + [ + "f02", + { + "u8": 0 + } + ], + [ + "f03", + { + "u8": 0 + } + ], + [ + "f04", + { + "u8": 0 + } + ], + [ + "f05", + { + "u8": 0 + } + ], + [ + "f06", + { + "u8": 0 + } + ], + [ + "f07", + { + "u8": 0 + } + ], + [ + "f08", + { + "u8": 0 + } + ], + [ + "f09", + { + "u8": 0 + } + ], + [ + "f10", + { + "u8": 0 + } + ], + [ + "f11", + { + "u8": 0 + } + ], + [ + "f12", + { + "u8": 0 + } + ], + [ + "f13", + { + "u8": 0 + } + ], + [ + "f14", + { + "u8": 0 + } + ], + [ + "f15", + { + "u8": 0 + } + ] + ], + "name": "Wide16" + } + } + }, + "min": { + "bytes": "00000000000000000000000000000000", + "value": { + "struct": { + "fields": [ + [ + "f00", + { + "u8": 0 + } + ], + [ + "f01", + { + "u8": 0 + } + ], + [ + "f02", + { + "u8": 0 + } + ], + [ + "f03", + { + "u8": 0 + } + ], + [ + "f04", + { + "u8": 0 + } + ], + [ + "f05", + { + "u8": 0 + } + ], + [ + "f06", + { + "u8": 0 + } + ], + [ + "f07", + { + "u8": 0 + } + ], + [ + "f08", + { + "u8": 0 + } + ], + [ + "f09", + { + "u8": 0 + } + ], + [ + "f10", + { + "u8": 0 + } + ], + [ + "f11", + { + "u8": 0 + } + ], + [ + "f12", + { + "u8": 0 + } + ], + [ + "f13", + { + "u8": 0 + } + ], + [ + "f14", + { + "u8": 0 + } + ], + [ + "f15", + { + "u8": 0 + } + ] + ], + "name": "Wide16" + } + } + } + } + } + }, + { + "id": "sizes-packed/struct-long-names", + "op": "size", + "input": { + "format": "packed@1", + "max": 5, + "min": 4, + "type": { + "struct": { + "fields": [ + [ + "id", + "u8" + ], + [ + "a_much_longer_field_name", + "u16" + ], + [ + "x", + { + "option": "bool" + } + ] + ], + "name": "Named" + } + }, + "witnesses": { + "between": [ + { + "bytes": "012c010101", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u8": 1 + } + ], + [ + "a_much_longer_field_name", + { + "u16": 300 + } + ], + [ + "x", + { + "option": { + "bool": true + } + } + ] + ], + "name": "Named" + } + } + } + ], + "max": { + "bytes": "0000000101", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u8": 0 + } + ], + [ + "a_much_longer_field_name", + { + "u16": 0 + } + ], + [ + "x", + { + "option": { + "bool": true + } + } + ] + ], + "name": "Named" + } + } + }, + "min": { + "bytes": "00000000", + "value": { + "struct": { + "fields": [ + [ + "id", + { + "u8": 0 + } + ], + [ + "a_much_longer_field_name", + { + "u16": 0 + } + ], + [ + "x", + { + "option": null + } + ] + ], + "name": "Named" + } + } + } + } + } + }, + { + "id": "sizes-packed/enum-color", + "op": "size", + "input": { + "format": "packed@1", + "max": 1, + "min": 1, + "type": { + "enum": { + "name": "Color", + "variants": [ + "Red", + "Green", + "Blue" + ] + } + }, + "witnesses": { + "between": [ + { + "bytes": "01", + "value": { + "unit_variant": { + "enum": "Color", + "index": 1, + "variant": "Green" + } + } + }, + { + "bytes": "02", + "value": { + "unit_variant": { + "enum": "Color", + "index": 2, + "variant": "Blue" + } + } + } + ], + "max": { + "bytes": "00", + "value": { + "unit_variant": { + "enum": "Color", + "index": 0, + "variant": "Red" + } + } + }, + "min": { + "bytes": "00", + "value": { + "unit_variant": { + "enum": "Color", + "index": 0, + "variant": "Red" + } + } + } + } + } + }, + { + "id": "sizes-packed/enum-single", + "op": "size", + "input": { + "format": "packed@1", + "max": 1, + "min": 1, + "type": { + "enum": { + "name": "Only", + "variants": [ + "Only" + ] + } + }, + "witnesses": { + "max": { + "bytes": "00", + "value": { + "unit_variant": { + "enum": "Only", + "index": 0, + "variant": "Only" + } + } + }, + "min": { + "bytes": "00", + "value": { + "unit_variant": { + "enum": "Only", + "index": 0, + "variant": "Only" + } + } + } + } + } + }, + { + "id": "sizes-packed/enum-129-variants", + "op": "size", + "input": { + "format": "packed@1", + "max": 2, + "min": 1, + "type": { + "enum": { + "name": "Many", + "variants": [ + "v000", + "v001", + "v002", + "v003", + "v004", + "v005", + "v006", + "v007", + "v008", + "v009", + "v010", + "v011", + "v012", + "v013", + "v014", + "v015", + "v016", + "v017", + "v018", + "v019", + "v020", + "v021", + "v022", + "v023", + "v024", + "v025", + "v026", + "v027", + "v028", + "v029", + "v030", + "v031", + "v032", + "v033", + "v034", + "v035", + "v036", + "v037", + "v038", + "v039", + "v040", + "v041", + "v042", + "v043", + "v044", + "v045", + "v046", + "v047", + "v048", + "v049", + "v050", + "v051", + "v052", + "v053", + "v054", + "v055", + "v056", + "v057", + "v058", + "v059", + "v060", + "v061", + "v062", + "v063", + "v064", + "v065", + "v066", + "v067", + "v068", + "v069", + "v070", + "v071", + "v072", + "v073", + "v074", + "v075", + "v076", + "v077", + "v078", + "v079", + "v080", + "v081", + "v082", + "v083", + "v084", + "v085", + "v086", + "v087", + "v088", + "v089", + "v090", + "v091", + "v092", + "v093", + "v094", + "v095", + "v096", + "v097", + "v098", + "v099", + "v100", + "v101", + "v102", + "v103", + "v104", + "v105", + "v106", + "v107", + "v108", + "v109", + "v110", + "v111", + "v112", + "v113", + "v114", + "v115", + "v116", + "v117", + "v118", + "v119", + "v120", + "v121", + "v122", + "v123", + "v124", + "v125", + "v126", + "v127", + "v128" + ] + } + }, + "witnesses": { + "between": [ + { + "bytes": "01", + "value": { + "unit_variant": { + "enum": "Many", + "index": 1, + "variant": "v001" + } + } + }, + { + "bytes": "7e", + "value": { + "unit_variant": { + "enum": "Many", + "index": 126, + "variant": "v126" + } + } + }, + { + "bytes": "7f", + "value": { + "unit_variant": { + "enum": "Many", + "index": 127, + "variant": "v127" + } + } + } + ], + "max": { + "bytes": "8001", + "value": { + "unit_variant": { + "enum": "Many", + "index": 128, + "variant": "v128" + } + } + }, + "min": { + "bytes": "00", + "value": { + "unit_variant": { + "enum": "Many", + "index": 0, + "variant": "v000" + } + } + } + } + } + }, + { + "id": "sizes-packed/enum-long-names", + "op": "size", + "input": { + "format": "packed@1", + "max": 1, + "min": 1, + "type": { + "enum": { + "name": "Long", + "variants": [ + "a", + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "ccccccccccccccccccccccccccccccc", + "dddddddddddddddddddddddddddddddd" + ] + } + }, + "witnesses": { + "between": [ + { + "bytes": "01", + "value": { + "unit_variant": { + "enum": "Long", + "index": 1, + "variant": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + } + } + }, + { + "bytes": "02", + "value": { + "unit_variant": { + "enum": "Long", + "index": 2, + "variant": "ccccccccccccccccccccccccccccccc" + } + } + }, + { + "bytes": "03", + "value": { + "unit_variant": { + "enum": "Long", + "index": 3, + "variant": "dddddddddddddddddddddddddddddddd" + } + } + } + ], + "max": { + "bytes": "00", + "value": { + "unit_variant": { + "enum": "Long", + "index": 0, + "variant": "a" + } + } + }, + "min": { + "bytes": "00", + "value": { + "unit_variant": { + "enum": "Long", + "index": 0, + "variant": "a" + } + } + } + } + } + }, + { + "id": "sizes-packed/recursive-chain-3", + "op": "size", + "input": { + "format": "packed@1", + "max": 3, + "min": 1, + "type": { + "recursive": { + "max_depth": 3, + "of": { + "struct": { + "fields": [ + [ + "next", + { + "option": "self" + } + ] + ], + "name": "Node" + } + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "0100", + "value": { + "struct": { + "fields": [ + [ + "next", + { + "option": { + "struct": { + "fields": [ + [ + "next", + { + "option": null + } + ] + ], + "name": "Node" + } + } + } + ] + ], + "name": "Node" + } + } + } + ], + "max": { + "bytes": "010100", + "value": { + "struct": { + "fields": [ + [ + "next", + { + "option": { + "struct": { + "fields": [ + [ + "next", + { + "option": { + "struct": { + "fields": [ + [ + "next", + { + "option": null + } + ] + ], + "name": "Node" + } + } + } + ] + ], + "name": "Node" + } + } + } + ] + ], + "name": "Node" + } + } + }, + "min": { + "bytes": "00", + "value": { + "struct": { + "fields": [ + [ + "next", + { + "option": null + } + ] + ], + "name": "Node" + } + } + } + } + } + }, + { + "id": "sizes-packed/recursive-tree-2", + "op": "size", + "input": { + "format": "packed@1", + "max": 3, + "min": 1, + "type": { + "recursive": { + "max_depth": 2, + "of": { + "struct": { + "fields": [ + [ + "children", + { + "bounded_array": { + "max": 2, + "of": "self" + } + } + ] + ], + "name": "Tree" + } + } + } + }, + "witnesses": { + "between": [ + { + "bytes": "0100", + "value": { + "struct": { + "fields": [ + [ + "children", + { + "array": [ + { + "struct": { + "fields": [ + [ + "children", + { + "array": [] + } + ] + ], + "name": "Tree" + } + } + ] + } + ] + ], + "name": "Tree" + } + } + } + ], + "max": { + "bytes": "020000", + "value": { + "struct": { + "fields": [ + [ + "children", + { + "array": [ + { + "struct": { + "fields": [ + [ + "children", + { + "array": [] + } + ] + ], + "name": "Tree" + } + }, + { + "struct": { + "fields": [ + [ + "children", + { + "array": [] + } + ] + ], + "name": "Tree" + } + } + ] + } + ] + ], + "name": "Tree" + } + } + }, + "min": { + "bytes": "00", + "value": { + "struct": { + "fields": [ + [ + "children", + { + "array": [] + } + ] + ], + "name": "Tree" + } + } + } + } + } + } + ] +} diff --git a/runtime/conformance/src/case.rs b/runtime/conformance/src/case.rs index 5a5696d..348d91c 100644 --- a/runtime/conformance/src/case.rs +++ b/runtime/conformance/src/case.rs @@ -88,7 +88,9 @@ struct CaseWire { op: Op, #[serde(default, skip_serializing_if = "Json::is_null")] input: Json, - bytes: Hex, + /// Every op but `size`, whose witnesses each have their own. + #[serde(default, skip_serializing_if = "Option::is_none")] + bytes: Option, #[serde(default, skip_serializing_if = "Expect::is_exact")] expect: Expect, #[serde(default, skip_serializing_if = "Compare::is_bytes")] @@ -101,10 +103,21 @@ impl TryFrom for Case { fn try_from(case: CaseWire) -> Result { let input = Input::parse(case.op, &case.input).map_err(|e| format!("case `{}`: {e}", case.id))?; + let bytes = match (case.op, case.bytes) { + (Op::Size, None) if case.expect.is_exact() && case.compare.is_bytes() => Hex::default(), + (Op::Size, _) => { + return Err(format!( + "case `{}`: a `size` case has no `bytes`, `expect` or `compare`", + case.id + )) + } + (_, Some(bytes)) => bytes, + (_, None) => return Err(format!("case `{}`: no `bytes`", case.id)), + }; Ok(Case { id: case.id, input, - bytes: case.bytes, + bytes, expect: case.expect, compare: case.compare, }) @@ -113,11 +126,12 @@ impl TryFrom for Case { impl From for CaseWire { fn from(case: Case) -> Self { + let op = case.input.op(); CaseWire { id: case.id, - op: case.input.op(), + op, input: crate::to_json(&case.input), - bytes: case.bytes, + bytes: (op != Op::Size).then_some(case.bytes), expect: case.expect, compare: case.compare, } @@ -184,6 +198,14 @@ pub enum Op { /// runtime concludes. Decode only. `comline@2`'s profile facts are /// about this. Comline2Negotiate, + /// `{format, type, min, max, witnesses}`: how many bytes `type` takes in + /// `format`, at least `min` and at most `max` (`null`: no bound), and + /// values that write to the ends of that, each with its `bytes`. A case + /// has no `bytes` of its own: it asks to encode each witness's `value` + /// as `type`, which must give the witness's `bytes` exactly (see + /// [`SizeIn`]). An implementation is asked those encodes (`encode` + /// questions), never a `size`. Encode only. + Size, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)] @@ -270,6 +292,7 @@ pub enum Input { /// `None` for a rejection, which only decodes. Comline2Message(Option), Comline2Negotiate(NegotiateIn), + Size(SizeIn), } impl Input { @@ -288,6 +311,7 @@ impl Input { Input::StreamSplit(_) => Op::StreamSplit, Input::Comline2Message(_) => Op::Comline2Message, Input::Comline2Negotiate(_) => Op::Comline2Negotiate, + Input::Size(_) => Op::Size, } } @@ -315,6 +339,7 @@ impl Input { Op::StreamSplit => Input::StreamSplit(StreamSplit::Frames(read(input)?)), Op::Comline2Message => Input::Comline2Message(read(input)?), Op::Comline2Negotiate => Input::Comline2Negotiate(read(input)?), + Op::Size => Input::Size(read(input)?), }; if same_shape(input, &crate::to_json(&parsed)) { Ok(parsed) @@ -462,6 +487,95 @@ pub struct EncodeIn { pub value: Value, } +/// A `size` case's input: the range of bytes a type takes in a format, and +/// the values that show it. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct SizeIn { + pub format: String, + /// The type, in `decode`'s notation, and `{"fixed_string": {"len": N}}` + /// for `char[N]`. + #[serde(rename = "type")] + pub ty: Type, + pub min: u64, + /// `None` (`null`) where no bound holds. + pub max: Option, + /// `max` is only a bound, which no value is known to reach. + #[serde(default, skip_serializing_if = "is_false")] + pub upper_bound: bool, + pub witnesses: Witnesses, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct Witnesses { + /// Takes exactly `min` bytes. + pub min: Witness, + /// Takes exactly `max` bytes; there is none where `max` is `null` or + /// only an upper bound. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub max: Option, + /// Take from `min` to `max` bytes. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub between: Vec, +} + +/// A value of a `size` case's type, and exactly what it encodes to. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct Witness { + pub value: Value, + pub bytes: Hex, +} + +impl SizeIn { + /// Every witness, in the order a case asks for them: `min`, `max`, then + /// those `between`. + pub fn witnesses(&self) -> impl Iterator { + std::iter::once(&self.witnesses.min) + .chain(&self.witnesses.max) + .chain(&self.witnesses.between) + } + + /// What the case says of itself, whatever the format writes: `min`'s + /// witness takes exactly `min` bytes and `max`'s exactly `max`, one is + /// there only where `max` is a number no bound stands for, every other + /// witness is in range, and the range isn't empty. + pub fn consistent(&self) -> Result<(), String> { + let len = |w: &Witness| w.bytes.0.len() as u64; + if self.max.is_some_and(|max| max < self.min) { + return Err(format!("`max` {:?} is under `min` {}", self.max, self.min)); + } + if len(&self.witnesses.min) != self.min { + return Err(format!( + "the `min` witness is {} bytes, `min` says {}", + len(&self.witnesses.min), + self.min + )); + } + match (&self.witnesses.max, self.max, self.upper_bound) { + (Some(w), Some(max), false) if len(w) != max => { + return Err(format!("the `max` witness is {} bytes, `max` says {max}", len(w))) + } + (Some(_), Some(_), false) => {} + (None, Some(_), false) => return Err("`max` has no witness".into()), + (None, _, _) => {} + (Some(_), _, _) => return Err("a `max` witness, where no value reaches `max`".into()), + } + for w in &self.witnesses.between { + if len(w) < self.min || self.max.is_some_and(|max| len(w) > max) { + return Err(format!( + "a `between` witness of {} bytes is outside {}..{}", + len(w), + self.min, + self.max.map_or("".into(), |m| m.to_string()) + )); + } + } + Ok(()) + } +} + #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct DecodeIn { pub format: String, diff --git a/runtime/conformance/src/engine.rs b/runtime/conformance/src/engine.rs index 352aef5..e203c14 100644 --- a/runtime/conformance/src/engine.rs +++ b/runtime/conformance/src/engine.rs @@ -43,6 +43,19 @@ pub(crate) fn encode_with(format: &str, value: &Value) -> Option> { encode_as(format, &Wire(value)) } +/// How many bytes `value` encodes to in `format`, by +/// [`WireFormat::encoded_len`]: `None` for a format this doesn't ship, or a +/// value the format refuses. +pub fn encoded_len_as(format: &str, value: &(impl Serialize + ?Sized)) -> Option { + match format { + FORMAT_JSON => Json.encoded_len(value), + FORMAT_MSGPACK => MsgPack.encoded_len(value), + FORMAT_PACKED => Packed.encoded_len(value), + _ => return None, + } + .ok() +} + /// Runs `$body` with `$f` as the format `$name` names, among those a /// request's params are written in here. macro_rules! with_params_format { @@ -339,6 +352,11 @@ pub(crate) fn encode(input: &Input) -> Result, Outcome> { .ok_or_else(|| Outcome::NotImplemented(format!("format `{}`", i.format))); } Input::Decode(_) => return Err(Outcome::Fail("`decode` cases are decode only".into())), + Input::Size(_) => { + return Err(Outcome::Fail( + "a `size` case asks for the encodes of its witnesses, not of itself".into(), + )) + } Input::Comline2Message(Some(message)) => return Ok(message.to_bytes()), Input::Comline2Negotiate(_) => { return Err(Outcome::Fail("`comline2_negotiate` cases are decode only".into())) @@ -392,7 +410,7 @@ pub(crate) fn encode(input: &Input) -> Result, Outcome> { pub(crate) fn decode(input: &Input, bytes: &[u8]) -> Result, Outcome> { let json = |v: serde_json::Value| -> Result, Outcome> { Ok(Some(v)) }; match input { - Input::NameHash(_) | Input::Encode(_) => Ok(None), + Input::NameHash(_) | Input::Encode(_) | Input::Size(_) => Ok(None), Input::Comline2Message(_) => Ok(comline_runtime::handshake::comline2::Message::decode(bytes) .ok() .map(|m| to_json(&m))), @@ -648,11 +666,41 @@ pub fn run(case: &Case) -> Outcome { .map(|q| answer(q.op, &q.input, q.bytes.as_deref())) .collect(); match judge(case, &answers) { - Outcome::Pass => request_bodies_match(case).err().unwrap_or(Outcome::Pass), + Outcome::Pass => request_bodies_match(case) + .and_then(|()| encoded_len_matches(case)) + .err() + .unwrap_or(Outcome::Pass), failed => failed, } } +/// A `size` case's witnesses are as long as `encoded_len` says, which is what +/// a caller that sizes a buffer before encoding relies on. +fn encoded_len_matches(case: &Case) -> Result<(), Outcome> { + let Input::Size(i) = &case.input else { + return Ok(()); + }; + for witness in i.witnesses() { + let want = witness.bytes.0.len(); + match encoded_len_as(&i.format, &Wire(&witness.value)) { + Some(len) if len == want => {} + Some(len) => { + return Err(Outcome::Fail(format!( + "encoded_len of {:?} is {len}, and it encodes to {want} bytes", + witness.value + ))) + } + None => { + return Err(Outcome::Fail(format!( + "encoded_len of {:?} failed", + witness.value + ))) + } + } + } + Ok(()) +} + /// A request's frame comes out the same however it's written: a case's input /// through each path a caller that serialises the params itself takes. fn request_bodies_match(case: &Case) -> Result<(), Outcome> { diff --git a/runtime/conformance/src/lib.rs b/runtime/conformance/src/lib.rs index 0869884..d48b631 100644 --- a/runtime/conformance/src/lib.rs +++ b/runtime/conformance/src/lib.rs @@ -25,10 +25,11 @@ mod seed; pub use case::{ hex, Case, Compare, DecodeIn, EncodeIn, Expect, Framed, HandshakeIn, Hex, Input, NameHashIn, Op, - PeerRefusalIn, Reply, RequestIn, ResponseIn, StreamPrefixIn, StreamSplit, StreamSplitIn, + PeerRefusalIn, Reply, RequestIn, ResponseIn, SizeIn, StreamPrefixIn, StreamSplit, + StreamSplitIn, Witness, Witnesses, }; pub use comline2::{NegotiateIn, NegotiateResult, Step}; -pub use engine::{answer, decode_typed, encode_as, run, Answer}; +pub use engine::{answer, decode_typed, encode_as, encoded_len_as, run, Answer}; pub(crate) use engine::to_json; pub use json_equal::json_equal; pub use profile::{ @@ -195,6 +196,11 @@ pub enum Type { BoundedString { max: u32, }, + /// `char[N]`: a string of exactly `len` characters. A `size` case's + /// type: it is written as a string, with the same header. + FixedString { + len: u32, + }, Option(Box), /// `T[]`. Array(Box), diff --git a/runtime/conformance/src/runner.rs b/runtime/conformance/src/runner.rs index cb7ffb7..294ec18 100644 --- a/runtime/conformance/src/runner.rs +++ b/runtime/conformance/src/runner.rs @@ -36,7 +36,10 @@ use std::path::Path; use serde::Deserialize; use serde_json::{json, Value as Json}; -use crate::{answer, fact_shown, hex, json_equal, to_json, Answer, Case, Compare, Expect, Hex, Op}; +use crate::{ + answer, fact_shown, hex, json_equal, to_json, Answer, Case, Compare, EncodeIn, Expect, Hex, + Input, Op, SizeIn, +}; use crate::{Outcome, Profile, Vectors}; /// The version of the public spec: the case format (`vectors/*.json`, @@ -276,6 +279,8 @@ pub fn parse_reply(reply: &Json) -> Result<(Json, Answer), String> { /// The questions a case poses, in order. [`judge`] takes their answers in /// the same order. /// +/// - A `size` case asks to encode each of its witnesses' values as its +/// type, `min`'s first, then `max`'s, then those `between`. /// - A rejection asks to decode `bytes`; a `stream_prefix` rejection also /// asks to encode its input, which must fail too. /// - Otherwise, every op but the decode-only ones (`decode`, @@ -283,6 +288,22 @@ pub fn parse_reply(reply: &Json) -> Result<(Json, Answer), String> { /// the input, and every /// op but `name_hash` and `encode` asks to decode `bytes`. pub fn questions(case: &Case) -> Vec { + // A `size` case asks nothing of its own: it asks each witness's value to + // be encoded as its type. + if let Input::Size(i) = &case.input { + return i + .witnesses() + .map(|witness| Question { + op: Op::Encode, + input: to_json(&EncodeIn { + format: i.format.clone(), + ty: Some(i.ty.clone()), + value: witness.value.clone(), + }), + bytes: None, + }) + .collect(); + } let ask = |bytes: Option<&[u8]>| Question { op: case.op(), input: to_json(&case.input), @@ -312,7 +333,9 @@ pub fn questions(case: &Case) -> Vec { /// Judges a case by the answers to its [`questions`], in their order. /// /// - An encode must give the case's bytes (as JSON when it compares as -/// JSON); a failure shows both with [`byte_diff`]. +/// JSON); a failure shows both with [`byte_diff`]. A `size` case's encodes +/// must each give their witness's bytes exactly, and the case must say +/// what it holds ([`SizeIn::consistent`]). /// - A decode must accept and give back the case's input exactly, or, for a /// rejection, refuse. /// - A `stream_prefix` rejection's encode must not give bytes. @@ -333,6 +356,9 @@ pub fn judge(case: &Case, answers: &[Answer]) -> Outcome { }) { return Outcome::NotImplemented(what.clone()); } + if let Input::Size(i) = &case.input { + return judge_size(i, answers); + } for (question, answer) in asked.iter().zip(answers) { let verdict = match (&question.bytes, answer) { (_, Answer::NotImplemented(_)) => unreachable!("handled above"), @@ -369,6 +395,32 @@ pub fn judge(case: &Case, answers: &[Answer]) -> Outcome { Outcome::Pass } +/// A `size` case: every witness's value encodes to exactly its bytes. +fn judge_size(input: &SizeIn, answers: &[Answer]) -> Outcome { + if let Err(why) = input.consistent() { + return Outcome::Fail(why); + } + for (witness, answer) in input.witnesses().zip(answers) { + let want = &witness.bytes.0; + let verdict = match answer { + Answer::Bytes(got) if got == want => continue, + Answer::Bytes(got) => format!( + "{:?} encodes wrong:\n{}", + witness.value, + byte_diff(got, want) + ), + Answer::Bad(why) => format!("{:?}: answered with an error: {why}", witness.value), + other => format!( + "{:?}: answered an encode with {}", + witness.value, + describe(other) + ), + }; + return Outcome::Fail(verdict); + } + Outcome::Pass +} + fn describe(answer: &Answer) -> &'static str { match answer { Answer::Bytes(_) => "bytes", diff --git a/runtime/conformance/src/seed.rs b/runtime/conformance/src/seed.rs index fefb3c2..2f5ad1b 100644 --- a/runtime/conformance/src/seed.rs +++ b/runtime/conformance/src/seed.rs @@ -114,6 +114,14 @@ impl<'de> DeserializeSeed<'de> for Seed<'_> { Type::BoundedString { max } => { Value::String(CharsSeed::::new(*max).deserialize(d)?) } + Type::FixedString { len } => { + let s = CharsSeed::::new(*len).deserialize(d)?; + // `char[N]` holds exactly N characters. + if s.chars().count() as u64 != u64::from(*len) { + return Err(de::Error::invalid_length(s.chars().count(), &"`char[N]`")); + } + Value::String(s) + } Type::BoundedArray { of, max } => { Value::Array(ItemsSeed::<_, Vec>::new(self.of(of), *max).deserialize(d)?) } @@ -415,6 +423,11 @@ fn check_in(value: &Value, ty: &Type, rec: Option<&Type>) -> Result<(), String> None => Err("`self` outside a recursive type".into()), }, (Type::BoundedString { .. }, Value::String(_)) | (Type::Char, Value::Char(_)) => Ok(()), + (Type::FixedString { len }, Value::String(s)) + if s.chars().count() as u64 == u64::from(*len) => + { + Ok(()) + } (Type::BoundedArray { of, .. }, Value::Array(items)) => { items.iter().try_for_each(|item| check(item, of)) } @@ -498,6 +511,7 @@ pub fn within_bounds(value: &Value, ty: &Type) -> Result<(), BoundExceeded> { None => Ok(()), }, (Type::BoundedString { max }, Value::String(s)) => bounds::check_chars(s, *max), + (Type::FixedString { len }, Value::String(s)) => bounds::check_chars(s, *len), (Type::BoundedArray { of, max }, Value::Array(items)) => { bounds::check_items(items.len(), *max)?; items.iter().try_for_each(|item| walk(item, of, rec)) diff --git a/runtime/conformance/support/rust.json b/runtime/conformance/support/rust.json index 35de027..7711836 100644 --- a/runtime/conformance/support/rust.json +++ b/runtime/conformance/support/rust.json @@ -13,6 +13,9 @@ "stream": { "state": "supported" }, "format-json": { "state": "supported" }, "format-msgpack": { "state": "supported" }, - "format-packed": { "state": "supported" } + "format-packed": { "state": "supported" }, + "sizes-packed": { "state": "supported" }, + "sizes-msgpack": { "state": "supported" }, + "sizes-json": { "state": "supported" } } } diff --git a/runtime/conformance/tests/conformance.rs b/runtime/conformance/tests/conformance.rs index 80755ec..1b585ae 100644 --- a/runtime/conformance/tests/conformance.rs +++ b/runtime/conformance/tests/conformance.rs @@ -2,7 +2,9 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at https://mozilla.org/MPL/2.0/. -//! `vectors_are_current`: `vectors/` holds what `comline-runtime` produces. +//! `vectors_are_current`: `vectors/` holds what `comline-runtime` produces, +//! apart from the `sizes-*` features, whose values and bytes the specification +//! writes and this runtime proves (`sizes_are_proven`, `rust_support_is_proven`). //! `rust_support_is_proven`: every claim in `support/rust.json` holds against //! the vectors, and `reports/rust.json` records which cases prove it. //! @@ -18,8 +20,8 @@ use comline_runtime::contract::{ FRAMING_DATAGRAM3, FRAMING_JSONRPC, HANDSHAKE_COMLINE, HANDSHAKE_COMLINE2, }; use comline_runtime_conformance::{ - fact_shown, reference_cases, render, run, Case, Fact, Facts, Features, Outcome, Output, Payload, - Profile, ProvenClaim, + fact_shown, reference_cases, render, run, Case, Fact, Facts, Features, Op, Outcome, Output, + Payload, Profile, ProvenClaim, Report, State, Support, Vectors, }; @@ -59,6 +61,18 @@ fn features() -> Features { read(&spec().join("features.json")) } +/// Whether the specification writes `feature`'s vectors and this runtime only +/// proves them: every case is a `size` case, whose witnesses (values and the +/// bytes they encode to) come from a model of the encoders, not from here. +/// `run` is what holds them to the real encoders. +fn proven_not_produced(feature: &str) -> bool { + let path = spec().join("vectors").join(format!("{feature}.json")); + path.exists() && { + let vectors: Vectors = read(&path); + !vectors.cases.is_empty() && vectors.cases.iter().all(|c| c.op() == Op::Size) + } +} + #[test] fn vectors_are_current() { let features = features(); @@ -66,7 +80,8 @@ fn vectors_are_current() { let mut problems = Vec::new(); for feature in &features.features { - if !reference.iter().any(|v| v.feature == feature.id) { + let produced = reference.iter().any(|v| v.feature == feature.id); + if !produced && !proven_not_produced(&feature.id) { problems.push(format!("feature `{}` has no vectors", feature.id)); } } @@ -111,14 +126,17 @@ fn rust_support_is_proven() { // Blessing rewrites the vectors alongside, so prove against what // they're being rewritten to. let path = spec().join("vectors").join(format!("{}.json", feature.id)); - let vectors: Vectors = if bless() { - match reference_cases() + let blessed = if bless() { + reference_cases() .into_iter() .find(|v| v.feature == feature.id) - { - Some(vectors) => vectors, - None => continue, // `vectors_are_current` reports it - } + } else { + None + }; + let vectors: Vectors = if let Some(vectors) = blessed { + vectors + } else if bless() && !proven_not_produced(&feature.id) { + continue; // `vectors_are_current` reports it } else if path.exists() { read(&path) } else { @@ -264,6 +282,65 @@ fn profiles_are_proven() { assert!(problems.is_empty(), "{}", problems.join("\n")); } +/// Every size rule a format's profile states is proven by cases that exist and +/// pass against `comline-runtime`: the witnesses' bytes are what the real +/// encoder writes (and `encoded_len` agrees), which is what the specification +/// leaves to this run. +#[test] +fn size_rules_are_proven() { + use comline_runtime_conformance::runner::{load_corpus, run_all, InProcess}; + + fn proven_by(value: &serde_json::Value, ids: &mut Vec) { + match value { + serde_json::Value::Object(members) => { + for (key, member) in members { + match (key.as_str(), member) { + ("proven_by", serde_json::Value::Array(cases)) => { + ids.extend(cases.iter().filter_map(|c| c.as_str().map(String::from))) + } + _ => proven_by(member, ids), + } + } + } + serde_json::Value::Array(items) => items.iter().for_each(|i| proven_by(i, ids)), + _ => {} + } + } + + let corpus = load_corpus(&spec()).unwrap(); + let mut problems = Vec::new(); + for name in [FORMAT_JSON, FORMAT_MSGPACK, FORMAT_PACKED] { + let profile: serde_json::Value = + read(&spec().join("profiles").join(format!("{name}.json"))); + let Some(sizes) = profile.get("sizes") else { + problems.push(format!("`{name}` states no sizes")); + continue; + }; + let feature = sizes["feature"].as_str().unwrap_or_default(); + let cases = corpus.feature(feature); + if cases.is_empty() { + problems.push(format!("`{name}`: the feature `{feature}` has no cases")); + continue; + } + let outcomes = run_all(&cases, &mut InProcess).unwrap(); + let mut ids = Vec::new(); + proven_by(sizes, &mut ids); + for id in ids { + match outcomes.get(&id) { + Some(Outcome::Pass) => {} + Some(other) => problems.push(format!("`{name}`: `{id}`: {other:?}")), + None => problems.push(format!("`{name}` names `{id}`, which isn't in `{feature}`")), + } + } + for (id, outcome) in &outcomes { + if *outcome != Outcome::Pass { + problems.push(format!("{id}: {outcome:?}")); + } + } + } + assert!(problems.is_empty(), "{}", problems.join("\n")); +} + /// Reading a vectors file and writing it back gives the file: the typed /// inputs hold everything the files do, and what's sent to implementations /// is what the corpus says. diff --git a/runtime/conformance/tests/properties.rs b/runtime/conformance/tests/properties.rs index c05c454..92efed7 100644 --- a/runtime/conformance/tests/properties.rs +++ b/runtime/conformance/tests/properties.rs @@ -11,6 +11,9 @@ //! exactly those bytes. //! - **Decoded values are values of the type:** whatever a format accepts, //! valid or mutated, passes [`check`]. +//! - **Exact sizes:** `encoded_len(v)` is the length of `encode(v)`, for a value +//! of any of the types a `size` vector's type notation holds, in every +//! format. //! - **Seed against derive:** the fixed mirrors of `tests/seed_vs_derive.rs` //! (in `common/mod.rs`) on proptest's mutations and on random bytes. //! @@ -39,7 +42,7 @@ mod common; use comline_runtime::contract::{FORMAT_JSON, FORMAT_MSGPACK, FORMAT_PACKED}; -use comline_runtime_conformance::{check, decode_typed, Type, Value}; +use comline_runtime_conformance::{check, decode_typed, encoded_len_as, Type, Value, Wire}; use proptest::prelude::*; use proptest::sample::Index; @@ -303,6 +306,7 @@ fn value_strategy(ty: &Type, c: Carries) -> BoxedStrategy { Type::Char => any::().prop_map(Value::Char).boxed(), Type::Unit => Just(Value::Unit(())).boxed(), Type::BoundedString { .. } + | Type::FixedString { .. } | Type::BoundedArray { .. } | Type::Recursive { .. } | Type::SelfRef => unreachable!("bounds aren't generated"), @@ -443,6 +447,20 @@ fn encode(format: &str, value: &Value) -> Vec { common::encode(format, &comline_runtime_conformance::Wire(value)) } +/// `encoded_len` is the length of the bytes `encode` writes. +fn len_is_the_encoding_length(format: &str, value: &Value) -> Result<(), TestCaseError> { + let bytes = encode(format, value); + prop_assert_eq!( + encoded_len_as(format, &Wire(value)), + Some(bytes.len()), + "{} wrote {:?} as {:02x?}", + format, + value, + bytes + ); + Ok(()) +} + fn round_trips(format: &str, ty: &Type, value: &Value) -> Result<(), TestCaseError> { prop_assert_eq!(check(value, ty), Ok(())); let bytes = encode(format, value); @@ -485,6 +503,21 @@ proptest! { ); } + #[test] + fn json_encoded_len_is_the_length((_, value) in typed_value(FORMAT_JSON)) { + len_is_the_encoding_length(FORMAT_JSON, &value)?; + } + + #[test] + fn msgpack_encoded_len_is_the_length((_, value) in typed_value(FORMAT_MSGPACK)) { + len_is_the_encoding_length(FORMAT_MSGPACK, &value)?; + } + + #[test] + fn packed_encoded_len_is_the_length((_, value) in typed_value(FORMAT_PACKED)) { + len_is_the_encoding_length(FORMAT_PACKED, &value)?; + } + #[test] fn json_round_trips((ty, value) in typed_value(FORMAT_JSON)) { round_trips(FORMAT_JSON, &ty, &value)?; diff --git a/runtime/core/src/contract/wire.rs b/runtime/core/src/contract/wire.rs index 384ee72..93a207c 100644 --- a/runtime/core/src/contract/wire.rs +++ b/runtime/core/src/contract/wire.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -use crate::contract::{BufMut, RuntimeError}; +use crate::contract::{BufMut, CountBuf, RuntimeError}; /// The message-serialization axis. Generated code is `serde`-only; a concrete /// `WireFormat` (MessagePack, JSON, …) is chosen once at setup. @@ -23,4 +23,20 @@ pub trait WireFormat { ) -> Result<(), RuntimeError>; fn decode<'de, T: Deserialize<'de>>(&self, bytes: &'de [u8]) -> Result; + + /// The exact number of bytes [`encode`](WireFormat::encode) writes for + /// `value`, or the error it fails with (a value over its bounds). + /// + /// It runs `encode` itself into a [`CountBuf`], which keeps nothing and + /// only counts, so it can't differ from what `encode` writes, and needs + /// neither `alloc` nor a buffer. A format writing through `std::io::Write` + /// (JSON, MessagePack) counts there too: its writer is over the same sink. + /// Use it to size a buffer before encoding into it, or to check a value + /// against a frame limit; it costs a full encode, so don't call it to + /// then encode on the success path. + fn encoded_len(&self, value: &T) -> Result { + let mut count = CountBuf::new(); + self.encode(value, &mut count)?; + Ok(count.len()) + } } diff --git a/runtime/core/tests/encoded_len.rs b/runtime/core/tests/encoded_len.rs new file mode 100644 index 0000000..b4bd5dd --- /dev/null +++ b/runtime/core/tests/encoded_len.rs @@ -0,0 +1,88 @@ +//! [`WireFormat::encoded_len`] is the length of what `encode` writes, in every +//! format, and fails as `encode` does. +#![cfg(feature = "std")] + +use comline_runtime::bounds::encode::string; +use comline_runtime::contract::{RuntimeError, WireFormat}; +use comline_runtime::format::{Json, MsgPack, Packed}; +use serde::{Serialize, Serializer}; + +#[derive(Serialize)] +struct Msg<'a> { + id: u32, + name: &'a str, + tags: Vec, + note: Option<&'a str>, + ratio: f64, +} + +/// A string over its bound, which `encode` refuses before writing it. +struct Short<'a>(&'a str); + +impl Serialize for Short<'_> { + fn serialize(&self, s: S) -> Result { + string::(self.0, s) + } +} + +fn agrees(format: W) { + let messages = [ + Msg { + id: 0, + name: "", + tags: vec![], + note: None, + ratio: 0.0, + }, + Msg { + id: 300, + name: "hello", + tags: vec![1, 2, 65535], + note: Some("x"), + ratio: 0.1, + }, + Msg { + id: u32::MAX, + name: "e\u{301}\u{1f600}\"\\\n", + tags: vec![0; 200], + note: None, + ratio: f64::MAX, + }, + ]; + for message in &messages { + let mut written = Vec::new(); + format.encode(message, &mut written).unwrap(); + assert_eq!( + format.encoded_len(message), + Ok(written.len()), + "{}", + format.name() + ); + } + assert_eq!( + format.encoded_len(&Short("abc")), + Ok(format.encoded_len("abc").unwrap()) + ); + let mut out = Vec::new(); + let refused = format.encode(&Short("abcd"), &mut out).unwrap_err(); + assert!( + matches!(refused, RuntimeError::BoundExceeded { .. }), + "{refused:?}" + ); + assert_eq!(format.encoded_len(&Short("abcd")), Err(refused)); +} + +#[test] +fn packed() { + agrees(Packed); +} + +#[test] +fn msgpack() { + agrees(MsgPack); +} + +#[test] +fn json() { + agrees(Json); +} diff --git a/runtime/reference/tests/process.rs b/runtime/reference/tests/process.rs index c9bdfc6..60dabe2 100644 --- a/runtime/reference/tests/process.rs +++ b/runtime/reference/tests/process.rs @@ -12,7 +12,8 @@ use std::process::{Child, ChildStdin, ChildStdout, Command, Stdio}; use serde_json::{json, Value as Json}; -use comline_runtime_conformance::{json_equal, Case, Compare, Expect, Hex, Op, Vectors}; +use comline_runtime_conformance::runner::questions; +use comline_runtime_conformance::{json_equal, Case, Compare, Expect, Hex, Input, Op, Vectors}; struct Reference { child: Child, @@ -97,6 +98,20 @@ fn expectations(case: &Case) -> Vec { let id = |what: &str| format!("{}/{what}", case.id); let bytes = serde_json::to_value(&case.bytes).unwrap(); let mut out = Vec::new(); + // A `size` case is asked as the encodes of its witnesses, never as itself: + // each must give its witness's bytes. + if let Input::Size(size) = &case.input { + for (n, (question, witness)) in questions(case).iter().zip(size.witnesses()).enumerate() { + let id = id(&format!("witness-{n}")); + out.push(Expected { + request: question.request(json!(id)), + reply: json!({ "id": id, "bytes": witness.bytes }), + json_bytes: false, + refused: false, + }); + } + return out; + } if case.expect == Expect::Reject && case.op() == Op::Encode { // A value over its type's bounds: encoding it is refused, and no // bytes stand for it.