diff --git a/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report-github.md b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report-github.md
new file mode 100644
index 00000000..a044b6c7
--- /dev/null
+++ b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report-github.md
@@ -0,0 +1,18 @@
+```
+
+BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
+Unknown processor
+.NET SDK 9.0.304
+ [Host] : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+ DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+
+
+```
+| Method | Mean | Error | StdDev | Gen0 | Gen1 | Allocated |
+|------------------ |-----------:|----------:|----------:|-------:|-------:|----------:|
+| STJ_String_Small | 287.1 ns | 3.48 ns | 3.25 ns | 0.0448 | - | 752 B |
+| STJ_Bytes_Small | 247.2 ns | 2.79 ns | 2.18 ns | 0.0448 | - | 752 B |
+| STJ_String_Medium | 499.8 ns | 8.72 ns | 6.81 ns | 0.2584 | 0.0038 | 4336 B |
+| STJ_Bytes_Medium | 512.3 ns | 13.51 ns | 38.77 ns | 0.2589 | 0.0038 | 4336 B |
+| STJ_String_Large | 4,610.5 ns | 114.34 ns | 337.12 ns | 3.9215 | 0.7782 | 65776 B |
+| STJ_Bytes_Large | 3,421.0 ns | 72.74 ns | 208.71 ns | 3.9215 | 0.7820 | 65776 B |
diff --git a/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report.csv b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report.csv
new file mode 100644
index 00000000..b8456939
--- /dev/null
+++ b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report.csv
@@ -0,0 +1,7 @@
+Method;Job;AnalyzeLaunchVariance;EvaluateOverhead;MaxAbsoluteError;MaxRelativeError;MinInvokeCount;MinIterationTime;OutlierMode;Affinity;EnvironmentVariables;Jit;LargeAddressAware;Platform;PowerPlanMode;Runtime;AllowVeryLargeObjects;Concurrent;CpuGroups;Force;HeapAffinitizeMask;HeapCount;NoAffinitize;RetainVm;Server;Arguments;BuildConfiguration;Clock;EngineFactory;NuGetReferences;Toolchain;IsMutator;InvocationCount;IterationCount;IterationTime;LaunchCount;MaxIterationCount;MaxWarmupIterationCount;MemoryRandomization;MinIterationCount;MinWarmupIterationCount;RunStrategy;UnrollFactor;WarmupCount;Mean;Error;StdDev;Gen0;Gen1;Allocated
+STJ_String_Small;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;287.1 ns;3.48 ns;3.25 ns;0.0448;0.0000;752 B
+STJ_Bytes_Small;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;247.2 ns;2.79 ns;2.18 ns;0.0448;0.0000;752 B
+STJ_String_Medium;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;499.8 ns;8.72 ns;6.81 ns;0.2584;0.0038;4336 B
+STJ_Bytes_Medium;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;512.3 ns;13.51 ns;38.77 ns;0.2589;0.0038;4336 B
+STJ_String_Large;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;"4,610.5 ns";114.34 ns;337.12 ns;3.9215;0.7782;65776 B
+STJ_Bytes_Large;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;"3,421.0 ns";72.74 ns;208.71 ns;3.9215;0.7820;65776 B
diff --git a/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report.html b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report.html
new file mode 100644
index 00000000..04156a83
--- /dev/null
+++ b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.JsonDecodeBench-report.html
@@ -0,0 +1,35 @@
+
+
+
+
+DSInternals.Json.Benchmarks.JsonDecodeBench-20250816-222213
+
+
+
+
+
+BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
+Unknown processor
+.NET SDK 9.0.304
+ [Host] : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+ DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+
+
+
+
+| Method | Mean | Error | StdDev | Gen0 | Gen1 | Allocated |
+
+| STJ_String_Small | 287.1 ns | 3.48 ns | 3.25 ns | 0.0448 | - | 752 B |
+
| STJ_Bytes_Small | 247.2 ns | 2.79 ns | 2.18 ns | 0.0448 | - | 752 B |
+
| STJ_String_Medium | 499.8 ns | 8.72 ns | 6.81 ns | 0.2584 | 0.0038 | 4336 B |
+
| STJ_Bytes_Medium | 512.3 ns | 13.51 ns | 38.77 ns | 0.2589 | 0.0038 | 4336 B |
+
| STJ_String_Large | 4,610.5 ns | 114.34 ns | 337.12 ns | 3.9215 | 0.7782 | 65776 B |
+
| STJ_Bytes_Large | 3,421.0 ns | 72.74 ns | 208.71 ns | 3.9215 | 0.7820 | 65776 B |
+
+
+
diff --git a/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report-github.md b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report-github.md
new file mode 100644
index 00000000..e4ef3e56
--- /dev/null
+++ b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report-github.md
@@ -0,0 +1,15 @@
+```
+
+BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
+Unknown processor
+.NET SDK 9.0.304
+ [Host] : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+ DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+
+
+```
+| Method | Mean | Error | StdDev | Gen0 | Allocated |
+|----------------- |---------:|--------:|---------:|-------:|----------:|
+| Laps_String | 222.4 ns | 5.39 ns | 15.63 ns | 0.0124 | 208 B |
+| Laps_Utf8_Bytes | 195.4 ns | 5.11 ns | 15.05 ns | 0.0124 | 208 B |
+| Laps_Utf16_Bytes | 318.1 ns | 7.64 ns | 22.16 ns | 0.0381 | 640 B |
diff --git a/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report.csv b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report.csv
new file mode 100644
index 00000000..7665d8d5
--- /dev/null
+++ b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report.csv
@@ -0,0 +1,4 @@
+Method;Job;AnalyzeLaunchVariance;EvaluateOverhead;MaxAbsoluteError;MaxRelativeError;MinInvokeCount;MinIterationTime;OutlierMode;Affinity;EnvironmentVariables;Jit;LargeAddressAware;Platform;PowerPlanMode;Runtime;AllowVeryLargeObjects;Concurrent;CpuGroups;Force;HeapAffinitizeMask;HeapCount;NoAffinitize;RetainVm;Server;Arguments;BuildConfiguration;Clock;EngineFactory;NuGetReferences;Toolchain;IsMutator;InvocationCount;IterationCount;IterationTime;LaunchCount;MaxIterationCount;MaxWarmupIterationCount;MemoryRandomization;MinIterationCount;MinWarmupIterationCount;RunStrategy;UnrollFactor;WarmupCount;Mean;Error;StdDev;Gen0;Allocated
+Laps_String;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;222.4 ns;5.39 ns;15.63 ns;0.0124;208 B
+Laps_Utf8_Bytes;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;195.4 ns;5.11 ns;15.05 ns;0.0124;208 B
+Laps_Utf16_Bytes;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;318.1 ns;7.64 ns;22.16 ns;0.0381;640 B
diff --git a/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report.html b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report.html
new file mode 100644
index 00000000..553d9196
--- /dev/null
+++ b/BenchmarkDotNet.Artifacts/results-improvements/DSInternals.Json.Benchmarks.LapsBench-report.html
@@ -0,0 +1,32 @@
+
+
+
+
+DSInternals.Json.Benchmarks.LapsBench-20250816-222715
+
+
+
+
+
+BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
+Unknown processor
+.NET SDK 9.0.304
+ [Host] : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+ DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+
+
+
+
+| Method | Mean | Error | StdDev | Gen0 | Allocated |
+
+| Laps_String | 222.4 ns | 5.39 ns | 15.63 ns | 0.0124 | 208 B |
+
| Laps_Utf8_Bytes | 195.4 ns | 5.11 ns | 15.05 ns | 0.0124 | 208 B |
+
| Laps_Utf16_Bytes | 318.1 ns | 7.64 ns | 22.16 ns | 0.0381 | 640 B |
+
+
+
diff --git a/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report-github.md b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report-github.md
new file mode 100644
index 00000000..425b1713
--- /dev/null
+++ b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report-github.md
@@ -0,0 +1,18 @@
+```
+
+BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
+Unknown processor
+.NET SDK 9.0.304
+ [Host] : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+ DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+
+
+```
+| Method | Mean | Error | StdDev | Median | Gen0 | Gen1 | Gen2 | Allocated |
+|------------------ |------------:|----------:|------------:|------------:|--------:|--------:|--------:|----------:|
+| STJ_String_Small | 279.8 ns | 4.15 ns | 3.88 ns | 279.0 ns | 0.0448 | - | - | 752 B |
+| STJ_Bytes_Small | 342.9 ns | 6.37 ns | 5.96 ns | 342.5 ns | 0.1063 | 0.0005 | - | 1784 B |
+| STJ_String_Medium | 631.9 ns | 28.32 ns | 83.50 ns | 649.3 ns | 0.2584 | 0.0038 | - | 4336 B |
+| STJ_Bytes_Medium | 777.3 ns | 16.94 ns | 48.33 ns | 763.0 ns | 0.7496 | 0.0334 | - | 12536 B |
+| STJ_String_Large | 4,043.0 ns | 66.74 ns | 52.11 ns | 4,041.0 ns | 3.9215 | 0.7782 | - | 65776 B |
+| STJ_Bytes_Large | 36,013.7 ns | 743.78 ns | 2,193.05 ns | 35,435.2 ns | 41.6565 | 41.6565 | 41.6565 | 196884 B |
diff --git a/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report.csv b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report.csv
new file mode 100644
index 00000000..6d0c774c
--- /dev/null
+++ b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report.csv
@@ -0,0 +1,7 @@
+Method;Job;AnalyzeLaunchVariance;EvaluateOverhead;MaxAbsoluteError;MaxRelativeError;MinInvokeCount;MinIterationTime;OutlierMode;Affinity;EnvironmentVariables;Jit;LargeAddressAware;Platform;PowerPlanMode;Runtime;AllowVeryLargeObjects;Concurrent;CpuGroups;Force;HeapAffinitizeMask;HeapCount;NoAffinitize;RetainVm;Server;Arguments;BuildConfiguration;Clock;EngineFactory;NuGetReferences;Toolchain;IsMutator;InvocationCount;IterationCount;IterationTime;LaunchCount;MaxIterationCount;MaxWarmupIterationCount;MemoryRandomization;MinIterationCount;MinWarmupIterationCount;RunStrategy;UnrollFactor;WarmupCount;Mean;Error;StdDev;Median;Gen0;Gen1;Gen2;Allocated
+STJ_String_Small;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;279.8 ns;4.15 ns;3.88 ns;279.0 ns;0.0448;0.0000;0.0000;752 B
+STJ_Bytes_Small;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;342.9 ns;6.37 ns;5.96 ns;342.5 ns;0.1063;0.0005;0.0000;1784 B
+STJ_String_Medium;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;631.9 ns;28.32 ns;83.50 ns;649.3 ns;0.2584;0.0038;0.0000;4336 B
+STJ_Bytes_Medium;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;777.3 ns;16.94 ns;48.33 ns;763.0 ns;0.7496;0.0334;0.0000;12536 B
+STJ_String_Large;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;"4,043.0 ns";66.74 ns;52.11 ns;"4,041.0 ns";3.9215;0.7782;0.0000;65776 B
+STJ_Bytes_Large;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;"36,013.7 ns";743.78 ns;"2,193.05 ns";"35,435.2 ns";41.6565;41.6565;41.6565;196884 B
diff --git a/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report.html b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report.html
new file mode 100644
index 00000000..b7dc2bf1
--- /dev/null
+++ b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.JsonDecodeBench-report.html
@@ -0,0 +1,35 @@
+
+
+
+
+DSInternals.Json.Benchmarks.JsonDecodeBench-20250817-075533
+
+
+
+
+
+BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
+Unknown processor
+.NET SDK 9.0.304
+ [Host] : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+ DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+
+
+
+
+| Method | Mean | Error | StdDev | Median | Gen0 | Gen1 | Gen2 | Allocated |
+
+| STJ_String_Small | 279.8 ns | 4.15 ns | 3.88 ns | 279.0 ns | 0.0448 | - | - | 752 B |
+
| STJ_Bytes_Small | 342.9 ns | 6.37 ns | 5.96 ns | 342.5 ns | 0.1063 | 0.0005 | - | 1784 B |
+
| STJ_String_Medium | 631.9 ns | 28.32 ns | 83.50 ns | 649.3 ns | 0.2584 | 0.0038 | - | 4336 B |
+
| STJ_Bytes_Medium | 777.3 ns | 16.94 ns | 48.33 ns | 763.0 ns | 0.7496 | 0.0334 | - | 12536 B |
+
| STJ_String_Large | 4,043.0 ns | 66.74 ns | 52.11 ns | 4,041.0 ns | 3.9215 | 0.7782 | - | 65776 B |
+
| STJ_Bytes_Large | 36,013.7 ns | 743.78 ns | 2,193.05 ns | 35,435.2 ns | 41.6565 | 41.6565 | 41.6565 | 196884 B |
+
+
+
diff --git a/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report-github.md b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report-github.md
new file mode 100644
index 00000000..bd13de4e
--- /dev/null
+++ b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report-github.md
@@ -0,0 +1,15 @@
+```
+
+BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
+Unknown processor
+.NET SDK 9.0.304
+ [Host] : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+ DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+
+
+```
+| Method | Mean | Error | StdDev | Gen0 | Allocated |
+|----------------- |---------:|--------:|---------:|-------:|----------:|
+| Laps_String | 246.7 ns | 6.61 ns | 18.96 ns | 0.0124 | 208 B |
+| Laps_Utf8_Bytes | 259.3 ns | 6.84 ns | 20.16 ns | 0.0219 | 368 B |
+| Laps_Utf16_Bytes | 281.1 ns | 8.17 ns | 24.08 ns | 0.0219 | 368 B |
diff --git a/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report.csv b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report.csv
new file mode 100644
index 00000000..28101576
--- /dev/null
+++ b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report.csv
@@ -0,0 +1,4 @@
+Method;Job;AnalyzeLaunchVariance;EvaluateOverhead;MaxAbsoluteError;MaxRelativeError;MinInvokeCount;MinIterationTime;OutlierMode;Affinity;EnvironmentVariables;Jit;LargeAddressAware;Platform;PowerPlanMode;Runtime;AllowVeryLargeObjects;Concurrent;CpuGroups;Force;HeapAffinitizeMask;HeapCount;NoAffinitize;RetainVm;Server;Arguments;BuildConfiguration;Clock;EngineFactory;NuGetReferences;Toolchain;IsMutator;InvocationCount;IterationCount;IterationTime;LaunchCount;MaxIterationCount;MaxWarmupIterationCount;MemoryRandomization;MinIterationCount;MinWarmupIterationCount;RunStrategy;UnrollFactor;WarmupCount;Mean;Error;StdDev;Gen0;Allocated
+Laps_String;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;246.7 ns;6.61 ns;18.96 ns;0.0124;208 B
+Laps_Utf8_Bytes;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;259.3 ns;6.84 ns;20.16 ns;0.0219;368 B
+Laps_Utf16_Bytes;DefaultJob;False;Default;Default;Default;Default;Default;Default;11111111111111111111111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 8.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;281.1 ns;8.17 ns;24.08 ns;0.0219;368 B
diff --git a/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report.html b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report.html
new file mode 100644
index 00000000..fda92802
--- /dev/null
+++ b/BenchmarkDotNet.Artifacts/results-original/DSInternals.Json.Benchmarks.LapsBench-report.html
@@ -0,0 +1,32 @@
+
+
+
+
+DSInternals.Json.Benchmarks.LapsBench-20250817-080046
+
+
+
+
+
+BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4652/24H2/2024Update/HudsonValley)
+Unknown processor
+.NET SDK 9.0.304
+ [Host] : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+ DefaultJob : .NET 8.0.19 (8.0.1925.36514), X64 RyuJIT AVX-512F+CD+BW+DQ+VL+VBMI
+
+
+
+
+| Method | Mean | Error | StdDev | Gen0 | Allocated |
+
+| Laps_String | 246.7 ns | 6.61 ns | 18.96 ns | 0.0124 | 208 B |
+
| Laps_Utf8_Bytes | 259.3 ns | 6.84 ns | 20.16 ns | 0.0219 | 368 B |
+
| Laps_Utf16_Bytes | 281.1 ns | 8.17 ns | 24.08 ns | 0.0219 | 368 B |
+
+
+
diff --git a/Src/DSInternals.Common/Serialization/DsiJson.cs b/Src/DSInternals.Common/Serialization/DsiJson.cs
index e79f6d7f..5c7b915f 100644
--- a/Src/DSInternals.Common/Serialization/DsiJson.cs
+++ b/Src/DSInternals.Common/Serialization/DsiJson.cs
@@ -25,8 +25,8 @@ static DsiJson()
Options.Converters.Add(new JsonStringEnumConverter());
}
- // ---------- String input ----------
- internal static T DeserializeLenient(string json)
+ // ---------- STRING INPUT ----------
+ internal static T? DeserializeLenient(string json)
{
if (string.IsNullOrWhiteSpace(json)) return default;
@@ -49,51 +49,67 @@ internal static T DeserializeLenient(string json)
}
}
- // ---------- Binary input ----------
- internal static T DeserializeLenient(ReadOnlySpan binaryJson, bool utf16 = false)
+ // ---------- BINARY INPUT ----------
+ internal static T? DeserializeLenient(ReadOnlySpan binaryJson, bool utf16 = false)
{
- var json = DecodeJson(binaryJson, utf16);
- return DeserializeLenient(json);
- }
+ if (binaryJson.Length == 0) return default;
- internal static string DecodeJson(ReadOnlySpan binaryJson, bool utf16 = false)
- {
- // Trim terminators/padding on BYTES BEFORE decoding.
var trimmed = TrimZeroTerminator(binaryJson, utf16);
+ if (!utf16)
+ {
+ // UTF-8 path
+ trimmed = TrimUtf8Bom(trimmed);
+
#if NET8_0_OR_GREATER
- string json = (utf16 ? Encoding.Unicode : Encoding.UTF8).GetString(trimmed);
+ // Fast-path: no string allocation if it already looks like proper JSON
+ if (!LooksLikeSingleQuotedJsonUtf8(trimmed))
+ return JsonSerializer.Deserialize(trimmed, Options);
+
+ string s = Encoding.UTF8.GetString(trimmed);
+ return DeserializeLenient(s);
#else
- // .NET Framework: no span GetString; copy to array explicitly.
- byte[] buf = trimmed.Length == 0 ? Array.Empty() : new byte[trimmed.Length];
- if (buf.Length != 0)
- {
- for (int i = 0; i < trimmed.Length; i++)
- {
- buf[i] = trimmed[i];
- }
- }
- string json = (utf16 ? Encoding.Unicode : Encoding.UTF8).GetString(buf);
+ // .NET Framework: decode to string and reuse string path
+ byte[] buf = new byte[trimmed.Length];
+ for (int i = 0; i < trimmed.Length; i++) buf[i] = trimmed[i];
+ string s = Encoding.UTF8.GetString(buf);
+ return DeserializeLenient(s);
#endif
- // Strip BOM if present
- if (json.Length > 0 && json[0] == '\uFEFF')
- json = json.Substring(1);
+ }
+ else
+ {
+ // UTF-16LE path
+ // Copy span to array (net48-safe), then transcode to UTF-8 using Encoding.Convert
+ byte[] utf16le = new byte[trimmed.Length];
+ for (int i = 0; i < trimmed.Length; i++) utf16le[i] = trimmed[i];
- return json;
+ byte[] utf8 = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, utf16le, 0, utf16le.Length);
+
+#if NET8_0_OR_GREATER
+ ReadOnlySpan utf8Span = utf8;
+ utf8Span = TrimUtf8Bom(utf8Span);
+ if (!LooksLikeSingleQuotedJsonUtf8(utf8Span))
+ return JsonSerializer.Deserialize(utf8Span, Options);
+#endif
+ // Fallback: go through string to apply single-quote normalization if needed
+ string s = Encoding.UTF8.GetString(utf8);
+ return DeserializeLenient(s);
+ }
}
+ // ---------- Helpers ----------
private static ReadOnlySpan TrimZeroTerminator(ReadOnlySpan input, bool utf16)
{
if (input.Length == 0) return input;
if (utf16)
{
- // Remove any number of trailing 0x00 0x00 pairs.
int len = input.Length;
+ // remove trailing 0x00 0x00 pairs
while (len >= 2 && input[len - 1] == 0 && input[len - 2] == 0)
len -= 2;
- // Safety: ensure even byte count for UTF-16
+ // ensure even count for UTF-16
if ((len & 1) == 1) len -= 1;
return input.Slice(0, len);
@@ -107,13 +123,56 @@ private static ReadOnlySpan TrimZeroTerminator(ReadOnlySpan input, b
}
}
+ private static ReadOnlySpan TrimUtf8Bom(ReadOnlySpan data)
+ {
+ if (data.Length >= 3 && data[0] == 0xEF && data[1] == 0xBB && data[2] == 0xBF)
+ return data.Slice(3);
+ return data;
+ }
+
private static bool LooksLikeSingleQuotedJson(string s)
{
if (string.IsNullOrEmpty(s)) return false;
- var t = s.TrimStart();
- return (t.Length > 0 && (t[0] == '{' || t[0] == '['))
- && s.IndexOf('"') < 0
- && s.IndexOf('\'') >= 0;
+
+ // manual trim-start (no allocation)
+ int i = 0;
+ while (i < s.Length)
+ {
+ char c = s[i];
+ if (c == ' ' || c == '\t' || c == '\r' || c == '\n') { i++; continue; }
+ break;
+ }
+ if (i >= s.Length) return false;
+
+ char first = s[i];
+ if (first != '{' && first != '[') return false;
+
+ // heuristic: has at least one ' and no "
+ return s.IndexOf('"', i) < 0 && s.IndexOf('\'', i) >= 0;
+ }
+
+ private static bool LooksLikeSingleQuotedJsonUtf8(ReadOnlySpan s)
+ {
+ int i = 0;
+ while (i < s.Length)
+ {
+ byte b = s[i];
+ if (b == (byte)' ' || b == (byte)'\t' || b == (byte)'\r' || b == (byte)'\n') { i++; continue; }
+ break;
+ }
+ if (i >= s.Length) return false;
+
+ byte first = s[i];
+ if (first != (byte)'{' && first != (byte)'[') return false;
+
+ bool hasDouble = false, hasSingle = false;
+ for (int j = i; j < s.Length; j++)
+ {
+ byte b = s[j];
+ if (b == (byte)'"') { hasDouble = true; break; }
+ if (b == (byte)'\'') { hasSingle = true; }
+ }
+ return !hasDouble && hasSingle;
}
// Converts '…' to "…" and preserves apostrophes inside strings (\' -> ')
@@ -158,4 +217,4 @@ private static string NormalizeSingleQuotedJson(string input)
return sb.ToString();
}
}
-}
\ No newline at end of file
+}
diff --git a/Src/DSInternals.Json.Benchmarks/DSInternals.Json.Benchmarks.csproj b/Src/DSInternals.Json.Benchmarks/DSInternals.Json.Benchmarks.csproj
new file mode 100644
index 00000000..eac311f2
--- /dev/null
+++ b/Src/DSInternals.Json.Benchmarks/DSInternals.Json.Benchmarks.csproj
@@ -0,0 +1,18 @@
+
+
+ net8.0-windows
+ Exe
+ enable
+ enable
+ false
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Src/DSInternals.Json.Benchmarks/JsonDecodeBench.cs b/Src/DSInternals.Json.Benchmarks/JsonDecodeBench.cs
new file mode 100644
index 00000000..5440967f
--- /dev/null
+++ b/Src/DSInternals.Json.Benchmarks/JsonDecodeBench.cs
@@ -0,0 +1,45 @@
+using System.Text;
+using System.Text.Json;
+using BenchmarkDotNet.Attributes;
+using DSInternals.Common.Serialization;
+
+namespace DSInternals.Json.Benchmarks
+{
+ [MemoryDiagnoser]
+ public class JsonDecodeBench
+ {
+ private byte[] _utf8Small, _utf8Medium, _utf8Large;
+ private string _utf8SmallString, _utf8MediumString, _utf8LargeString;
+
+ [GlobalSetup]
+ public void Setup()
+ {
+ _utf8SmallString = MakeJson(512); // ~0.5 KB
+ _utf8MediumString = MakeJson(4096); // ~4 KB
+ _utf8LargeString = MakeJson(65536); // ~64 KB
+
+ _utf8Small = Encoding.UTF8.GetBytes(_utf8SmallString);
+ _utf8Medium = Encoding.UTF8.GetBytes(_utf8MediumString);
+ _utf8Large = Encoding.UTF8.GetBytes(_utf8LargeString);
+ }
+
+ private static string MakeJson(int approxSize)
+ {
+ var sb = new StringBuilder(approxSize + 64);
+ sb.Append('{');
+ sb.Append("\"n\":\"Administrator\",\"t\":\"2024-05-07T12:34:56Z\",\"p\":\"");
+ sb.Append(new string('A', approxSize - 64));
+ sb.Append("\"}");
+ return sb.ToString();
+ }
+
+ [Benchmark] public object STJ_String_Small() => JsonSerializer.Deserialize(_utf8SmallString, DsiJson.Options);
+ [Benchmark] public object STJ_Bytes_Small() => DsiJson.DeserializeLenient(_utf8Small, utf16: false)!;
+
+ [Benchmark] public object STJ_String_Medium() => JsonSerializer.Deserialize(_utf8MediumString, DsiJson.Options);
+ [Benchmark] public object STJ_Bytes_Medium() => DsiJson.DeserializeLenient(_utf8Medium, utf16: false)!;
+
+ [Benchmark] public object STJ_String_Large() => JsonSerializer.Deserialize(_utf8LargeString, DsiJson.Options);
+ [Benchmark] public object STJ_Bytes_Large() => DsiJson.DeserializeLenient(_utf8Large, utf16: false)!;
+ }
+}
diff --git a/Src/DSInternals.Json.Benchmarks/LapsBench.cs b/Src/DSInternals.Json.Benchmarks/LapsBench.cs
new file mode 100644
index 00000000..a1affd0a
--- /dev/null
+++ b/Src/DSInternals.Json.Benchmarks/LapsBench.cs
@@ -0,0 +1,28 @@
+using System.Text;
+using BenchmarkDotNet.Attributes;
+using DSInternals.Common.Serialization;
+using DSInternals.Common.Data;
+
+namespace DSInternals.Json.Benchmarks
+{
+ [MemoryDiagnoser]
+ public class LapsBench
+ {
+ private const string LapsJson = "{\"n\":\"Administrator\",\"p\":\"a998aoEUUXxO32\",\"t\":\"2025-06-01T08:00:00Z\"}";
+ private byte[] _utf8;
+ private byte[] _utf16le;
+ private string _str;
+
+ [GlobalSetup]
+ public void Setup()
+ {
+ _str = LapsJson;
+ _utf8 = Encoding.UTF8.GetBytes(LapsJson);
+ _utf16le = Encoding.Unicode.GetBytes(LapsJson);
+ }
+
+ [Benchmark] public object Laps_String() => DsiJson.DeserializeLenient(_str)!;
+ [Benchmark] public object Laps_Utf8_Bytes() => DsiJson.DeserializeLenient(_utf8, utf16: false)!;
+ [Benchmark] public object Laps_Utf16_Bytes() => DsiJson.DeserializeLenient(_utf16le, utf16: true)!;
+ }
+}
diff --git a/Src/DSInternals.Json.Benchmarks/Program.cs b/Src/DSInternals.Json.Benchmarks/Program.cs
new file mode 100644
index 00000000..008c80d0
--- /dev/null
+++ b/Src/DSInternals.Json.Benchmarks/Program.cs
@@ -0,0 +1,10 @@
+using BenchmarkDotNet.Running;
+
+namespace DSInternals.Json.Benchmarks
+{
+ public class Program
+ {
+ public static void Main(string[] args) =>
+ BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args);
+ }
+}
diff --git a/Src/DSInternals.Json.Benchmarks/packages.lock.json b/Src/DSInternals.Json.Benchmarks/packages.lock.json
new file mode 100644
index 00000000..a9178481
--- /dev/null
+++ b/Src/DSInternals.Json.Benchmarks/packages.lock.json
@@ -0,0 +1,287 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0-windows7.0": {
+ "BenchmarkDotNet": {
+ "type": "Direct",
+ "requested": "[0.15.2, )",
+ "resolved": "0.15.2",
+ "contentHash": "5vl4nQFUGTKgOVE5LNoLpv/X/wFQ7wE5yiaJAXCpzgNtUADtfEwbuufKI4o5E2De0VTXNEeom5Hnv8S8vuBZtg==",
+ "dependencies": {
+ "BenchmarkDotNet.Annotations": "0.15.2",
+ "CommandLineParser": "2.9.1",
+ "Gee.External.Capstone": "2.3.0",
+ "Iced": "1.21.0",
+ "Microsoft.CodeAnalysis.CSharp": "4.14.0",
+ "Microsoft.Diagnostics.Runtime": "3.1.512801",
+ "Microsoft.Diagnostics.Tracing.TraceEvent": "3.1.21",
+ "Microsoft.DotNet.PlatformAbstractions": "3.1.6",
+ "Perfolizer": "[0.5.3]",
+ "System.Management": "9.0.5"
+ }
+ },
+ "Microsoft.SourceLink.GitHub": {
+ "type": "Direct",
+ "requested": "[8.0.0, )",
+ "resolved": "8.0.0",
+ "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==",
+ "dependencies": {
+ "Microsoft.Build.Tasks.Git": "8.0.0",
+ "Microsoft.SourceLink.Common": "8.0.0"
+ }
+ },
+ "BenchmarkDotNet.Annotations": {
+ "type": "Transitive",
+ "resolved": "0.15.2",
+ "contentHash": "a7rVlVmXQRrp3J+HF/FtjwiFcshU6BAuv6U1xtAbqCUYepOEnNGaPeOFvy4It17QZwwofm6U/GAfW3JrFMXszg=="
+ },
+ "CommandLineParser": {
+ "type": "Transitive",
+ "resolved": "2.9.1",
+ "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA=="
+ },
+ "Gee.External.Capstone": {
+ "type": "Transitive",
+ "resolved": "2.3.0",
+ "contentHash": "2ap/rYmjtzCOT8hxrnEW/QeiOt+paD8iRrIcdKX0cxVwWLFa1e+JDBNeECakmccXrSFeBQuu5AV8SNkipFMMMw=="
+ },
+ "Iced": {
+ "type": "Transitive",
+ "resolved": "1.21.0",
+ "contentHash": "dv5+81Q1TBQvVMSOOOmRcjJmvWcX3BZPZsIq31+RLc5cNft0IHAyNlkdb7ZarOWG913PyBoFDsDXoCIlKmLclg=="
+ },
+ "Microsoft.Build.Tasks.Git": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
+ },
+ "Microsoft.CodeAnalysis.Analyzers": {
+ "type": "Transitive",
+ "resolved": "3.11.0",
+ "contentHash": "v/EW3UE8/lbEYHoC2Qq7AR/DnmvpgdtAMndfQNmpuIMx/Mto8L5JnuCfdBYtgvalQOtfNCnxFejxuRrryvUTsg=="
+ },
+ "Microsoft.CodeAnalysis.Common": {
+ "type": "Transitive",
+ "resolved": "4.14.0",
+ "contentHash": "PC3tuwZYnC+idaPuoC/AZpEdwrtX7qFpmnrfQkgobGIWiYmGi5MCRtl5mx6QrfMGQpK78X2lfIEoZDLg/qnuHg==",
+ "dependencies": {
+ "Microsoft.CodeAnalysis.Analyzers": "3.11.0",
+ "System.Collections.Immutable": "9.0.0",
+ "System.Reflection.Metadata": "9.0.0"
+ }
+ },
+ "Microsoft.CodeAnalysis.CSharp": {
+ "type": "Transitive",
+ "resolved": "4.14.0",
+ "contentHash": "568a6wcTivauIhbeWcCwfWwIn7UV7MeHEBvFB2uzGIpM2OhJ4eM/FZ8KS0yhPoNxnSpjGzz7x7CIjTxhslojQA==",
+ "dependencies": {
+ "Microsoft.CodeAnalysis.Analyzers": "3.11.0",
+ "Microsoft.CodeAnalysis.Common": "[4.14.0]",
+ "System.Collections.Immutable": "9.0.0",
+ "System.Reflection.Metadata": "9.0.0"
+ }
+ },
+ "Microsoft.Diagnostics.NETCore.Client": {
+ "type": "Transitive",
+ "resolved": "0.2.510501",
+ "contentHash": "juoqJYMDs+lRrrZyOkXXMImJHneCF23cuvO4waFRd2Ds7j+ZuGIPbJm0Y/zz34BdeaGiiwGWraMUlln05W1PCQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Logging": "6.0.0"
+ }
+ },
+ "Microsoft.Diagnostics.Runtime": {
+ "type": "Transitive",
+ "resolved": "3.1.512801",
+ "contentHash": "0lMUDr2oxNZa28D6NH5BuSQEe5T9tZziIkvkD44YkkCGQXPJqvFjLq5ZQq1hYLl3RjQJrY+hR0jFgap+EWPDTw==",
+ "dependencies": {
+ "Microsoft.Diagnostics.NETCore.Client": "0.2.410101"
+ }
+ },
+ "Microsoft.Diagnostics.Tracing.TraceEvent": {
+ "type": "Transitive",
+ "resolved": "3.1.21",
+ "contentHash": "/OrJFKaojSR6TkUKtwh8/qA9XWNtxLrXMqvEb89dBSKCWjaGVTbKMYodIUgF5deCEtmd6GXuRerciXGl5bhZ7Q==",
+ "dependencies": {
+ "Microsoft.Diagnostics.NETCore.Client": "0.2.510501",
+ "Microsoft.Win32.Registry": "5.0.0",
+ "System.Collections.Immutable": "8.0.0",
+ "System.Reflection.Metadata": "8.0.0",
+ "System.Reflection.TypeExtensions": "4.7.0",
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0",
+ "System.Text.Json": "8.0.5"
+ }
+ },
+ "Microsoft.DotNet.PlatformAbstractions": {
+ "type": "Transitive",
+ "resolved": "3.1.6",
+ "contentHash": "jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg=="
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg=="
+ },
+ "Microsoft.Extensions.Logging": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "6.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Options": "6.0.0",
+ "System.Diagnostics.DiagnosticSource": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA=="
+ },
+ "Microsoft.Extensions.Options": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Primitives": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+ }
+ },
+ "Microsoft.NETCore.Platforms": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ=="
+ },
+ "Microsoft.SourceLink.Common": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
+ },
+ "Microsoft.Win32.Registry": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
+ "dependencies": {
+ "System.Security.AccessControl": "5.0.0",
+ "System.Security.Principal.Windows": "5.0.0"
+ }
+ },
+ "Perfolizer": {
+ "type": "Transitive",
+ "resolved": "0.5.3",
+ "contentHash": "EhHo0s4y+tHJKhZHgQvPgFWhAhnQpHHuFzutRzfqfv5z763wvhzXh849ZtpVePQNxXWoFafh1Ta2tZgnSIVsYQ=="
+ },
+ "PeterO.Cbor": {
+ "type": "Transitive",
+ "resolved": "4.5.5",
+ "contentHash": "9fMcLg2SUm9ri1j3gVPYxk6+Ev4l4wu93bYwFG1tvntg1Qy4m0rFDdxStG88XR/W4DggOtBXfPVkC3bLF10nqw==",
+ "dependencies": {
+ "PeterO.Numbers": "1.8.2",
+ "PeterO.URIUtility": "1.0.0"
+ }
+ },
+ "PeterO.Numbers": {
+ "type": "Transitive",
+ "resolved": "1.8.2",
+ "contentHash": "d+A5KLoWbwOTpvubPaGXLgCzANE00jXmsT+yneHwLe2OlobBBFLaIHyoDwmekuHM17z9hU++RF6mL+zZ2x69nA=="
+ },
+ "PeterO.URIUtility": {
+ "type": "Transitive",
+ "resolved": "1.0.0",
+ "contentHash": "fpRTBsYACMp7NvTECauYRomubWTC3vUNw4hMXdIedP8ctBGK6tea9HOJwE+qVzis6MZYkL3LIs8qeY3rc6Jdlw=="
+ },
+ "System.CodeDom": {
+ "type": "Transitive",
+ "resolved": "9.0.5",
+ "contentHash": "cuzLM2MWutf9ZBEMPYYfd0DXwYdvntp7VCT6a/wvbKCa2ZuvGmW74xi+YBa2mrfEieAXqM4TNKlMmSnfAfpUoQ=="
+ },
+ "System.Collections.Immutable": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "QhkXUl2gNrQtvPmtBTQHb0YsUrDiDQ2QS09YbtTTiSjGcf7NBqtYbrG/BE06zcBPCKEwQGzIv13IVdXNOSub2w=="
+ },
+ "System.Diagnostics.DiagnosticSource": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+ }
+ },
+ "System.DirectoryServices": {
+ "type": "Transitive",
+ "resolved": "9.0.8",
+ "contentHash": "xN2JrOfhcOyswOflVZG27XlFJDPPqU7AQtAAStWcnKoC8W9XCLOLdAYIrrwiZMfeRhavVErI8HkSO/c2TQ+z2g=="
+ },
+ "System.Management": {
+ "type": "Transitive",
+ "resolved": "9.0.5",
+ "contentHash": "n6o9PZm9p25+zAzC3/48K0oHnaPKTInRrxqFq1fi/5TPbMLjuoCm/h//mS3cUmSy+9AO1Z+qsC/Ilt/ZFatv5Q==",
+ "dependencies": {
+ "System.CodeDom": "9.0.5"
+ }
+ },
+ "System.Reflection.Metadata": {
+ "type": "Transitive",
+ "resolved": "9.0.0",
+ "contentHash": "ANiqLu3DxW9kol/hMmTWbt3414t9ftdIuiIU7j80okq2YzAueo120M442xk1kDJWtmZTqWQn7wHDvMRipVOEOQ==",
+ "dependencies": {
+ "System.Collections.Immutable": "9.0.0"
+ }
+ },
+ "System.Reflection.TypeExtensions": {
+ "type": "Transitive",
+ "resolved": "4.7.0",
+ "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA=="
+ },
+ "System.Runtime.CompilerServices.Unsafe": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg=="
+ },
+ "System.Security.AccessControl": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "5.0.0",
+ "System.Security.Principal.Windows": "5.0.0"
+ }
+ },
+ "System.Security.Principal.Windows": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
+ },
+ "System.Text.Json": {
+ "type": "Transitive",
+ "resolved": "8.0.5",
+ "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg=="
+ },
+ "dsinternals.common": {
+ "type": "Project",
+ "dependencies": {
+ "PeterO.Cbor": "[4.5.5, )",
+ "System.DirectoryServices": "[9.0.8, )"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file