detached 75fcba3

fix(expr): parse strings and number literals like the runner's ParseNumber

commit
75fcba3589e8f1910d6b804e577b5c57b6253e7f
author
brice · · 2026-10-12 17:55 UTC
parent
4adbc1a
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
9 files · +682 -70
M expr/PORTING.md +18 -7
@@ -122,13 +122,24 @@ whether to keep the JS behaviour or follow the runner.
122122 runner's code on 200 000 random doubles. The number *literal* in an
123123 expression is parsed independently of this (see below) and the JSON
124124 writer of `toJSON` uses the same conversion (next item).
125-- [ ] **String to number**: `Number()` semantics (hex, octal, binary,
126- `Infinity`, whitespace trimmed, empty is 0). C# `double.TryParse` with
127- `NumberStyles` differs (no octal/binary; check `0x` and `Infinity`).
128- The lexer applies the same conversion to number literals, so `0x10`,
129- `0b11`, `1e3`, `.5`, `5.` and `+1` are all literals here.
130-- [ ] **Number literals after `-` / `+`**: `-1` is one literal token; `a -1`
131- is therefore a parse error, as in the JS.
125+- [x] **String to number**: resolved, follows the C#. `ExpressionUtility.
126+ ParseNumber` (`src/Sdk/DTExpressions2/Expressions2/Sdk/ExpressionUtility.cs`)
127+ trims with `String.Trim()` (so U+0085 is white space and U+FEFF is not),
128+ accepts what `Double.TryParse(AllowLeadingSign | AllowDecimalPoint |
129+ AllowExponent)` accepts (ASCII digits only, trailing NULs ignored,
130+ `Infinity` in any letter case with an optional sign), then `0x` hex and
131+ `0o` octal (lower-case prefix only, no sign) read as a **32-bit signed
132+ integer** (`0xffffffff` is `-1`, anything over 32 bits is NaN). There is
133+ no `0b` form and no upper-case `0X`/`0O`. The lexer uses the same
134+ function for number literals, so `0b101`, `0X10` and `0xFFFFFFFFF` are
135+ "Unexpected symbol" errors and `0xffffffff` is `-1`. The same function is
136+ implemented as `parseNumber` in `number.go`;
137+ `TestParseNumberMatchesRunner` replays 443 strings recorded from the
138+ runner's code (`gen/runner/number_cases.mjs`).
139+- [x] **Number literals after `-` / `+`**: `-1` is one literal token; `a -1`
140+ is therefore a parse error. Same in the C# lexer (`LexicalAnalyzer.
141+ TryGetNextToken`: `c == '-' || c == '+' || digit` starts `ReadNumberToken`),
142+ checked by the differential run.
132143 - [ ] **Object key order from `fromJSON`**: array-index keys first, ascending
133144 (JavaScript `Object.keys`), then insertion order. `Json.NET` keeps
134145 document order. The same ordering is applied by `toJSON` (the JS
@@ -122,13 +122,24 @@ whether to keep the JS behaviour or follow the runner.
122 runner's code on 200 000 random doubles. The number *literal* in an122 runner's code on 200 000 random doubles. The number *literal* in an
123 expression is parsed independently of this (see below) and the JSON123 expression is parsed independently of this (see below) and the JSON
124 writer of `toJSON` uses the same conversion (next item).124 writer of `toJSON` uses the same conversion (next item).
125-- [ ] **String to number**: `Number()` semantics (hex, octal, binary,125+- [x] **String to number**: resolved, follows the C#. `ExpressionUtility.
126- `Infinity`, whitespace trimmed, empty is 0). C# `double.TryParse` with126+ ParseNumber` (`src/Sdk/DTExpressions2/Expressions2/Sdk/ExpressionUtility.cs`)
127- `NumberStyles` differs (no octal/binary; check `0x` and `Infinity`).127+ trims with `String.Trim()` (so U+0085 is white space and U+FEFF is not),
128- The lexer applies the same conversion to number literals, so `0x10`,128+ accepts what `Double.TryParse(AllowLeadingSign | AllowDecimalPoint |
129- `0b11`, `1e3`, `.5`, `5.` and `+1` are all literals here.129+ AllowExponent)` accepts (ASCII digits only, trailing NULs ignored,
130-- [ ] **Number literals after `-` / `+`**: `-1` is one literal token; `a -1`130+ `Infinity` in any letter case with an optional sign), then `0x` hex and
131- is therefore a parse error, as in the JS.131+ `0o` octal (lower-case prefix only, no sign) read as a **32-bit signed
132+ integer** (`0xffffffff` is `-1`, anything over 32 bits is NaN). There is
133+ no `0b` form and no upper-case `0X`/`0O`. The lexer uses the same
134+ function for number literals, so `0b101`, `0X10` and `0xFFFFFFFFF` are
135+ "Unexpected symbol" errors and `0xffffffff` is `-1`. The same function is
136+ implemented as `parseNumber` in `number.go`;
137+ `TestParseNumberMatchesRunner` replays 443 strings recorded from the
138+ runner's code (`gen/runner/number_cases.mjs`).
139+- [x] **Number literals after `-` / `+`**: `-1` is one literal token; `a -1`
140+ is therefore a parse error. Same in the C# lexer (`LexicalAnalyzer.
141+ TryGetNextToken`: `c == '-' || c == '+' || digit` starts `ReadNumberToken`),
142+ checked by the differential run.
132 - [ ] **Object key order from `fromJSON`**: array-index keys first, ascending143 - [ ] **Object key order from `fromJSON`**: array-index keys first, ascending
133 (JavaScript `Object.keys`), then insertion order. `Json.NET` keeps144 (JavaScript `Object.keys`), then insertion order. `Json.NET` keeps
134 document order. The same ordering is applied by `toJSON` (the JS145 document order. The same ordering is applied by `toJSON` (the JS
M expr/data.go +1 -1
@@ -253,7 +253,7 @@ func toNumber(v Value) float64 {
253253 case Number:
254254 return float64(x)
255255 case String:
256- return jsToNumber(string(x))
256+ return parseNumber(string(x))
257257 }
258258 return nan
259259 }
@@ -253,7 +253,7 @@ func toNumber(v Value) float64 {
253 case Number:253 case Number:
254 return float64(x)254 return float64(x)
255 case String:255 case String:
256- return jsToNumber(string(x))256+ return parseNumber(string(x))
257 }257 }
258 return nan258 return nan
259 }259 }
M expr/eval_test.go +8 -23
@@ -80,7 +80,14 @@ func TestEvalLiteralsAndOperators(t *testing.T) {
8080 {"1e3", "Number:1000"},
8181 {"0x10", "Number:16"},
8282 {"0o17", "Number:15"},
83- {"0b101", "Number:5"},
83+ {"0xffffffff", "Number:-1"}, // read as a 32-bit integer, like the runner
84+ {"0b101", "PARSE Unexpected symbol: '0b101'. Located at position 1 within expression: 0b101"},
85+ {"0X10", "PARSE Unexpected symbol: '0X10'. Located at position 1 within expression: 0X10"},
86+ {"'0b11' == 3", "Boolean:false"},
87+ {"'0x1F' == 31", "Boolean:true"},
88+ {"'infinity' == Infinity", "Boolean:true"},
89+ {"'\u0085 1 \u0085' == 1", "Boolean:true"},
90+ {"'\ufeff1' == 1", "Boolean:false"},
8491 {"-0x10", "PARSE Unexpected symbol: '-0x10'. Located at position 1 within expression: -0x10"},
8592 {"NaN", "Number:NaN"},
8693 {"Infinity", "Number:Infinity"},
@@ -866,28 +873,6 @@ func TestJSNumberToString(t *testing.T) {
866873 }
867874 }
868875
869-func TestJSToNumber(t *testing.T) {
870- nan := math.NaN()
871- tests := []struct {
872- in string
873- want float64
874- }{
875- {"", 0}, {" ", 0}, {"\n\t", 0}, {"1", 1}, {" 1 ", 1}, {"\u00a01\u2003", 1}, {"\ufeff1", 1}, {"+1", 1}, {"-1", -1},
876- {"1.", 1}, {".5", 0.5}, {"-.5", -0.5}, {"1e3", 1000}, {"1E-3", 0.001}, {"1e+3", 1000}, {"0x10", 16}, {"0X1f", 31},
877- {"0o17", 15}, {"0b101", 5}, {"0x", nan}, {"0xg", nan}, {"-0x10", nan}, {"+0x10", nan}, {"0b2", nan}, {"1_000", nan},
878- {"Infinity", math.Inf(1)}, {"-Infinity", math.Inf(-1)}, {"+Infinity", math.Inf(1)}, {"infinity", nan}, {"inf", nan},
879- {"NaN", nan}, {"nan", nan}, {"abc", nan}, {"1e", nan}, {"1e+", nan}, {".", nan}, {"e5", nan}, {"1 2", nan}, {"1,5", nan},
880- {"00", 0}, {"007", 7}, {"0.0", 0}, {"1e999", math.Inf(1)}, {"-1e999", math.Inf(-1)}, {"0x1fffffffffffff", 9007199254740991},
881- {"12345678901234567890", 12345678901234567890}, {"٣", nan}, {"--1", nan}, {"+-1", nan}, {"1e1.5", nan}, {"0x1.8", nan},
882- }
883- for _, tc := range tests {
884- got := jsToNumber(tc.in)
885- if got != tc.want && !(math.IsNaN(got) && math.IsNaN(tc.want)) {
886- t.Errorf("jsToNumber(%q) = %v, want %v", tc.in, got, tc.want)
887- }
888- }
889-}
890-
891876 func TestJSCasing(t *testing.T) {
892877 upper := map[string]string{"abc": "ABC", "ß": "SS", "ʼn": "ʼN", "dž": "DŽ", "ı": "I", "ffi": "FFI", "ὒ": "Υ̓̀", "ᾀ": "ἈΙ", "σ": "Σ", "ς": "Σ", "😀": "😀", "é": "É"}
893878 for in, want := range upper {
@@ -80,7 +80,14 @@ func TestEvalLiteralsAndOperators(t *testing.T) {
80 {"1e3", "Number:1000"},80 {"1e3", "Number:1000"},
81 {"0x10", "Number:16"},81 {"0x10", "Number:16"},
82 {"0o17", "Number:15"},82 {"0o17", "Number:15"},
83- {"0b101", "Number:5"},83+ {"0xffffffff", "Number:-1"}, // read as a 32-bit integer, like the runner
84+ {"0b101", "PARSE Unexpected symbol: '0b101'. Located at position 1 within expression: 0b101"},
85+ {"0X10", "PARSE Unexpected symbol: '0X10'. Located at position 1 within expression: 0X10"},
86+ {"'0b11' == 3", "Boolean:false"},
87+ {"'0x1F' == 31", "Boolean:true"},
88+ {"'infinity' == Infinity", "Boolean:true"},
89+ {"'\u0085 1 \u0085' == 1", "Boolean:true"},
90+ {"'\ufeff1' == 1", "Boolean:false"},
84 {"-0x10", "PARSE Unexpected symbol: '-0x10'. Located at position 1 within expression: -0x10"},91 {"-0x10", "PARSE Unexpected symbol: '-0x10'. Located at position 1 within expression: -0x10"},
85 {"NaN", "Number:NaN"},92 {"NaN", "Number:NaN"},
86 {"Infinity", "Number:Infinity"},93 {"Infinity", "Number:Infinity"},
@@ -866,28 +873,6 @@ func TestJSNumberToString(t *testing.T) {
866 }873 }
867 }874 }
868 875
869-func TestJSToNumber(t *testing.T) {
870- nan := math.NaN()
871- tests := []struct {
872- in string
873- want float64
874- }{
875- {"", 0}, {" ", 0}, {"\n\t", 0}, {"1", 1}, {" 1 ", 1}, {"\u00a01\u2003", 1}, {"\ufeff1", 1}, {"+1", 1}, {"-1", -1},
876- {"1.", 1}, {".5", 0.5}, {"-.5", -0.5}, {"1e3", 1000}, {"1E-3", 0.001}, {"1e+3", 1000}, {"0x10", 16}, {"0X1f", 31},
877- {"0o17", 15}, {"0b101", 5}, {"0x", nan}, {"0xg", nan}, {"-0x10", nan}, {"+0x10", nan}, {"0b2", nan}, {"1_000", nan},
878- {"Infinity", math.Inf(1)}, {"-Infinity", math.Inf(-1)}, {"+Infinity", math.Inf(1)}, {"infinity", nan}, {"inf", nan},
879- {"NaN", nan}, {"nan", nan}, {"abc", nan}, {"1e", nan}, {"1e+", nan}, {".", nan}, {"e5", nan}, {"1 2", nan}, {"1,5", nan},
880- {"00", 0}, {"007", 7}, {"0.0", 0}, {"1e999", math.Inf(1)}, {"-1e999", math.Inf(-1)}, {"0x1fffffffffffff", 9007199254740991},
881- {"12345678901234567890", 12345678901234567890}, {"٣", nan}, {"--1", nan}, {"+-1", nan}, {"1e1.5", nan}, {"0x1.8", nan},
882- }
883- for _, tc := range tests {
884- got := jsToNumber(tc.in)
885- if got != tc.want && !(math.IsNaN(got) && math.IsNaN(tc.want)) {
886- t.Errorf("jsToNumber(%q) = %v, want %v", tc.in, got, tc.want)
887- }
888- }
889-}
890-
891 func TestJSCasing(t *testing.T) {876 func TestJSCasing(t *testing.T) {
892 upper := map[string]string{"abc": "ABC", "ß": "SS", "ʼn": "ʼN", "dž": "DŽ", "ı": "I", "ffi": "FFI", "ὒ": "Υ̓̀", "ᾀ": "ἈΙ", "σ": "Σ", "ς": "Σ", "😀": "😀", "é": "É"}877 upper := map[string]string{"abc": "ABC", "ß": "SS", "ʼn": "ʼN", "dž": "DŽ", "ı": "I", "ffi": "FFI", "ὒ": "Υ̓̀", "ᾀ": "ἈΙ", "σ": "Σ", "ς": "Σ", "😀": "😀", "é": "É"}
893 for in, want := range upper {878 for in, want := range upper {
M expr/gen/runner/Program.cs +13 -0
@@ -121,6 +121,19 @@ internal static class P
121121 }
122122 return 0;
123123 }
124+ if (args[0] == "--num")
125+ {
126+ // Debug aid: each input line is a string as dot-separated hexadecimal UTF-16 code units ("-" for the
127+ // empty string); prints the IEEE 754 bits (hexadecimal) of ExpressionUtility.ParseNumber of it.
128+ foreach (var line in File.ReadLines(args[1]))
129+ {
130+ var sb = new StringBuilder();
131+ if (line.Trim() != "-") foreach (var u in line.Trim().Split('.')) sb.Append((char)Convert.ToInt32(u, 16));
132+ var d = ExpressionUtility.ParseNumber(sb.ToString());
133+ Console.WriteLine(double.IsNaN(d) ? "NaN" : BitConverter.DoubleToInt64Bits(d).ToString("x"));
134+ }
135+ return 0;
136+ }
124137 if (args[0] == "--g15")
125138 {
126139 // Debug aid: one hexadecimal IEEE 754 bit pattern per input line, the G15 form per output line.
@@ -121,6 +121,19 @@ internal static class P
121 }121 }
122 return 0;122 return 0;
123 }123 }
124+ if (args[0] == "--num")
125+ {
126+ // Debug aid: each input line is a string as dot-separated hexadecimal UTF-16 code units ("-" for the
127+ // empty string); prints the IEEE 754 bits (hexadecimal) of ExpressionUtility.ParseNumber of it.
128+ foreach (var line in File.ReadLines(args[1]))
129+ {
130+ var sb = new StringBuilder();
131+ if (line.Trim() != "-") foreach (var u in line.Trim().Split('.')) sb.Append((char)Convert.ToInt32(u, 16));
132+ var d = ExpressionUtility.ParseNumber(sb.ToString());
133+ Console.WriteLine(double.IsNaN(d) ? "NaN" : BitConverter.DoubleToInt64Bits(d).ToString("x"));
134+ }
135+ return 0;
136+ }
124 if (args[0] == "--g15")137 if (args[0] == "--g15")
125 {138 {
126 // Debug aid: one hexadecimal IEEE 754 bit pattern per input line, the G15 form per output line.139 // Debug aid: one hexadecimal IEEE 754 bit pattern per input line, the G15 form per output line.
A expr/gen/runner/number_cases.mjs +42 -0
@@ -0,0 +1,42 @@
1+// SPDX-License-Identifier: MIT
2+//
3+// Writes testdata/number_cases.txt: ExpressionUtility.ParseNumber of the
4+// runner (string to number, used for number literals and for comparisons of
5+// strings with numbers) on a corpus of strings, as `--num` prints it.
6+// number_test.go replays it.
7+//
8+// dotnet build -c Release expr/gen/runner -p:RunnerSrc=<runner>/src/Sdk
9+// node expr/gen/runner/number_cases.mjs > expr/testdata/number_cases.txt
10+
11+import { execFileSync } from "node:child_process";
12+import { writeFileSync, mkdtempSync, rmSync } from "node:fs";
13+import { tmpdir } from "node:os";
14+import { join, dirname } from "node:path";
15+import { fileURLToPath } from "node:url";
16+
17+const here = dirname(fileURLToPath(import.meta.url));
18+const set = new Set();
19+const add = s => set.add(s);
20+const base = ["", " ", "0", "00", "-0", "+0", "1", "-1", "+1", "12", "007", "1.5", "-1.5", "1.", ".5", "-.5", "+.5", ".", "-.", "+.", "..", "1..2", "1.2.3",
21+ "1e3", "1E3", "1e+3", "1e-3", "1e", "1e+", "1e-", "e3", "E3", ".e3", "1.e3", ".5e3", "1e3.5", "1e03", "1e0003", "1e308", "1e309", "-1e309", "1e-324", "1e-400", "4.9e-324", "2.5e-324", "1.7976931348623157e308", "1.7976931348623159e308",
22+ "0.1", "0.30000000000000004", "123456789012345678901234567890", "9007199254740993", "-9007199254740993", "0.000001", "1_000", "1,000", "1 000", "١٢٣", "123",
23+ "Infinity", "-Infinity", "+Infinity", "infinity", "INFINITY", "Infinit", "Infinityx", "inf", "Inf", "-inf", "+inf", "∞", "-∞", "\u2212Infinity", "\u2212" + "1",
24+ "NaN", "nan", "NAN", "-NaN", "+NaN", "NaNx", "N", "null", "true", "false", "abc", "x", "-", "+", "+-1", "-+1", "--1", "++1", "- 1", "+ 1", "1 -", "1-", "1+", "1 2",
25+ "0x", "0x0", "0x1", "0x10", "0xff", "0xFF", "0XFF", "0xfF", "0x7fffffff", "0x80000000", "0xffffffff", "0x100000000", "0xFFFFFFFFF", "0x00000001", "0x0000000000000001", "0x000000000000000000001", "-0x1", "+0x1", "0x-1", "0x+1", "0x1.0", "0x1p3", "0xg", "0x 1", "0 x1", "0x1 ",
26+ "0o", "0o0", "0o7", "0o8", "0o17", "0O17", "0o777", "0o17777777777", "0o20000000000", "0o37777777777", "0o40000000000", "0o77777777777", "0o000000000001", "0o0000000000000000000001", "-0o7", "0o-7", "0o1.5", "0o 7",
27+ "0b", "0b0", "0b1", "0b101", "0B101", "0b2", "0b1e3",
28+ "\t1", "1\t", "\n1\n", "\r1", "\u000b1", "\u000c1", "\u00a01", "1\u00a0", "\u20281", "\u20291", "\u00851", "1\u0085", "\u30001", "\u20031\u2003", "\ufeff1", "1\ufeff", "\u200b1", "\u180e1", "\u1680" + "1",
29+ "1\u0000", "\u00001", "1 ", " 1", " 1 ", "+ ", " -1.5e2 "];
30+base.forEach(add);
31+// systematically: signs x forms
32+for (const sg of ["", "+", "-"]) for (const f of ["0", "1", "10", "1.", ".1", "1.1", "1e1", "1e+1", "1e-1", ".1e1", "1.e1", "Infinity", "infinity", "NaN", "nan", "0x1", "0xA", "0o1", "0b1"]) add(sg + f);
33+for (let i = 0; i < 40; i++) { add("0x" + "f".repeat(i)); add("0o" + "7".repeat(i)); add("0x" + "0".repeat(i) + "1"); add("0o" + "0".repeat(i) + "1"); add("1" + "0".repeat(i)); add("0." + "0".repeat(i) + "1"); }
34+for (const n of [255, 256, 2147483647, 2147483648, 4294967295, 4294967296]) { add("0x" + n.toString(16)); add("0o" + n.toString(8)); add(String(n)); }
35+const hex = s => s.length ? [...s].flatMap(c => { const n = c.codePointAt(0); return n > 0xffff ? [0xd800 + ((n - 0x10000) >> 10), 0xdc00 + ((n - 0x10000) & 0x3ff)] : [n]; }).map(u => u.toString(16).toUpperCase()).join(".") : "-";
36+const all = [...set];
37+const tmp = mkdtempSync(join(tmpdir(), "num-"));
38+writeFileSync(join(tmp, "in.txt"), all.map(hex).join("\n") + "\n");
39+const out = execFileSync("dotnet", [join(here, "bin/Release/net9.0/runner.dll"), "--num", join(tmp, "in.txt")], { maxBuffer: 1 << 28 }).toString().split("\n").filter(Boolean);
40+rmSync(tmp, { recursive: true });
41+if (out.length !== all.length) throw new Error("answer count");
42+process.stdout.write(all.map((s, i) => `${hex(s)} ${out[i]}`).join("\n") + "\n");
@@ -0,0 +1,42 @@
1+// SPDX-License-Identifier: MIT
2+//
3+// Writes testdata/number_cases.txt: ExpressionUtility.ParseNumber of the
4+// runner (string to number, used for number literals and for comparisons of
5+// strings with numbers) on a corpus of strings, as `--num` prints it.
6+// number_test.go replays it.
7+//
8+// dotnet build -c Release expr/gen/runner -p:RunnerSrc=<runner>/src/Sdk
9+// node expr/gen/runner/number_cases.mjs > expr/testdata/number_cases.txt
10+
11+import { execFileSync } from "node:child_process";
12+import { writeFileSync, mkdtempSync, rmSync } from "node:fs";
13+import { tmpdir } from "node:os";
14+import { join, dirname } from "node:path";
15+import { fileURLToPath } from "node:url";
16+
17+const here = dirname(fileURLToPath(import.meta.url));
18+const set = new Set();
19+const add = s => set.add(s);
20+const base = ["", " ", "0", "00", "-0", "+0", "1", "-1", "+1", "12", "007", "1.5", "-1.5", "1.", ".5", "-.5", "+.5", ".", "-.", "+.", "..", "1..2", "1.2.3",
21+ "1e3", "1E3", "1e+3", "1e-3", "1e", "1e+", "1e-", "e3", "E3", ".e3", "1.e3", ".5e3", "1e3.5", "1e03", "1e0003", "1e308", "1e309", "-1e309", "1e-324", "1e-400", "4.9e-324", "2.5e-324", "1.7976931348623157e308", "1.7976931348623159e308",
22+ "0.1", "0.30000000000000004", "123456789012345678901234567890", "9007199254740993", "-9007199254740993", "0.000001", "1_000", "1,000", "1 000", "١٢٣", "123",
23+ "Infinity", "-Infinity", "+Infinity", "infinity", "INFINITY", "Infinit", "Infinityx", "inf", "Inf", "-inf", "+inf", "∞", "-∞", "\u2212Infinity", "\u2212" + "1",
24+ "NaN", "nan", "NAN", "-NaN", "+NaN", "NaNx", "N", "null", "true", "false", "abc", "x", "-", "+", "+-1", "-+1", "--1", "++1", "- 1", "+ 1", "1 -", "1-", "1+", "1 2",
25+ "0x", "0x0", "0x1", "0x10", "0xff", "0xFF", "0XFF", "0xfF", "0x7fffffff", "0x80000000", "0xffffffff", "0x100000000", "0xFFFFFFFFF", "0x00000001", "0x0000000000000001", "0x000000000000000000001", "-0x1", "+0x1", "0x-1", "0x+1", "0x1.0", "0x1p3", "0xg", "0x 1", "0 x1", "0x1 ",
26+ "0o", "0o0", "0o7", "0o8", "0o17", "0O17", "0o777", "0o17777777777", "0o20000000000", "0o37777777777", "0o40000000000", "0o77777777777", "0o000000000001", "0o0000000000000000000001", "-0o7", "0o-7", "0o1.5", "0o 7",
27+ "0b", "0b0", "0b1", "0b101", "0B101", "0b2", "0b1e3",
28+ "\t1", "1\t", "\n1\n", "\r1", "\u000b1", "\u000c1", "\u00a01", "1\u00a0", "\u20281", "\u20291", "\u00851", "1\u0085", "\u30001", "\u20031\u2003", "\ufeff1", "1\ufeff", "\u200b1", "\u180e1", "\u1680" + "1",
29+ "1\u0000", "\u00001", "1 ", " 1", " 1 ", "+ ", " -1.5e2 "];
30+base.forEach(add);
31+// systematically: signs x forms
32+for (const sg of ["", "+", "-"]) for (const f of ["0", "1", "10", "1.", ".1", "1.1", "1e1", "1e+1", "1e-1", ".1e1", "1.e1", "Infinity", "infinity", "NaN", "nan", "0x1", "0xA", "0o1", "0b1"]) add(sg + f);
33+for (let i = 0; i < 40; i++) { add("0x" + "f".repeat(i)); add("0o" + "7".repeat(i)); add("0x" + "0".repeat(i) + "1"); add("0o" + "0".repeat(i) + "1"); add("1" + "0".repeat(i)); add("0." + "0".repeat(i) + "1"); }
34+for (const n of [255, 256, 2147483647, 2147483648, 4294967295, 4294967296]) { add("0x" + n.toString(16)); add("0o" + n.toString(8)); add(String(n)); }
35+const hex = s => s.length ? [...s].flatMap(c => { const n = c.codePointAt(0); return n > 0xffff ? [0xd800 + ((n - 0x10000) >> 10), 0xdc00 + ((n - 0x10000) & 0x3ff)] : [n]; }).map(u => u.toString(16).toUpperCase()).join(".") : "-";
36+const all = [...set];
37+const tmp = mkdtempSync(join(tmpdir(), "num-"));
38+writeFileSync(join(tmp, "in.txt"), all.map(hex).join("\n") + "\n");
39+const out = execFileSync("dotnet", [join(here, "bin/Release/net9.0/runner.dll"), "--num", join(tmp, "in.txt")], { maxBuffer: 1 << 28 }).toString().split("\n").filter(Boolean);
40+rmSync(tmp, { recursive: true });
41+if (out.length !== all.length) throw new Error("answer count");
42+process.stdout.write(all.map((s, i) => `${hex(s)} ${out[i]}`).join("\n") + "\n");
M expr/lexer.go +1 -1
@@ -271,7 +271,7 @@ func (l *lexer) consumeNumber() error {
271271 l.next()
272272 }
273273 lexeme := l.substring(l.start, l.offset)
274- v := jsToNumber(lexeme)
274+ v := parseNumber(lexeme)
275275 if math.IsNaN(v) {
276276 return l.unexpected(lexeme)
277277 }
@@ -271,7 +271,7 @@ func (l *lexer) consumeNumber() error {
271 l.next()271 l.next()
272 }272 }
273 lexeme := l.substring(l.start, l.offset)273 lexeme := l.substring(l.start, l.offset)
274- v := jsToNumber(lexeme)274+ v := parseNumber(lexeme)
275 if math.IsNaN(v) {275 if math.IsNaN(v) {
276 return l.unexpected(lexeme)276 return l.unexpected(lexeme)
277 }277 }
M expr/number.go +94 -38
@@ -4,7 +4,6 @@ package expr
44
55 import (
66 "math"
7- "math/big"
87 "strconv"
98 "strings"
109 )
@@ -78,55 +77,112 @@ func numberToCoercedString(x float64) string {
7877 return sign + digits[:exp+1] + "." + digits[exp+1:]
7978 }
8079
81-// jsToNumber is Number(string): the StringToNumber algorithm of ECMAScript.
82-// Surrounding whitespace is ignored, the empty string is 0, and the accepted
83-// forms are decimal literals with optional sign, fraction and exponent,
84-// [+-]Infinity, and unsigned 0x, 0o and 0b integers. Everything else, including
85-// digit separators and "inf" or "nan", is NaN.
86-func jsToNumber(s string) float64 {
87- s = jsTrim(s)
80+// isNetSpace reports whether r is white space for .NET's Char.IsWhiteSpace,
81+// which String.Trim() removes: U+0009..U+000D, U+0020, U+0085, U+00A0,
82+// U+1680, U+2000..U+200A, U+2028, U+2029, U+202F, U+205F and U+3000. (The
83+// JavaScript trim also removes U+FEFF and not U+0085.)
84+func isNetSpace(r rune) bool {
85+ switch {
86+ case r >= 0x09 && r <= 0x0D, r == 0x20, r == 0x85, r == 0xA0, r == 0x1680,
87+ r >= 0x2000 && r <= 0x200A, r == 0x2028, r == 0x2029, r == 0x202F, r == 0x205F, r == 0x3000:
88+ return true
89+ }
90+ return false
91+}
92+
93+// parseNumber converts a string to a number the way the runner does,
94+// ExpressionUtility.ParseNumber (src/Sdk/DTExpressions2/Expressions2/Sdk/
95+// ExpressionUtility.cs), which is used for number literals in expressions and
96+// for every implicit string-to-number conversion:
97+//
98+// - the string is trimmed (see isNetSpace); empty means 0;
99+// - Double.TryParse with AllowLeadingSign | AllowDecimalPoint |
100+// AllowExponent in the invariant culture: [sign] digits [. digits]
101+// [e [sign] digits], at least one digit around the point, ASCII digits
102+// only, an out-of-range exponent giving an infinity, "Infinity" and
103+// "-Infinity" in any letter case, NaN, and any number of trailing NUL
104+// characters, which .NET ignores;
105+// - "0x" followed by hexadecimal digits and "0o" followed by octal digits
106+// (lower-case prefix, no sign), read as a 32-bit two's-complement
107+// integer: 0xffffffff is -1, and a value that does not fit in 32 bits is
108+// NaN. There is no binary form;
109+// - everything else is NaN.
110+//
111+// The JavaScript reference uses Number(), which differs: 0X, 0O and 0B
112+// prefixes, 64-bit exactness, no 32-bit wrap, and U+FEFF as white space.
113+func parseNumber(s string) float64 {
114+ s = strings.TrimFunc(s, isNetSpace)
88115 if s == "" {
89116 return 0
90117 }
118+ t := strings.TrimRight(s, "\x00")
119+ if body, neg := strings.CutPrefix(t, "-"); neg {
120+ if v, ok := parseDecimal(body); ok {
121+ return -v
122+ }
123+ } else {
124+ body, _ = strings.CutPrefix(t, "+")
125+ if v, ok := parseDecimal(body); ok {
126+ return v
127+ }
128+ }
91129 if len(s) > 2 && s[0] == '0' {
92- base := 0
93130 switch s[1] {
94- case 'x', 'X':
95- base = 16
96- case 'o', 'O':
97- base = 8
98- case 'b', 'B':
99- base = 2
100- }
101- if base != 0 {
102- n, ok := new(big.Int).SetString(s[2:], base)
103- if !ok || strings.ContainsAny(s[2:], "_+-") {
104- return nan
131+ case 'x':
132+ if v, ok := parseRadix32(s[2:], 16); ok {
133+ return v
134+ }
135+ case 'o':
136+ if v, ok := parseRadix32(s[2:], 8); ok {
137+ return v
105138 }
106- f, _ := new(big.Float).SetInt(n).Float64()
107- return f
108139 }
109140 }
110- body := s
111- neg := false
112- if body[0] == '+' || body[0] == '-' {
113- neg = body[0] == '-'
114- body = body[1:]
115- }
116- if body == "Infinity" {
117- if neg {
118- return math.Inf(-1)
119- }
120- return math.Inf(1)
141+ return nan
142+}
143+
144+// parseDecimal parses an unsigned decimal literal or "Infinity".
145+func parseDecimal(body string) (float64, bool) {
146+ if len(body) == 8 && strings.EqualFold(body, "infinity") && isASCII(body) {
147+ return posInf, true
121148 }
122149 if !isDecimalLiteral(body) {
123- return nan
150+ return 0, false
124151 }
125- v, _ := strconv.ParseFloat(body, 64) // out of range yields ±Inf, which is what JS does too
126- if neg {
127- v = -v
152+ v, _ := strconv.ParseFloat(body, 64) // out of range yields an infinity, as in .NET
153+ return v, true
154+}
155+
156+// parseRadix32 reads digits in base 16 or 8 as an unsigned 32-bit value and
157+// returns it as a signed one (Int32.TryParse with AllowHexSpecifier,
158+// Convert.ToInt32(s, 8)). Leading zeros are free; digits beyond 32 bits fail.
159+func parseRadix32(digits string, base int) (float64, bool) {
160+ if digits == "" {
161+ return 0, false
162+ }
163+ var v uint64
164+ for i := 0; i < len(digits); i++ {
165+ c := digits[i]
166+ var d int
167+ switch {
168+ case c >= '0' && c <= '9':
169+ d = int(c - '0')
170+ case c >= 'a' && c <= 'f':
171+ d = int(c-'a') + 10
172+ case c >= 'A' && c <= 'F':
173+ d = int(c-'A') + 10
174+ default:
175+ return 0, false
176+ }
177+ if d >= base {
178+ return 0, false
179+ }
180+ v = v*uint64(base) + uint64(d)
181+ if v > math.MaxUint32 {
182+ return 0, false
183+ }
128184 }
129- return v
185+ return float64(int32(uint32(v))), true
130186 }
131187
132188 // isDecimalLiteral reports whether s matches
@@ -4,7 +4,6 @@ package expr
4 4
5 import (5 import (
6 "math"6 "math"
7- "math/big"
8 "strconv"7 "strconv"
9 "strings"8 "strings"
10 )9 )
@@ -78,55 +77,112 @@ func numberToCoercedString(x float64) string {
78 return sign + digits[:exp+1] + "." + digits[exp+1:]77 return sign + digits[:exp+1] + "." + digits[exp+1:]
79 }78 }
80 79
81-// jsToNumber is Number(string): the StringToNumber algorithm of ECMAScript.80+// isNetSpace reports whether r is white space for .NET's Char.IsWhiteSpace,
82-// Surrounding whitespace is ignored, the empty string is 0, and the accepted81+// which String.Trim() removes: U+0009..U+000D, U+0020, U+0085, U+00A0,
83-// forms are decimal literals with optional sign, fraction and exponent,82+// U+1680, U+2000..U+200A, U+2028, U+2029, U+202F, U+205F and U+3000. (The
84-// [+-]Infinity, and unsigned 0x, 0o and 0b integers. Everything else, including83+// JavaScript trim also removes U+FEFF and not U+0085.)
85-// digit separators and "inf" or "nan", is NaN.84+func isNetSpace(r rune) bool {
86-func jsToNumber(s string) float64 {85+ switch {
87- s = jsTrim(s)86+ case r >= 0x09 && r <= 0x0D, r == 0x20, r == 0x85, r == 0xA0, r == 0x1680,
87+ r >= 0x2000 && r <= 0x200A, r == 0x2028, r == 0x2029, r == 0x202F, r == 0x205F, r == 0x3000:
88+ return true
89+ }
90+ return false
91+}
92+
93+// parseNumber converts a string to a number the way the runner does,
94+// ExpressionUtility.ParseNumber (src/Sdk/DTExpressions2/Expressions2/Sdk/
95+// ExpressionUtility.cs), which is used for number literals in expressions and
96+// for every implicit string-to-number conversion:
97+//
98+// - the string is trimmed (see isNetSpace); empty means 0;
99+// - Double.TryParse with AllowLeadingSign | AllowDecimalPoint |
100+// AllowExponent in the invariant culture: [sign] digits [. digits]
101+// [e [sign] digits], at least one digit around the point, ASCII digits
102+// only, an out-of-range exponent giving an infinity, "Infinity" and
103+// "-Infinity" in any letter case, NaN, and any number of trailing NUL
104+// characters, which .NET ignores;
105+// - "0x" followed by hexadecimal digits and "0o" followed by octal digits
106+// (lower-case prefix, no sign), read as a 32-bit two's-complement
107+// integer: 0xffffffff is -1, and a value that does not fit in 32 bits is
108+// NaN. There is no binary form;
109+// - everything else is NaN.
110+//
111+// The JavaScript reference uses Number(), which differs: 0X, 0O and 0B
112+// prefixes, 64-bit exactness, no 32-bit wrap, and U+FEFF as white space.
113+func parseNumber(s string) float64 {
114+ s = strings.TrimFunc(s, isNetSpace)
88 if s == "" {115 if s == "" {
89 return 0116 return 0
90 }117 }
118+ t := strings.TrimRight(s, "\x00")
119+ if body, neg := strings.CutPrefix(t, "-"); neg {
120+ if v, ok := parseDecimal(body); ok {
121+ return -v
122+ }
123+ } else {
124+ body, _ = strings.CutPrefix(t, "+")
125+ if v, ok := parseDecimal(body); ok {
126+ return v
127+ }
128+ }
91 if len(s) > 2 && s[0] == '0' {129 if len(s) > 2 && s[0] == '0' {
92- base := 0
93 switch s[1] {130 switch s[1] {
94- case 'x', 'X':131+ case 'x':
95- base = 16132+ if v, ok := parseRadix32(s[2:], 16); ok {
96- case 'o', 'O':133+ return v
97- base = 8134+ }
98- case 'b', 'B':135+ case 'o':
99- base = 2136+ if v, ok := parseRadix32(s[2:], 8); ok {
100- }137+ return v
101- if base != 0 {
102- n, ok := new(big.Int).SetString(s[2:], base)
103- if !ok || strings.ContainsAny(s[2:], "_+-") {
104- return nan
105 }138 }
106- f, _ := new(big.Float).SetInt(n).Float64()
107- return f
108 }139 }
109 }140 }
110- body := s141+ return nan
111- neg := false142+}
112- if body[0] == '+' || body[0] == '-' {143+
113- neg = body[0] == '-'144+// parseDecimal parses an unsigned decimal literal or "Infinity".
114- body = body[1:]145+func parseDecimal(body string) (float64, bool) {
115- }146+ if len(body) == 8 && strings.EqualFold(body, "infinity") && isASCII(body) {
116- if body == "Infinity" {147+ return posInf, true
117- if neg {
118- return math.Inf(-1)
119- }
120- return math.Inf(1)
121 }148 }
122 if !isDecimalLiteral(body) {149 if !isDecimalLiteral(body) {
123- return nan150+ return 0, false
124 }151 }
125- v, _ := strconv.ParseFloat(body, 64) // out of range yields ±Inf, which is what JS does too152+ v, _ := strconv.ParseFloat(body, 64) // out of range yields an infinity, as in .NET
126- if neg {153+ return v, true
127- v = -v154+}
155+
156+// parseRadix32 reads digits in base 16 or 8 as an unsigned 32-bit value and
157+// returns it as a signed one (Int32.TryParse with AllowHexSpecifier,
158+// Convert.ToInt32(s, 8)). Leading zeros are free; digits beyond 32 bits fail.
159+func parseRadix32(digits string, base int) (float64, bool) {
160+ if digits == "" {
161+ return 0, false
162+ }
163+ var v uint64
164+ for i := 0; i < len(digits); i++ {
165+ c := digits[i]
166+ var d int
167+ switch {
168+ case c >= '0' && c <= '9':
169+ d = int(c - '0')
170+ case c >= 'a' && c <= 'f':
171+ d = int(c-'a') + 10
172+ case c >= 'A' && c <= 'F':
173+ d = int(c-'A') + 10
174+ default:
175+ return 0, false
176+ }
177+ if d >= base {
178+ return 0, false
179+ }
180+ v = v*uint64(base) + uint64(d)
181+ if v > math.MaxUint32 {
182+ return 0, false
183+ }
128 }184 }
129- return v185+ return float64(int32(uint32(v))), true
130 }186 }
131 187
132 // isDecimalLiteral reports whether s matches188 // isDecimalLiteral reports whether s matches
A expr/number_test.go +62 -0
@@ -0,0 +1,62 @@
1+// SPDX-License-Identifier: MIT
2+
3+package expr
4+
5+import (
6+ "math"
7+ "os"
8+ "strconv"
9+ "strings"
10+ "testing"
11+)
12+
13+// TestParseNumberMatchesRunner replays testdata/number_cases.txt, the answers
14+// of the runner's ExpressionUtility.ParseNumber (gen/runner/number_cases.mjs)
15+// on 443 strings: hexadecimal, octal and binary forms, signs, exponents,
16+// Infinity and NaN spellings, Unicode digits and spaces.
17+func TestParseNumberMatchesRunner(t *testing.T) {
18+ data, err := os.ReadFile("testdata/number_cases.txt")
19+ if err != nil {
20+ t.Fatal(err)
21+ }
22+ n := 0
23+ for _, line := range strings.Split(strings.TrimSpace(string(data)), "\n") {
24+ f := strings.Fields(line)
25+ if len(f) != 2 {
26+ t.Fatalf("bad line %q", line)
27+ }
28+ in := decodeUnits(f[0])
29+ var want float64
30+ if f[1] == "NaN" {
31+ want = math.NaN()
32+ } else {
33+ bits, err := strconv.ParseUint(f[1], 16, 64)
34+ if err != nil {
35+ t.Fatal(err)
36+ }
37+ want = math.Float64frombits(bits)
38+ }
39+ got := parseNumber(in)
40+ if math.Float64bits(got) != math.Float64bits(want) && !(math.IsNaN(got) && math.IsNaN(want)) {
41+ t.Errorf("parseNumber(%q [%s]) = %v (%x), runner %v (%x)", in, f[0], got, math.Float64bits(got), want, math.Float64bits(want))
42+ }
43+ n++
44+ }
45+ if n < 400 {
46+ t.Errorf("only %d cases", n)
47+ }
48+}
49+
50+// decodeUnits decodes dot-separated hexadecimal UTF-16 code units ("-" is the
51+// empty string).
52+func decodeUnits(h string) string {
53+ if h == "-" {
54+ return ""
55+ }
56+ var units []uint16
57+ for _, u := range strings.Split(h, ".") {
58+ n, _ := strconv.ParseUint(u, 16, 16)
59+ units = append(units, uint16(n))
60+ }
61+ return utf16String(units)
62+}
@@ -0,0 +1,62 @@
1+// SPDX-License-Identifier: MIT
2+
3+package expr
4+
5+import (
6+ "math"
7+ "os"
8+ "strconv"
9+ "strings"
10+ "testing"
11+)
12+
13+// TestParseNumberMatchesRunner replays testdata/number_cases.txt, the answers
14+// of the runner's ExpressionUtility.ParseNumber (gen/runner/number_cases.mjs)
15+// on 443 strings: hexadecimal, octal and binary forms, signs, exponents,
16+// Infinity and NaN spellings, Unicode digits and spaces.
17+func TestParseNumberMatchesRunner(t *testing.T) {
18+ data, err := os.ReadFile("testdata/number_cases.txt")
19+ if err != nil {
20+ t.Fatal(err)
21+ }
22+ n := 0
23+ for _, line := range strings.Split(strings.TrimSpace(string(data)), "\n") {
24+ f := strings.Fields(line)
25+ if len(f) != 2 {
26+ t.Fatalf("bad line %q", line)
27+ }
28+ in := decodeUnits(f[0])
29+ var want float64
30+ if f[1] == "NaN" {
31+ want = math.NaN()
32+ } else {
33+ bits, err := strconv.ParseUint(f[1], 16, 64)
34+ if err != nil {
35+ t.Fatal(err)
36+ }
37+ want = math.Float64frombits(bits)
38+ }
39+ got := parseNumber(in)
40+ if math.Float64bits(got) != math.Float64bits(want) && !(math.IsNaN(got) && math.IsNaN(want)) {
41+ t.Errorf("parseNumber(%q [%s]) = %v (%x), runner %v (%x)", in, f[0], got, math.Float64bits(got), want, math.Float64bits(want))
42+ }
43+ n++
44+ }
45+ if n < 400 {
46+ t.Errorf("only %d cases", n)
47+ }
48+}
49+
50+// decodeUnits decodes dot-separated hexadecimal UTF-16 code units ("-" is the
51+// empty string).
52+func decodeUnits(h string) string {
53+ if h == "-" {
54+ return ""
55+ }
56+ var units []uint16
57+ for _, u := range strings.Split(h, ".") {
58+ n, _ := strconv.ParseUint(u, 16, 16)
59+ units = append(units, uint16(n))
60+ }
61+ return utf16String(units)
62+}
A expr/testdata/number_cases.txt +443 -0
@@ -0,0 +1,443 @@
1+- 0
2+20 0
3+30 0
4+30.30 0
5+2D.30 8000000000000000
6+2B.30 0
7+31 3ff0000000000000
8+2D.31 bff0000000000000
9+2B.31 3ff0000000000000
10+31.32 4028000000000000
11+30.30.37 401c000000000000
12+31.2E.35 3ff8000000000000
13+2D.31.2E.35 bff8000000000000
14+31.2E 3ff0000000000000
15+2E.35 3fe0000000000000
16+2D.2E.35 bfe0000000000000
17+2B.2E.35 3fe0000000000000
18+2E NaN
19+2D.2E NaN
20+2B.2E NaN
21+2E.2E NaN
22+31.2E.2E.32 NaN
23+31.2E.32.2E.33 NaN
24+31.65.33 408f400000000000
25+31.45.33 408f400000000000
26+31.65.2B.33 408f400000000000
27+31.65.2D.33 3f50624dd2f1a9fc
28+31.65 NaN
29+31.65.2B NaN
30+31.65.2D NaN
31+65.33 NaN
32+45.33 NaN
33+2E.65.33 NaN
34+31.2E.65.33 408f400000000000
35+2E.35.65.33 407f400000000000
36+31.65.33.2E.35 NaN
37+31.65.30.33 408f400000000000
38+31.65.30.30.30.33 408f400000000000
39+31.65.33.30.38 7fe1ccf385ebc8a0
40+31.65.33.30.39 7ff0000000000000
41+2D.31.65.33.30.39 fff0000000000000
42+31.65.2D.33.32.34 0
43+31.65.2D.34.30.30 0
44+34.2E.39.65.2D.33.32.34 1
45+32.2E.35.65.2D.33.32.34 1
46+31.2E.37.39.37.36.39.33.31.33.34.38.36.32.33.31.35.37.65.33.30.38 7fefffffffffffff
47+31.2E.37.39.37.36.39.33.31.33.34.38.36.32.33.31.35.39.65.33.30.38 7ff0000000000000
48+30.2E.31 3fb999999999999a
49+30.2E.33.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.34 3fd3333333333334
50+31.32.33.34.35.36.37.38.39.30.31.32.33.34.35.36.37.38.39.30.31.32.33.34.35.36.37.38.39.30 45f8ee90ff6c373e
51+39.30.30.37.31.39.39.32.35.34.37.34.30.39.39.33 4340000000000000
52+2D.39.30.30.37.31.39.39.32.35.34.37.34.30.39.39.33 c340000000000000
53+30.2E.30.30.30.30.30.31 3eb0c6f7a0b5ed8d
54+31.5F.30.30.30 NaN
55+31.2C.30.30.30 NaN
56+31.20.30.30.30 NaN
57+661.662.663 NaN
58+FF11.FF12.FF13 NaN
59+49.6E.66.69.6E.69.74.79 7ff0000000000000
60+2D.49.6E.66.69.6E.69.74.79 fff0000000000000
61+2B.49.6E.66.69.6E.69.74.79 7ff0000000000000
62+69.6E.66.69.6E.69.74.79 7ff0000000000000
63+49.4E.46.49.4E.49.54.59 7ff0000000000000
64+49.6E.66.69.6E.69.74 NaN
65+49.6E.66.69.6E.69.74.79.78 NaN
66+69.6E.66 NaN
67+49.6E.66 NaN
68+2D.69.6E.66 NaN
69+2B.69.6E.66 NaN
70+221E NaN
71+2D.221E NaN
72+2212.49.6E.66.69.6E.69.74.79 NaN
73+2212.31 NaN
74+4E.61.4E NaN
75+6E.61.6E NaN
76+4E.41.4E NaN
77+2D.4E.61.4E NaN
78+2B.4E.61.4E NaN
79+4E.61.4E.78 NaN
80+4E NaN
81+6E.75.6C.6C NaN
82+74.72.75.65 NaN
83+66.61.6C.73.65 NaN
84+61.62.63 NaN
85+78 NaN
86+2D NaN
87+2B NaN
88+2B.2D.31 NaN
89+2D.2B.31 NaN
90+2D.2D.31 NaN
91+2B.2B.31 NaN
92+2D.20.31 NaN
93+2B.20.31 NaN
94+31.20.2D NaN
95+31.2D NaN
96+31.2B NaN
97+31.20.32 NaN
98+30.78 NaN
99+30.78.30 0
100+30.78.31 3ff0000000000000
101+30.78.31.30 4030000000000000
102+30.78.66.66 406fe00000000000
103+30.78.46.46 406fe00000000000
104+30.58.46.46 NaN
105+30.78.66.46 406fe00000000000
106+30.78.37.66.66.66.66.66.66.66 41dfffffffc00000
107+30.78.38.30.30.30.30.30.30.30 c1e0000000000000
108+30.78.66.66.66.66.66.66.66.66 bff0000000000000
109+30.78.31.30.30.30.30.30.30.30.30 NaN
110+30.78.46.46.46.46.46.46.46.46.46 NaN
111+30.78.30.30.30.30.30.30.30.31 3ff0000000000000
112+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
113+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
114+2D.30.78.31 NaN
115+2B.30.78.31 NaN
116+30.78.2D.31 NaN
117+30.78.2B.31 NaN
118+30.78.31.2E.30 NaN
119+30.78.31.70.33 NaN
120+30.78.67 NaN
121+30.78.20.31 NaN
122+30.20.78.31 NaN
123+30.78.31.20 3ff0000000000000
124+30.6F NaN
125+30.6F.30 0
126+30.6F.37 401c000000000000
127+30.6F.38 NaN
128+30.6F.31.37 402e000000000000
129+30.4F.31.37 NaN
130+30.6F.37.37.37 407ff00000000000
131+30.6F.31.37.37.37.37.37.37.37.37.37.37 41dfffffffc00000
132+30.6F.32.30.30.30.30.30.30.30.30.30.30 c1e0000000000000
133+30.6F.33.37.37.37.37.37.37.37.37.37.37 bff0000000000000
134+30.6F.34.30.30.30.30.30.30.30.30.30.30 NaN
135+30.6F.37.37.37.37.37.37.37.37.37.37.37 NaN
136+30.6F.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
137+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
138+2D.30.6F.37 NaN
139+30.6F.2D.37 NaN
140+30.6F.31.2E.35 NaN
141+30.6F.20.37 NaN
142+30.62 NaN
143+30.62.30 NaN
144+30.62.31 NaN
145+30.62.31.30.31 NaN
146+30.42.31.30.31 NaN
147+30.62.32 NaN
148+30.62.31.65.33 NaN
149+9.31 3ff0000000000000
150+31.9 3ff0000000000000
151+A.31.A 3ff0000000000000
152+D.31 3ff0000000000000
153+B.31 3ff0000000000000
154+C.31 3ff0000000000000
155+A0.31 3ff0000000000000
156+31.A0 3ff0000000000000
157+2028.31 3ff0000000000000
158+2029.31 3ff0000000000000
159+85.31 3ff0000000000000
160+31.85 3ff0000000000000
161+3000.31 3ff0000000000000
162+2003.31.2003 3ff0000000000000
163+FEFF.31 NaN
164+31.FEFF NaN
165+200B.31 NaN
166+180E.31 NaN
167+1680.31 3ff0000000000000
168+31.0 3ff0000000000000
169+0.31 NaN
170+31.20 3ff0000000000000
171+20.31 3ff0000000000000
172+20.20.31.20.20 3ff0000000000000
173+2B.20 NaN
174+20.2D.31.2E.35.65.32.20 c062c00000000000
175+31.30 4024000000000000
176+2E.31 3fb999999999999a
177+31.2E.31 3ff199999999999a
178+31.65.31 4024000000000000
179+31.65.2B.31 4024000000000000
180+31.65.2D.31 3fb999999999999a
181+2E.31.65.31 3ff0000000000000
182+31.2E.65.31 4024000000000000
183+30.78.41 4024000000000000
184+30.6F.31 3ff0000000000000
185+2B.31.30 4024000000000000
186+2B.31.2E 3ff0000000000000
187+2B.2E.31 3fb999999999999a
188+2B.31.2E.31 3ff199999999999a
189+2B.31.65.31 4024000000000000
190+2B.31.65.2B.31 4024000000000000
191+2B.31.65.2D.31 3fb999999999999a
192+2B.2E.31.65.31 3ff0000000000000
193+2B.31.2E.65.31 4024000000000000
194+2B.69.6E.66.69.6E.69.74.79 7ff0000000000000
195+2B.6E.61.6E NaN
196+2B.30.78.41 NaN
197+2B.30.6F.31 NaN
198+2B.30.62.31 NaN
199+2D.31.30 c024000000000000
200+2D.31.2E bff0000000000000
201+2D.2E.31 bfb999999999999a
202+2D.31.2E.31 bff199999999999a
203+2D.31.65.31 c024000000000000
204+2D.31.65.2B.31 c024000000000000
205+2D.31.65.2D.31 bfb999999999999a
206+2D.2E.31.65.31 bff0000000000000
207+2D.31.2E.65.31 c024000000000000
208+2D.69.6E.66.69.6E.69.74.79 fff0000000000000
209+2D.6E.61.6E NaN
210+2D.30.78.41 NaN
211+2D.30.6F.31 NaN
212+2D.30.62.31 NaN
213+30.78.66 402e000000000000
214+30.78.30.31 3ff0000000000000
215+30.6F.30.31 3ff0000000000000
216+30.2E.30.31 3f847ae147ae147b
217+30.6F.37.37 404f800000000000
218+30.78.30.30.31 3ff0000000000000
219+30.6F.30.30.31 3ff0000000000000
220+31.30.30 4059000000000000
221+30.2E.30.30.31 3f50624dd2f1a9fc
222+30.78.66.66.66 40affe0000000000
223+30.78.30.30.30.31 3ff0000000000000
224+30.6F.30.30.30.31 3ff0000000000000
225+31.30.30.30 408f400000000000
226+30.2E.30.30.30.31 3f1a36e2eb1c432d
227+30.78.66.66.66.66 40efffe000000000
228+30.6F.37.37.37.37 40affe0000000000
229+30.78.30.30.30.30.31 3ff0000000000000
230+30.6F.30.30.30.30.31 3ff0000000000000
231+31.30.30.30.30 40c3880000000000
232+30.2E.30.30.30.30.31 3ee4f8b588e368f1
233+30.78.66.66.66.66.66 412ffffe00000000
234+30.6F.37.37.37.37.37 40dfffc000000000
235+30.78.30.30.30.30.30.31 3ff0000000000000
236+30.6F.30.30.30.30.30.31 3ff0000000000000
237+31.30.30.30.30.30 40f86a0000000000
238+30.78.66.66.66.66.66.66 416fffffe0000000
239+30.6F.37.37.37.37.37.37 410ffff800000000
240+30.78.30.30.30.30.30.30.31 3ff0000000000000
241+30.6F.30.30.30.30.30.30.31 3ff0000000000000
242+31.30.30.30.30.30.30 412e848000000000
243+30.2E.30.30.30.30.30.30.31 3e7ad7f29abcaf48
244+30.78.66.66.66.66.66.66.66 41affffffe000000
245+30.6F.37.37.37.37.37.37.37 413fffff00000000
246+30.6F.30.30.30.30.30.30.30.31 3ff0000000000000
247+31.30.30.30.30.30.30.30 416312d000000000
248+30.2E.30.30.30.30.30.30.30.31 3e45798ee2308c3a
249+30.6F.37.37.37.37.37.37.37.37 416fffffe0000000
250+30.78.30.30.30.30.30.30.30.30.31 3ff0000000000000
251+30.6F.30.30.30.30.30.30.30.30.31 3ff0000000000000
252+31.30.30.30.30.30.30.30.30 4197d78400000000
253+30.2E.30.30.30.30.30.30.30.30.31 3e112e0be826d695
254+30.78.66.66.66.66.66.66.66.66.66 NaN
255+30.6F.37.37.37.37.37.37.37.37.37 419ffffffc000000
256+30.78.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
257+30.6F.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
258+31.30.30.30.30.30.30.30.30.30 41cdcd6500000000
259+30.2E.30.30.30.30.30.30.30.30.30.31 3ddb7cdfd9d7bdbb
260+30.78.66.66.66.66.66.66.66.66.66.66 NaN
261+30.6F.37.37.37.37.37.37.37.37.37.37 41cfffffff800000
262+30.78.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
263+30.6F.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
264+31.30.30.30.30.30.30.30.30.30.30 4202a05f20000000
265+30.2E.30.30.30.30.30.30.30.30.30.30.31 3da5fd7fe1796495
266+30.78.66.66.66.66.66.66.66.66.66.66.66 NaN
267+30.78.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
268+31.30.30.30.30.30.30.30.30.30.30.30 42374876e8000000
269+30.2E.30.30.30.30.30.30.30.30.30.30.30.31 3d719799812dea11
270+30.78.66.66.66.66.66.66.66.66.66.66.66.66 NaN
271+30.6F.37.37.37.37.37.37.37.37.37.37.37.37 NaN
272+30.78.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
273+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
274+31.30.30.30.30.30.30.30.30.30.30.30.30 426d1a94a2000000
275+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.31 3d3c25c268497682
276+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
277+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
278+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
279+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
280+31.30.30.30.30.30.30.30.30.30.30.30.30.30 42a2309ce5400000
281+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3d06849b86a12b9b
282+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
283+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
284+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
285+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
286+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30 42d6bcc41e900000
287+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3cd203af9ee75616
288+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
289+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
290+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
291+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 430c6bf526340000
292+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3c9cd2b297d889bc
293+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
294+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
295+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
296+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
297+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4341c37937e08000
298+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3c670ef54646d497
299+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
300+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
301+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
302+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
303+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4376345785d8a000
304+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3c32725dd1d243ac
305+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
306+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
307+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
308+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
309+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 43abc16d674ec800
310+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3bfd83c94fb6d2ac
311+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
312+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
313+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
314+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
315+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 43e158e460913d00
316+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3bc79ca10c924223
317+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
318+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
319+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
320+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4415af1d78b58c40
321+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3b92e3b40a0e9b4f
322+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
323+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
324+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
325+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 444b1ae4d6e2ef50
326+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3b5e392010175ee6
327+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
328+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
329+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
330+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
331+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4480f0cf064dd592
332+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3b282db34012b251
333+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
334+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
335+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
336+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
337+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 44b52d02c7e14af6
338+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3af357c299a88ea7
339+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
340+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
341+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
342+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
343+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 44ea784379d99db4
344+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3abef2d0f5da7dd9
345+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
346+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
347+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
348+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
349+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 45208b2a2c280291
350+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3a88c240c4aecb14
351+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
352+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
353+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
354+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
355+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4554adf4b7320335
356+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3a53ce9a36f23c10
357+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
358+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
359+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
360+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
361+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4589d971e4fe8402
362+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3a1fb0f6be506019
363+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
364+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
365+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
366+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
367+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 45c027e72f1f1281
368+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 39e95a5efea6b347
369+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
370+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
371+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
372+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
373+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 45f431e0fae6d721
374+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 39b4484bfeebc2a0
375+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
376+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
377+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
378+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
379+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 46293e5939a08cea
380+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 398039d665896880
381+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
382+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
383+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
384+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
385+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 465f8def8808b024
386+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3949f623d5a8a733
387+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
388+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
389+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
390+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
391+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4693b8b5b5056e17
392+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3914c4e977ba1f5c
393+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
394+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
395+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
396+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
397+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 46c8a6e32246c99c
398+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 38e09d8792fb4c49
399+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
400+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
401+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
402+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
403+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 46fed09bead87c03
404+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 38aa95a5b7f87a0f
405+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
406+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
407+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
408+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
409+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4733426172c74d82
410+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 38754484932d2e72
411+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
412+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
413+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
414+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
415+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 476812f9cf7920e3
416+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3841039d428a8b8f
417+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
418+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
419+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
420+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
421+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 479e17b84357691b
422+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 380b38fb9daa78e4
423+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
424+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
425+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
426+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
427+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 47d2ced32a16a1b1
428+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 37d5c72fb1552d83
429+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
430+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
431+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
432+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
433+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 48078287f49c4a1d
434+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 37a16c262777579c
435+30.6F.33.37.37 406fe00000000000
436+32.35.35 406fe00000000000
437+30.78.31.30.30 4070000000000000
438+30.6F.34.30.30 4070000000000000
439+32.35.36 4070000000000000
440+32.31.34.37.34.38.33.36.34.37 41dfffffffc00000
441+32.31.34.37.34.38.33.36.34.38 41e0000000000000
442+34.32.39.34.39.36.37.32.39.35 41efffffffe00000
443+34.32.39.34.39.36.37.32.39.36 41f0000000000000
@@ -0,0 +1,443 @@
1+- 0
2+20 0
3+30 0
4+30.30 0
5+2D.30 8000000000000000
6+2B.30 0
7+31 3ff0000000000000
8+2D.31 bff0000000000000
9+2B.31 3ff0000000000000
10+31.32 4028000000000000
11+30.30.37 401c000000000000
12+31.2E.35 3ff8000000000000
13+2D.31.2E.35 bff8000000000000
14+31.2E 3ff0000000000000
15+2E.35 3fe0000000000000
16+2D.2E.35 bfe0000000000000
17+2B.2E.35 3fe0000000000000
18+2E NaN
19+2D.2E NaN
20+2B.2E NaN
21+2E.2E NaN
22+31.2E.2E.32 NaN
23+31.2E.32.2E.33 NaN
24+31.65.33 408f400000000000
25+31.45.33 408f400000000000
26+31.65.2B.33 408f400000000000
27+31.65.2D.33 3f50624dd2f1a9fc
28+31.65 NaN
29+31.65.2B NaN
30+31.65.2D NaN
31+65.33 NaN
32+45.33 NaN
33+2E.65.33 NaN
34+31.2E.65.33 408f400000000000
35+2E.35.65.33 407f400000000000
36+31.65.33.2E.35 NaN
37+31.65.30.33 408f400000000000
38+31.65.30.30.30.33 408f400000000000
39+31.65.33.30.38 7fe1ccf385ebc8a0
40+31.65.33.30.39 7ff0000000000000
41+2D.31.65.33.30.39 fff0000000000000
42+31.65.2D.33.32.34 0
43+31.65.2D.34.30.30 0
44+34.2E.39.65.2D.33.32.34 1
45+32.2E.35.65.2D.33.32.34 1
46+31.2E.37.39.37.36.39.33.31.33.34.38.36.32.33.31.35.37.65.33.30.38 7fefffffffffffff
47+31.2E.37.39.37.36.39.33.31.33.34.38.36.32.33.31.35.39.65.33.30.38 7ff0000000000000
48+30.2E.31 3fb999999999999a
49+30.2E.33.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.34 3fd3333333333334
50+31.32.33.34.35.36.37.38.39.30.31.32.33.34.35.36.37.38.39.30.31.32.33.34.35.36.37.38.39.30 45f8ee90ff6c373e
51+39.30.30.37.31.39.39.32.35.34.37.34.30.39.39.33 4340000000000000
52+2D.39.30.30.37.31.39.39.32.35.34.37.34.30.39.39.33 c340000000000000
53+30.2E.30.30.30.30.30.31 3eb0c6f7a0b5ed8d
54+31.5F.30.30.30 NaN
55+31.2C.30.30.30 NaN
56+31.20.30.30.30 NaN
57+661.662.663 NaN
58+FF11.FF12.FF13 NaN
59+49.6E.66.69.6E.69.74.79 7ff0000000000000
60+2D.49.6E.66.69.6E.69.74.79 fff0000000000000
61+2B.49.6E.66.69.6E.69.74.79 7ff0000000000000
62+69.6E.66.69.6E.69.74.79 7ff0000000000000
63+49.4E.46.49.4E.49.54.59 7ff0000000000000
64+49.6E.66.69.6E.69.74 NaN
65+49.6E.66.69.6E.69.74.79.78 NaN
66+69.6E.66 NaN
67+49.6E.66 NaN
68+2D.69.6E.66 NaN
69+2B.69.6E.66 NaN
70+221E NaN
71+2D.221E NaN
72+2212.49.6E.66.69.6E.69.74.79 NaN
73+2212.31 NaN
74+4E.61.4E NaN
75+6E.61.6E NaN
76+4E.41.4E NaN
77+2D.4E.61.4E NaN
78+2B.4E.61.4E NaN
79+4E.61.4E.78 NaN
80+4E NaN
81+6E.75.6C.6C NaN
82+74.72.75.65 NaN
83+66.61.6C.73.65 NaN
84+61.62.63 NaN
85+78 NaN
86+2D NaN
87+2B NaN
88+2B.2D.31 NaN
89+2D.2B.31 NaN
90+2D.2D.31 NaN
91+2B.2B.31 NaN
92+2D.20.31 NaN
93+2B.20.31 NaN
94+31.20.2D NaN
95+31.2D NaN
96+31.2B NaN
97+31.20.32 NaN
98+30.78 NaN
99+30.78.30 0
100+30.78.31 3ff0000000000000
101+30.78.31.30 4030000000000000
102+30.78.66.66 406fe00000000000
103+30.78.46.46 406fe00000000000
104+30.58.46.46 NaN
105+30.78.66.46 406fe00000000000
106+30.78.37.66.66.66.66.66.66.66 41dfffffffc00000
107+30.78.38.30.30.30.30.30.30.30 c1e0000000000000
108+30.78.66.66.66.66.66.66.66.66 bff0000000000000
109+30.78.31.30.30.30.30.30.30.30.30 NaN
110+30.78.46.46.46.46.46.46.46.46.46 NaN
111+30.78.30.30.30.30.30.30.30.31 3ff0000000000000
112+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
113+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
114+2D.30.78.31 NaN
115+2B.30.78.31 NaN
116+30.78.2D.31 NaN
117+30.78.2B.31 NaN
118+30.78.31.2E.30 NaN
119+30.78.31.70.33 NaN
120+30.78.67 NaN
121+30.78.20.31 NaN
122+30.20.78.31 NaN
123+30.78.31.20 3ff0000000000000
124+30.6F NaN
125+30.6F.30 0
126+30.6F.37 401c000000000000
127+30.6F.38 NaN
128+30.6F.31.37 402e000000000000
129+30.4F.31.37 NaN
130+30.6F.37.37.37 407ff00000000000
131+30.6F.31.37.37.37.37.37.37.37.37.37.37 41dfffffffc00000
132+30.6F.32.30.30.30.30.30.30.30.30.30.30 c1e0000000000000
133+30.6F.33.37.37.37.37.37.37.37.37.37.37 bff0000000000000
134+30.6F.34.30.30.30.30.30.30.30.30.30.30 NaN
135+30.6F.37.37.37.37.37.37.37.37.37.37.37 NaN
136+30.6F.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
137+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
138+2D.30.6F.37 NaN
139+30.6F.2D.37 NaN
140+30.6F.31.2E.35 NaN
141+30.6F.20.37 NaN
142+30.62 NaN
143+30.62.30 NaN
144+30.62.31 NaN
145+30.62.31.30.31 NaN
146+30.42.31.30.31 NaN
147+30.62.32 NaN
148+30.62.31.65.33 NaN
149+9.31 3ff0000000000000
150+31.9 3ff0000000000000
151+A.31.A 3ff0000000000000
152+D.31 3ff0000000000000
153+B.31 3ff0000000000000
154+C.31 3ff0000000000000
155+A0.31 3ff0000000000000
156+31.A0 3ff0000000000000
157+2028.31 3ff0000000000000
158+2029.31 3ff0000000000000
159+85.31 3ff0000000000000
160+31.85 3ff0000000000000
161+3000.31 3ff0000000000000
162+2003.31.2003 3ff0000000000000
163+FEFF.31 NaN
164+31.FEFF NaN
165+200B.31 NaN
166+180E.31 NaN
167+1680.31 3ff0000000000000
168+31.0 3ff0000000000000
169+0.31 NaN
170+31.20 3ff0000000000000
171+20.31 3ff0000000000000
172+20.20.31.20.20 3ff0000000000000
173+2B.20 NaN
174+20.2D.31.2E.35.65.32.20 c062c00000000000
175+31.30 4024000000000000
176+2E.31 3fb999999999999a
177+31.2E.31 3ff199999999999a
178+31.65.31 4024000000000000
179+31.65.2B.31 4024000000000000
180+31.65.2D.31 3fb999999999999a
181+2E.31.65.31 3ff0000000000000
182+31.2E.65.31 4024000000000000
183+30.78.41 4024000000000000
184+30.6F.31 3ff0000000000000
185+2B.31.30 4024000000000000
186+2B.31.2E 3ff0000000000000
187+2B.2E.31 3fb999999999999a
188+2B.31.2E.31 3ff199999999999a
189+2B.31.65.31 4024000000000000
190+2B.31.65.2B.31 4024000000000000
191+2B.31.65.2D.31 3fb999999999999a
192+2B.2E.31.65.31 3ff0000000000000
193+2B.31.2E.65.31 4024000000000000
194+2B.69.6E.66.69.6E.69.74.79 7ff0000000000000
195+2B.6E.61.6E NaN
196+2B.30.78.41 NaN
197+2B.30.6F.31 NaN
198+2B.30.62.31 NaN
199+2D.31.30 c024000000000000
200+2D.31.2E bff0000000000000
201+2D.2E.31 bfb999999999999a
202+2D.31.2E.31 bff199999999999a
203+2D.31.65.31 c024000000000000
204+2D.31.65.2B.31 c024000000000000
205+2D.31.65.2D.31 bfb999999999999a
206+2D.2E.31.65.31 bff0000000000000
207+2D.31.2E.65.31 c024000000000000
208+2D.69.6E.66.69.6E.69.74.79 fff0000000000000
209+2D.6E.61.6E NaN
210+2D.30.78.41 NaN
211+2D.30.6F.31 NaN
212+2D.30.62.31 NaN
213+30.78.66 402e000000000000
214+30.78.30.31 3ff0000000000000
215+30.6F.30.31 3ff0000000000000
216+30.2E.30.31 3f847ae147ae147b
217+30.6F.37.37 404f800000000000
218+30.78.30.30.31 3ff0000000000000
219+30.6F.30.30.31 3ff0000000000000
220+31.30.30 4059000000000000
221+30.2E.30.30.31 3f50624dd2f1a9fc
222+30.78.66.66.66 40affe0000000000
223+30.78.30.30.30.31 3ff0000000000000
224+30.6F.30.30.30.31 3ff0000000000000
225+31.30.30.30 408f400000000000
226+30.2E.30.30.30.31 3f1a36e2eb1c432d
227+30.78.66.66.66.66 40efffe000000000
228+30.6F.37.37.37.37 40affe0000000000
229+30.78.30.30.30.30.31 3ff0000000000000
230+30.6F.30.30.30.30.31 3ff0000000000000
231+31.30.30.30.30 40c3880000000000
232+30.2E.30.30.30.30.31 3ee4f8b588e368f1
233+30.78.66.66.66.66.66 412ffffe00000000
234+30.6F.37.37.37.37.37 40dfffc000000000
235+30.78.30.30.30.30.30.31 3ff0000000000000
236+30.6F.30.30.30.30.30.31 3ff0000000000000
237+31.30.30.30.30.30 40f86a0000000000
238+30.78.66.66.66.66.66.66 416fffffe0000000
239+30.6F.37.37.37.37.37.37 410ffff800000000
240+30.78.30.30.30.30.30.30.31 3ff0000000000000
241+30.6F.30.30.30.30.30.30.31 3ff0000000000000
242+31.30.30.30.30.30.30 412e848000000000
243+30.2E.30.30.30.30.30.30.31 3e7ad7f29abcaf48
244+30.78.66.66.66.66.66.66.66 41affffffe000000
245+30.6F.37.37.37.37.37.37.37 413fffff00000000
246+30.6F.30.30.30.30.30.30.30.31 3ff0000000000000
247+31.30.30.30.30.30.30.30 416312d000000000
248+30.2E.30.30.30.30.30.30.30.31 3e45798ee2308c3a
249+30.6F.37.37.37.37.37.37.37.37 416fffffe0000000
250+30.78.30.30.30.30.30.30.30.30.31 3ff0000000000000
251+30.6F.30.30.30.30.30.30.30.30.31 3ff0000000000000
252+31.30.30.30.30.30.30.30.30 4197d78400000000
253+30.2E.30.30.30.30.30.30.30.30.31 3e112e0be826d695
254+30.78.66.66.66.66.66.66.66.66.66 NaN
255+30.6F.37.37.37.37.37.37.37.37.37 419ffffffc000000
256+30.78.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
257+30.6F.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
258+31.30.30.30.30.30.30.30.30.30 41cdcd6500000000
259+30.2E.30.30.30.30.30.30.30.30.30.31 3ddb7cdfd9d7bdbb
260+30.78.66.66.66.66.66.66.66.66.66.66 NaN
261+30.6F.37.37.37.37.37.37.37.37.37.37 41cfffffff800000
262+30.78.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
263+30.6F.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
264+31.30.30.30.30.30.30.30.30.30.30 4202a05f20000000
265+30.2E.30.30.30.30.30.30.30.30.30.30.31 3da5fd7fe1796495
266+30.78.66.66.66.66.66.66.66.66.66.66.66 NaN
267+30.78.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
268+31.30.30.30.30.30.30.30.30.30.30.30 42374876e8000000
269+30.2E.30.30.30.30.30.30.30.30.30.30.30.31 3d719799812dea11
270+30.78.66.66.66.66.66.66.66.66.66.66.66.66 NaN
271+30.6F.37.37.37.37.37.37.37.37.37.37.37.37 NaN
272+30.78.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
273+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
274+31.30.30.30.30.30.30.30.30.30.30.30.30 426d1a94a2000000
275+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.31 3d3c25c268497682
276+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
277+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
278+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
279+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
280+31.30.30.30.30.30.30.30.30.30.30.30.30.30 42a2309ce5400000
281+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3d06849b86a12b9b
282+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
283+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
284+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
285+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
286+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30 42d6bcc41e900000
287+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3cd203af9ee75616
288+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
289+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
290+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
291+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 430c6bf526340000
292+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3c9cd2b297d889bc
293+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
294+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
295+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
296+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
297+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4341c37937e08000
298+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3c670ef54646d497
299+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
300+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
301+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
302+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
303+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4376345785d8a000
304+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3c32725dd1d243ac
305+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
306+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
307+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
308+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
309+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 43abc16d674ec800
310+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3bfd83c94fb6d2ac
311+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
312+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
313+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
314+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
315+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 43e158e460913d00
316+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3bc79ca10c924223
317+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
318+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
319+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
320+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4415af1d78b58c40
321+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3b92e3b40a0e9b4f
322+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
323+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
324+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
325+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 444b1ae4d6e2ef50
326+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3b5e392010175ee6
327+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
328+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
329+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
330+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
331+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4480f0cf064dd592
332+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3b282db34012b251
333+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
334+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
335+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
336+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
337+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 44b52d02c7e14af6
338+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3af357c299a88ea7
339+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
340+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
341+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
342+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
343+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 44ea784379d99db4
344+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3abef2d0f5da7dd9
345+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
346+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
347+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
348+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
349+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 45208b2a2c280291
350+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3a88c240c4aecb14
351+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
352+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
353+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
354+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
355+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4554adf4b7320335
356+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3a53ce9a36f23c10
357+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
358+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
359+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
360+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
361+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4589d971e4fe8402
362+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3a1fb0f6be506019
363+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
364+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
365+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
366+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
367+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 45c027e72f1f1281
368+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 39e95a5efea6b347
369+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
370+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
371+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
372+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
373+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 45f431e0fae6d721
374+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 39b4484bfeebc2a0
375+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
376+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
377+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
378+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
379+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 46293e5939a08cea
380+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 398039d665896880
381+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
382+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
383+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
384+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
385+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 465f8def8808b024
386+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3949f623d5a8a733
387+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
388+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
389+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
390+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
391+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4693b8b5b5056e17
392+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3914c4e977ba1f5c
393+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
394+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
395+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
396+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
397+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 46c8a6e32246c99c
398+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 38e09d8792fb4c49
399+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
400+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
401+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
402+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
403+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 46fed09bead87c03
404+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 38aa95a5b7f87a0f
405+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
406+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
407+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
408+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
409+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 4733426172c74d82
410+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 38754484932d2e72
411+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
412+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
413+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
414+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
415+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 476812f9cf7920e3
416+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3841039d428a8b8f
417+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
418+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
419+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
420+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
421+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 479e17b84357691b
422+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 380b38fb9daa78e4
423+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
424+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
425+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
426+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
427+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 47d2ced32a16a1b1
428+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 37d5c72fb1552d83
429+30.78.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66.66 NaN
430+30.6F.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37.37 NaN
431+30.78.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
432+30.6F.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 3ff0000000000000
433+31.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30 48078287f49c4a1d
434+30.2E.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.30.31 37a16c262777579c
435+30.6F.33.37.37 406fe00000000000
436+32.35.35 406fe00000000000
437+30.78.31.30.30 4070000000000000
438+30.6F.34.30.30 4070000000000000
439+32.35.36 4070000000000000
440+32.31.34.37.34.38.33.36.34.37 41dfffffffc00000
441+32.31.34.37.34.38.33.36.34.38 41e0000000000000
442+34.32.39.34.39.36.37.32.39.35 41efffffffe00000
443+34.32.39.34.39.36.37.32.39.36 41f0000000000000

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 3

↑↓ moveenter openesc close